Skip to main content

alloy_provider/provider/multicall/
tuple.rs

1use super::{
2    bindings::IMulticall3::Result as MulticallResult,
3    inner_types::{Dynamic, Failure, MulticallError, Result},
4};
5use alloy_primitives::Bytes;
6use alloy_sol_types::SolCall;
7
8/// Sealed trait to prevent external implementations
9mod private {
10    #[expect(unnameable_types)]
11    pub trait Sealed {}
12}
13use private::Sealed;
14
15/// A trait for tuples that can have types pushed to them
16#[doc(hidden)]
17#[expect(unnameable_types)]
18pub trait TuplePush<T> {
19    /// The resulting type after pushing T
20    type Pushed;
21}
22
23/// A trait for tuples of SolCalls that can be decoded
24#[doc(hidden)]
25pub trait CallTuple: Sealed {
26    /// Flattened tuple consisting of the return values of each call.
27    ///
28    /// Each return value is wrapped in a [`Result`] in order to account for failures in calls when
29    /// others succeed.
30    ///
31    /// - [`Result::Ok`] contains the decoded return value of the call.
32    /// - [`Result::Err`] contains a [`Failure`] struct with the index of the call that failed and
33    ///   the raw bytes returned on failure.
34    ///
35    /// For example,
36    ///
37    /// ```ignore
38    /// use alloy_sol_types::sol;
39    /// use alloy_primitives::Address;
40    /// use alloy_provider::{CallItem, Provider, ProviderBuilder, Result, Failure};
41    /// use crate::SomeContract::failureCall;
42    /// sol! {
43    ///     #[derive(Debug)]
44    ///     #[sol(rpc)]
45    ///     contract SomeContract {
46    ///       function success() external;
47    ///       function failure() external;
48    ///     }
49    /// }
50    ///
51    /// #[tokio::main]
52    /// async fn main() {
53    ///     let target = Address::random();
54    ///     let provider = ProviderBuilder::new().connect("https://..").await.unwrap();    
55    ///     let some_contract = SomeContract::new(target, &provider);
56    ///     let allow_failure_call = CallItem::<failureCall>::new(target, some_contract.failure().input()).allow_failure(true); // This calls is allowed to fail so that the batch doesn't revert.
57    ///
58    ///     let multicall = provider.multicall().add(some_contract.success()).add_call(allow_failure_call);
59    ///
60    ///     let (success_result, failure_result) = multicall.aggregate3().await.unwrap();
61    ///     match success_result {
62    ///       Ok(success) => { println!("Success: {:?}", success) },
63    ///       Err(failure) => { /* handle failure */ },
64    ///     }
65    ///
66    ///     match failure_result {
67    ///       Ok(success) => { /* handle success */ },
68    ///       Err(failure) => { assert!(matches!(failure, Failure { idx: 1, return_data: _ })) },
69    ///     }
70    /// }
71    /// ```
72    type Returns;
73
74    /// Flattened tuple consisting of the decoded return values of each call.
75    type SuccessReturns;
76
77    /// Decode the returns from a sequence of bytes
78    ///
79    /// To be used for calls where success is ensured i.e `allow_failure` for all calls is false.
80    fn decode_returns(data: &[Bytes]) -> Result<Self::SuccessReturns>;
81
82    /// Converts Returns to SuccessReturns if all results are Ok
83    fn decode_return_results(results: &[MulticallResult]) -> Result<Self::Returns>;
84
85    /// Converts Returns to SuccessReturns if all results are Ok
86    fn try_into_success(results: Self::Returns) -> Result<Self::SuccessReturns>;
87}
88
89/// Type indicating that the [`MulticallBuilder`](crate::MulticallBuilder) is empty.
90#[derive(Debug, Clone)]
91pub struct Empty;
92
93impl Sealed for Empty {}
94
95impl<T: SolCall> TuplePush<T> for Empty {
96    type Pushed = (T,);
97}
98
99impl CallTuple for Empty {
100    type Returns = ();
101    type SuccessReturns = ();
102    fn decode_returns(_: &[Bytes]) -> Result<Self::SuccessReturns> {
103        Ok(())
104    }
105    fn decode_return_results(_results: &[MulticallResult]) -> Result<Self::Returns> {
106        Ok(())
107    }
108    fn try_into_success(_: Self::Returns) -> Result<Self::SuccessReturns> {
109        Ok(())
110    }
111}
112
113impl<D: SolCall> Sealed for Dynamic<D> {}
114
115// Macro to implement for tuples of different sizes
116macro_rules! impl_tuple {
117    ($($idx:tt => $ty:ident),+) => {
118        impl<$($ty: SolCall,)+> Sealed for ($($ty,)+) {}
119
120        // Implement pushing a new type onto the tuple
121        impl<T: SolCall, $($ty: SolCall,)+> TuplePush<T> for ($($ty,)+) {
122            type Pushed = ($($ty,)+ T,);
123        }
124
125        // Implement decoding for the tuple
126        impl<$($ty: SolCall,)+> CallTuple for ($($ty,)+) {
127            // The Returns associated type is a tuple of each SolCall's Return type
128            type Returns = ($(Result<$ty::Return, Failure>,)+);
129
130            type SuccessReturns = ($($ty::Return,)+);
131
132            fn decode_returns(data: &[Bytes]) -> Result<Self::SuccessReturns> {
133                if data.len() != count!($($ty),+) {
134                    return Err(MulticallError::NoReturnData);
135                }
136
137                // Decode each return value in order
138                Ok(($($ty::abi_decode_returns(&data[$idx]).map_err(MulticallError::DecodeError)?,)+))
139            }
140
141            fn decode_return_results(results: &[MulticallResult]) -> Result<Self::Returns> {
142                if results.len() != count!($($ty),+) {
143                    return Err(MulticallError::NoReturnData);
144                }
145
146                Ok(($(
147                    match &results[$idx].success {
148                        true => $ty::abi_decode_returns(&results[$idx].returnData)
149                            .or_else(|_| Err(Failure { idx: $idx, return_data: results[$idx].returnData.clone() })),
150                        false => Err(Failure { idx: $idx, return_data: results[$idx].returnData.clone() }),
151                    },
152                )+))
153            }
154
155            fn try_into_success(results: Self::Returns) -> Result<Self::SuccessReturns> {
156                Ok(($(
157                    match results.$idx {
158                        Ok(value) => value,
159                        Err(failure) => return Err(MulticallError::CallFailed(failure.return_data)),
160                    },
161                )+))
162            }
163        }
164    };
165}
166
167// Helper macro to count number of types
168macro_rules! count {
169    () => (0);
170    ($x:tt $(,$xs:tt)*) => (1 + count!($($xs),*));
171}
172
173// Max tuple size without feature flag is 24, matching alloy-core.
174impl_tuple!(0 => T1);
175impl_tuple!(0 => T1, 1 => T2);
176impl_tuple!(0 => T1, 1 => T2, 2 => T3);
177impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4);
178impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5);
179impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6);
180impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7);
181impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8);
182impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9);
183impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10);
184impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11);
185impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12);
186impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13);
187impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14);
188impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15);
189impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16);
190impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17);
191impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18);
192impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19);
193impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20);
194impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21);
195impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22);
196impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23);
197impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24);
198
199#[cfg(feature = "more-tuple-impls")]
200macro_rules! block {
201    ($($block:tt)*) => {
202        $($block)*
203    };
204}
205
206#[cfg(feature = "more-tuple-impls")]
207block! {
208    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25);
209    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26);
210    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27);
211    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28);
212    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29);
213    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30);
214    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31);
215    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32);
216    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33);
217    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34);
218    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34, 34 => T35);
219    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34, 34 => T35, 35 => T36);
220    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34, 34 => T35, 35 => T36, 36 => T37);
221    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34, 34 => T35, 35 => T36, 36 => T37, 37 => T38);
222    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34, 34 => T35, 35 => T36, 36 => T37, 37 => T38, 38 => T39);
223    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34, 34 => T35, 35 => T36, 36 => T37, 37 => T38, 38 => T39, 39 => T40);
224    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34, 34 => T35, 35 => T36, 36 => T37, 37 => T38, 38 => T39, 39 => T40, 40 => T41);
225    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34, 34 => T35, 35 => T36, 36 => T37, 37 => T38, 38 => T39, 39 => T40, 40 => T41, 41 => T42);
226    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34, 34 => T35, 35 => T36, 36 => T37, 37 => T38, 38 => T39, 39 => T40, 40 => T41, 41 => T42, 42 => T43);
227    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34, 34 => T35, 35 => T36, 36 => T37, 37 => T38, 38 => T39, 39 => T40, 40 => T41, 41 => T42, 42 => T43, 43 => T44);
228    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34, 34 => T35, 35 => T36, 36 => T37, 37 => T38, 38 => T39, 39 => T40, 40 => T41, 41 => T42, 42 => T43, 43 => T44, 44 => T45);
229    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34, 34 => T35, 35 => T36, 36 => T37, 37 => T38, 38 => T39, 39 => T40, 40 => T41, 41 => T42, 42 => T43, 43 => T44, 44 => T45, 45 => T46);
230    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34, 34 => T35, 35 => T36, 36 => T37, 37 => T38, 38 => T39, 39 => T40, 40 => T41, 41 => T42, 42 => T43, 43 => T44, 44 => T45, 45 => T46, 46 => T47);
231    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34, 34 => T35, 35 => T36, 36 => T37, 37 => T38, 38 => T39, 39 => T40, 40 => T41, 41 => T42, 42 => T43, 43 => T44, 44 => T45, 45 => T46, 46 => T47, 47 => T48);
232    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34, 34 => T35, 35 => T36, 36 => T37, 37 => T38, 38 => T39, 39 => T40, 40 => T41, 41 => T42, 42 => T43, 43 => T44, 44 => T45, 45 => T46, 46 => T47, 47 => T48, 48 => T49);
233    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34, 34 => T35, 35 => T36, 36 => T37, 37 => T38, 38 => T39, 39 => T40, 40 => T41, 41 => T42, 42 => T43, 43 => T44, 44 => T45, 45 => T46, 46 => T47, 47 => T48, 48 => T49, 49 => T50);
234    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34, 34 => T35, 35 => T36, 36 => T37, 37 => T38, 38 => T39, 39 => T40, 40 => T41, 41 => T42, 42 => T43, 43 => T44, 44 => T45, 45 => T46, 46 => T47, 47 => T48, 48 => T49, 49 => T50, 50 => T51);
235    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34, 34 => T35, 35 => T36, 36 => T37, 37 => T38, 38 => T39, 39 => T40, 40 => T41, 41 => T42, 42 => T43, 43 => T44, 44 => T45, 45 => T46, 46 => T47, 47 => T48, 48 => T49, 49 => T50, 50 => T51, 51 => T52);
236    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34, 34 => T35, 35 => T36, 36 => T37, 37 => T38, 38 => T39, 39 => T40, 40 => T41, 41 => T42, 42 => T43, 43 => T44, 44 => T45, 45 => T46, 46 => T47, 47 => T48, 48 => T49, 49 => T50, 50 => T51, 51 => T52, 52 => T53);
237    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34, 34 => T35, 35 => T36, 36 => T37, 37 => T38, 38 => T39, 39 => T40, 40 => T41, 41 => T42, 42 => T43, 43 => T44, 44 => T45, 45 => T46, 46 => T47, 47 => T48, 48 => T49, 49 => T50, 50 => T51, 51 => T52, 52 => T53, 53 => T54);
238    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34, 34 => T35, 35 => T36, 36 => T37, 37 => T38, 38 => T39, 39 => T40, 40 => T41, 41 => T42, 42 => T43, 43 => T44, 44 => T45, 45 => T46, 46 => T47, 47 => T48, 48 => T49, 49 => T50, 50 => T51, 51 => T52, 52 => T53, 53 => T54, 54 => T55);
239    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34, 34 => T35, 35 => T36, 36 => T37, 37 => T38, 38 => T39, 39 => T40, 40 => T41, 41 => T42, 42 => T43, 43 => T44, 44 => T45, 45 => T46, 46 => T47, 47 => T48, 48 => T49, 49 => T50, 50 => T51, 51 => T52, 52 => T53, 53 => T54, 54 => T55, 55 => T56);
240    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34, 34 => T35, 35 => T36, 36 => T37, 37 => T38, 38 => T39, 39 => T40, 40 => T41, 41 => T42, 42 => T43, 43 => T44, 44 => T45, 45 => T46, 46 => T47, 47 => T48, 48 => T49, 49 => T50, 50 => T51, 51 => T52, 52 => T53, 53 => T54, 54 => T55, 55 => T56, 56 => T57);
241    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34, 34 => T35, 35 => T36, 36 => T37, 37 => T38, 38 => T39, 39 => T40, 40 => T41, 41 => T42, 42 => T43, 43 => T44, 44 => T45, 45 => T46, 46 => T47, 47 => T48, 48 => T49, 49 => T50, 50 => T51, 51 => T52, 52 => T53, 53 => T54, 54 => T55, 55 => T56, 56 => T57, 57 => T58);
242    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34, 34 => T35, 35 => T36, 36 => T37, 37 => T38, 38 => T39, 39 => T40, 40 => T41, 41 => T42, 42 => T43, 43 => T44, 44 => T45, 45 => T46, 46 => T47, 47 => T48, 48 => T49, 49 => T50, 50 => T51, 51 => T52, 52 => T53, 53 => T54, 54 => T55, 55 => T56, 56 => T57, 57 => T58, 58 => T59);
243    impl_tuple!(0 => T1, 1 => T2, 2 => T3, 3 => T4, 4 => T5, 5 => T6, 6 => T7, 7 => T8, 8 => T9, 9 => T10, 10 => T11, 11 => T12, 12 => T13, 13 => T14, 14 => T15, 15 => T16, 16 => T17, 17 => T18, 18 => T19, 19 => T20, 20 => T21, 21 => T22, 22 => T23, 23 => T24, 24 => T25, 25 => T26, 26 => T27, 27 => T28, 28 => T29, 29 => T30, 30 => T31, 31 => T32, 32 => T33, 33 => T34, 34 => T35, 35 => T36, 36 => T37, 37 => T38, 38 => T39, 39 => T40, 40 => T41, 41 => T42, 42 => T43, 43 => T44, 44 => T45, 45 => T46, 46 => T47, 47 => T48, 48 => T49, 49 => T50, 50 => T51, 51 => T52, 52 => T53, 53 => T54, 54 => T55, 55 => T56, 56 => T57, 57 => T58, 58 => T59, 59 => T60);
244}