Skip to main content

soroban_cli/commands/tx/fetch/
fee.rs

1use super::args;
2use crate::color::gray;
3use crate::{
4    commands::global,
5    config::network,
6    rpc,
7    xdr::{
8        self, FeeBumpTransactionInnerTx, Hash, SorobanTransactionMetaExt, TransactionEnvelope,
9        TransactionMeta, TransactionResult,
10    },
11};
12use clap::Parser;
13use serde::{Deserialize, Serialize};
14use soroban_rpc::GetTransactionResponse;
15
16#[derive(Parser, Debug, Clone)]
17#[group(skip)]
18pub struct Cmd {
19    #[command(flatten)]
20    args: args::Args,
21
22    /// Output format for fee command
23    #[arg(long, default_value = "table")]
24    pub output: FeeOutputFormat,
25}
26
27#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, clap::ValueEnum, Default)]
28pub enum FeeOutputFormat {
29    /// JSON output of the ledger entry with parsed XDRs (one line, not formatted)
30    Json,
31    /// Formatted (multiline) JSON output of the ledger entry with parsed XDRs
32    JsonFormatted,
33    /// Formatted in a table comparing fee types
34    #[default]
35    Table,
36}
37
38#[derive(thiserror::Error, Debug)]
39pub enum Error {
40    #[error(transparent)]
41    Network(#[from] network::Error),
42    #[error(transparent)]
43    Serde(#[from] serde_json::Error),
44    #[error(transparent)]
45    Xdr(#[from] xdr::Error),
46    #[error(transparent)]
47    Args(#[from] args::Error),
48    #[error("{message}")]
49    NotSupported { message: String },
50    #[error("transaction {tx_hash} not found on {network} network")]
51    NotFound { tx_hash: Hash, network: String },
52    #[error(transparent)]
53    Rpc(#[from] rpc::Error),
54    #[error("{field} is None, expected it to be Some")]
55    None { field: String },
56}
57
58const DEFAULT_RESOURCE_FEE: i64 = 0; // non-soroban txns do not have resource fees
59const RESOURCE_FEE_TITLE: &str = "Resource Fee";
60
61// proposed
62const FEE_PROPOSED_TITLE: &str = "Fee Proposed";
63const INCLUSION_FEE_TITLE: &str = "Inclusion Fee";
64const NON_REFUNDABLE_TITLE: &str = "Non-Refundable";
65const REFUNDABLE_TITLE: &str = "Refundable";
66fn non_refundable_components() -> String {
67    format!(
68        "\n\n{}\n{}\n{}",
69        gray("cpu instructions"),
70        gray("storage read/write"),
71        gray("tx size")
72    )
73}
74
75fn refundable_components() -> String {
76    format!(
77        "\n\n{}\n{}\n{}",
78        gray("return value"),
79        gray("storage rent"),
80        gray("events")
81    )
82}
83
84//charged
85const FEE_CHARGED_TITLE: &str = "Fee Charged";
86const RESOURCE_FEE_CHARGED_TITLE: &str = "Resource Fee Charged";
87const NON_REFUNDABLE_CHARGED_TITLE: &str = "Non-Refundable Charged";
88const REFUNDABLE_CHARGED_TITLE: &str = "Refundable Charged";
89const REFUNDED_TITLE: &str = "Refunded";
90const INCLUSION_FEE_CHARGED_TITLE: &str = "Inclusion Fee Charged";
91
92impl Cmd {
93    pub async fn run(&self, global_args: &global::Args) -> Result<(), Error> {
94        let resp = self.args.fetch_transaction(global_args).await?;
95        let fee_table = FeeTable::new_from_transaction_response(&resp)?;
96        match self.output {
97            FeeOutputFormat::Json => {
98                println!("{}", serde_json::to_string(&fee_table)?);
99            }
100            FeeOutputFormat::JsonFormatted => {
101                args::Args::print_tx_summary(&resp);
102                println!("{}", serde_json::to_string_pretty(&fee_table)?);
103            }
104            FeeOutputFormat::Table => {
105                args::Args::print_tx_summary(&resp);
106                fee_table.print();
107            }
108        }
109
110        Ok(())
111    }
112}
113
114#[derive(Serialize, Deserialize, Debug, PartialEq)]
115pub struct ProposedFees {
116    pub fee: i64,
117    pub resource_fee: i64,
118    pub inclusion_fee: i64,
119}
120
121#[derive(Serialize, Deserialize, Debug, PartialEq)]
122pub struct ChargedFees {
123    pub fee: i64,
124    pub resource_fee: i64,
125    pub inclusion_fee: i64,
126    pub non_refundable_resource_fee: i64,
127    pub refundable_resource_fee: i64,
128}
129
130#[derive(Serialize, Deserialize, Debug)]
131pub struct FeeTable {
132    pub proposed: ProposedFees,
133    pub charged: ChargedFees,
134}
135
136impl FeeTable {
137    pub fn new_from_transaction_response(resp: &GetTransactionResponse) -> Result<Self, Error> {
138        let (tx_result, tx_meta, tx_envelope) = Self::unpack_tx_response(resp)?;
139        let proposed = Self::extract_proposed_fees(&tx_envelope);
140        let charged = Self::extract_charged_fees(&tx_meta, &tx_result);
141
142        Ok(FeeTable { proposed, charged })
143    }
144
145    fn unpack_tx_response(
146        resp: &GetTransactionResponse,
147    ) -> Result<(TransactionResult, TransactionMeta, TransactionEnvelope), Error> {
148        let tx_result = resp.result.clone().ok_or(Error::None {
149            field: "tx_result".to_string(),
150        })?;
151        let tx_meta = resp.result_meta.clone().ok_or(Error::None {
152            field: "tx_meta".to_string(),
153        })?;
154        let tx_envelope = resp.envelope.clone().ok_or(Error::None {
155            field: "tx_envelope".to_string(),
156        })?;
157
158        Ok((tx_result, tx_meta, tx_envelope))
159    }
160
161    fn extract_proposed_fees(tx_envelope: &TransactionEnvelope) -> ProposedFees {
162        match tx_envelope {
163            TransactionEnvelope::TxV0(transaction_v0_envelope) => {
164                let fee: i64 = transaction_v0_envelope.tx.fee.into();
165                ProposedFees {
166                    fee,
167                    resource_fee: DEFAULT_RESOURCE_FEE,
168                    inclusion_fee: fee - DEFAULT_RESOURCE_FEE,
169                }
170            }
171            TransactionEnvelope::Tx(transaction_v1_envelope) => {
172                let tx = transaction_v1_envelope.tx.clone();
173                let fee: i64 = tx.fee.into();
174                let resource_fee = match tx.ext {
175                    xdr::TransactionExt::V0 => DEFAULT_RESOURCE_FEE,
176                    xdr::TransactionExt::V1(soroban_transaction_data) => {
177                        soroban_transaction_data.resource_fee
178                    }
179                };
180                ProposedFees {
181                    fee,
182                    resource_fee,
183                    inclusion_fee: fee - resource_fee,
184                }
185            }
186            TransactionEnvelope::TxFeeBump(fee_bump_transaction_envelope) => {
187                let inner_tx_resource_fee = match &fee_bump_transaction_envelope.tx.inner_tx {
188                    FeeBumpTransactionInnerTx::Tx(tx_v1_envelope) => match &tx_v1_envelope.tx.ext {
189                        xdr::TransactionExt::V0 => DEFAULT_RESOURCE_FEE,
190                        xdr::TransactionExt::V1(soroban_transaction_data) => {
191                            soroban_transaction_data.resource_fee
192                        }
193                    },
194                };
195                // the is the top level fee bump tx fee
196                let fee = fee_bump_transaction_envelope.tx.fee;
197
198                ProposedFees {
199                    fee,
200                    resource_fee: inner_tx_resource_fee,
201                    inclusion_fee: fee - inner_tx_resource_fee,
202                }
203            }
204        }
205    }
206
207    fn extract_charged_fees(
208        tx_meta: &TransactionMeta,
209        tx_result: &TransactionResult,
210    ) -> ChargedFees {
211        let fee = tx_result.fee_charged;
212        let (non_refundable_resource_fee, refundable_resource_fee) =
213            Self::resource_fees_charged(tx_meta);
214        let resource_fee = non_refundable_resource_fee + refundable_resource_fee;
215
216        ChargedFees {
217            fee,
218            resource_fee,
219            inclusion_fee: fee - resource_fee,
220            non_refundable_resource_fee,
221            refundable_resource_fee,
222        }
223    }
224
225    fn resource_fees_charged(tx_meta: &TransactionMeta) -> (i64, i64) {
226        let (non_refundable_resource_fee_charged, refundable_resource_fee_charged) =
227            match tx_meta.clone() {
228                TransactionMeta::V0(_) | TransactionMeta::V1(_) | TransactionMeta::V2(_) => {
229                    (DEFAULT_RESOURCE_FEE, DEFAULT_RESOURCE_FEE)
230                }
231                TransactionMeta::V3(meta) => {
232                    if let Some(soroban_meta) = meta.soroban_meta {
233                        match soroban_meta.ext {
234                            SorobanTransactionMetaExt::V0 => {
235                                (DEFAULT_RESOURCE_FEE, DEFAULT_RESOURCE_FEE)
236                            }
237                            SorobanTransactionMetaExt::V1(v1) => (
238                                v1.total_non_refundable_resource_fee_charged,
239                                v1.total_refundable_resource_fee_charged,
240                            ),
241                        }
242                    } else {
243                        (DEFAULT_RESOURCE_FEE, DEFAULT_RESOURCE_FEE)
244                    }
245                }
246                TransactionMeta::V4(meta) => {
247                    if let Some(soroban_meta) = meta.soroban_meta {
248                        match soroban_meta.ext {
249                            SorobanTransactionMetaExt::V0 => {
250                                (DEFAULT_RESOURCE_FEE, DEFAULT_RESOURCE_FEE)
251                            }
252                            SorobanTransactionMetaExt::V1(v1) => (
253                                v1.total_non_refundable_resource_fee_charged,
254                                v1.total_refundable_resource_fee_charged,
255                            ),
256                        }
257                    } else {
258                        (DEFAULT_RESOURCE_FEE, DEFAULT_RESOURCE_FEE)
259                    }
260                }
261            };
262
263        (
264            non_refundable_resource_fee_charged,
265            refundable_resource_fee_charged,
266        )
267    }
268
269    fn should_include_resource_fees(&self) -> bool {
270        self.charged.resource_fee != 0 || self.proposed.resource_fee != 0
271    }
272
273    fn estimated_refunded_resource_fee(&self) -> i64 {
274        self.proposed.resource_fee - self.charged.non_refundable_resource_fee
275    }
276
277    fn refunded(&self) -> i64 {
278        self.proposed.fee - self.charged.fee
279    }
280
281    pub fn table(&self) -> String {
282        let mut rows = self.proposed_rows();
283        rows.push(vec![("👆 Proposed Fee  👇 Final Fee".to_string(), 4, true)]);
284        rows.extend(self.charged_rows());
285        render_span_table(&rows, 4)
286    }
287
288    fn proposed_rows(&self) -> Vec<Vec<(String, usize, bool)>> {
289        vec![
290            vec![(
291                format!("{FEE_PROPOSED_TITLE}: {}", self.proposed.fee),
292                4,
293                false,
294            )],
295            vec![
296                (
297                    format!("{INCLUSION_FEE_TITLE}: {}", self.proposed.inclusion_fee),
298                    1,
299                    false,
300                ),
301                (
302                    format!("{RESOURCE_FEE_TITLE}: {}", self.proposed.resource_fee),
303                    3,
304                    false,
305                ),
306            ],
307            vec![
308                (
309                    format!("{INCLUSION_FEE_TITLE}: {}", self.proposed.inclusion_fee),
310                    1,
311                    false,
312                ),
313                (
314                    format!(
315                        "{NON_REFUNDABLE_TITLE}: {}{}",
316                        self.charged.non_refundable_resource_fee,
317                        non_refundable_components()
318                    ),
319                    1,
320                    false,
321                ),
322                (
323                    format!(
324                        "{REFUNDABLE_TITLE}: {}{}",
325                        self.estimated_refunded_resource_fee(),
326                        refundable_components()
327                    ),
328                    2,
329                    false,
330                ),
331            ],
332        ]
333    }
334
335    fn charged_rows(&self) -> Vec<Vec<(String, usize, bool)>> {
336        let refunded = format!("{REFUNDED_TITLE}: {}", self.refunded());
337        let mut rows = Vec::new();
338        if self.should_include_resource_fees() {
339            rows.push(vec![
340                (
341                    format!(
342                        "{INCLUSION_FEE_CHARGED_TITLE}: {}",
343                        self.charged.inclusion_fee
344                    ),
345                    1,
346                    false,
347                ),
348                (
349                    format!(
350                        "{NON_REFUNDABLE_CHARGED_TITLE}: {}",
351                        self.charged.non_refundable_resource_fee
352                    ),
353                    1,
354                    false,
355                ),
356                (
357                    format!(
358                        "{REFUNDABLE_CHARGED_TITLE}: {}",
359                        self.charged.refundable_resource_fee
360                    ),
361                    1,
362                    false,
363                ),
364                (refunded.clone(), 1, false),
365            ]);
366            rows.push(vec![
367                (
368                    format!(
369                        "{INCLUSION_FEE_CHARGED_TITLE}: {}",
370                        self.charged.inclusion_fee
371                    ),
372                    1,
373                    false,
374                ),
375                (
376                    format!(
377                        "{RESOURCE_FEE_CHARGED_TITLE}: {}",
378                        self.charged.resource_fee
379                    ),
380                    2,
381                    false,
382                ),
383                (refunded.clone(), 1, false),
384            ]);
385        }
386        rows.push(vec![
387            (
388                format!("{FEE_CHARGED_TITLE}: {}", self.charged.fee),
389                3,
390                false,
391            ),
392            (refunded, 1, false),
393        ]);
394        rows
395    }
396
397    pub fn print(&self) {
398        print!("{}", self.table());
399    }
400}
401
402// Each row is a list of (content, col_span, centered).
403// All rows share the same n_cols logical columns.
404fn render_span_table(rows: &[Vec<(String, usize, bool)>], n_cols: usize) -> String {
405    const PAD: usize = 1;
406
407    let widths = span_col_widths(rows, n_cols, PAD);
408    let inner: usize = widths.iter().sum::<usize>() + (n_cols - 1);
409
410    let border = |l: char, r: char| format!("{l}{}{r}\n", "─".repeat(inner));
411
412    let mut out = border('┌', '┐');
413
414    for (i, row) in rows.iter().enumerate() {
415        let cells: Vec<(Vec<&str>, usize, bool)> = row
416            .iter()
417            .map(|(s, span, c)| (s.lines().collect(), *span, *c))
418            .collect();
419
420        let height = cells.iter().map(|(ls, _, _)| ls.len()).max().unwrap_or(1);
421
422        for line_i in 0..height {
423            out.push('│');
424            let mut col = 0;
425            for (lines, span, centered) in &cells {
426                let cw: usize = widths[col..col + span].iter().sum::<usize>() + span - 1;
427                let text = lines.get(line_i).copied().unwrap_or("");
428                let tw = str_display_width(text);
429
430                if *centered {
431                    let space = cw.saturating_sub(tw + 2 * PAD);
432                    let lpad = PAD + space / 2;
433                    let rpad = cw.saturating_sub(lpad + tw);
434                    out.push_str(&" ".repeat(lpad));
435                    out.push_str(text);
436                    out.push_str(&" ".repeat(rpad));
437                } else {
438                    out.push(' ');
439                    out.push_str(text);
440                    out.push_str(&" ".repeat(cw.saturating_sub(1 + tw)));
441                }
442
443                col += span;
444                if col < n_cols {
445                    out.push('│');
446                }
447            }
448            out.push_str("│\n");
449        }
450
451        let (l, r) = if i == rows.len() - 1 {
452            ('└', '┘')
453        } else {
454            ('├', '┤')
455        };
456        out.push_str(&border(l, r));
457    }
458
459    out
460}
461
462fn span_col_widths(rows: &[Vec<(String, usize, bool)>], n_cols: usize, pad: usize) -> Vec<usize> {
463    let mut widths = vec![0usize; n_cols];
464
465    // First pass: single-column cells set minimum widths.
466    for row in rows {
467        let mut col = 0;
468        for (content, span, _) in row {
469            if *span == 1 {
470                let w = content.lines().map(str_display_width).max().unwrap_or(0);
471                widths[col] = widths[col].max(w + 2 * pad);
472            }
473            col += span;
474        }
475    }
476
477    // Second pass: spanning cells expand the last column in their span if needed.
478    for row in rows {
479        let mut col = 0;
480        for (content, span, _) in row {
481            if *span > 1 && col + span <= n_cols {
482                let available: usize = widths[col..col + span].iter().sum::<usize>() + span - 1;
483                let needed = content.lines().map(str_display_width).max().unwrap_or(0) + 2 * pad;
484                if needed > available {
485                    widths[col + span - 1] += needed - available;
486                }
487            }
488            col += span;
489        }
490    }
491
492    widths
493}
494
495// Returns the display width of a string, counting wide chars (emoji, CJK) as 2
496// and skipping ANSI escape sequences.
497fn str_display_width(s: &str) -> usize {
498    let mut width = 0;
499    let mut chars = s.chars();
500    while let Some(c) = chars.next() {
501        if c == '\x1b' {
502            for c2 in chars.by_ref() {
503                if c2 == 'm' {
504                    break;
505                }
506            }
507        } else {
508            width += match c as u32 {
509                0x1100..=0x115F
510                | 0x2E80..=0x303F
511                | 0x3041..=0x33FF
512                | 0xFF00..=0xFF60
513                | 0xFFE0..=0xFFE6
514                | 0x1F000..=0x1FFFF => 2,
515                _ => 1,
516            };
517        }
518    }
519    width
520}
521
522#[cfg(test)]
523mod test {
524    use soroban_rpc::GetTransactionResponse;
525
526    use super::*;
527
528    #[test]
529    fn soroban_tx() {
530        let resp = soroban_tx_response().unwrap();
531        let fee_table = FeeTable::new_from_transaction_response(&resp).unwrap();
532
533        let proposed_fee = 105_447;
534        let proposed_resource_fee = 105_347;
535        let expected_proposed_fees = ProposedFees {
536            fee: proposed_fee,
537            resource_fee: proposed_resource_fee,
538            inclusion_fee: proposed_fee - proposed_resource_fee,
539        };
540        assert_eq!(fee_table.proposed, expected_proposed_fees);
541
542        let charged_fee = 60_537;
543        let non_refundable_resource_fee_charged = 60_358;
544        let refundable_resource_fee_charged = 79;
545        let full_resource_fee_charged =
546            non_refundable_resource_fee_charged + refundable_resource_fee_charged;
547        let inclusion_fee_charged = charged_fee - full_resource_fee_charged;
548        let expected_charged_fees = ChargedFees {
549            fee: charged_fee,
550            resource_fee: full_resource_fee_charged,
551            inclusion_fee: inclusion_fee_charged,
552            non_refundable_resource_fee: non_refundable_resource_fee_charged,
553            refundable_resource_fee: refundable_resource_fee_charged,
554        };
555        assert_eq!(fee_table.charged, expected_charged_fees);
556
557        assert!(fee_table.should_include_resource_fees());
558
559        let expected_estimated_refund = proposed_resource_fee - non_refundable_resource_fee_charged;
560        assert_eq!(
561            fee_table.estimated_refunded_resource_fee(),
562            expected_estimated_refund
563        );
564
565        let refund = proposed_fee - charged_fee;
566        assert_eq!(fee_table.refunded(), refund);
567    }
568
569    #[test]
570    fn classic_tx() {
571        let resp = classic_tx_response().unwrap();
572        let fee_table = FeeTable::new_from_transaction_response(&resp).unwrap();
573
574        let proposed_fee = 100;
575        let proposed_resource_fee = DEFAULT_RESOURCE_FEE;
576        let expected_proposed_fees = ProposedFees {
577            fee: proposed_fee,
578            resource_fee: proposed_resource_fee,
579            inclusion_fee: proposed_fee - proposed_resource_fee,
580        };
581        assert_eq!(fee_table.proposed, expected_proposed_fees);
582
583        let charged_fee = 100;
584        let non_refundable_resource_fee_charged = DEFAULT_RESOURCE_FEE;
585        let refundable_resource_fee_charged = DEFAULT_RESOURCE_FEE;
586        let full_resource_fee_charged =
587            non_refundable_resource_fee_charged + refundable_resource_fee_charged;
588        let inclusion_fee_charged = charged_fee - full_resource_fee_charged;
589        let expected_charged_fees = ChargedFees {
590            fee: charged_fee,
591            resource_fee: full_resource_fee_charged,
592            inclusion_fee: inclusion_fee_charged,
593            non_refundable_resource_fee: non_refundable_resource_fee_charged,
594            refundable_resource_fee: refundable_resource_fee_charged,
595        };
596        assert_eq!(fee_table.charged, expected_charged_fees);
597
598        assert!(!fee_table.should_include_resource_fees());
599    }
600
601    #[test]
602    fn fee_bump_wrapping_classic_tx() {
603        let resp = fee_bump_wrapping_classic_tx_response().unwrap();
604        let fee_table = FeeTable::new_from_transaction_response(&resp).unwrap();
605
606        let proposed_fee = 400;
607        let proposed_resource_fee = DEFAULT_RESOURCE_FEE;
608        let expected_proposed_fees = ProposedFees {
609            fee: proposed_fee,
610            resource_fee: proposed_resource_fee,
611            inclusion_fee: proposed_fee - proposed_resource_fee,
612        };
613        assert_eq!(fee_table.proposed, expected_proposed_fees);
614
615        let charged_fee = 200;
616        let non_refundable_resource_fee_charged = DEFAULT_RESOURCE_FEE;
617        let refundable_resource_fee_charged = DEFAULT_RESOURCE_FEE;
618        let full_resource_fee_charged =
619            non_refundable_resource_fee_charged + refundable_resource_fee_charged;
620        let inclusion_fee_charged = charged_fee - full_resource_fee_charged;
621        let expected_charged_fees = ChargedFees {
622            fee: charged_fee,
623            resource_fee: full_resource_fee_charged,
624            inclusion_fee: inclusion_fee_charged,
625            non_refundable_resource_fee: non_refundable_resource_fee_charged,
626            refundable_resource_fee: refundable_resource_fee_charged,
627        };
628        assert_eq!(fee_table.charged, expected_charged_fees);
629
630        assert!(!fee_table.should_include_resource_fees());
631    }
632
633    #[test]
634    fn fee_bump_wrapping_soroban_tx() {
635        let resp = fee_bump_wrapping_soroban_tx_response().unwrap();
636        let fee_table = FeeTable::new_from_transaction_response(&resp).unwrap();
637
638        let proposed_fee = 10_208_876;
639        let proposed_inner_tx_resource_fee = 5_004_438;
640        let expected_proposed_fees = ProposedFees {
641            fee: proposed_fee,
642            resource_fee: proposed_inner_tx_resource_fee,
643            inclusion_fee: proposed_fee - proposed_inner_tx_resource_fee,
644        };
645        assert_eq!(fee_table.proposed, expected_proposed_fees);
646
647        let charged_fee = 3_603_030;
648        let non_refundable_resource_fee_charged = 285_226;
649        let refundable_resource_fee_charged = 3_317_604;
650        let full_resource_fee_charged =
651            non_refundable_resource_fee_charged + refundable_resource_fee_charged;
652        let inclusion_fee_charged = charged_fee - full_resource_fee_charged;
653        let expected_charged_fees = ChargedFees {
654            fee: charged_fee,
655            resource_fee: full_resource_fee_charged,
656            inclusion_fee: inclusion_fee_charged,
657            non_refundable_resource_fee: non_refundable_resource_fee_charged,
658            refundable_resource_fee: refundable_resource_fee_charged,
659        };
660        assert_eq!(fee_table.charged, expected_charged_fees);
661
662        assert!(fee_table.should_include_resource_fees());
663    }
664
665    fn soroban_tx_response() -> Result<GetTransactionResponse, serde_json::Error> {
666        serde_json::from_str(SOROBAN_TX_RESPONSE)
667    }
668
669    fn classic_tx_response() -> Result<GetTransactionResponse, serde_json::Error> {
670        serde_json::from_str(CLASSIC_TX_RESPONSE)
671    }
672
673    fn fee_bump_wrapping_classic_tx_response() -> Result<GetTransactionResponse, serde_json::Error>
674    {
675        serde_json::from_str(FEE_BUMP_WRAPPING_CLASSIC_TX_RESPONSE)
676    }
677
678    fn fee_bump_wrapping_soroban_tx_response() -> Result<GetTransactionResponse, serde_json::Error>
679    {
680        serde_json::from_str(FEE_BUMP_WRAPPING_SOROBAN_TX_RESPONSE)
681    }
682
683    const SOROBAN_TX_RESPONSE: &str = r#"{"status":"SUCCESS","envelope":{"tx":{"tx":{"source_account":"GDWREJ5HETNIDTQKXJZPA6LRSJMFUCO4T2DFEJYSZ2XVWRTMUG64AL4B","fee":105447,"seq_num":"2062499130114054","cond":"none","memo":"none","operations":[{"source_account":null,"body":{"invoke_host_function":{"host_function":{"invoke_contract":{"contract_address":"CCFNZO33IO6GDTPLWWRJ5F34UBXEBOSYGSQJJGVLAJNNULU26CRZR6TM","function_name":"inc","args":[]}},"auth":[]}}}],"ext":{"v1":{"ext":"v0","resources":{"footprint":{"read_only":[{"contract_data":{"contract":"CCFNZO33IO6GDTPLWWRJ5F34UBXEBOSYGSQJJGVLAJNNULU26CRZR6TM","key":"ledger_key_contract_instance","durability":"persistent"}},{"contract_code":{"hash":"2a41e16cb574fc372ee81f02c1d775365d9d39002cc630bd162a4dcaeb153161"}}],"read_write":[{"contract_data":{"contract":"CCFNZO33IO6GDTPLWWRJ5F34UBXEBOSYGSQJJGVLAJNNULU26CRZR6TM","key":{"symbol":"COUNTER"},"durability":"persistent"}}]},"instructions":2099865,"disk_read_bytes":8008,"write_bytes":80},"resource_fee":"105347"}}},"signatures":[{"hint":"6ca1bdc0","signature":"b8120310a5db9b5fd295f00d9fd7ebc26e34d14b27a00a5827aa89a18027fb7d69fb1b11e3b6408885602627b228256fde049aee2045fea7d088327302e4ea04"}]}},"result":{"fee_charged":"60537","result":{"tx_success":[{"op_inner":{"invoke_host_function":{"success":"e18456c437deb4d21dceee8db938ac8bcea25405af8df02d9225104e5d53e185"}}}]},"ext":"v0"},"result_meta":{"v3":{"ext":"v0","tx_changes_before":[{"state":{"last_modified_ledger_seq":480745,"data":{"account":{"account_id":"GDWREJ5HETNIDTQKXJZPA6LRSJMFUCO4T2DFEJYSZ2XVWRTMUG64AL4B","balance":"99907097552","seq_num":"2062499130114053","num_sub_entries":1,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":"0","selling":"0"},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":0,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":480418,"seq_time":"1752671669"}}}}}}}},"ext":"v0"}},{"updated":{"last_modified_ledger_seq":480745,"data":{"account":{"account_id":"GDWREJ5HETNIDTQKXJZPA6LRSJMFUCO4T2DFEJYSZ2XVWRTMUG64AL4B","balance":"99907097552","seq_num":"2062499130114054","num_sub_entries":1,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":"0","selling":"0"},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":0,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":480745,"seq_time":"1752673305"}}}}}}}},"ext":"v0"}}],"operations":[{"changes":[{"state":{"last_modified_ledger_seq":480290,"data":{"contract_data":{"ext":"v0","contract":"CCFNZO33IO6GDTPLWWRJ5F34UBXEBOSYGSQJJGVLAJNNULU26CRZR6TM","key":{"symbol":"COUNTER"},"durability":"persistent","val":{"u32":2}}},"ext":"v0"}},{"updated":{"last_modified_ledger_seq":480745,"data":{"contract_data":{"ext":"v0","contract":"CCFNZO33IO6GDTPLWWRJ5F34UBXEBOSYGSQJJGVLAJNNULU26CRZR6TM","key":{"symbol":"COUNTER"},"durability":"persistent","val":{"u32":3}}},"ext":"v0"}}]}],"tx_changes_after":[{"state":{"last_modified_ledger_seq":480745,"data":{"account":{"account_id":"GDWREJ5HETNIDTQKXJZPA6LRSJMFUCO4T2DFEJYSZ2XVWRTMUG64AL4B","balance":"99907097552","seq_num":"2062499130114054","num_sub_entries":1,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":"0","selling":"0"},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":0,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":480745,"seq_time":"1752673305"}}}}}}}},"ext":"v0"}},{"updated":{"last_modified_ledger_seq":480745,"data":{"account":{"account_id":"GDWREJ5HETNIDTQKXJZPA6LRSJMFUCO4T2DFEJYSZ2XVWRTMUG64AL4B","balance":"99907142462","seq_num":"2062499130114054","num_sub_entries":1,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":"0","selling":"0"},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":0,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":480745,"seq_time":"1752673305"}}}}}}}},"ext":"v0"}}],"soroban_meta":{"ext":{"v1":{"ext":"v0","total_non_refundable_resource_fee_charged":"60358","total_refundable_resource_fee_charged":"79","rent_fee_charged":"0"}},"events":[],"return_value":{"u32":3},"diagnostic_events":[{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"fn_call"},{"bytes":"8adcbb7b43bc61cdebb5a29e977ca06e40ba5834a0949aab025ada2e9af0a398"},{"symbol":"inc"}],"data":"void"}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":"CCFNZO33IO6GDTPLWWRJ5F34UBXEBOSYGSQJJGVLAJNNULU26CRZR6TM","type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"log"}],"data":{"vec":[{"string":"count: {}"},{"u32":2}]}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":"CCFNZO33IO6GDTPLWWRJ5F34UBXEBOSYGSQJJGVLAJNNULU26CRZR6TM","type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"fn_return"},{"symbol":"inc"}],"data":{"u32":3}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"read_entry"}],"data":{"u64":"6"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"write_entry"}],"data":{"u64":"1"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"ledger_read_byte"}],"data":{"u64":"8008"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"ledger_write_byte"}],"data":{"u64":"80"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"read_key_byte"}],"data":{"u64":"144"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"write_key_byte"}],"data":{"u64":"0"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"read_data_byte"}],"data":{"u64":"184"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"write_data_byte"}],"data":{"u64":"80"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"read_code_byte"}],"data":{"u64":"7824"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"write_code_byte"}],"data":{"u64":"0"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"emit_event"}],"data":{"u64":"0"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"emit_event_byte"}],"data":{"u64":"8"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"cpu_insn"}],"data":{"u64":"2006689"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"mem_byte"}],"data":{"u64":"1492062"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"invoke_time_nsecs"}],"data":{"u64":"561706"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"max_rw_key_byte"}],"data":{"u64":"60"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"max_rw_data_byte"}],"data":{"u64":"104"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"max_rw_code_byte"}],"data":{"u64":"7824"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"max_emit_event_byte"}],"data":{"u64":"0"}}}}}]}}},"events":{"contract_events":[],"diagnostic_events":[{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"fn_call"},{"bytes":"8adcbb7b43bc61cdebb5a29e977ca06e40ba5834a0949aab025ada2e9af0a398"},{"symbol":"inc"}],"data":"void"}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":"CCFNZO33IO6GDTPLWWRJ5F34UBXEBOSYGSQJJGVLAJNNULU26CRZR6TM","type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"log"}],"data":{"vec":[{"string":"count: {}"},{"u32":2}]}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":"CCFNZO33IO6GDTPLWWRJ5F34UBXEBOSYGSQJJGVLAJNNULU26CRZR6TM","type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"fn_return"},{"symbol":"inc"}],"data":{"u32":3}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"read_entry"}],"data":{"u64":"6"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"write_entry"}],"data":{"u64":"1"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"ledger_read_byte"}],"data":{"u64":"8008"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"ledger_write_byte"}],"data":{"u64":"80"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"read_key_byte"}],"data":{"u64":"144"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"write_key_byte"}],"data":{"u64":"0"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"read_data_byte"}],"data":{"u64":"184"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"write_data_byte"}],"data":{"u64":"80"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"read_code_byte"}],"data":{"u64":"7824"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"write_code_byte"}],"data":{"u64":"0"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"emit_event"}],"data":{"u64":"0"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"emit_event_byte"}],"data":{"u64":"8"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"cpu_insn"}],"data":{"u64":"2006689"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"mem_byte"}],"data":{"u64":"1492062"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"invoke_time_nsecs"}],"data":{"u64":"561706"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"max_rw_key_byte"}],"data":{"u64":"60"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"max_rw_data_byte"}],"data":{"u64":"104"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"max_rw_code_byte"}],"data":{"u64":"7824"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"max_emit_event_byte"}],"data":{"u64":"0"}}}}}],"transaction_events":[]}}"#;
684
685    const CLASSIC_TX_RESPONSE: &str = r#"{"status":"SUCCESS","envelope":{"tx":{"tx":{"source_account":"GDWREJ5HETNIDTQKXJZPA6LRSJMFUCO4T2DFEJYSZ2XVWRTMUG64AL4B","fee":100,"seq_num":"2062499130114053","cond":"none","memo":"none","operations":[{"source_account":null,"body":{"manage_data":{"data_name":"test","data_value":"abcdef"}}}],"ext":"v0"},"signatures":[{"hint":"6ca1bdc0","signature":"a12761eee624d0a15f731b6e63201c55978d714a28d167e80441092afb11a06549056199e589ff511d376299782cde796169a1781b7ecad93cbe68ac3a768d05"}]}},"result":{"fee_charged":"100","result":{"tx_success":[{"op_inner":{"manage_data":"success"}}]},"ext":"v0"},"result_meta":{"v3":{"ext":"v0","tx_changes_before":[{"state":{"last_modified_ledger_seq":480418,"data":{"account":{"account_id":"GDWREJ5HETNIDTQKXJZPA6LRSJMFUCO4T2DFEJYSZ2XVWRTMUG64AL4B","balance":"99907202999","seq_num":"2062499130114052","num_sub_entries":0,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":"0","selling":"0"},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":0,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":480290,"seq_time":"1752671028"}}}}}}}},"ext":"v0"}},{"updated":{"last_modified_ledger_seq":480418,"data":{"account":{"account_id":"GDWREJ5HETNIDTQKXJZPA6LRSJMFUCO4T2DFEJYSZ2XVWRTMUG64AL4B","balance":"99907202999","seq_num":"2062499130114053","num_sub_entries":0,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":"0","selling":"0"},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":0,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":480418,"seq_time":"1752671669"}}}}}}}},"ext":"v0"}}],"operations":[{"changes":[{"created":{"last_modified_ledger_seq":480418,"data":{"data":{"account_id":"GDWREJ5HETNIDTQKXJZPA6LRSJMFUCO4T2DFEJYSZ2XVWRTMUG64AL4B","data_name":"test","data_value":"abcdef","ext":"v0"}},"ext":"v0"}},{"state":{"last_modified_ledger_seq":480418,"data":{"account":{"account_id":"GDWREJ5HETNIDTQKXJZPA6LRSJMFUCO4T2DFEJYSZ2XVWRTMUG64AL4B","balance":"99907202999","seq_num":"2062499130114053","num_sub_entries":0,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":"0","selling":"0"},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":0,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":480418,"seq_time":"1752671669"}}}}}}}},"ext":"v0"}},{"updated":{"last_modified_ledger_seq":480418,"data":{"account":{"account_id":"GDWREJ5HETNIDTQKXJZPA6LRSJMFUCO4T2DFEJYSZ2XVWRTMUG64AL4B","balance":"99907202999","seq_num":"2062499130114053","num_sub_entries":1,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":"0","selling":"0"},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":0,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":480418,"seq_time":"1752671669"}}}}}}}},"ext":"v0"}}]}],"tx_changes_after":[],"soroban_meta":null}},"events":{"contract_events":[],"diagnostic_events":[],"transaction_events":[]}}"#;
686
687    const FEE_BUMP_WRAPPING_CLASSIC_TX_RESPONSE: &str = r#"{"status":"SUCCESS","envelope":{"tx_fee_bump":{"tx":{"fee_source":"GD5EJEGJM5PWKZ4WBJFMTHHY3VNUDJDU55N24ODPIPNYKBRRJCCIA44P","fee":"400","inner_tx":{"tx":{"tx":{"source_account":"GDWREJ5HETNIDTQKXJZPA6LRSJMFUCO4T2DFEJYSZ2XVWRTMUG64AL4B","fee":100,"seq_num":"2062499130114055","cond":{"time":{"min_time":"0","max_time":"1752675654"}},"memo":"none","operations":[{"source_account":null,"body":{"payment":{"destination":"GDBFMEGF2EVTNISNTYVOOYGXAEP5A353YJCPDRGUH3L6GMIDATR4BWY6","asset":"native","amount":"100000000"}}}],"ext":"v0"},"signatures":[{"hint":"6ca1bdc0","signature":"ce5f19bac1e1a57f6f54a7d4f5729fd2db8755dac425fd61220111e3d4436dfd52e9f0f0098ea0c07fc3e65c69f19f7d1f440adc7fa9937662bd9268fb7cb00c"}]}},"ext":"v0"},"signatures":[{"hint":"31488480","signature":"789b8261c481532c7f8933ed1b32d9fb270d9acc044774dda1986f20aba8248592975f25eec1aabe374978fcc10a19b9797c834d686465a4d225b01d0c57020e"}]}},"result":{"fee_charged":"200","result":{"tx_fee_bump_inner_success":{"transaction_hash":"b6b9591c8c00d1aa9212ef0345e6b1ccd56f9a362e463a1f6237423d09dbcab8","result":{"fee_charged":"100","result":{"tx_success":[{"op_inner":{"payment":"success"}}]},"ext":"v0"}}},"ext":"v0"},"result_meta":{"v3":{"ext":"v0","tx_changes_before":[{"state":{"last_modified_ledger_seq":481209,"data":{"account":{"account_id":"GD5EJEGJM5PWKZ4WBJFMTHHY3VNUDJDU55N24ODPIPNYKBRRJCCIA44P","balance":"99999999800","seq_num":"2065887859310592","num_sub_entries":0,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":"v0"}},"ext":"v0"}},{"updated":{"last_modified_ledger_seq":481209,"data":{"account":{"account_id":"GD5EJEGJM5PWKZ4WBJFMTHHY3VNUDJDU55N24ODPIPNYKBRRJCCIA44P","balance":"99999999800","seq_num":"2065887859310592","num_sub_entries":0,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":"v0"}},"ext":"v0"}},{"state":{"last_modified_ledger_seq":481027,"data":{"account":{"account_id":"GDWREJ5HETNIDTQKXJZPA6LRSJMFUCO4T2DFEJYSZ2XVWRTMUG64AL4B","balance":"199907142462","seq_num":"2062499130114054","num_sub_entries":1,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":"0","selling":"0"},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":0,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":480745,"seq_time":"1752673305"}}}}}}}},"ext":"v0"}},{"updated":{"last_modified_ledger_seq":481209,"data":{"account":{"account_id":"GDWREJ5HETNIDTQKXJZPA6LRSJMFUCO4T2DFEJYSZ2XVWRTMUG64AL4B","balance":"199907142462","seq_num":"2062499130114055","num_sub_entries":1,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":"0","selling":"0"},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":0,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":481209,"seq_time":"1752675627"}}}}}}}},"ext":"v0"}}],"operations":[{"changes":[{"state":{"last_modified_ledger_seq":481209,"data":{"account":{"account_id":"GDWREJ5HETNIDTQKXJZPA6LRSJMFUCO4T2DFEJYSZ2XVWRTMUG64AL4B","balance":"199907142462","seq_num":"2062499130114055","num_sub_entries":1,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":"0","selling":"0"},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":0,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":481209,"seq_time":"1752675627"}}}}}}}},"ext":"v0"}},{"updated":{"last_modified_ledger_seq":481209,"data":{"account":{"account_id":"GDWREJ5HETNIDTQKXJZPA6LRSJMFUCO4T2DFEJYSZ2XVWRTMUG64AL4B","balance":"199807142462","seq_num":"2062499130114055","num_sub_entries":1,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":"0","selling":"0"},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":0,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":481209,"seq_time":"1752675627"}}}}}}}},"ext":"v0"}},{"state":{"last_modified_ledger_seq":481014,"data":{"account":{"account_id":"GDBFMEGF2EVTNISNTYVOOYGXAEP5A353YJCPDRGUH3L6GMIDATR4BWY6","balance":"100000000000","seq_num":"2065939398918144","num_sub_entries":0,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":"v0"}},"ext":"v0"}},{"updated":{"last_modified_ledger_seq":481209,"data":{"account":{"account_id":"GDBFMEGF2EVTNISNTYVOOYGXAEP5A353YJCPDRGUH3L6GMIDATR4BWY6","balance":"100100000000","seq_num":"2065939398918144","num_sub_entries":0,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":"v0"}},"ext":"v0"}}]}],"tx_changes_after":[],"soroban_meta":null}},"events":{"contract_events":[],"diagnostic_events":[],"transaction_events":[]}}"#;
688
689    const FEE_BUMP_WRAPPING_SOROBAN_TX_RESPONSE: &str = r#"{"status":"SUCCESS","envelope":{"tx_fee_bump":{"tx":{"fee_source":"GDJLH2F7DBI6GC22J7YUTPAEFRSWKG5MN5RSE2GOOYUTO4BH66LHENRW","fee":"10208876","inner_tx":{"tx":{"tx":{"source_account":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK","fee":5004538,"seq_num":"244204891193475075","cond":"none","memo":"none","operations":[{"source_account":null,"body":{"invoke_host_function":{"host_function":{"invoke_contract":{"contract_address":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP","function_name":"submit","args":[{"address":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK"},{"address":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK"},{"address":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK"},{"vec":[{"map":[{"key":{"symbol":"address"},"val":{"address":"CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75"}},{"key":{"symbol":"amount"},"val":{"i128":"10000990"}},{"key":{"symbol":"request_type"},"val":{"u32":3}}]}]}]}},"auth":[{"credentials":"source_account","root_invocation":{"function":{"contract_fn":{"contract_address":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP","function_name":"submit","args":[{"address":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK"},{"address":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK"},{"address":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK"},{"vec":[{"map":[{"key":{"symbol":"address"},"val":{"address":"CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75"}},{"key":{"symbol":"amount"},"val":{"i128":"10000990"}},{"key":{"symbol":"request_type"},"val":{"u32":3}}]}]}]}},"sub_invocations":[]}}]}}}],"ext":{"v1":{"ext":"v0","resources":{"footprint":{"read_only":[{"contract_data":{"contract":"CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75","key":"ledger_key_contract_instance","durability":"persistent"}},{"contract_data":{"contract":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP","key":{"vec":[{"symbol":"EmisConfig"},{"u32":3}]},"durability":"persistent"}},{"contract_data":{"contract":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP","key":{"vec":[{"symbol":"EmisData"},{"u32":3}]},"durability":"persistent"}},{"contract_data":{"contract":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP","key":{"vec":[{"symbol":"ResConfig"},{"address":"CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75"}]},"durability":"persistent"}},{"contract_data":{"contract":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP","key":"ledger_key_contract_instance","durability":"persistent"}},{"contract_code":{"hash":"baf978f10efdbcd85747868bef8832845ea6809f7643b67a4ac0cd669327fc2c"}}],"read_write":[{"trustline":{"account_id":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK","asset":{"credit_alphanum4":{"asset_code":"USDC","issuer":"GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN"}}}},{"contract_data":{"contract":"CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75","key":{"vec":[{"symbol":"Balance"},{"address":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP"}]},"durability":"persistent"}},{"contract_data":{"contract":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP","key":{"vec":[{"symbol":"Positions"},{"address":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK"}]},"durability":"persistent"}},{"contract_data":{"contract":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP","key":{"vec":[{"symbol":"ResData"},{"address":"CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75"}]},"durability":"persistent"}},{"contract_data":{"contract":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP","key":{"vec":[{"symbol":"UserEmis"},{"map":[{"key":{"symbol":"reserve_id"},"val":{"u32":3}},{"key":{"symbol":"user"},"val":{"address":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK"}}]}]},"durability":"persistent"}}]},"instructions":9237256,"disk_read_bytes":53060,"write_bytes":1276},"resource_fee":"5004438"}}},"signatures":[{"hint":"f291f849","signature":"3cc2da7de9df730b23ffa8a26ddfe180aa4b8eef3e251c6f05972984a659a729f1cea6396c806cce57dc66d070e588708021dfd6dc510454355bd9ce3be55500"}]}},"ext":"v0"},"signatures":[{"hint":"27f79672","signature":"f5985e8d0d8d1acc1e9862418ad09da9ec9607327362a887ee8fd805d362bcd97dee470c8f604cf5e4acbf161be4e79ece729333ba39f126d64781ecbe763202"}]}},"result":{"fee_charged":"3603030","result":{"tx_fee_bump_inner_success":{"transaction_hash":"0d2bdcf1532b215a81730267d6a7cd444127b19bdb435a568543890951a95d78","result":{"fee_charged":"3602930","result":{"tx_success":[{"op_inner":{"invoke_host_function":{"success":"1437b07cfee492dc5c26ccebe96fcab3c8a96b9a0e29d2b804095d6cc8e2f89d"}}}]},"ext":"v0"}}},"ext":"v0"},"result_meta":{"v3":{"ext":"v0","tx_changes_before":[{"state":{"last_modified_ledger_seq":58166971,"data":{"account":{"account_id":"GDJLH2F7DBI6GC22J7YUTPAEFRSWKG5MN5RSE2GOOYUTO4BH66LHENRW","balance":"22097264303","seq_num":"181263292226863151","num_sub_entries":4,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":"0","selling":"0"},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":2,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":56604244,"seq_time":"1744587782"}}}}}}}},"ext":"v0"}},{"updated":{"last_modified_ledger_seq":58166971,"data":{"account":{"account_id":"GDJLH2F7DBI6GC22J7YUTPAEFRSWKG5MN5RSE2GOOYUTO4BH66LHENRW","balance":"22097264303","seq_num":"181263292226863151","num_sub_entries":4,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":"0","selling":"0"},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":2,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":56604244,"seq_time":"1744587782"}}}}}}}},"ext":"v0"}},{"state":{"last_modified_ledger_seq":56858638,"data":{"account":{"account_id":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK","balance":"0","seq_num":"244204891193475074","num_sub_entries":4,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"00141414","signers":[{"key":"GCO6RBY3BSJ77Y77TUXV2O5AV5E5WHAKRVMFDBHHX4H4KSKPVMICFKT4","weight":10},{"key":"GDG2THNO7333WXJU2ZMFAIDYEMJHWLHZLAJ6ZEV2QPWPWT7SSH4ETPIW","weight":20},{"key":"GDRWVPEIZK3YDKSLFPY4I4S2FOFZ6SJIRTUHTFN4NZGZTZGOIBRD4CT7","weight":10}],"ext":{"v1":{"liabilities":{"buying":"0","selling":"0"},"ext":{"v2":{"num_sponsored":6,"num_sponsoring":0,"signer_sponsoring_i_ds":["GBKAZKU33LRJX47UGDX2YGA7UIJ5BWSVAFQJLBAUYIMOS5KBPVXKGO4X","GCUISJEWU2TZ4QIJNGNVU4BSZ5CQS3KE6A3N3ETOV7XHCBVO4GLTLGOQ","GBKAZKU33LRJX47UGDX2YGA7UIJ5BWSVAFQJLBAUYIMOS5KBPVXKGO4X"],"ext":{"v3":{"ext":"v0","seq_ledger":56858638,"seq_time":"1746041747"}}}}}}}},"ext":{"v1":{"sponsoring_id":"GBKAZKU33LRJX47UGDX2YGA7UIJ5BWSVAFQJLBAUYIMOS5KBPVXKGO4X","ext":"v0"}}}},{"updated":{"last_modified_ledger_seq":58166971,"data":{"account":{"account_id":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK","balance":"0","seq_num":"244204891193475075","num_sub_entries":4,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"00141414","signers":[{"key":"GCO6RBY3BSJ77Y77TUXV2O5AV5E5WHAKRVMFDBHHX4H4KSKPVMICFKT4","weight":10},{"key":"GDG2THNO7333WXJU2ZMFAIDYEMJHWLHZLAJ6ZEV2QPWPWT7SSH4ETPIW","weight":20},{"key":"GDRWVPEIZK3YDKSLFPY4I4S2FOFZ6SJIRTUHTFN4NZGZTZGOIBRD4CT7","weight":10}],"ext":{"v1":{"liabilities":{"buying":"0","selling":"0"},"ext":{"v2":{"num_sponsored":6,"num_sponsoring":0,"signer_sponsoring_i_ds":["GBKAZKU33LRJX47UGDX2YGA7UIJ5BWSVAFQJLBAUYIMOS5KBPVXKGO4X","GCUISJEWU2TZ4QIJNGNVU4BSZ5CQS3KE6A3N3ETOV7XHCBVO4GLTLGOQ","GBKAZKU33LRJX47UGDX2YGA7UIJ5BWSVAFQJLBAUYIMOS5KBPVXKGO4X"],"ext":{"v3":{"ext":"v0","seq_ledger":58166971,"seq_time":"1753467627"}}}}}}}},"ext":{"v1":{"sponsoring_id":"GBKAZKU33LRJX47UGDX2YGA7UIJ5BWSVAFQJLBAUYIMOS5KBPVXKGO4X","ext":"v0"}}}}],"operations":[{"changes":[{"state":{"last_modified_ledger_seq":56858638,"data":{"contract_data":{"ext":"v0","contract":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP","key":{"vec":[{"symbol":"UserEmis"},{"map":[{"key":{"symbol":"reserve_id"},"val":{"u32":3}},{"key":{"symbol":"user"},"val":{"address":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK"}}]}]},"durability":"persistent","val":{"map":[{"key":{"symbol":"accrued"},"val":{"i128":"0"}},{"key":{"symbol":"index"},"val":{"i128":"16117732"}}]}}},"ext":"v0"}},{"updated":{"last_modified_ledger_seq":58166971,"data":{"contract_data":{"ext":"v0","contract":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP","key":{"vec":[{"symbol":"UserEmis"},{"map":[{"key":{"symbol":"reserve_id"},"val":{"u32":3}},{"key":{"symbol":"user"},"val":{"address":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK"}}]}]},"durability":"persistent","val":{"map":[{"key":{"symbol":"accrued"},"val":{"i128":"3595324"}},{"key":{"symbol":"index"},"val":{"i128":"20142282"}}]}}},"ext":"v0"}},{"state":{"last_modified_ledger_seq":58166528,"data":{"contract_data":{"ext":"v0","contract":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP","key":{"vec":[{"symbol":"ResData"},{"address":"CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75"}]},"durability":"persistent","val":{"map":[{"key":{"symbol":"b_rate"},"val":{"i128":"1119495346"}},{"key":{"symbol":"b_supply"},"val":{"i128":"650408667001"}},{"key":{"symbol":"backstop_credit"},"val":{"i128":"1347654276"}},{"key":{"symbol":"d_rate"},"val":{"i128":"1190401998"}},{"key":{"symbol":"d_supply"},"val":{"i128":"58684906655"}},{"key":{"symbol":"ir_mod"},"val":{"i128":"100000000"}},{"key":{"symbol":"last_time"},"val":{"u64":"1753465101"}}]}}},"ext":"v0"}},{"updated":{"last_modified_ledger_seq":58166971,"data":{"contract_data":{"ext":"v0","contract":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP","key":{"vec":[{"symbol":"ResData"},{"address":"CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75"}]},"durability":"persistent","val":{"map":[{"key":{"symbol":"b_rate"},"val":{"i128":"1119495371"}},{"key":{"symbol":"b_supply"},"val":{"i128":"650399733520"}},{"key":{"symbol":"backstop_credit"},"val":{"i128":"1347658442"}},{"key":{"symbol":"d_rate"},"val":{"i128":"1190402353"}},{"key":{"symbol":"d_supply"},"val":{"i128":"58684906655"}},{"key":{"symbol":"ir_mod"},"val":{"i128":"100000000"}},{"key":{"symbol":"last_time"},"val":{"u64":"1753467627"}}]}}},"ext":"v0"}},{"state":{"last_modified_ledger_seq":56858638,"data":{"ttl":{"key_hash":"ec31d93e482c805046d62dd73b28cca317660a98f88c191a59004c4c3f3f4445","live_until_ledger_seq":58932237}},"ext":"v0"}},{"updated":{"last_modified_ledger_seq":58166971,"data":{"ttl":{"key_hash":"ec31d93e482c805046d62dd73b28cca317660a98f88c191a59004c4c3f3f4445","live_until_ledger_seq":60240571}},"ext":"v0"}},{"state":{"last_modified_ledger_seq":56858638,"data":{"contract_data":{"ext":"v0","contract":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP","key":{"vec":[{"symbol":"Positions"},{"address":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK"}]},"durability":"persistent","val":{"map":[{"key":{"symbol":"collateral"},"val":{"map":[{"key":{"u32":1},"val":{"i128":"8933481"}}]}},{"key":{"symbol":"liabilities"},"val":{"map":[]}},{"key":{"symbol":"supply"},"val":{"map":[]}}]}}},"ext":"v0"}},{"updated":{"last_modified_ledger_seq":58166971,"data":{"contract_data":{"ext":"v0","contract":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP","key":{"vec":[{"symbol":"Positions"},{"address":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK"}]},"durability":"persistent","val":{"map":[{"key":{"symbol":"collateral"},"val":{"map":[]}},{"key":{"symbol":"liabilities"},"val":{"map":[]}},{"key":{"symbol":"supply"},"val":{"map":[]}}]}}},"ext":"v0"}},{"state":{"last_modified_ledger_seq":56858638,"data":{"ttl":{"key_hash":"23de831fb42c10fd3e52d2e5273666cc1ae375c7409df2c8c18c8dcbcebbc1d7","live_until_ledger_seq":58932237}},"ext":"v0"}},{"updated":{"last_modified_ledger_seq":58166971,"data":{"ttl":{"key_hash":"23de831fb42c10fd3e52d2e5273666cc1ae375c7409df2c8c18c8dcbcebbc1d7","live_until_ledger_seq":60240571}},"ext":"v0"}},{"state":{"last_modified_ledger_seq":58166528,"data":{"contract_data":{"ext":"v0","contract":"CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75","key":{"vec":[{"symbol":"Balance"},{"address":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP"}]},"durability":"persistent","val":{"map":[{"key":{"symbol":"amount"},"val":{"i128":"660267264555"}},{"key":{"symbol":"authorized"},"val":{"bool":true}},{"key":{"symbol":"clawback"},"val":{"bool":false}}]}}},"ext":"v0"}},{"updated":{"last_modified_ledger_seq":58166971,"data":{"contract_data":{"ext":"v0","contract":"CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75","key":{"vec":[{"symbol":"Balance"},{"address":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP"}]},"durability":"persistent","val":{"map":[{"key":{"symbol":"amount"},"val":{"i128":"660257263565"}},{"key":{"symbol":"authorized"},"val":{"bool":true}},{"key":{"symbol":"clawback"},"val":{"bool":false}}]}}},"ext":"v0"}},{"state":{"last_modified_ledger_seq":56858638,"data":{"trustline":{"account_id":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK","asset":{"credit_alphanum4":{"asset_code":"USDC","issuer":"GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN"}},"balance":"0","limit":"9223372036854775807","flags":1,"ext":"v0"}},"ext":{"v1":{"sponsoring_id":"GBKAZKU33LRJX47UGDX2YGA7UIJ5BWSVAFQJLBAUYIMOS5KBPVXKGO4X","ext":"v0"}}}},{"updated":{"last_modified_ledger_seq":58166971,"data":{"trustline":{"account_id":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK","asset":{"credit_alphanum4":{"asset_code":"USDC","issuer":"GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN"}},"balance":"10000990","limit":"9223372036854775807","flags":1,"ext":"v0"}},"ext":{"v1":{"sponsoring_id":"GBKAZKU33LRJX47UGDX2YGA7UIJ5BWSVAFQJLBAUYIMOS5KBPVXKGO4X","ext":"v0"}}}}]}],"tx_changes_after":[{"state":{"last_modified_ledger_seq":58166971,"data":{"account":{"account_id":"GDJLH2F7DBI6GC22J7YUTPAEFRSWKG5MN5RSE2GOOYUTO4BH66LHENRW","balance":"22097264303","seq_num":"181263292226863151","num_sub_entries":4,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":"0","selling":"0"},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":2,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":56604244,"seq_time":"1744587782"}}}}}}}},"ext":"v0"}},{"updated":{"last_modified_ledger_seq":58166971,"data":{"account":{"account_id":"GDJLH2F7DBI6GC22J7YUTPAEFRSWKG5MN5RSE2GOOYUTO4BH66LHENRW","balance":"22098665911","seq_num":"181263292226863151","num_sub_entries":4,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":"0","selling":"0"},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":2,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":56604244,"seq_time":"1744587782"}}}}}}}},"ext":"v0"}}],"soroban_meta":{"ext":{"v1":{"ext":"v0","total_non_refundable_resource_fee_charged":"285226","total_refundable_resource_fee_charged":"3317604","rent_fee_charged":"3312096"}},"events":[{"ext":"v0","contract_id":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP","type_":"contract","body":{"v0":{"topics":[{"symbol":"withdraw_collateral"},{"address":"CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75"},{"address":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK"}],"data":{"vec":[{"i128":"10000990"},{"i128":"8933481"}]}}}},{"ext":"v0","contract_id":"CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75","type_":"contract","body":{"v0":{"topics":[{"symbol":"transfer"},{"address":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP"},{"address":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK"},{"string":"USDC:GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN"}],"data":{"i128":"10000990"}}}}],"return_value":{"map":[{"key":{"symbol":"collateral"},"val":{"map":[]}},{"key":{"symbol":"liabilities"},"val":{"map":[]}},{"key":{"symbol":"supply"},"val":{"map":[]}}]},"diagnostic_events":[{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"fn_call"},{"bytes":"eb0aa9d8d625796902fa9be6341291de077e8dd523a7378e46a4a6152da8183b"},{"symbol":"submit"}],"data":{"vec":[{"address":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK"},{"address":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK"},{"address":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK"},{"vec":[{"map":[{"key":{"symbol":"address"},"val":{"address":"CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75"}},{"key":{"symbol":"amount"},"val":{"i128":"10000990"}},{"key":{"symbol":"request_type"},"val":{"u32":3}}]}]}]}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP","type_":"contract","body":{"v0":{"topics":[{"symbol":"withdraw_collateral"},{"address":"CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75"},{"address":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK"}],"data":{"vec":[{"i128":"10000990"},{"i128":"8933481"}]}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP","type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"fn_call"},{"bytes":"adefce59aee52968f76061d494c2525b75659fa4296a65f499ef29e56477e496"},{"symbol":"transfer"}],"data":{"vec":[{"address":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP"},{"address":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK"},{"i128":"10000990"}]}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":"CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75","type_":"contract","body":{"v0":{"topics":[{"symbol":"transfer"},{"address":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP"},{"address":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK"},{"string":"USDC:GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN"}],"data":{"i128":"10000990"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":"CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75","type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"fn_return"},{"symbol":"transfer"}],"data":"void"}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP","type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"fn_return"},{"symbol":"submit"}],"data":{"map":[{"key":{"symbol":"collateral"},"val":{"map":[]}},{"key":{"symbol":"liabilities"},"val":{"map":[]}},{"key":{"symbol":"supply"},"val":{"map":[]}}]}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"read_entry"}],"data":{"u64":"11"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"write_entry"}],"data":{"u64":"5"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"ledger_read_byte"}],"data":{"u64":"53060"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"ledger_write_byte"}],"data":{"u64":"1276"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"read_key_byte"}],"data":{"u64":"1008"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"write_key_byte"}],"data":{"u64":"0"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"read_data_byte"}],"data":{"u64":"3028"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"write_data_byte"}],"data":{"u64":"1276"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"read_code_byte"}],"data":{"u64":"50032"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"write_code_byte"}],"data":{"u64":"0"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"emit_event"}],"data":{"u64":"2"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"emit_event_byte"}],"data":{"u64":"460"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"cpu_insn"}],"data":{"u64":"8808582"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"mem_byte"}],"data":{"u64":"3010311"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"invoke_time_nsecs"}],"data":{"u64":"1166673"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"max_rw_key_byte"}],"data":{"u64":"168"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"max_rw_data_byte"}],"data":{"u64":"508"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"max_rw_code_byte"}],"data":{"u64":"50032"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"max_emit_event_byte"}],"data":{"u64":"244"}}}}}]}}},"events":{"contract_events":[],"diagnostic_events":[{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"fn_call"},{"bytes":"eb0aa9d8d625796902fa9be6341291de077e8dd523a7378e46a4a6152da8183b"},{"symbol":"submit"}],"data":{"vec":[{"address":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK"},{"address":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK"},{"address":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK"},{"vec":[{"map":[{"key":{"symbol":"address"},"val":{"address":"CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75"}},{"key":{"symbol":"amount"},"val":{"i128":"10000990"}},{"key":{"symbol":"request_type"},"val":{"u32":3}}]}]}]}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP","type_":"contract","body":{"v0":{"topics":[{"symbol":"withdraw_collateral"},{"address":"CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75"},{"address":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK"}],"data":{"vec":[{"i128":"10000990"},{"i128":"8933481"}]}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP","type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"fn_call"},{"bytes":"adefce59aee52968f76061d494c2525b75659fa4296a65f499ef29e56477e496"},{"symbol":"transfer"}],"data":{"vec":[{"address":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP"},{"address":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK"},{"i128":"10000990"}]}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":"CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75","type_":"contract","body":{"v0":{"topics":[{"symbol":"transfer"},{"address":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP"},{"address":"GBQUFZ3QRIP6VQ74BV6KJGBEJ7YFE4WGRCB4YCMGTXFEMYLXNI2CC2AK"},{"string":"USDC:GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN"}],"data":{"i128":"10000990"}}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":"CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75","type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"fn_return"},{"symbol":"transfer"}],"data":"void"}}}},{"in_successful_contract_call":true,"event":{"ext":"v0","contract_id":"CDVQVKOY2YSXS2IC7KN6MNASSHPAO7UN2UR2ON4OI2SKMFJNVAMDX6DP","type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"fn_return"},{"symbol":"submit"}],"data":{"map":[{"key":{"symbol":"collateral"},"val":{"map":[]}},{"key":{"symbol":"liabilities"},"val":{"map":[]}},{"key":{"symbol":"supply"},"val":{"map":[]}}]}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"read_entry"}],"data":{"u64":"11"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"write_entry"}],"data":{"u64":"5"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"ledger_read_byte"}],"data":{"u64":"53060"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"ledger_write_byte"}],"data":{"u64":"1276"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"read_key_byte"}],"data":{"u64":"1008"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"write_key_byte"}],"data":{"u64":"0"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"read_data_byte"}],"data":{"u64":"3028"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"write_data_byte"}],"data":{"u64":"1276"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"read_code_byte"}],"data":{"u64":"50032"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"write_code_byte"}],"data":{"u64":"0"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"emit_event"}],"data":{"u64":"2"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"emit_event_byte"}],"data":{"u64":"460"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"cpu_insn"}],"data":{"u64":"8808582"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"mem_byte"}],"data":{"u64":"3010311"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"invoke_time_nsecs"}],"data":{"u64":"1166673"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"max_rw_key_byte"}],"data":{"u64":"168"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"max_rw_data_byte"}],"data":{"u64":"508"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"max_rw_code_byte"}],"data":{"u64":"50032"}}}}},{"in_successful_contract_call":false,"event":{"ext":"v0","contract_id":null,"type_":"diagnostic","body":{"v0":{"topics":[{"symbol":"core_metrics"},{"symbol":"max_emit_event_byte"}],"data":{"u64":"244"}}}}}],"transaction_events":[]}}"#;
690}