/home/marten/fuel/fuel-vm/fuel-asm/src/op.rs
Line
Count
Source
1
//! Definitions and implementations for each unique instruction type, one for each
2
//! unique `Opcode` variant.
3
4
use super::{
5
    wideint::{
6
        CompareArgs,
7
        DivArgs,
8
        MathArgs,
9
        MulArgs,
10
    },
11
    CheckRegId,
12
    GMArgs,
13
    GTFArgs,
14
    Imm12,
15
    Imm18,
16
    Instruction,
17
    RegId,
18
};
19
20
// Here we re-export the generated instruction types and constructors, but extend them
21
// with `gm_args` and `gtf_args` short-hand constructors below to take their `GMArgs` and
22
// `GTFArgs` values respectively.
23
#[doc(inline)]
24
pub use super::_op::*;
25
26
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
27
impl GM {
28
    /// Construct a `GM` instruction from its arguments.
29
0
    pub fn from_args(ra: RegId, args: GMArgs) -> Self {
30
0
        Self::new(ra, Imm18::new(args as _))
31
0
    }
32
}
33
34
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
35
impl GTF {
36
    /// Construct a `GTF` instruction from its arguments.
37
0
    pub fn from_args(ra: RegId, rb: RegId, args: GTFArgs) -> Self {
38
0
        Self::new(ra, rb, Imm12::new(args as _))
39
0
    }
40
}
41
42
/// Construct a `GM` instruction from its arguments.
43
0
pub fn gm_args<A: CheckRegId>(ra: A, args: GMArgs) -> Instruction {
44
0
    Instruction::GM(GM::from_args(ra.check(), args))
45
0
}
46
47
#[cfg(feature = "typescript")]
48
const _: () = {
49
    use super::*;
50
51
    #[wasm_bindgen::prelude::wasm_bindgen]
52
    /// Construct a `GM` instruction from its arguments.
53
    pub fn gm_args(ra: u8, args: GMArgs) -> typescript::Instruction {
54
        Instruction::GM(GM::from_args(ra.check(), args)).into()
55
    }
56
};
57
58
/// Construct a `GM` instruction from its arguments.
59
0
pub fn gtf_args<A: CheckRegId, B: CheckRegId>(
60
0
    ra: A,
61
0
    rb: B,
62
0
    args: GTFArgs,
63
0
) -> Instruction {
64
0
    Instruction::GTF(GTF::from_args(ra.check(), rb.check(), args))
65
0
}
66
67
#[cfg(feature = "typescript")]
68
const _: () = {
69
    use super::*;
70
71
    #[wasm_bindgen::prelude::wasm_bindgen]
72
    /// Construct a `GM` instruction from its arguments.
73
    pub fn gtf_args(ra: u8, rb: u8, args: GTFArgs) -> typescript::Instruction {
74
        Instruction::GTF(GTF::from_args(ra.check(), rb.check(), args)).into()
75
    }
76
};
77
78
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
79
impl WDCM {
80
    /// Construct a `WDCM` instruction from its arguments.
81
0
    pub fn from_args(ra: RegId, rb: RegId, rc: RegId, args: CompareArgs) -> Self {
82
0
        Self::new(ra, rb, rc, args.to_imm())
83
0
    }
84
}
85
86
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
87
impl WQCM {
88
    /// Construct a `WQCM` instruction from its arguments.
89
0
    pub fn from_args(ra: RegId, rb: RegId, rc: RegId, args: CompareArgs) -> Self {
90
0
        Self::new(ra, rb, rc, args.to_imm())
91
0
    }
92
}
93
94
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
95
impl WDOP {
96
    /// Construct a `WDOP` instruction from its arguments.
97
0
    pub fn from_args(ra: RegId, rb: RegId, rc: RegId, args: MathArgs) -> Self {
98
0
        Self::new(ra, rb, rc, args.to_imm())
99
0
    }
100
}
101
102
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
103
impl WQOP {
104
    /// Construct a `WQOP` instruction from its arguments.
105
0
    pub fn from_args(ra: RegId, rb: RegId, rc: RegId, args: MathArgs) -> Self {
106
0
        Self::new(ra, rb, rc, args.to_imm())
107
0
    }
108
}
109
110
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
111
impl WDML {
112
    /// Construct a `WDML` instruction from its arguments.
113
0
    pub fn from_args(ra: RegId, rb: RegId, rc: RegId, args: MulArgs) -> Self {
114
0
        Self::new(ra, rb, rc, args.to_imm())
115
0
    }
116
}
117
118
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
119
impl WQML {
120
    /// Construct a `WQML` instruction from its arguments.
121
0
    pub fn from_args(ra: RegId, rb: RegId, rc: RegId, args: MulArgs) -> Self {
122
0
        Self::new(ra, rb, rc, args.to_imm())
123
0
    }
124
}
125
126
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
127
impl WDDV {
128
    /// Construct a `WDDV` instruction from its arguments.
129
0
    pub fn from_args(ra: RegId, rb: RegId, rc: RegId, args: DivArgs) -> Self {
130
0
        Self::new(ra, rb, rc, args.to_imm())
131
0
    }
132
}
133
134
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
135
impl WQDV {
136
    /// Construct a `WQDV` instruction from its arguments.
137
0
    pub fn from_args(ra: RegId, rb: RegId, rc: RegId, args: DivArgs) -> Self {
138
0
        Self::new(ra, rb, rc, args.to_imm())
139
0
    }
140
}
141
142
/// Construct a `WDCM` instruction from its arguments.
143
0
pub fn wdcm_args<A: CheckRegId, B: CheckRegId, C: CheckRegId>(
144
0
    ra: A,
145
0
    rb: B,
146
0
    rc: C,
147
0
    args: CompareArgs,
148
0
) -> Instruction {
149
0
    Instruction::WDCM(WDCM::from_args(ra.check(), rb.check(), rc.check(), args))
150
0
}
151
152
#[cfg(feature = "typescript")]
153
const _: () = {
154
    use super::*;
155
156
    #[wasm_bindgen::prelude::wasm_bindgen]
157
    /// Construct a `WDCM` instruction from its arguments.
158
    pub fn wdcm_args(
159
        ra: u8,
160
        rb: u8,
161
        rc: u8,
162
        args: CompareArgs,
163
    ) -> typescript::Instruction {
164
        crate::op::wdcm_args(ra, rb, rc, args).into()
165
    }
166
};
167
168
/// Construct a `WQCM` instruction from its arguments.
169
0
pub fn wqcm_args<A: CheckRegId, B: CheckRegId, C: CheckRegId>(
170
0
    ra: A,
171
0
    rb: B,
172
0
    rc: C,
173
0
    args: CompareArgs,
174
0
) -> Instruction {
175
0
    Instruction::WQCM(WQCM::from_args(ra.check(), rb.check(), rc.check(), args))
176
0
}
177
178
#[cfg(feature = "typescript")]
179
const _: () = {
180
    use super::*;
181
182
    #[wasm_bindgen::prelude::wasm_bindgen]
183
    /// Construct a `WQCM` instruction from its arguments.
184
    pub fn wqcm_args(
185
        ra: u8,
186
        rb: u8,
187
        rc: u8,
188
        args: CompareArgs,
189
    ) -> typescript::Instruction {
190
        crate::op::wqcm_args(ra, rb, rc, args).into()
191
    }
192
};
193
194
/// Construct a `WDOP` instruction from its arguments.
195
0
pub fn wdop_args<A: CheckRegId, B: CheckRegId, C: CheckRegId>(
196
0
    ra: A,
197
0
    rb: B,
198
0
    rc: C,
199
0
    args: MathArgs,
200
0
) -> Instruction {
201
0
    Instruction::WDOP(WDOP::from_args(ra.check(), rb.check(), rc.check(), args))
202
0
}
203
204
#[cfg(feature = "typescript")]
205
const _: () = {
206
    use super::*;
207
208
    #[wasm_bindgen::prelude::wasm_bindgen]
209
    /// Construct a `WDOP` instruction from its arguments.
210
    pub fn wdop_args(ra: u8, rb: u8, rc: u8, args: MathArgs) -> typescript::Instruction {
211
        crate::op::wdop_args(ra, rb, rc, args).into()
212
    }
213
};
214
215
/// Construct a `WQOP` instruction from its arguments.
216
0
pub fn wqop_args<A: CheckRegId, B: CheckRegId, C: CheckRegId>(
217
0
    ra: A,
218
0
    rb: B,
219
0
    rc: C,
220
0
    args: MathArgs,
221
0
) -> Instruction {
222
0
    Instruction::WQOP(WQOP::from_args(ra.check(), rb.check(), rc.check(), args))
223
0
}
224
225
#[cfg(feature = "typescript")]
226
const _: () = {
227
    use super::*;
228
229
    #[wasm_bindgen::prelude::wasm_bindgen]
230
    /// Construct a `WQOP` instruction from its arguments.
231
    pub fn wqop_args(ra: u8, rb: u8, rc: u8, args: MathArgs) -> typescript::Instruction {
232
        crate::op::wqop_args(ra, rb, rc, args).into()
233
    }
234
};
235
236
/// Construct a `WDML` instruction from its arguments.
237
0
pub fn wdml_args<A: CheckRegId, B: CheckRegId, C: CheckRegId>(
238
0
    ra: A,
239
0
    rb: B,
240
0
    rc: C,
241
0
    args: MulArgs,
242
0
) -> Instruction {
243
0
    Instruction::WDML(WDML::from_args(ra.check(), rb.check(), rc.check(), args))
244
0
}
245
246
#[cfg(feature = "typescript")]
247
const _: () = {
248
    use super::*;
249
250
    #[wasm_bindgen::prelude::wasm_bindgen]
251
    /// Construct a `WDML` instruction from its arguments.
252
    pub fn wdml_args(ra: u8, rb: u8, rc: u8, args: MulArgs) -> typescript::Instruction {
253
        crate::op::wdml_args(ra, rb, rc, args).into()
254
    }
255
};
256
257
/// Construct a `WQML` instruction from its arguments.
258
0
pub fn wqml_args<A: CheckRegId, B: CheckRegId, C: CheckRegId>(
259
0
    ra: A,
260
0
    rb: B,
261
0
    rc: C,
262
0
    args: MulArgs,
263
0
) -> Instruction {
264
0
    Instruction::WQML(WQML::from_args(ra.check(), rb.check(), rc.check(), args))
265
0
}
266
267
#[cfg(feature = "typescript")]
268
const _: () = {
269
    use super::*;
270
271
    #[wasm_bindgen::prelude::wasm_bindgen]
272
    /// Construct a `WQML` instruction from its arguments.
273
    pub fn wqml_args(ra: u8, rb: u8, rc: u8, args: MulArgs) -> typescript::Instruction {
274
        crate::op::wqml_args(ra, rb, rc, args).into()
275
    }
276
};
277
278
/// Construct a `WDDV` instruction from its arguments.
279
0
pub fn wddv_args<A: CheckRegId, B: CheckRegId, C: CheckRegId>(
280
0
    ra: A,
281
0
    rb: B,
282
0
    rc: C,
283
0
    args: DivArgs,
284
0
) -> Instruction {
285
0
    Instruction::WDDV(WDDV::from_args(ra.check(), rb.check(), rc.check(), args))
286
0
}
287
288
#[cfg(feature = "typescript")]
289
const _: () = {
290
    use super::*;
291
292
    #[wasm_bindgen::prelude::wasm_bindgen]
293
    /// Construct a `WDDV` instruction from its arguments.
294
    pub fn wddv_args(ra: u8, rb: u8, rc: u8, args: DivArgs) -> typescript::Instruction {
295
        crate::op::wddv_args(ra, rb, rc, args).into()
296
    }
297
};
298
299
/// Construct a `WQDV` instruction from its arguments.
300
0
pub fn wqdv_args<A: CheckRegId, B: CheckRegId, C: CheckRegId>(
301
0
    ra: A,
302
0
    rb: B,
303
0
    rc: C,
304
0
    args: DivArgs,
305
0
) -> Instruction {
306
0
    Instruction::WQDV(WQDV::from_args(ra.check(), rb.check(), rc.check(), args))
307
0
}
308
309
#[cfg(feature = "typescript")]
310
const _: () = {
311
    use super::*;
312
313
    #[wasm_bindgen::prelude::wasm_bindgen]
314
    /// Construct a `WQDV` instruction from its arguments.
315
    pub fn wqdv_args(ra: u8, rb: u8, rc: u8, args: DivArgs) -> typescript::Instruction {
316
        crate::op::wqdv_args(ra, rb, rc, args).into()
317
    }
318
};
/home/marten/fuel/fuel-vm/fuel-asm/src/panic_reason.rs
Line
Count
Source
1
use core::fmt;
2
3
macro_rules! enum_from {
4
    (
5
        $(#[$meta:meta])* $vis:vis enum $name:ident {
6
            $($(#[$vmeta:meta])* $vname:ident $(= $val:expr)?,)*
7
        }
8
    ) => {
9
        $(#[$meta])*
10
        $vis enum $name {
11
            $($(#[$vmeta])* $vname $(= $val)?,)*
12
        }
13
14
        impl From<u8> for $name {
15
0
            fn from(v: u8) -> Self {
16
0
                match v {
17
0
                    $(x if x == $name::$vname as u8 => $name::$vname,)*
18
0
                    _ => $name::UnknownPanicReason,
19
                }
20
0
            }
21
        }
22
    }
23
}
24
25
enum_from! {
26
0
    #[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, strum::EnumIter)]
Unexecuted instantiation: _RNvMs9_NtCs6P3fQNJKMy0_8fuel_asm12panic_reasonNtB5_15PanicReasonIter3get
Unexecuted instantiation: _RNvXsa_NtCs6P3fQNJKMy0_8fuel_asm12panic_reasonNtB5_11PanicReasonNtCs7SJq3lwJE1q_5strum16IntoEnumIterator4iterB7_
Unexecuted instantiation: _RNvXsb_NtCs6P3fQNJKMy0_8fuel_asm12panic_reasonNtB5_15PanicReasonIterNtNtNtNtCsd3UI3IJrzMw_4core4iter6traits8iterator8Iterator4next
Unexecuted instantiation: _RNvXsb_NtCs6P3fQNJKMy0_8fuel_asm12panic_reasonNtB5_15PanicReasonIterNtNtNtNtCsd3UI3IJrzMw_4core4iter6traits8iterator8Iterator9size_hint
Unexecuted instantiation: _RNvXsb_NtCs6P3fQNJKMy0_8fuel_asm12panic_reasonNtB5_15PanicReasonIterNtNtNtNtCsd3UI3IJrzMw_4core4iter6traits8iterator8Iterator3nth
Unexecuted instantiation: _RNvXsc_NtCs6P3fQNJKMy0_8fuel_asm12panic_reasonNtB5_15PanicReasonIterNtNtNtNtCsd3UI3IJrzMw_4core4iter6traits10exact_size17ExactSizeIterator3len
Unexecuted instantiation: _RNvXsd_NtCs6P3fQNJKMy0_8fuel_asm12panic_reasonNtB5_15PanicReasonIterNtNtNtNtCsd3UI3IJrzMw_4core4iter6traits12double_ended19DoubleEndedIterator9next_back
Unexecuted instantiation: _RNvXse_NtCs6P3fQNJKMy0_8fuel_asm12panic_reasonNtB5_15PanicReasonIterNtNtCsd3UI3IJrzMw_4core5clone5Clone5cloneB7_
27
    #[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
28
0
    #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm12panic_reasons_1__NtB7_11PanicReasonNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB19_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtCs6P3fQNJKMy0_8fuel_asm12panic_reasons_1__NtBa_11PanicReasonNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1c_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm12panic_reasons_1__NtB8_11PanicReasonNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1a_7Visitor9visit_u64pEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm12panic_reasons_1__NtB8_11PanicReasonNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1a_7Visitor9visit_strpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm12panic_reasons_1__NtB8_11PanicReasonNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1a_7Visitor11visit_bytespEBa_
Unexecuted instantiation: _RINvXs_NvXNvNtCs6P3fQNJKMy0_8fuel_asm12panic_reasons_1__NtBa_11PanicReasonNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1a_11deserializepEBc_
Unexecuted instantiation: _RINvXs0_NvXNvNtCs6P3fQNJKMy0_8fuel_asm12panic_reasons_1__NtBb_11PanicReasonNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1d_7Visitor10visit_enumpEBd_
29
    #[repr(u8)]
30
    #[non_exhaustive]
31
    /// Panic reason representation for the interpreter.
32
    pub enum PanicReason {
33
        #[default]
34
        /// The byte can't be mapped to any known `PanicReason`.
35
        UnknownPanicReason = 0x00,
36
        /// Found `RVRT` instruction.
37
        Revert = 0x01,
38
        /// Execution ran out of gas.
39
        OutOfGas = 0x02,
40
        /// The transaction validity is violated.
41
        TransactionValidity = 0x03,
42
        /// Attempt to write outside interpreter memory boundaries.
43
        MemoryOverflow = 0x04,
44
        /// Overflow while executing arithmetic operation.
45
        /// These errors are ignored using the WRAPPING flag.
46
        ArithmeticOverflow = 0x05,
47
        /// Designed contract was not found in the storage.
48
        ContractNotFound = 0x06,
49
        /// Memory ownership rules are violated.
50
        MemoryOwnership = 0x07,
51
        /// The asset ID balance isn't enough for the instruction.
52
        NotEnoughBalance = 0x08,
53
        /// The interpreter is expected to be in internal context.
54
        ExpectedInternalContext = 0x09,
55
        /// The queried asset ID was not found in the state.
56
        AssetIdNotFound = 0x0a,
57
        /// The provided input is not found in the transaction.
58
        InputNotFound = 0x0b,
59
        /// The provided output is not found in the transaction.
60
        OutputNotFound = 0x0c,
61
        /// The provided witness is not found in the transaction.
62
        WitnessNotFound = 0x0d,
63
        /// The transaction maturity is not valid for this request.
64
        TransactionMaturity = 0x0e,
65
        /// The metadata identifier is invalid.
66
        InvalidMetadataIdentifier = 0x0f,
67
        /// The call structure is not valid.
68
        MalformedCallStructure = 0x10,
69
        /// The provided register does not allow write operations.
70
        ReservedRegisterNotWritable = 0x11,
71
        /// The execution resulted in an erroneous state of the interpreter.
72
        InvalidFlags = 0x12,
73
        /// The provided immediate value is not valid for this instruction.
74
        InvalidImmediateValue = 0x13,
75
        /// The provided transaction input is not of type `Coin`.
76
        ExpectedCoinInput = 0x14,
77
        /// `ECAL` instruction failed.
78
        EcalError = 0x15,
79
        /// Two segments of the interpreter memory should not intersect for write operations.
80
        MemoryWriteOverlap = 0x16,
81
        /// The requested contract is not listed in the transaction inputs.
82
        ContractNotInInputs = 0x17,
83
        /// The internal asset ID balance overflowed with the provided instruction.
84
        InternalBalanceOverflow = 0x18,
85
        /// The maximum allowed contract size is violated.
86
        ContractMaxSize = 0x19,
87
        /// This instruction expects the stack area to be unallocated for this call.
88
        ExpectedUnallocatedStack = 0x1a,
89
        /// The maximum allowed number of static contracts was reached for this transaction.
90
        MaxStaticContractsReached = 0x1b,
91
        /// The requested transfer amount cannot be zero.
92
        TransferAmountCannotBeZero = 0x1c,
93
        /// The provided transaction output should be of type `Variable`.
94
        ExpectedOutputVariable = 0x1d,
95
        /// The expected context of the stack parent is internal.
96
        ExpectedParentInternalContext = 0x1e,
97
        /// The predicate returned non `1`. The `1` means successful verification
98
        /// of the predicate, all other values means unsuccessful.
99
        PredicateReturnedNonOne = 0x1f,
100
        /// The contract ID is already deployed and can't be overwritten.
101
        ContractIdAlreadyDeployed = 0x20,
102
        /// The loaded contract mismatch expectations.
103
        ContractMismatch = 0x21,
104
        /// Attempting to send message data longer than `MAX_MESSAGE_DATA_LENGTH`
105
        MessageDataTooLong = 0x22,
106
        /// Mathematically invalid arguments where given to an arithmetic instruction.
107
        /// For instance, division by zero produces this.
108
        /// These errors are ignored using the UNSAFEMATH flag.
109
        ArithmeticError = 0x23,
110
        /// The contract instruction is not allowed in predicates.
111
        ContractInstructionNotAllowed = 0x24,
112
        /// Transfer of zero coins is not allowed.
113
        TransferZeroCoins = 0x25,
114
        /// Attempted to execute an invalid instruction
115
        InvalidInstruction = 0x26,
116
        /// Memory outside $is..$ssp range is not executable
117
        MemoryNotExecutable = 0x27,
118
        /// The policy is not set.
119
        PolicyIsNotSet = 0x28,
120
        /// The policy is not found across policies.
121
        PolicyNotFound = 0x29,
122
        /// Receipt context is full
123
        TooManyReceipts = 0x2a,
124
        /// Balance of a contract overflowed
125
        BalanceOverflow = 0x2b,
126
        /// Block height value is invalid, typically because it is too large
127
        InvalidBlockHeight = 0x2c,
128
        /// Attempt to use sequential memory instructions with too large slot count,
129
        /// typically because it cannot fit into usize
130
        TooManySlots = 0x2d,
131
        /// Caller of this internal context is also expected to be internal,
132
        /// i.e. $fp->$fp must be non-zero.
133
        ExpectedNestedCaller = 0x2e,
134
        /// During memory growth, the stack overlapped with the heap
135
        MemoryGrowthOverlap = 0x2f,
136
        /// Attempting to read or write uninitialized memory.
137
        /// Also occurs when boundary crosses from stack to heap.
138
        UninitalizedMemoryAccess = 0x30,
139
        /// Overriding consensus parameters is not allowed.
140
        OverridingConsensusParameters = 0x31,
141
        /// The storage doesn't know about the hash of the state transition bytecode.
142
        UnknownStateTransactionBytecodeRoot = 0x32,
143
        /// Overriding the state transition bytecode is not allowed.
144
        OverridingStateTransactionBytecode = 0x33,
145
        /// The bytecode is already uploaded and cannot be uploaded again.
146
        BytecodeAlreadyUploaded = 0x34,
147
        /// The part of the bytecode is not sequentially connected to the previous parts.
148
        ThePartIsNotSequentiallyConnected = 0x35,
149
        /// The requested blob is not found.
150
        BlobNotFound = 0x36,
151
        /// The blob was already
152
        BlobIdAlreadyUploaded = 0x37,
153
        /// Active gas costs do not define the cost for this instruction.
154
        GasCostNotDefined = 0x38,
155
    }
156
}
157
158
impl fmt::Display for PanicReason {
159
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
160
0
        write!(f, "{self:?}")
161
0
    }
162
}
163
164
impl From<core::array::TryFromSliceError> for PanicReason {
165
0
    fn from(_: core::array::TryFromSliceError) -> Self {
166
0
        Self::MemoryOverflow
167
0
    }
168
}
169
170
#[cfg(test)]
171
mod tests {
172
    use super::*;
173
    use strum::IntoEnumIterator;
174
175
    #[test]
176
    fn test_u8_panic_reason_round_trip() {
177
        let last_known_panic_reason: u8 = PanicReason::iter().last().unwrap() as u8 + 1;
178
        let reason = PanicReason::from(0);
179
        assert_eq!(reason, PanicReason::UnknownPanicReason);
180
181
        for i in 1..last_known_panic_reason {
182
            let reason = PanicReason::from(i);
183
            let i2 = reason as u8;
184
            assert_eq!(i, i2);
185
        }
186
        for i in last_known_panic_reason..=255 {
187
            let reason = PanicReason::from(i);
188
            let i2 = reason as u8;
189
            assert_eq!(PanicReason::UnknownPanicReason as u8, i2);
190
        }
191
    }
192
}
/home/marten/fuel/fuel-vm/fuel-asm/src/panic_instruction.rs
Line
Count
Source
1
use core::fmt;
2
3
use crate::{
4
    Instruction,
5
    PanicReason,
6
    RawInstruction,
7
    Word,
8
};
9
10
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
11
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
12
0
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm17panic_instructions_1__NtB7_16PanicInstructionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1j_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtCs6P3fQNJKMy0_8fuel_asm17panic_instructions_1__NtBa_16PanicInstructionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1m_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm17panic_instructions_1__NtB8_16PanicInstructionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1k_7Visitor9visit_u64pEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm17panic_instructions_1__NtB8_16PanicInstructionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1k_7Visitor9visit_strpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm17panic_instructions_1__NtB8_16PanicInstructionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1k_7Visitor11visit_bytespEBa_
Unexecuted instantiation: _RINvXs_NvXNvNtCs6P3fQNJKMy0_8fuel_asm17panic_instructions_1__NtBa_16PanicInstructionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1k_11deserializepEBc_
Unexecuted instantiation: _RINvXs0_NvXNvNtCs6P3fQNJKMy0_8fuel_asm17panic_instructions_1__NtBb_16PanicInstructionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1n_7Visitor9visit_seqpEBd_
Unexecuted instantiation: _RINvXs0_NvXNvNtCs6P3fQNJKMy0_8fuel_asm17panic_instructions_1__NtBb_16PanicInstructionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1n_7Visitor9visit_mappEBd_
13
4.31k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtCs6P3fQNJKMy0_8fuel_asm17panic_instructions0_1__NtB5_16PanicInstructionNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXNvNtCs6P3fQNJKMy0_8fuel_asm17panic_instructions0_1__NtB5_16PanicInstructionNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXNvNtCs6P3fQNJKMy0_8fuel_asm17panic_instructions0_1__NtB5_16PanicInstructionNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEB7_
Unexecuted instantiation: _RINvXNvNtCs6P3fQNJKMy0_8fuel_asm17panic_instructions0_1__NtB5_16PanicInstructionNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEB7_
_RINvXNvNtCs6P3fQNJKMy0_8fuel_asm17panic_instructions1_1__NtB5_16PanicInstructionNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
13
2.15k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtCs6P3fQNJKMy0_8fuel_asm17panic_instructions1_1__NtB5_16PanicInstructionNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
13
2.15k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RNvXNvNtCs6P3fQNJKMy0_8fuel_asm17panic_instructions1_1__NtB4_16PanicInstructionNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_static
Line
Count
Source
13
2.15k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RNvXNvNtCs6P3fQNJKMy0_8fuel_asm17panic_instructions1_1__NtB4_16PanicInstructionNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamic
Line
Count
Source
13
2.15k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtCs6P3fQNJKMy0_8fuel_asm17panic_instructions1_1__NtB5_16PanicInstructionNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXNvNtCs6P3fQNJKMy0_8fuel_asm17panic_instructions1_1__NtB5_16PanicInstructionNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXNvNtCs6P3fQNJKMy0_8fuel_asm17panic_instructions1_1__NtB5_16PanicInstructionNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvXNvNtCs6P3fQNJKMy0_8fuel_asm17panic_instructions1_1__NtB5_16PanicInstructionNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
14
/// Describe a panic reason with the instruction that generated it
15
pub struct PanicInstruction {
16
    #[canonical(skip)]
17
    reason: PanicReason,
18
    instruction: RawInstruction,
19
}
20
21
impl PanicInstruction {
22
    /// Represents an error described by a reason and an instruction.
23
2.15k
    pub const fn error(reason: PanicReason, instruction: RawInstruction) -> Self {
24
2.15k
        Self {
25
2.15k
            reason,
26
2.15k
            instruction,
27
2.15k
        }
28
2.15k
    }
_RNvMNtCs6P3fQNJKMy0_8fuel_asm17panic_instructionNtB2_16PanicInstruction5errorCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
23
2.15k
    pub const fn error(reason: PanicReason, instruction: RawInstruction) -> Self {
24
2.15k
        Self {
25
2.15k
            reason,
26
2.15k
            instruction,
27
2.15k
        }
28
2.15k
    }
Unexecuted instantiation: _RNvMNtCs6P3fQNJKMy0_8fuel_asm17panic_instructionNtB2_16PanicInstruction5errorB4_
29
30
    /// Underlying panic reason
31
0
    pub const fn reason(&self) -> &PanicReason {
32
0
        &self.reason
33
0
    }
Unexecuted instantiation: _RNvMNtCs6P3fQNJKMy0_8fuel_asm17panic_instructionNtB2_16PanicInstruction6reasonCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMNtCs6P3fQNJKMy0_8fuel_asm17panic_instructionNtB2_16PanicInstruction6reasonB4_
34
35
    /// Underlying instruction
36
0
    pub const fn instruction(&self) -> &RawInstruction {
37
0
        &self.instruction
38
0
    }
39
}
40
41
/// Helper struct to debug-format a `RawInstruction` in `PanicInstruction::fmt`.
42
struct InstructionDbg(RawInstruction);
43
impl fmt::Debug for InstructionDbg {
44
    /// Formats like this: `MOVI { dst: 32, val: 32 } (bytes: 72 80 00 20)`}`
45
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
46
0
        match Instruction::try_from(self.0) {
47
0
            Ok(instr) => write!(f, "{:?}", instr)?,
48
0
            Err(_) => write!(f, "Unknown")?,
49
        };
50
0
        write!(f, " (bytes: ")?;
51
0
        for (i, byte) in self.0.to_be_bytes().iter().enumerate() {
52
0
            if i != 0 {
53
0
                write!(f, " ")?;
54
0
            }
55
0
            write!(f, "{:02x}", byte)?;
56
        }
57
0
        write!(f, ")")
58
0
    }
59
}
60
61
impl fmt::Debug for PanicInstruction {
62
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
63
0
        f.debug_struct("PanicInstruction")
64
0
            .field("reason", &self.reason)
65
0
            .field("instruction", &InstructionDbg(self.instruction))
66
0
            .finish()
67
0
    }
68
}
69
70
#[cfg(feature = "typescript")]
71
#[wasm_bindgen::prelude::wasm_bindgen]
72
impl PanicInstruction {
73
    /// Represents an error described by a reason and an instruction.
74
    #[wasm_bindgen(constructor)]
75
    pub fn error_typescript(reason: PanicReason, instruction: RawInstruction) -> Self {
76
        Self::error(reason, instruction)
77
    }
78
79
    /// Underlying panic reason
80
    #[wasm_bindgen(js_name = reason)]
81
    pub fn reason_typescript(&self) -> PanicReason {
82
        *self.reason()
83
    }
84
85
    /// Underlying instruction
86
    #[wasm_bindgen(js_name = instruction)]
87
    pub fn instruction_typescript(&self) -> RawInstruction {
88
        *self.instruction()
89
    }
90
}
91
92
const WORD_SIZE: usize = core::mem::size_of::<Word>();
93
const REASON_OFFSET: Word = (WORD_SIZE * 8 - 8) as Word;
94
const INSTR_OFFSET: Word = REASON_OFFSET - (Instruction::SIZE * 8) as Word;
95
96
impl From<PanicInstruction> for Word {
97
0
    fn from(r: PanicInstruction) -> Word {
98
0
        let reason = Word::from(r.reason as u8);
99
0
        let instruction = Word::from(r.instruction);
100
0
        (reason << REASON_OFFSET) | (instruction << INSTR_OFFSET)
101
0
    }
102
}
103
104
impl From<Word> for PanicInstruction {
105
    #[allow(clippy::cast_possible_truncation)]
106
0
    fn from(val: Word) -> Self {
107
0
        // Safe to cast as we've shifted the 8 MSB.
108
0
        let reason_u8 = (val >> REASON_OFFSET) as u8;
109
0
        // Cast to truncate in order to remove the `reason` bits.
110
0
        let instruction = (val >> INSTR_OFFSET) as u32;
111
0
        let reason = PanicReason::from(reason_u8);
112
0
        Self {
113
0
            reason,
114
0
            instruction,
115
0
        }
116
0
    }
117
}
118
119
#[cfg(test)]
120
mod tests {
121
    use super::*;
122
    use crate::op;
123
    use fuel_types::canonical::Serialize;
124
125
    #[test]
126
    fn canonical_serialization_ignores_panic_reason() {
127
        let revert_panic_instruction =
128
            PanicInstruction::error(PanicReason::Revert, op::noop().into());
129
        let out_of_gas_panic_instruction =
130
            PanicInstruction::error(PanicReason::OutOfGas, op::noop().into());
131
        assert_eq!(
132
            revert_panic_instruction.to_bytes(),
133
            out_of_gas_panic_instruction.to_bytes()
134
        );
135
    }
136
}
/home/marten/fuel/fuel-vm/fuel-asm/src/args.rs
Line
Count
Source
1
pub mod wideint;
2
3
/// 12-bits immediate value type
4
type Immediate12 = u16;
5
6
/// 18-bits immediate value type
7
type Immediate18 = u32;
8
9
crate::enum_try_from! {
10
0
    #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, strum::EnumIter)]
Unexecuted instantiation: _RNvMs8_NtCs6P3fQNJKMy0_8fuel_asm4argsNtB5_10GMArgsIter3getB7_
Unexecuted instantiation: _RNvXs9_NtCs6P3fQNJKMy0_8fuel_asm4argsNtB5_6GMArgsNtCs7SJq3lwJE1q_5strum16IntoEnumIterator4iterB7_
Unexecuted instantiation: _RNvXsa_NtCs6P3fQNJKMy0_8fuel_asm4argsNtB5_10GMArgsIterNtNtNtNtCsd3UI3IJrzMw_4core4iter6traits8iterator8Iterator4next
Unexecuted instantiation: _RNvXsa_NtCs6P3fQNJKMy0_8fuel_asm4argsNtB5_10GMArgsIterNtNtNtNtCsd3UI3IJrzMw_4core4iter6traits8iterator8Iterator9size_hint
Unexecuted instantiation: _RNvXsa_NtCs6P3fQNJKMy0_8fuel_asm4argsNtB5_10GMArgsIterNtNtNtNtCsd3UI3IJrzMw_4core4iter6traits8iterator8Iterator3nth
Unexecuted instantiation: _RNvXsb_NtCs6P3fQNJKMy0_8fuel_asm4argsNtB5_10GMArgsIterNtNtNtNtCsd3UI3IJrzMw_4core4iter6traits10exact_size17ExactSizeIterator3len
Unexecuted instantiation: _RNvXsc_NtCs6P3fQNJKMy0_8fuel_asm4argsNtB5_10GMArgsIterNtNtNtNtCsd3UI3IJrzMw_4core4iter6traits12double_ended19DoubleEndedIterator9next_back
Unexecuted instantiation: _RNvXsd_NtCs6P3fQNJKMy0_8fuel_asm4argsNtB5_10GMArgsIterNtNtCsd3UI3IJrzMw_4core5clone5Clone5cloneB7_
11
    #[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
12
    #[repr(u8)]
13
0
    #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm4argss_1__NtB7_6GMArgsNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtCs6P3fQNJKMy0_8fuel_asm4argss_1__NtBa_6GMArgsNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtBX_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm4argss_1__NtB8_6GMArgsNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtBV_7Visitor9visit_u64pEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm4argss_1__NtB8_6GMArgsNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtBV_7Visitor9visit_strpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm4argss_1__NtB8_6GMArgsNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtBV_7Visitor11visit_bytespEBa_
Unexecuted instantiation: _RINvXs_NvXNvNtCs6P3fQNJKMy0_8fuel_asm4argss_1__NtBa_6GMArgsNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldBV_11deserializepEBc_
Unexecuted instantiation: _RINvXs0_NvXNvNtCs6P3fQNJKMy0_8fuel_asm4argss_1__NtBb_6GMArgsNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtBY_7Visitor10visit_enumpEBd_
14
    /// Argument list for GM (get metadata) instruction
15
    /// The VM is the only who should match this struct, and it *MUST* always perform
16
    /// exhaustive match so all offered variants are covered.
17
    pub enum GMArgs {
18
        /// Get if caller is external.
19
        IsCallerExternal = 0x01,
20
21
        /// Get caller's contract ID.
22
        GetCaller = 0x02,
23
24
        /// Get index of current predicate.
25
        GetVerifyingPredicate = 0x03,
26
27
        /// Get the Chain ID this VM is operating within
28
        GetChainId = 0x04,
29
30
        /// Get memory address where the transaction is located
31
        TxStart = 0x05,
32
33
        /// Get memory address of base asset ID
34
        BaseAssetId = 0x06,
35
    },
36
    Immediate18
37
}
38
39
impl From<GMArgs> for Immediate18 {
40
0
    fn from(args: GMArgs) -> Self {
41
0
        args as Immediate18
42
0
    }
43
}
44
45
crate::enum_try_from! {
46
    /// Argument list for GTF (get tx fields) instruction
47
    /// The VM is the only who should match this struct, and it *MUST* always perform
48
    /// exhaustive match so all offered variants are covered.
49
0
    #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, strum::EnumIter)]
Unexecuted instantiation: _RNvMsm_NtCs6P3fQNJKMy0_8fuel_asm4argsNtB5_11GTFArgsIter3get
Unexecuted instantiation: _RNvXsn_NtCs6P3fQNJKMy0_8fuel_asm4argsNtB5_7GTFArgsNtCs7SJq3lwJE1q_5strum16IntoEnumIterator4iterB7_
Unexecuted instantiation: _RNvXso_NtCs6P3fQNJKMy0_8fuel_asm4argsNtB5_11GTFArgsIterNtNtNtNtCsd3UI3IJrzMw_4core4iter6traits8iterator8Iterator4next
Unexecuted instantiation: _RNvXso_NtCs6P3fQNJKMy0_8fuel_asm4argsNtB5_11GTFArgsIterNtNtNtNtCsd3UI3IJrzMw_4core4iter6traits8iterator8Iterator9size_hint
Unexecuted instantiation: _RNvXso_NtCs6P3fQNJKMy0_8fuel_asm4argsNtB5_11GTFArgsIterNtNtNtNtCsd3UI3IJrzMw_4core4iter6traits8iterator8Iterator3nth
Unexecuted instantiation: _RNvXsp_NtCs6P3fQNJKMy0_8fuel_asm4argsNtB5_11GTFArgsIterNtNtNtNtCsd3UI3IJrzMw_4core4iter6traits10exact_size17ExactSizeIterator3len
Unexecuted instantiation: _RNvXsq_NtCs6P3fQNJKMy0_8fuel_asm4argsNtB5_11GTFArgsIterNtNtNtNtCsd3UI3IJrzMw_4core4iter6traits12double_ended19DoubleEndedIterator9next_back
Unexecuted instantiation: _RNvXsr_NtCs6P3fQNJKMy0_8fuel_asm4argsNtB5_11GTFArgsIterNtNtCsd3UI3IJrzMw_4core5clone5Clone5cloneB7_
50
    #[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
51
    #[repr(u16)]
52
0
    #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm4argss1_1__NtB7_7GTFArgsNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtBW_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtCs6P3fQNJKMy0_8fuel_asm4argss1_1__NtBa_7GTFArgsNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtBZ_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm4argss1_1__NtB8_7GTFArgsNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtBX_7Visitor9visit_u64pEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm4argss1_1__NtB8_7GTFArgsNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtBX_7Visitor9visit_strpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm4argss1_1__NtB8_7GTFArgsNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtBX_7Visitor11visit_bytespEBa_
Unexecuted instantiation: _RINvXs_NvXNvNtCs6P3fQNJKMy0_8fuel_asm4argss1_1__NtBa_7GTFArgsNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldBX_11deserializepEBc_
Unexecuted instantiation: _RINvXs0_NvXNvNtCs6P3fQNJKMy0_8fuel_asm4argss1_1__NtBb_7GTFArgsNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB10_7Visitor10visit_enumpEBd_
53
    pub enum GTFArgs {
54
        /// Set `$rA` to `tx.type`
55
        Type = 0x001,
56
57
        /// Set `$rA` to `tx.scriptGasLimit`
58
        ScriptGasLimit = 0x002,
59
60
        /// Set `$rA` to `tx.scriptLength`
61
        ScriptLength = 0x003,
62
63
        /// Set `$rA` to `tx.scriptDataLength`
64
        ScriptDataLength = 0x004,
65
66
        /// Set `$rA` to `tx.inputsCount`
67
        ScriptInputsCount = 0x005,
68
69
        /// Set `$rA` to `tx.outputsCount`
70
        ScriptOutputsCount = 0x006,
71
72
        /// Set `$rA` to `tx.witnessesCount`
73
        ScriptWitnessesCount = 0x007,
74
75
        /// Set `$rA` to `Memory address of tx.script`
76
        Script = 0x009,
77
78
        /// Set `$rA` to `Memory address of tx.scriptData`
79
        ScriptData = 0x00A,
80
81
        /// Set `$rA` to `Memory address of tx.inputs[$rB]`
82
        ScriptInputAtIndex = 0x00B,
83
84
        /// Set `$rA` to `Memory address of t.outputs[$rB]`
85
        ScriptOutputAtIndex = 0x00C,
86
87
        /// Set `$rA` to `Memory address of tx.witnesses[$rB]`
88
        ScriptWitnessAtIndex = 0x00D,
89
90
        /// Set `$rA` to size of the transaction in memory, in bytes
91
        TxLength = 0x00E,
92
93
        /// Set `$rA` to `tx.bytecodeWitnessIndex`
94
        CreateBytecodeWitnessIndex = 0x101,
95
96
        /// Set `$rA` to `tx.storageSlotsCount`
97
        CreateStorageSlotsCount = 0x102,
98
99
        /// Set `$rA` to `tx.inputsCount`
100
        CreateInputsCount = 0x103,
101
102
        /// Set `$rA` to `tx.outputsCount`
103
        CreateOutputsCount = 0x104,
104
105
        /// Set `$rA` to `tx.witnessesCount`
106
        CreateWitnessesCount = 0x105,
107
108
        /// Set `$rA` to `Memory address of tx.salt`
109
        CreateSalt = 0x106,
110
111
        /// Set `$rA` to `Memory address of tx.storageSlots[$rB]`
112
        CreateStorageSlotAtIndex = 0x107,
113
114
        /// Set `$rA` to `Memory address of tx.inputs[$rB]`
115
        CreateInputAtIndex = 0x108,
116
117
        /// Set `$rA` to `Memory address of t.outputs[$rB]`
118
        CreateOutputAtIndex = 0x109,
119
120
        /// Set `$rA` to `Memory address of tx.witnesses[$rB]`
121
        CreateWitnessAtIndex = 0x10A,
122
123
        /// Set `$rA` to `tx.inputs[$rB].type`
124
        InputType = 0x200,
125
126
        /// Set `$rA` to `Memory address of tx.inputs[$rB].txID`
127
        InputCoinTxId = 0x201,
128
129
        /// Set `$rA` to `tx.inputs[$rB].outputIndex`
130
        InputCoinOutputIndex = 0x202,
131
132
        /// Set `$rA` to `Memory address of tx.inputs[$rB].owner`
133
        InputCoinOwner = 0x203,
134
135
        /// Set `$rA` to `tx.inputs[$rB].amount`
136
        InputCoinAmount = 0x204,
137
138
        /// Set `$rA` to `Memory address of tx.inputs[$rB].asset_id`
139
        InputCoinAssetId = 0x205,
140
141
        /// Set `$rA` to `Memory address of tx.inputs[$rB].txPointer`
142
        InputCoinTxPointer = 0x206,
143
144
        /// Set `$rA` to `tx.inputs[$rB].witnessIndex`
145
        InputCoinWitnessIndex = 0x207,
146
147
        /// Set `$rA` to `tx.inputs[$rB].predicateLength`
148
        InputCoinPredicateLength = 0x209,
149
150
        /// Set `$rA` to `tx.inputs[$rB].predicateDataLength`
151
        InputCoinPredicateDataLength = 0x20A,
152
153
        /// Set `$rA` to `Memory address of tx.inputs[$rB].predicate`
154
        InputCoinPredicate = 0x20B,
155
156
        /// Set `$rA` to `Memory address of tx.inputs[$rB].predicateData`
157
        InputCoinPredicateData = 0x20C,
158
159
        /// Set `$rA` to `Memory address of tx.inputs[$rB].predicateGasUsed`
160
        InputCoinPredicateGasUsed = 0x20D,
161
162
        /// Set `$rA` to `Memory address of tx.inputs[$rB].txID`
163
        InputContractTxId = 0x220,
164
165
        /// Set `$rA` to `tx.inputs[$rB].outputIndex`
166
        InputContractOutputIndex = 0x221,
167
168
        /// Set `$rA` to `Memory address of tx.inputs[$rB].contractID`
169
        InputContractId = 0x225,
170
171
        /// Set `$rA` to `Memory address of tx.inputs[$rB].sender`
172
        InputMessageSender = 0x240,
173
174
        /// Set `$rA` to `Memory address of tx.inputs[$rB].recipient`
175
        InputMessageRecipient = 0x241,
176
177
        /// Set `$rA` to `tx.inputs[$rB].amount`
178
        InputMessageAmount = 0x242,
179
180
        /// Set `$rA` to `Memory address of tx.inputs[$rB].nonce`
181
        InputMessageNonce = 0x243,
182
183
        /// Set `$rA` to `tx.inputs[$rB].witnessIndex`
184
        InputMessageWitnessIndex = 0x244,
185
186
        /// Set `$rA` to `tx.inputs[$rB].dataLength`
187
        InputMessageDataLength = 0x245,
188
189
        /// Set `$rA` to `tx.inputs[$rB].predicateLength`
190
        InputMessagePredicateLength = 0x246,
191
192
        /// Set `$rA` to `tx.inputs[$rB].predicateDataLength`
193
        InputMessagePredicateDataLength = 0x247,
194
195
        /// Set `$rA` to `Memory address of tx.inputs[$rB].data`
196
        InputMessageData = 0x248,
197
198
        /// Set `$rA` to `Memory address of tx.inputs[$rB].predicate`
199
        InputMessagePredicate = 0x249,
200
201
        /// Set `$rA` to `Memory address of tx.inputs[$rB].predicateData`
202
        InputMessagePredicateData = 0x24A,
203
204
        /// Set `$rA` to `Memory address of tx.inputs[$rB].predicateGasUsed`
205
        InputMessagePredicateGasUsed = 0x24B,
206
207
        /// Set `$rA` to `tx.outputs[$rB].type`
208
        OutputType = 0x300,
209
210
        /// Set `$rA` to `Memory address of tx.outputs[$rB].to`
211
        OutputCoinTo = 0x301,
212
213
        /// Set `$rA` to `tx.outputs[$rB].amount`
214
        OutputCoinAmount = 0x302,
215
216
        /// Set `$rA` to `Memory address of tx.outputs[$rB].asset_id`
217
        OutputCoinAssetId = 0x303,
218
219
        /// Set `$rA` to `tx.outputs[$rB].inputIndex`
220
        OutputContractInputIndex = 0x304,
221
222
        /// Set `$rA` to `Memory address of tx.outputs[$rB].contractID`
223
        OutputContractCreatedContractId = 0x307,
224
225
        /// Set `$rA` to `Memory address of tx.outputs[$rB].stateRoot`
226
        OutputContractCreatedStateRoot = 0x308,
227
228
        /// Set `$rA` to `tx.witnesses[$rB].dataLength`
229
        WitnessDataLength = 0x400,
230
231
        /// Set `$rA` to `Memory address of tx.witnesses[$rB].data`
232
        WitnessData = 0x401,
233
234
        /// Set `$rA` to `tx.policyTypes`
235
        PolicyTypes = 0x500,
236
237
        /// Set `$rA` to `tx.policies[0x00].gasPrice`
238
        PolicyTip = 0x501,
239
240
        /// Set `$rA` to `tx.policies[count_ones(0b11 & tx.policyTypes) - 1].witnessLimit`
241
        PolicyWitnessLimit = 0x502,
242
243
        /// Set `$rA` to `tx.policies[count_ones(0b111 & tx.policyTypes) - 1].maturity`
244
        PolicyMaturity = 0x503,
245
246
        /// Set `$rA` to `tx.policies[count_ones(0b1111 & tx.policyTypes) - 1].maxFee`
247
        PolicyMaxFee = 0x504,
248
    },
249
    Immediate12
250
}
251
252
impl From<GTFArgs> for Immediate12 {
253
0
    fn from(args: GTFArgs) -> Self {
254
0
        args as Immediate12
255
0
    }
Unexecuted instantiation: _RNvXs_NtCs6P3fQNJKMy0_8fuel_asm4argstINtNtCsd3UI3IJrzMw_4core7convert4FromNtB4_7GTFArgsE4fromCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NtCs6P3fQNJKMy0_8fuel_asm4argstINtNtCsd3UI3IJrzMw_4core7convert4FromNtB4_7GTFArgsE4fromB6_
256
}
257
258
#[test]
259
#[cfg(feature = "std")]
260
fn encode_gm_args() {
261
    let args = vec![
262
        GMArgs::IsCallerExternal,
263
        GMArgs::GetCaller,
264
        GMArgs::GetVerifyingPredicate,
265
        GMArgs::GetChainId,
266
        GMArgs::TxStart,
267
        GMArgs::BaseAssetId,
268
    ];
269
270
    args.into_iter().for_each(|a| {
271
        let imm = a as Immediate18;
272
        let a_p = GMArgs::try_from(imm).expect("failed to convert GMArgs");
273
274
        assert_eq!(a, a_p);
275
    });
276
}
277
278
#[test]
279
#[cfg(feature = "std")]
280
fn encode_gtf_args() {
281
    let args = vec![
282
        GTFArgs::Type,
283
        GTFArgs::ScriptGasLimit,
284
        GTFArgs::ScriptLength,
285
        GTFArgs::ScriptDataLength,
286
        GTFArgs::ScriptInputsCount,
287
        GTFArgs::ScriptOutputsCount,
288
        GTFArgs::ScriptWitnessesCount,
289
        GTFArgs::Script,
290
        GTFArgs::ScriptData,
291
        GTFArgs::ScriptInputAtIndex,
292
        GTFArgs::ScriptOutputAtIndex,
293
        GTFArgs::ScriptWitnessAtIndex,
294
        GTFArgs::CreateBytecodeWitnessIndex,
295
        GTFArgs::CreateStorageSlotsCount,
296
        GTFArgs::CreateInputsCount,
297
        GTFArgs::CreateOutputsCount,
298
        GTFArgs::CreateWitnessesCount,
299
        GTFArgs::CreateSalt,
300
        GTFArgs::CreateStorageSlotAtIndex,
301
        GTFArgs::CreateInputAtIndex,
302
        GTFArgs::CreateOutputAtIndex,
303
        GTFArgs::CreateWitnessAtIndex,
304
        GTFArgs::InputType,
305
        GTFArgs::InputCoinTxId,
306
        GTFArgs::InputCoinOutputIndex,
307
        GTFArgs::InputCoinOwner,
308
        GTFArgs::InputCoinAmount,
309
        GTFArgs::InputCoinAssetId,
310
        GTFArgs::InputCoinTxPointer,
311
        GTFArgs::InputCoinWitnessIndex,
312
        GTFArgs::InputCoinPredicateLength,
313
        GTFArgs::InputCoinPredicateDataLength,
314
        GTFArgs::InputCoinPredicate,
315
        GTFArgs::InputCoinPredicateData,
316
        GTFArgs::InputCoinPredicateGasUsed,
317
        GTFArgs::InputContractId,
318
        GTFArgs::InputMessageSender,
319
        GTFArgs::InputMessageRecipient,
320
        GTFArgs::InputMessageAmount,
321
        GTFArgs::InputMessageNonce,
322
        GTFArgs::InputMessageWitnessIndex,
323
        GTFArgs::InputMessageDataLength,
324
        GTFArgs::InputMessagePredicateLength,
325
        GTFArgs::InputMessagePredicateDataLength,
326
        GTFArgs::InputMessageData,
327
        GTFArgs::InputMessagePredicate,
328
        GTFArgs::InputMessagePredicateData,
329
        GTFArgs::InputMessagePredicateGasUsed,
330
        GTFArgs::OutputType,
331
        GTFArgs::OutputCoinTo,
332
        GTFArgs::OutputCoinAmount,
333
        GTFArgs::OutputCoinAssetId,
334
        GTFArgs::OutputContractInputIndex,
335
        GTFArgs::OutputContractCreatedContractId,
336
        GTFArgs::OutputContractCreatedStateRoot,
337
        GTFArgs::WitnessDataLength,
338
        GTFArgs::WitnessData,
339
        GTFArgs::PolicyTypes,
340
        GTFArgs::PolicyTip,
341
        GTFArgs::PolicyWitnessLimit,
342
        GTFArgs::PolicyMaturity,
343
        GTFArgs::PolicyMaxFee,
344
    ];
345
346
    args.into_iter().for_each(|a| {
347
        let imm = a as Immediate12;
348
        let a_p = GTFArgs::try_from(imm).expect("failed to convert GTFArgs");
349
350
        assert_eq!(a, a_p);
351
    });
352
}
/home/marten/fuel/fuel-vm/fuel-asm/src/lib.rs
Line
Count
Source
1
//! FuelVM instruction and opcodes representation.
2
3
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
4
#![cfg_attr(not(feature = "std"), no_std)]
5
#![cfg_attr(feature = "std", doc = include_str!("../README.md"))]
6
#![deny(
7
    clippy::arithmetic_side_effects,
8
    clippy::cast_sign_loss,
9
    clippy::cast_possible_truncation,
10
    clippy::cast_possible_wrap,
11
    clippy::string_slice
12
)]
13
#![deny(missing_docs)]
14
#![deny(unsafe_code)]
15
#![deny(unused_crate_dependencies)]
16
17
#[cfg(feature = "alloc")]
18
extern crate alloc;
19
20
mod args;
21
mod panic_instruction;
22
// This is `pub` to make documentation for the private `impl_instructions!` macro more
23
// accessible.
24
#[macro_use]
25
pub mod macros;
26
pub mod op;
27
mod pack;
28
mod panic_reason;
29
mod unpack;
30
31
#[cfg(test)]
32
mod encoding_tests;
33
34
#[doc(no_inline)]
35
pub use args::{
36
    wideint,
37
    GMArgs,
38
    GTFArgs,
39
};
40
41
/// Register ID type
42
pub type RegisterId = usize;
43
44
/// Register value type
45
pub type Word = u64;
46
47
pub use panic_instruction::PanicInstruction;
48
pub use panic_reason::PanicReason;
49
50
/// Represents a 6-bit register ID, guaranteed to be masked by construction.
51
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
52
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
53
pub struct RegId(u8);
54
55
/// Represents a 6-bit immediate value, guaranteed to be masked by construction.
56
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
57
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
58
pub struct Imm06(u8);
59
60
/// Represents a 12-bit immediate value, guaranteed to be masked by construction.
61
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
62
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
63
pub struct Imm12(u16);
64
65
/// Represents a 18-bit immediate value, guaranteed to be masked by construction.
66
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
67
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
68
pub struct Imm18(u32);
69
70
/// Represents a 24-bit immediate value, guaranteed to be masked by construction.
71
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
72
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
73
pub struct Imm24(u32);
74
75
/// An instruction in its raw, packed, unparsed representation.
76
pub type RawInstruction = u32;
77
78
/// Given opcode doesn't exist, or is the reserved part of
79
/// the instruction (i.e. space outside arguments) is non-zero.
80
#[derive(Debug, Eq, PartialEq)]
81
pub struct InvalidOpcode;
82
83
bitflags::bitflags! {
84
    /// Possible values for the FLAG instruction.
85
    /// See https://github.com/FuelLabs/fuel-specs/blob/master/src/fuel-vm/index.md#flags
86
    pub struct Flags: Word {
87
        /// If set, arithmetic errors result in setting $err instead of panicking.
88
        /// This includes cases where result of a computation is undefined, like
89
        /// division by zero. Arithmetic overflows still cause a panic, but that be
90
        /// controlled with [`Flags::WRAPPING`].
91
        const UNSAFEMATH = 0x01;
92
        /// If set, arithmetic overflows result in setting $of instead of panicking.
93
        const WRAPPING = 0x02;
94
    }
95
}
96
/// Type is convertible to a [`RegId`]
97
pub trait CheckRegId {
98
    /// Convert to a [`RegId`], or panic
99
    fn check(self) -> RegId;
100
}
101
102
impl CheckRegId for RegId {
103
4.38k
    fn check(self) -> RegId {
104
4.38k
        self
105
4.38k
    }
_RNvXCs6P3fQNJKMy0_8fuel_asmNtB2_5RegIdNtB2_10CheckRegId5checkCs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
103
2.19k
    fn check(self) -> RegId {
104
2.19k
        self
105
2.19k
    }
_RNvXCs6P3fQNJKMy0_8fuel_asmNtB2_5RegIdNtB2_10CheckRegId5checkCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
103
2.19k
    fn check(self) -> RegId {
104
2.19k
        self
105
2.19k
    }
Unexecuted instantiation: _RNvXCs6P3fQNJKMy0_8fuel_asmNtB2_5RegIdNtB2_10CheckRegId5checkB2_
106
}
107
108
impl CheckRegId for u8 {
109
8.77k
    fn check(self) -> RegId {
110
8.77k
        RegId::new_checked(self).expect("CheckRegId was given invalid RegId")
111
8.77k
    }
112
}
113
114
// Defines the `Instruction` and `Opcode` types, along with an `op` module declaring a
115
// unique type for each opcode's instruction variant. For a detailed explanation of how
116
// this works, see the `fuel_asm::macros` module level documentation.
117
impl_instructions! {
118
    "Adds two registers."
119
    0x10 ADD add [dst: RegId lhs: RegId rhs: RegId]
120
    "Bitwise ANDs two registers."
121
    0x11 AND and [dst: RegId lhs: RegId rhs: RegId]
122
    "Divides two registers."
123
    0x12 DIV div [dst: RegId lhs: RegId rhs: RegId]
124
    "Compares two registers for equality."
125
    0x13 EQ eq [dst: RegId lhs: RegId rhs: RegId]
126
    "Raises one register to the power of another."
127
    0x14 EXP exp [dst: RegId lhs: RegId rhs: RegId]
128
    "Compares two registers for greater-than."
129
    0x15 GT gt [dst: RegId lhs: RegId rhs: RegId]
130
    "Compares two registers for less-than."
131
    0x16 LT lt [dst: RegId lhs: RegId rhs: RegId]
132
    "The integer logarithm of a register."
133
    0x17 MLOG mlog [dst: RegId lhs: RegId rhs: RegId]
134
    "The integer root of a register."
135
    0x18 MROO mroo [dst: RegId lhs: RegId rhs: RegId]
136
    "Modulo remainder of two registers."
137
    0x19 MOD mod_ [dst: RegId lhs: RegId rhs: RegId]
138
    "Copy from one register to another."
139
    0x1A MOVE move_ [dst: RegId src: RegId]
140
    "Multiplies two registers."
141
    0x1B MUL mul [dst: RegId lhs: RegId rhs: RegId]
142
    "Bitwise NOT a register."
143
    0x1C NOT not [dst: RegId arg: RegId]
144
    "Bitwise ORs two registers."
145
    0x1D OR or [dst: RegId lhs: RegId rhs: RegId]
146
    "Left shifts a register by a register."
147
    0x1E SLL sll [dst: RegId lhs: RegId rhs: RegId]
148
    "Right shifts a register by a register."
149
    0x1F SRL srl [dst: RegId lhs: RegId rhs: RegId]
150
    "Subtracts two registers."
151
    0x20 SUB sub [dst: RegId lhs: RegId rhs: RegId]
152
    "Bitwise XORs two registers."
153
    0x21 XOR xor [dst: RegId lhs: RegId rhs: RegId]
154
    "Fused multiply-divide with arbitrary precision intermediate step."
155
    0x22 MLDV mldv [dst: RegId mul_lhs: RegId mul_rhs: RegId divisor: RegId]
156
157
    "Return from context."
158
    0x24 RET ret [value: RegId]
159
    "Return from context with data."
160
    0x25 RETD retd [addr: RegId len: RegId]
161
    "Allocate a number of bytes from the heap."
162
    0x26 ALOC aloc [bytes: RegId]
163
    "Clear a variable number of bytes in memory."
164
    0x27 MCL mcl [dst_addr: RegId len: RegId]
165
    "Copy a variable number of bytes in memory."
166
    0x28 MCP mcp [dst_addr: RegId src_addr: RegId len: RegId]
167
    "Compare bytes in memory."
168
    0x29 MEQ meq [result: RegId lhs_addr: RegId rhs_addr: RegId len: RegId]
169
    "Get block header hash for height."
170
    0x2A BHSH bhsh [dst: RegId heigth: RegId]
171
    "Get current block height."
172
    0x2B BHEI bhei [dst: RegId]
173
    "Burns `amount` coins of the asset ID created from `sub_id` for the current contract."
174
    0x2C BURN burn [amount: RegId sub_id_addr: RegId]
175
    "Call a contract."
176
    0x2D CALL call [target_struct: RegId fwd_coins: RegId asset_id_addr: RegId fwd_gas: RegId]
177
    "Copy contract code for a contract."
178
    0x2E CCP ccp [dst_addr: RegId contract_id_addr: RegId offset: RegId len: RegId]
179
    "Get code root of a contract."
180
    0x2F CROO croo [dst_addr: RegId contract_id_addr: RegId]
181
    "Get code size of a contract."
182
    0x30 CSIZ csiz [dst: RegId contract_id_addr: RegId]
183
    "Get current block proposer's address."
184
    0x31 CB cb [dst: RegId]
185
    "Load code as executable either from contract, blob, or memory."
186
    0x32 LDC ldc [src_addr: RegId offset: RegId len: RegId mode: Imm06]
187
    "Log an event."
188
    0x33 LOG log [a: RegId b: RegId c: RegId d: RegId]
189
    "Log data."
190
    0x34 LOGD logd [a: RegId b: RegId addr: RegId len: RegId]
191
    "Mints `amount` coins of the asset ID created from `sub_id` for the current contract."
192
    0x35 MINT mint [amount: RegId sub_id_addr: RegId]
193
    "Halt execution, reverting state changes and returning a value."
194
    0x36 RVRT rvrt [value: RegId]
195
    "Clear a series of slots from contract storage."
196
    0x37 SCWQ scwq [key_addr: RegId status: RegId lenq: RegId]
197
    "Load a word from contract storage."
198
    0x38 SRW srw [dst: RegId status: RegId key_addr: RegId]
199
    "Load a series of 32 byte slots from contract storage."
200
    0x39 SRWQ srwq [dst_addr: RegId status: RegId key_addr:RegId lenq: RegId]
201
    "Store a word in contract storage."
202
    0x3A SWW sww [key_addr: RegId status: RegId value: RegId]
203
    "Store a series of 32 byte slots in contract storage."
204
    0x3B SWWQ swwq [key_addr: RegId status: RegId src_addr: RegId lenq: RegId]
205
    "Transfer coins to a contract unconditionally."
206
    0x3C TR tr [contract_id_addr: RegId amount: RegId asset_id_addr: RegId]
207
    "Transfer coins to a variable output."
208
    0x3D TRO tro [contract_id_addr: RegId output_index: RegId amount: RegId asset_id_addr: RegId]
209
    "The 64-byte public key (x, y) recovered from 64-byte signature on 32-byte message hash."
210
    0x3E ECK1 eck1 [dst_addr: RegId sig_addr: RegId msg_hash_addr: RegId]
211
    "The 64-byte Secp256r1 public key (x, y) recovered from 64-byte signature on 32-byte message hash."
212
    0x3F ECR1 ecr1 [dst_addr: RegId sig_addr: RegId msg_hash_addr: RegId]
213
    "Verify ED25519 public key and signature match a message."
214
    0x40 ED19 ed19 [pub_key_addr: RegId sig_addr: RegId msg_addr: RegId msg_len: RegId]
215
    "The keccak-256 hash of a slice."
216
    0x41 K256 k256 [dst_addr: RegId src_addr: RegId len: RegId]
217
    "The SHA-2-256 hash of a slice."
218
    0x42 S256 s256 [dst_addr: RegId src_addr: RegId len: RegId]
219
    "Get timestamp of block at given height."
220
    0x43 TIME time [dst: RegId heigth: RegId]
221
222
    "Performs no operation."
223
    0x47 NOOP noop []
224
    "Set flag register to a register."
225
    0x48 FLAG flag [value: RegId]
226
    "Get the balance of contract of an asset ID."
227
    0x49 BAL bal [dst: RegId asset_id_addr: RegId contract_id_addr: RegId]
228
    "Dynamic jump."
229
    0x4A JMP jmp [abs_target: RegId]
230
    "Conditional dynamic jump."
231
    0x4B JNE jne [abs_target: RegId lhs: RegId rhs: RegId]
232
    "Send a message to recipient address with call abi, coins, and output."
233
    0x4C SMO smo [recipient_addr: RegId data_addr: RegId data_len: RegId coins: RegId]
234
235
    "Adds a register and an immediate value."
236
    0x50 ADDI addi [dst: RegId lhs: RegId rhs: Imm12]
237
    "Bitwise ANDs a register and an immediate value."
238
    0x51 ANDI andi [dst: RegId lhs: RegId rhs: Imm12]
239
    "Divides a register and an immediate value."
240
    0x52 DIVI divi [dst: RegId lhs: RegId rhs: Imm12]
241
    "Raises one register to the power of an immediate value."
242
    0x53 EXPI expi [dst: RegId lhs: RegId rhs: Imm12]
243
    "Modulo remainder of a register and an immediate value."
244
    0x54 MODI modi [dst: RegId lhs: RegId rhs: Imm12]
245
    "Multiplies a register and an immediate value."
246
    0x55 MULI muli [dst: RegId lhs: RegId rhs: Imm12]
247
    "Bitwise ORs a register and an immediate value."
248
    0x56 ORI ori [dst: RegId lhs: RegId rhs: Imm12]
249
    "Left shifts a register by an immediate value."
250
    0x57 SLLI slli [dst: RegId lhs: RegId rhs: Imm12]
251
    "Right shifts a register by an immediate value."
252
    0x58 SRLI srli [dst: RegId lhs: RegId rhs: Imm12]
253
    "Subtracts a register and an immediate value."
254
    0x59 SUBI subi [dst: RegId lhs: RegId rhs: Imm12]
255
    "Bitwise XORs a register and an immediate value."
256
    0x5A XORI xori [dst: RegId lhs: RegId rhs: Imm12]
257
    "Conditional jump."
258
    0x5B JNEI jnei [cond_lhs: RegId cond_rhs: RegId abs_target: Imm12]
259
    "A byte is loaded from the specified address offset by an immediate value."
260
    0x5C LB lb [dst: RegId addr: RegId offset: Imm12]
261
    "A word is loaded from the specified address offset by an immediate value."
262
    0x5D LW lw [dst: RegId addr: RegId offset: Imm12]
263
    "Write the least significant byte of a register to memory."
264
    0x5E SB sb [addr: RegId value: RegId offset: Imm12]
265
    "Write a register to memory."
266
    0x5F SW sw [addr: RegId value: RegId offset: Imm12]
267
    "Copy an immediate number of bytes in memory."
268
    0x60 MCPI mcpi [dst_addr: RegId src_addr: RegId len: Imm12]
269
    "Get transaction fields."
270
    0x61 GTF gtf [dst: RegId arg: RegId selector: Imm12]
271
272
    "Clear an immediate number of bytes in memory."
273
    0x70 MCLI mcli [addr: RegId count: Imm18]
274
    "Get metadata from memory."
275
    0x71 GM gm [dst: RegId selector: Imm18]
276
    "Copy immediate value into a register"
277
    0x72 MOVI movi [dst: RegId val: Imm18]
278
    "Conditional jump against zero."
279
    0x73 JNZI jnzi [cond_nz: RegId abs_target: Imm18]
280
    "Unconditional dynamic relative jump forwards, with a constant offset."
281
    0x74 JMPF jmpf [dynamic: RegId fixed: Imm18]
282
    "Unconditional dynamic relative jump backwards, with a constant offset."
283
    0x75 JMPB jmpb [dynamic: RegId fixed: Imm18]
284
    "Dynamic relative jump forwards, conditional against zero, with a constant offset."
285
    0x76 JNZF jnzf [cond_nz: RegId dynamic: RegId fixed: Imm12]
286
    "Dynamic relative jump backwards, conditional against zero, with a constant offset."
287
    0x77 JNZB jnzb [cond_nz: RegId dynamic: RegId fixed: Imm12]
288
    "Dynamic relative jump forwards, conditional on comparsion, with a constant offset."
289
    0x78 JNEF jnef [cond_lhs: RegId cond_rhs: RegId dynamic: RegId fixed: Imm06]
290
    "Dynamic relative jump backwards, conditional on comparsion, with a constant offset."
291
    0x79 JNEB jneb [cond_lhs: RegId cond_rhs: RegId dynamic: RegId fixed: Imm06]
292
293
    "Jump."
294
    0x90 JI ji [abs_target: Imm24]
295
    "Extend the current call frame's stack by an immediate value."
296
    0x91 CFEI cfei [amount: Imm24]
297
    "Shrink the current call frame's stack by an immediate value."
298
    0x92 CFSI cfsi [amount: Imm24]
299
    "Extend the current call frame's stack"
300
    0x93 CFE cfe [amount: RegId]
301
    "Shrink the current call frame's stack"
302
    0x94 CFS cfs [amount: RegId]
303
    "Push a bitmask-selected set of registers in range 16..40 to the stack."
304
    0x95 PSHL pshl [bitmask: Imm24]
305
    "Push a bitmask-selected set of registers in range 40..64 to the stack."
306
    0x96 PSHH pshh [bitmask: Imm24]
307
    "Pop a bitmask-selected set of registers in range 16..40 to the stack."
308
    0x97 POPL popl [bitmask: Imm24]
309
    "Pop a bitmask-selected set of registers in range 40..64 to the stack."
310
    0x98 POPH poph [bitmask: Imm24]
311
312
    "Compare 128bit integers"
313
    0xa0 WDCM wdcm [dst: RegId lhs: RegId rhs: RegId flags: Imm06]
314
    "Compare 256bit integers"
315
    0xa1 WQCM wqcm [dst: RegId lhs: RegId rhs: RegId flags: Imm06]
316
    "Simple 128bit operations"
317
    0xa2 WDOP wdop [dst: RegId lhs: RegId rhs: RegId flags: Imm06]
318
    "Simple 256bit operations"
319
    0xa3 WQOP wqop [dst: RegId lhs: RegId rhs: RegId flags: Imm06]
320
    "Multiply 128bit"
321
    0xa4 WDML wdml [dst: RegId lhs: RegId rhs: RegId flags: Imm06]
322
    "Multiply 256bit"
323
    0xa5 WQML wqml [dst: RegId lhs: RegId rhs: RegId flags: Imm06]
324
    "Divide 128bit"
325
    0xa6 WDDV wddv [dst: RegId lhs: RegId rhs: RegId flags: Imm06]
326
    "Divide 256bit"
327
    0xa7 WQDV wqdv [dst: RegId lhs: RegId rhs: RegId flags: Imm06]
328
    "Fused multiply-divide 128bit"
329
    0xa8 WDMD wdmd [dst: RegId mul_lhs: RegId mul_rhs: RegId divisor: RegId]
330
    "Fused multiply-divide 256bit"
331
    0xa9 WQMD wqmd [dst: RegId mul_lhs: RegId mul_rhs: RegId divisor: RegId]
332
    "AddMod 128bit"
333
    0xaa WDAM wdam [dst: RegId add_lhs: RegId add_rhs: RegId modulo: RegId]
334
    "AddMod 256bit"
335
    0xab WQAM wqam [dst: RegId add_lhs: RegId add_rhs: RegId modulo: RegId]
336
    "MulMod 128bit"
337
    0xac WDMM wdmm [dst: RegId mul_lhs: RegId mul_rhs: RegId modulo: RegId]
338
    "MulMod 256bit"
339
    0xad WQMM wqmm [dst: RegId mul_lhs: RegId mul_rhs: RegId modulo: RegId]
340
341
    "Call external function"
342
    0xb0 ECAL ecal [a: RegId b: RegId c: RegId d: RegId]
343
344
    "Get blob size"
345
    0xba BSIZ bsiz [dst: RegId blob_id_ptr: RegId]
346
    "Load blob as data"
347
    0xbb BLDD bldd [dst_ptr: RegId blob_id_ptr: RegId offset: RegId len: RegId]
348
}
349
350
impl Instruction {
351
    /// Size of an instruction in bytes
352
    pub const SIZE: usize = core::mem::size_of::<Instruction>();
353
354
    /// Convenience method for converting to bytes
355
8.77k
    pub fn to_bytes(self) -> [u8; 4] {
356
8.77k
        self.into()
357
8.77k
    }
358
}
359
360
#[cfg(feature = "typescript")]
361
mod typescript {
362
    /// Representation of a single instruction for the interpreter.
363
    ///
364
    /// The opcode is represented in the tag (variant), or may be retrieved in the
365
    /// form of an `Opcode` byte using the `opcode` method.
366
    ///
367
    /// The register and immediate data associated with the instruction is represented
368
    /// within an inner unit type wrapper around the 3 remaining bytes.
369
    #[derive(Clone, Eq, Hash, PartialEq)]
370
    #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
371
    #[wasm_bindgen::prelude::wasm_bindgen]
372
    pub struct Instruction(Box<crate::Instruction>);
373
374
    impl Instruction {
375
        pub fn new(instruction: crate::Instruction) -> Self {
376
            Self(Box::new(instruction))
377
        }
378
    }
379
380
    #[wasm_bindgen::prelude::wasm_bindgen]
381
    impl Instruction {
382
        /// Convenience method for converting to bytes
383
        pub fn to_bytes(&self) -> Vec<u8> {
384
            use core::ops::Deref;
385
            self.deref().to_bytes().to_vec()
386
        }
387
388
        /// Size of an instruction in bytes
389
        pub fn size() -> usize {
390
            crate::Instruction::SIZE
391
        }
392
    }
393
394
    impl core::ops::Deref for Instruction {
395
        type Target = crate::Instruction;
396
397
        fn deref(&self) -> &crate::Instruction {
398
            self.0.as_ref()
399
        }
400
    }
401
402
    impl core::ops::DerefMut for Instruction {
403
        fn deref_mut(&mut self) -> &mut crate::Instruction {
404
            self.0.as_mut()
405
        }
406
    }
407
408
    impl core::borrow::Borrow<crate::Instruction> for Instruction {
409
        fn borrow(&self) -> &crate::Instruction {
410
            self.0.as_ref()
411
        }
412
    }
413
414
    impl core::borrow::BorrowMut<crate::Instruction> for Instruction {
415
        fn borrow_mut(&mut self) -> &mut crate::Instruction {
416
            self.0.as_mut()
417
        }
418
    }
419
}
420
421
impl RegId {
422
    /// Received balance for this context.
423
    pub const BAL: Self = Self(0x0B);
424
    /// Remaining gas in the context.
425
    pub const CGAS: Self = Self(0x0A);
426
    /// Error codes for particular operations.
427
    pub const ERR: Self = Self(0x08);
428
    /// Flags register.
429
    pub const FLAG: Self = Self(0x0F);
430
    /// Frame pointer. Memory address of beginning of current call frame.
431
    pub const FP: Self = Self(0x06);
432
    /// Remaining gas globally.
433
    pub const GGAS: Self = Self(0x09);
434
    /// Heap pointer. Memory address below the current bottom of the heap (points to free
435
    /// memory).
436
    pub const HP: Self = Self(0x07);
437
    /// Instructions start. Pointer to the start of the currently-executing code.
438
    pub const IS: Self = Self(0x0C);
439
    /// Contains overflow/underflow of addition, subtraction, and multiplication.
440
    pub const OF: Self = Self(0x02);
441
    /// Contains one (1), for convenience.
442
    pub const ONE: Self = Self(0x01);
443
    /// The program counter. Memory address of the current instruction.
444
    pub const PC: Self = Self(0x03);
445
    /// Return value or pointer.
446
    pub const RET: Self = Self(0x0D);
447
    /// Return value length in bytes.
448
    pub const RETL: Self = Self(0x0E);
449
    /// Stack pointer. Memory address on top of current writable stack area (points to
450
    /// free memory).
451
    pub const SP: Self = Self(0x05);
452
    /// Stack start pointer. Memory address of bottom of current writable stack area.
453
    pub const SSP: Self = Self(0x04);
454
    /// Smallest writable register.
455
    pub const WRITABLE: Self = Self(0x10);
456
    /// Contains zero (0), for convenience.
457
    pub const ZERO: Self = Self(0x00);
458
459
    /// Construct a register ID from the given value.
460
    ///
461
    /// The given value will be masked to 6 bits.
462
1.02G
    pub const fn new(u: u8) -> Self {
463
1.02G
        Self(u & 0b_0011_1111)
464
1.02G
    }
465
466
    /// A const alternative to the `Into<u8>` implementation.
467
0
    pub const fn to_u8(self) -> u8 {
468
0
        self.0
469
0
    }
470
}
471
472
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
473
impl RegId {
474
    /// Construct a register ID from the given value.
475
    ///
476
    /// Returns `None` if the value is outside the 6-bit value range.
477
8.77k
    pub fn new_checked(u: u8) -> Option<RegId> {
478
8.77k
        let r = Self::new(u);
479
8.77k
        (r.0 == u).then_some(r)
480
8.77k
    }
481
}
482
483
#[cfg(feature = "typescript")]
484
#[wasm_bindgen::prelude::wasm_bindgen]
485
impl RegId {
486
    /// Received balance for this context.
487
    pub fn bal() -> Self {
488
        Self::BAL
489
    }
490
491
    /// Remaining gas in the context.
492
    pub fn cgas() -> Self {
493
        Self::CGAS
494
    }
495
496
    /// Error codes for particular operations.
497
    pub fn err() -> Self {
498
        Self::ERR
499
    }
500
501
    /// Flags register.
502
    pub fn flag() -> Self {
503
        Self::FLAG
504
    }
505
506
    /// Frame pointer. Memory address of beginning of current call frame.
507
    pub fn fp() -> Self {
508
        Self::FP
509
    }
510
511
    /// Remaining gas globally.
512
    pub fn ggas() -> Self {
513
        Self::GGAS
514
    }
515
516
    /// Heap pointer. Memory address below the current bottom of the heap (points to free
517
    /// memory).
518
    pub fn hp() -> Self {
519
        Self::HP
520
    }
521
522
    /// Instructions start. Pointer to the start of the currently-executing code.
523
    pub fn is() -> Self {
524
        Self::IS
525
    }
526
527
    /// Contains overflow/underflow of addition, subtraction, and multiplication.
528
    pub fn of() -> Self {
529
        Self::OF
530
    }
531
532
    /// Contains one (1), for convenience.
533
    pub fn one() -> Self {
534
        Self::ONE
535
    }
536
537
    /// The program counter. Memory address of the current instruction.
538
    pub fn pc() -> Self {
539
        Self::PC
540
    }
541
542
    /// Return value or pointer.
543
    pub fn ret() -> Self {
544
        Self::RET
545
    }
546
547
    /// Return value length in bytes.
548
    pub fn retl() -> Self {
549
        Self::RETL
550
    }
551
552
    /// Stack pointer. Memory address on top of current writable stack area (points to
553
    /// free memory).
554
    pub fn sp() -> Self {
555
        Self::SP
556
    }
557
558
    /// Stack start pointer. Memory address of bottom of current writable stack area.
559
    pub fn spp() -> Self {
560
        Self::SSP
561
    }
562
563
    /// Smallest writable register.
564
    pub fn writable() -> Self {
565
        Self::WRITABLE
566
    }
567
568
    /// Contains zero (0), for convenience.
569
    pub fn zero() -> Self {
570
        Self::ZERO
571
    }
572
573
    /// Construct a register ID from the given value.
574
    ///
575
    /// The given value will be masked to 6 bits.
576
    #[wasm_bindgen(constructor)]
577
    pub fn new_typescript(u: u8) -> Self {
578
        Self::new(u)
579
    }
580
581
    /// A const alternative to the `Into<u8>` implementation.
582
    #[wasm_bindgen(js_name = to_u8)]
583
    pub fn to_u8_typescript(self) -> u8 {
584
        self.to_u8()
585
    }
586
}
587
588
impl Imm06 {
589
    /// Max value for the type
590
    pub const MAX: Self = Self(0b_0011_1111);
591
592
    /// Construct an immediate value.
593
    ///
594
    /// The given value will be masked to 6 bits.
595
103M
    pub const fn new(u: u8) -> Self {
596
103M
        Self(u & Self::MAX.0)
597
103M
    }
598
599
    /// Construct an immediate value.
600
    ///
601
    /// Returns `None` if the value is outside the 6-bit value range.
602
0
    pub fn new_checked(u: u8) -> Option<Self> {
603
0
        let imm = Self::new(u);
604
0
        (imm.0 == u).then_some(imm)
605
0
    }
606
607
    /// A const alternative to the `Into<u8>` implementation.
608
597k
    pub const fn to_u8(self) -> u8 {
609
597k
        self.0
610
597k
    }
_RNvMs3_Cs6P3fQNJKMy0_8fuel_asmNtB5_5Imm065to_u8Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
608
597k
    pub const fn to_u8(self) -> u8 {
609
597k
        self.0
610
597k
    }
Unexecuted instantiation: _RNvMs3_Cs6P3fQNJKMy0_8fuel_asmNtB5_5Imm065to_u8B5_
611
}
612
613
impl Imm12 {
614
    /// Max value for the type
615
    pub const MAX: Self = Self(0b_0000_1111_1111_1111);
616
617
    /// Construct an immediate value.
618
    ///
619
    /// The given value will be masked to 12 bits.
620
167M
    pub const fn new(u: u16) -> Self {
621
167M
        Self(u & Self::MAX.0)
622
167M
    }
623
624
    /// Construct an immediate value.
625
    ///
626
    /// Returns `None` if the value is outside the 12-bit value range.
627
4.38k
    pub fn new_checked(u: u16) -> Option<Self> {
628
4.38k
        let imm = Self::new(u);
629
4.38k
        (imm.0 == u).then_some(imm)
630
4.38k
    }
631
632
    /// A const alternative to the `Into<u16>` implementation.
633
0
    pub const fn to_u16(self) -> u16 {
634
0
        self.0
635
0
    }
636
}
637
638
impl Imm18 {
639
    /// Max value for the type
640
    pub const MAX: Self = Self(0b_0000_0000_0000_0011_1111_1111_1111_1111);
641
642
    /// Construct an immediate value.
643
    ///
644
    /// The given value will be masked to 18 bits.
645
43.1M
    pub const fn new(u: u32) -> Self {
646
43.1M
        Self(u & Self::MAX.0)
647
43.1M
    }
648
649
    /// Construct an immediate value.
650
    ///
651
    /// Returns `None` if the value is outside the 18-bit value range.
652
0
    pub fn new_checked(u: u32) -> Option<Self> {
653
0
        let imm = Self::new(u);
654
0
        (imm.0 == u).then_some(imm)
655
0
    }
656
657
    /// A const alternative to the `Into<u32>` implementation.
658
0
    pub const fn to_u32(self) -> u32 {
659
0
        self.0
660
0
    }
661
}
662
663
impl Imm24 {
664
    /// Max value for the type
665
    pub const MAX: Self = Self(0b_0000_0000_1111_1111_1111_1111_1111_1111);
666
667
    /// Construct an immediate value.
668
    ///
669
    /// The given value will be masked to 24 bits.
670
62.3M
    pub const fn new(u: u32) -> Self {
671
62.3M
        Self(u & Self::MAX.0)
672
62.3M
    }
673
674
    /// Construct an immediate value.
675
    ///
676
    /// Returns `None` if the value is outside the 24-bit value range.
677
0
    pub fn new_checked(u: u32) -> Option<Self> {
678
0
        let imm = Self::new(u);
679
0
        (imm.0 == u).then_some(imm)
680
0
    }
681
682
    /// A const alternative to the `Into<u32>` implementation.
683
4.90M
    pub const fn to_u32(self) -> u32 {
684
4.90M
        self.0
685
4.90M
    }
_RNvMs6_Cs6P3fQNJKMy0_8fuel_asmNtB5_5Imm246to_u32Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
683
4.90M
    pub const fn to_u32(self) -> u32 {
684
4.90M
        self.0
685
4.90M
    }
Unexecuted instantiation: _RNvMs6_Cs6P3fQNJKMy0_8fuel_asmNtB5_5Imm246to_u32B5_
686
}
687
688
impl Opcode {
689
    /// Check if the opcode is allowed for predicates.
690
    ///
691
    /// <https://github.com/FuelLabs/fuel-specs/blob/master/src/fuel-vm/index.md#predicate-verification>
692
    /// <https://github.com/FuelLabs/fuel-specs/blob/master/src/fuel-vm/instruction-set.md#contract-instructions>
693
    #[allow(clippy::match_like_matches_macro)]
694
0
    pub fn is_predicate_allowed(&self) -> bool {
695
        use Opcode::*;
696
0
        match self {
697
            ADD | AND | DIV | EQ | EXP | GT | LT | MLOG | MROO | MOD | MOVE | MUL
698
            | NOT | OR | SLL | SRL | SUB | XOR | WDCM | WQCM | WDOP | WQOP | WDML
699
            | WQML | WDDV | WQDV | WDMD | WQMD | WDAM | WQAM | WDMM | WQMM | PSHH
700
            | PSHL | POPH | POPL | RET | ALOC | MCL | MCP | MEQ | ECK1 | ECR1 | ED19
701
            | K256 | S256 | NOOP | FLAG | ADDI | ANDI | DIVI | EXPI | MODI | MULI
702
            | MLDV | ORI | SLLI | SRLI | SUBI | XORI | JNEI | LB | LW | SB | SW
703
            | MCPI | MCLI | GM | MOVI | JNZI | JI | JMP | JNE | JMPF | JMPB | JNZF
704
            | JNZB | JNEF | JNEB | CFEI | CFSI | CFE | CFS | GTF | LDC | BSIZ | BLDD => {
705
0
                true
706
            }
707
0
            _ => false,
708
        }
709
0
    }
Unexecuted instantiation: _RNvMs7_Cs6P3fQNJKMy0_8fuel_asmNtB5_6Opcode20is_predicate_allowedCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMs7_Cs6P3fQNJKMy0_8fuel_asmNtB5_6Opcode20is_predicate_allowedB5_
710
}
711
712
// Direct conversions
713
714
impl From<u8> for RegId {
715
0
    fn from(u: u8) -> Self {
716
0
        RegId::new(u)
717
0
    }
718
}
719
720
impl From<u8> for Imm06 {
721
0
    fn from(u: u8) -> Self {
722
0
        Imm06::new(u)
723
0
    }
724
}
725
726
impl From<u16> for Imm12 {
727
0
    fn from(u: u16) -> Self {
728
0
        Imm12::new(u)
729
0
    }
730
}
731
732
impl From<u32> for Imm18 {
733
0
    fn from(u: u32) -> Self {
734
0
        Imm18::new(u)
735
0
    }
736
}
737
738
impl From<u32> for Imm24 {
739
0
    fn from(u: u32) -> Self {
740
0
        Imm24::new(u)
741
0
    }
742
}
743
744
impl From<RegId> for u8 {
745
1.99G
    fn from(RegId(u): RegId) -> Self {
746
1.99G
        u
747
1.99G
    }
_RNvXsd_Cs6P3fQNJKMy0_8fuel_asmhINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_5RegIdE4fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
745
1.99G
    fn from(RegId(u): RegId) -> Self {
746
1.99G
        u
747
1.99G
    }
Unexecuted instantiation: _RNvXsd_Cs6P3fQNJKMy0_8fuel_asmhINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_5RegIdE4fromB5_
748
}
749
750
impl From<Imm06> for u8 {
751
7.93M
    fn from(Imm06(u): Imm06) -> Self {
752
7.93M
        u
753
7.93M
    }
_RNvXse_Cs6P3fQNJKMy0_8fuel_asmhINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_5Imm06E4fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
751
7.93M
    fn from(Imm06(u): Imm06) -> Self {
752
7.93M
        u
753
7.93M
    }
Unexecuted instantiation: _RNvXse_Cs6P3fQNJKMy0_8fuel_asmhINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_5Imm06E4fromB5_
754
}
755
756
impl From<Imm12> for u16 {
757
141M
    fn from(Imm12(u): Imm12) -> Self {
758
141M
        u
759
141M
    }
_RNvXsf_Cs6P3fQNJKMy0_8fuel_asmtINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_5Imm12E4fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
757
141M
    fn from(Imm12(u): Imm12) -> Self {
758
141M
        u
759
141M
    }
Unexecuted instantiation: _RNvXsf_Cs6P3fQNJKMy0_8fuel_asmtINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_5Imm12E4fromB5_
760
}
761
762
impl From<Imm18> for u32 {
763
37.0M
    fn from(Imm18(u): Imm18) -> Self {
764
37.0M
        u
765
37.0M
    }
_RNvXsg_Cs6P3fQNJKMy0_8fuel_asmmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_5Imm18E4fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
763
37.0M
    fn from(Imm18(u): Imm18) -> Self {
764
37.0M
        u
765
37.0M
    }
Unexecuted instantiation: _RNvXsg_Cs6P3fQNJKMy0_8fuel_asmmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_5Imm18E4fromB5_
766
}
767
768
impl From<Imm24> for u32 {
769
57.4M
    fn from(Imm24(u): Imm24) -> Self {
770
57.4M
        u
771
57.4M
    }
_RNvXsh_Cs6P3fQNJKMy0_8fuel_asmmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_5Imm24E4fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
769
57.4M
    fn from(Imm24(u): Imm24) -> Self {
770
57.4M
        u
771
57.4M
    }
Unexecuted instantiation: _RNvXsh_Cs6P3fQNJKMy0_8fuel_asmmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_5Imm24E4fromB5_
772
}
773
774
// Lossless, convenience conversions
775
776
impl From<RegId> for usize {
777
1.99G
    fn from(r: RegId) -> usize {
778
1.99G
        u8::from(r).into()
779
1.99G
    }
_RNvXsi_Cs6P3fQNJKMy0_8fuel_asmjINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_5RegIdE4fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
777
1.99G
    fn from(r: RegId) -> usize {
778
1.99G
        u8::from(r).into()
779
1.99G
    }
Unexecuted instantiation: _RNvXsi_Cs6P3fQNJKMy0_8fuel_asmjINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_5RegIdE4fromB5_
780
}
781
782
impl From<Imm06> for u16 {
783
0
    fn from(imm: Imm06) -> Self {
784
0
        u8::from(imm).into()
785
0
    }
786
}
787
788
impl From<Imm06> for u32 {
789
0
    fn from(imm: Imm06) -> Self {
790
0
        u8::from(imm).into()
791
0
    }
792
}
793
794
impl From<Imm06> for u64 {
795
7.93M
    fn from(imm: Imm06) -> Self {
796
7.93M
        u8::from(imm).into()
797
7.93M
    }
_RNvXsl_Cs6P3fQNJKMy0_8fuel_asmyINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_5Imm06E4fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
795
7.93M
    fn from(imm: Imm06) -> Self {
796
7.93M
        u8::from(imm).into()
797
7.93M
    }
Unexecuted instantiation: _RNvXsl_Cs6P3fQNJKMy0_8fuel_asmyINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_5Imm06E4fromB5_
798
}
799
800
impl From<Imm06> for u128 {
801
0
    fn from(imm: Imm06) -> Self {
802
0
        u8::from(imm).into()
803
0
    }
804
}
805
806
impl From<Imm12> for u32 {
807
3.57M
    fn from(imm: Imm12) -> Self {
808
3.57M
        u16::from(imm).into()
809
3.57M
    }
_RNvXsn_Cs6P3fQNJKMy0_8fuel_asmmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_5Imm12E4fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
807
3.57M
    fn from(imm: Imm12) -> Self {
808
3.57M
        u16::from(imm).into()
809
3.57M
    }
Unexecuted instantiation: _RNvXsn_Cs6P3fQNJKMy0_8fuel_asmmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_5Imm12E4fromB5_
810
}
811
812
impl From<Imm12> for u64 {
813
88.2M
    fn from(imm: Imm12) -> Self {
814
88.2M
        u16::from(imm).into()
815
88.2M
    }
_RNvXso_Cs6P3fQNJKMy0_8fuel_asmyINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_5Imm12E4fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
813
88.2M
    fn from(imm: Imm12) -> Self {
814
88.2M
        u16::from(imm).into()
815
88.2M
    }
Unexecuted instantiation: _RNvXso_Cs6P3fQNJKMy0_8fuel_asmyINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_5Imm12E4fromB5_
816
}
817
818
impl From<Imm12> for u128 {
819
39.4M
    fn from(imm: Imm12) -> Self {
820
39.4M
        u16::from(imm).into()
821
39.4M
    }
_RNvXsp_Cs6P3fQNJKMy0_8fuel_asmoINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_5Imm12E4fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
819
39.4M
    fn from(imm: Imm12) -> Self {
820
39.4M
        u16::from(imm).into()
821
39.4M
    }
Unexecuted instantiation: _RNvXsp_Cs6P3fQNJKMy0_8fuel_asmoINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_5Imm12E4fromB5_
822
}
823
824
impl From<Imm18> for u64 {
825
35.4M
    fn from(imm: Imm18) -> Self {
826
35.4M
        u32::from(imm).into()
827
35.4M
    }
_RNvXsq_Cs6P3fQNJKMy0_8fuel_asmyINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_5Imm18E4fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
825
35.4M
    fn from(imm: Imm18) -> Self {
826
35.4M
        u32::from(imm).into()
827
35.4M
    }
Unexecuted instantiation: _RNvXsq_Cs6P3fQNJKMy0_8fuel_asmyINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_5Imm18E4fromB5_
828
}
829
830
impl From<Imm18> for u128 {
831
0
    fn from(imm: Imm18) -> Self {
832
0
        u32::from(imm).into()
833
0
    }
834
}
835
836
impl From<Imm24> for u64 {
837
57.4M
    fn from(imm: Imm24) -> Self {
838
57.4M
        u32::from(imm).into()
839
57.4M
    }
_RNvXss_Cs6P3fQNJKMy0_8fuel_asmyINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_5Imm24E4fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
837
57.4M
    fn from(imm: Imm24) -> Self {
838
57.4M
        u32::from(imm).into()
839
57.4M
    }
Unexecuted instantiation: _RNvXss_Cs6P3fQNJKMy0_8fuel_asmyINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_5Imm24E4fromB5_
840
}
841
842
impl From<Imm24> for u128 {
843
0
    fn from(imm: Imm24) -> Self {
844
0
        u32::from(imm).into()
845
0
    }
846
}
847
848
impl From<Opcode> for u8 {
849
0
    fn from(op: Opcode) -> Self {
850
0
        op as u8
851
0
    }
852
}
853
854
impl From<Instruction> for RawInstruction {
855
0
    fn from(inst: Instruction) -> Self {
856
0
        RawInstruction::from_be_bytes(inst.into())
857
0
    }
858
}
859
860
impl core::convert::TryFrom<RawInstruction> for Instruction {
861
    type Error = InvalidOpcode;
862
863
387M
    fn try_from(u: RawInstruction) -> Result<Self, Self::Error> {
864
387M
        Self::try_from(u.to_be_bytes())
865
387M
    }
866
}
867
868
// Index slices with `RegId`
869
870
impl<T> core::ops::Index<RegId> for [T]
871
where
872
    [T]: core::ops::Index<usize, Output = T>,
873
{
874
    type Output = T;
875
876
1.75G
    fn index(&self, ix: RegId) -> &Self::Output {
877
1.75G
        &self[usize::from(ix)]
878
1.75G
    }
_RNvXsx_Cs6P3fQNJKMy0_8fuel_asmSyINtNtNtCsd3UI3IJrzMw_4core3ops5index5IndexNtB5_5RegIdE5indexCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
876
1.75G
    fn index(&self, ix: RegId) -> &Self::Output {
877
1.75G
        &self[usize::from(ix)]
878
1.75G
    }
Unexecuted instantiation: _RNvXINICs6P3fQNJKMy0_8fuel_asmsx_0pESpINtNtNtCsd3UI3IJrzMw_4core3ops5index5IndexNtB5_5RegIdE5indexB5_
879
}
880
881
impl<T> core::ops::IndexMut<RegId> for [T]
882
where
883
    [T]: core::ops::IndexMut<usize, Output = T>,
884
{
885
163k
    fn index_mut(&mut self, ix: RegId) -> &mut Self::Output {
886
163k
        &mut self[usize::from(ix)]
887
163k
    }
_RNvXsy_Cs6P3fQNJKMy0_8fuel_asmSyINtNtNtCsd3UI3IJrzMw_4core3ops5index8IndexMutNtB5_5RegIdE9index_mutCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
885
163k
    fn index_mut(&mut self, ix: RegId) -> &mut Self::Output {
886
163k
        &mut self[usize::from(ix)]
887
163k
    }
Unexecuted instantiation: _RNvXINICs6P3fQNJKMy0_8fuel_asmsy_0pESpINtNtNtCsd3UI3IJrzMw_4core3ops5index8IndexMutNtB5_5RegIdE9index_mutB5_
888
}
889
890
// Collect instructions into bytes or halfwords
891
892
#[cfg(feature = "alloc")]
893
impl core::iter::FromIterator<Instruction> for alloc::vec::Vec<u8> {
894
2.19k
    fn from_iter<I: IntoIterator<Item = Instruction>>(iter: I) -> Self {
895
2.19k
        iter.into_iter().flat_map(Instruction::to_bytes).collect()
896
2.19k
    }
Unexecuted instantiation: _RINvXsz_Cs6P3fQNJKMy0_8fuel_asmINtNtCs5vansr6XbJU_5alloc3vec3VechEINtNtNtNtCsd3UI3IJrzMw_4core4iter6traits7collect12FromIteratorNtB6_11InstructionE9from_iterINtNtBw_9into_iter8IntoIterB22_EECsg6P9hFxt0iW_7fuel_vm
_RINvXsz_Cs6P3fQNJKMy0_8fuel_asmINtNtCs5vansr6XbJU_5alloc3vec3VechEINtNtNtNtCsd3UI3IJrzMw_4core4iter6traits7collect12FromIteratorNtB6_11InstructionE9from_iterINtNtNtB19_7sources4once4OnceB22_EECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
894
2.19k
    fn from_iter<I: IntoIterator<Item = Instruction>>(iter: I) -> Self {
895
2.19k
        iter.into_iter().flat_map(Instruction::to_bytes).collect()
896
2.19k
    }
Unexecuted instantiation: _RINvXsz_Cs6P3fQNJKMy0_8fuel_asmINtNtCs5vansr6XbJU_5alloc3vec3VechEINtNtNtNtCsd3UI3IJrzMw_4core4iter6traits7collect12FromIteratorNtB6_11InstructionE9from_iterINtNtNtB1b_5array4iter8IntoIterB22_Kj3_EECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXsz_Cs6P3fQNJKMy0_8fuel_asmINtNtCs5vansr6XbJU_5alloc3vec3VechEINtNtNtNtCsd3UI3IJrzMw_4core4iter6traits7collect12FromIteratorNtB6_11InstructionE9from_iterpEB6_
897
}
898
899
#[cfg(feature = "alloc")]
900
impl core::iter::FromIterator<Instruction> for alloc::vec::Vec<u32> {
901
0
    fn from_iter<I: IntoIterator<Item = Instruction>>(iter: I) -> Self {
902
0
        iter.into_iter().map(u32::from).collect()
903
0
    }
904
}
905
906
/// Given an iterator yielding bytes, produces an iterator yielding `Instruction`s.
907
///
908
/// This function assumes each consecutive 4 bytes aligns with an instruction.
909
///
910
/// The produced iterator yields an `Err` in the case that an instruction fails to parse
911
/// from 4 consecutive bytes.
912
0
pub fn from_bytes<I>(bs: I) -> impl Iterator<Item = Result<Instruction, InvalidOpcode>>
913
0
where
914
0
    I: IntoIterator<Item = u8>,
915
0
{
916
0
    let mut iter = bs.into_iter();
917
0
    core::iter::from_fn(move || {
918
0
        let a = iter.next()?;
919
0
        let b = iter.next()?;
920
0
        let c = iter.next()?;
921
0
        let d = iter.next()?;
922
0
        Some(Instruction::try_from([a, b, c, d]))
923
0
    })
Unexecuted instantiation: _RNCINvCs6P3fQNJKMy0_8fuel_asm10from_bytesINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters6cloned6ClonedINtNtNtBM_5slice4iter4IterhEEE0Cs9ElU2YR0Zcw_12fuel_vm_fuzz
Unexecuted instantiation: _RNCINvCs6P3fQNJKMy0_8fuel_asm10from_bytespE0B4_
924
0
}
Unexecuted instantiation: _RINvCs6P3fQNJKMy0_8fuel_asm10from_bytesINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters6cloned6ClonedINtNtNtBK_5slice4iter4IterhEEECs9ElU2YR0Zcw_12fuel_vm_fuzz
Unexecuted instantiation: _RINvCs6P3fQNJKMy0_8fuel_asm10from_bytespEB2_
925
926
/// Given an iterator yielding u32s (i.e. "half words" or "raw instructions"), produces an
927
/// iterator yielding `Instruction`s.
928
///
929
/// This function assumes each consecutive 4 bytes aligns with an instruction.
930
///
931
/// The produced iterator yields an `Err` in the case that an instruction fails to parse.
932
0
pub fn from_u32s<I>(us: I) -> impl Iterator<Item = Result<Instruction, InvalidOpcode>>
933
0
where
934
0
    I: IntoIterator<Item = u32>,
935
0
{
936
0
    us.into_iter().map(Instruction::try_from)
937
0
}
938
939
// Short-hand, `panic!`ing constructors for the short-hand instruction construtors (e.g
940
// op::add).
941
942
0
fn check_imm06(u: u8) -> Imm06 {
943
0
    Imm06::new_checked(u)
944
0
        .unwrap_or_else(|| panic!("Value `{u}` out of range for 6-bit immediate"))
945
0
}
946
947
4.38k
fn check_imm12(u: u16) -> Imm12 {
948
4.38k
    Imm12::new_checked(u)
949
4.38k
        .unwrap_or_else(|| panic!("Value `{u}` out of range for 12-bit immediate"))
950
4.38k
}
951
952
0
fn check_imm18(u: u32) -> Imm18 {
953
0
    Imm18::new_checked(u)
954
0
        .unwrap_or_else(|| panic!("Value `{u}` out of range for 18-bit immediate"))
955
0
}
956
957
0
fn check_imm24(u: u32) -> Imm24 {
958
0
    Imm24::new_checked(u)
959
0
        .unwrap_or_else(|| panic!("Value `{u}` out of range for 24-bit immediate"))
960
0
}
961
962
// --------------------------------------------------------
963
964
// The size of the instruction isn't larger than necessary.
965
// 1 byte for the opcode, 3 bytes for registers and immediates.
966
#[test]
967
fn test_instruction_size() {
968
    // NOTE: Throughout `fuel-vm`, we use the `Instruction::SIZE` associated
969
    // const to refer to offsets within raw instruction data. As a result, it's
970
    // *essential* that this equivalence remains the same. If you've added
971
    // a new field or changed the size of `Instruction` somehow and have
972
    // arrived at this assertion, ensure that you also revisit all sites where
973
    // `Instruction::SIZE` is used and make sure we're using the right value
974
    // (in most cases, the right value is `core::mem::size_of::<RawInstruction>()`).
975
    assert_eq!(
976
        core::mem::size_of::<Instruction>(),
977
        core::mem::size_of::<RawInstruction>()
978
    );
979
980
    assert_eq!(core::mem::size_of::<Instruction>(), Instruction::SIZE);
981
}
982
983
// The size of the opcode is exactly one byte.
984
#[test]
985
fn test_opcode_size() {
986
    assert_eq!(core::mem::size_of::<Opcode>(), 1);
987
}
988
989
#[test]
990
#[allow(clippy::match_like_matches_macro)]
991
fn check_predicate_allowed() {
992
    use Opcode::*;
993
    for byte in 0..u8::MAX {
994
        if let Ok(repr) = Opcode::try_from(byte) {
995
            let should_allow = match repr {
996
                BAL | BHEI | BHSH | BURN | CALL | CB | CCP | CROO | CSIZ | LOG | LOGD
997
                | MINT | RETD | RVRT | SMO | SCWQ | SRW | SRWQ | SWW | SWWQ | TIME
998
                | TR | TRO | ECAL => false,
999
                _ => true,
1000
            };
1001
            assert_eq!(should_allow, repr.is_predicate_allowed());
1002
        }
1003
    }
1004
}
1005
1006
// Test roundtrip conversion for all valid opcodes.
1007
#[test]
1008
fn test_opcode_u8_conv() {
1009
    for u in 0..=u8::MAX {
1010
        if let Ok(op) = Opcode::try_from(u) {
1011
            assert_eq!(op as u8, u);
1012
        }
1013
    }
1014
}
/home/marten/fuel/fuel-vm/fuel-asm/src/unpack.rs
Line
Count
Source
1
//! Functions for unpacking instruction data from bytes or u32s.
2
3
use crate::{
4
    Imm06,
5
    Imm12,
6
    Imm18,
7
    Imm24,
8
    RegId,
9
};
10
11
11.0M
pub(super) fn rd_from_bytes(bs: [u8; 3]) -> RegId {
12
11.0M
    rd_from_u32(u32::from_be_bytes(u8x4_from_u8x3(bs)))
13
11.0M
}
14
15
103M
pub(super) fn imm06_from_bytes(bs: [u8; 3]) -> Imm06 {
16
103M
    imm06_from_u32(u32::from_be_bytes(u8x4_from_u8x3(bs)))
17
103M
}
18
19
167M
pub(super) fn imm12_from_bytes(bs: [u8; 3]) -> Imm12 {
20
167M
    imm12_from_u32(u32::from_be_bytes(u8x4_from_u8x3(bs)))
21
167M
}
22
23
43.1M
pub(super) fn imm18_from_bytes(bs: [u8; 3]) -> Imm18 {
24
43.1M
    imm18_from_u32(u32::from_be_bytes(u8x4_from_u8x3(bs)))
25
43.1M
}
26
27
62.3M
pub(super) fn imm24_from_bytes(bs: [u8; 3]) -> Imm24 {
28
62.3M
    imm24_from_u32(u32::from_be_bytes(u8x4_from_u8x3(bs)))
29
62.3M
}
30
31
26.0M
pub(super) fn ra_rb_from_bytes(bs: [u8; 3]) -> (RegId, RegId) {
32
26.0M
    (ra_from_bytes(bs), rb_from_bytes(bs))
33
26.0M
}
34
35
78.7M
pub(super) fn ra_rb_rc_from_bytes(bs: [u8; 3]) -> (RegId, RegId, RegId) {
36
78.7M
    (ra_from_bytes(bs), rb_from_bytes(bs), rc_from_bytes(bs))
37
78.7M
}
38
39
11.0M
pub(super) fn ra_rb_rc_rd_from_bytes(bs: [u8; 3]) -> (RegId, RegId, RegId, RegId) {
40
11.0M
    (
41
11.0M
        ra_from_bytes(bs),
42
11.0M
        rb_from_bytes(bs),
43
11.0M
        rc_from_bytes(bs),
44
11.0M
        rd_from_bytes(bs),
45
11.0M
    )
46
11.0M
}
47
48
103M
pub(super) fn ra_rb_rc_imm06_from_bytes(bs: [u8; 3]) -> (RegId, RegId, RegId, Imm06) {
49
103M
    (
50
103M
        ra_from_bytes(bs),
51
103M
        rb_from_bytes(bs),
52
103M
        rc_from_bytes(bs),
53
103M
        imm06_from_bytes(bs),
54
103M
    )
55
103M
}
56
57
167M
pub(super) fn ra_rb_imm12_from_bytes(bs: [u8; 3]) -> (RegId, RegId, Imm12) {
58
167M
    (ra_from_bytes(bs), rb_from_bytes(bs), imm12_from_bytes(bs))
59
167M
}
60
61
43.1M
pub(super) fn ra_imm18_from_bytes(bs: [u8; 3]) -> (RegId, Imm18) {
62
43.1M
    (ra_from_bytes(bs), imm18_from_bytes(bs))
63
43.1M
}
64
65
#[allow(clippy::cast_possible_truncation)]
66
435M
fn ra_from_u32(u: u32) -> RegId {
67
435M
    RegId::new((u >> 18) as u8)
68
435M
}
69
70
#[allow(clippy::cast_possible_truncation)]
71
386M
fn rb_from_u32(u: u32) -> RegId {
72
386M
    RegId::new((u >> 12) as u8)
73
386M
}
74
75
#[allow(clippy::cast_possible_truncation)]
76
192M
fn rc_from_u32(u: u32) -> RegId {
77
192M
    RegId::new((u >> 6) as u8)
78
192M
}
79
80
#[allow(clippy::cast_possible_truncation)]
81
11.0M
fn rd_from_u32(u: u32) -> RegId {
82
11.0M
    RegId::new(u as u8)
83
11.0M
}
84
85
#[allow(clippy::cast_possible_truncation)]
86
103M
fn imm06_from_u32(u: u32) -> Imm06 {
87
103M
    Imm06::new(u as u8)
88
103M
}
89
90
#[allow(clippy::cast_possible_truncation)]
91
167M
fn imm12_from_u32(u: u32) -> Imm12 {
92
167M
    Imm12::new(u as u16)
93
167M
}
94
95
43.1M
fn imm18_from_u32(u: u32) -> Imm18 {
96
43.1M
    Imm18::new(u)
97
43.1M
}
98
99
62.3M
fn imm24_from_u32(u: u32) -> Imm24 {
100
62.3M
    Imm24::new(u)
101
62.3M
}
102
103
435M
pub(super) fn ra_from_bytes(bs: [u8; 3]) -> RegId {
104
435M
    ra_from_u32(u32::from_be_bytes(u8x4_from_u8x3(bs)))
105
435M
}
106
107
386M
pub(super) fn rb_from_bytes(bs: [u8; 3]) -> RegId {
108
386M
    rb_from_u32(u32::from_be_bytes(u8x4_from_u8x3(bs)))
109
386M
}
110
111
192M
pub(super) fn rc_from_bytes(bs: [u8; 3]) -> RegId {
112
192M
    rc_from_u32(u32::from_be_bytes(u8x4_from_u8x3(bs)))
113
192M
}
114
115
// Produce the big-endian bytes for an instruction's data, with a zeroed opcode byte.
116
1.40G
fn u8x4_from_u8x3([a, b, c]: [u8; 3]) -> [u8; 4] {
117
1.40G
    [0, a, b, c]
118
1.40G
}
/home/marten/fuel/fuel-vm/fuel-asm/src/pack.rs
Line
Count
Source
1
//! Functions for packing instruction data into bytes or u32s.
2
3
use crate::{
4
    Imm06,
5
    Imm12,
6
    Imm18,
7
    Imm24,
8
    RegId,
9
};
10
11
4.38k
pub(super) fn bytes_from_ra(ra: RegId) -> [u8; 3] {
12
4.38k
    u8x3_from_u8x4(u32_from_ra(ra).to_be_bytes())
13
4.38k
}
14
15
0
pub(super) fn bytes_from_ra_rb(ra: RegId, rb: RegId) -> [u8; 3] {
16
0
    u8x3_from_u8x4(u32_from_ra_rb(ra, rb).to_be_bytes())
17
0
}
18
19
0
pub(super) fn bytes_from_ra_rb_rc(ra: RegId, rb: RegId, rc: RegId) -> [u8; 3] {
20
0
    u8x3_from_u8x4(u32_from_ra_rb_rc(ra, rb, rc).to_be_bytes())
21
0
}
22
23
0
pub(super) fn bytes_from_ra_rb_rc_rd(
24
0
    ra: RegId,
25
0
    rb: RegId,
26
0
    rc: RegId,
27
0
    rd: RegId,
28
0
) -> [u8; 3] {
29
0
    u8x3_from_u8x4(u32_from_ra_rb_rc_rd(ra, rb, rc, rd).to_be_bytes())
30
0
}
31
32
0
pub(super) fn bytes_from_ra_rb_rc_imm06(
33
0
    ra: RegId,
34
0
    rb: RegId,
35
0
    rc: RegId,
36
0
    imm: Imm06,
37
0
) -> [u8; 3] {
38
0
    u8x3_from_u8x4(u32_from_ra_rb_rc_imm06(ra, rb, rc, imm).to_be_bytes())
39
0
}
40
41
4.38k
pub(super) fn bytes_from_ra_rb_imm12(ra: RegId, rb: RegId, imm: Imm12) -> [u8; 3] {
42
4.38k
    u8x3_from_u8x4(u32_from_ra_rb_imm12(ra, rb, imm).to_be_bytes())
43
4.38k
}
44
45
0
pub(super) fn bytes_from_ra_imm18(ra: RegId, imm: Imm18) -> [u8; 3] {
46
0
    u8x3_from_u8x4(u32_from_ra_imm18(ra, imm).to_be_bytes())
47
0
}
48
49
0
pub(super) fn bytes_from_imm24(imm: Imm24) -> [u8; 3] {
50
0
    u8x3_from_u8x4(u32_from_imm24(imm).to_be_bytes())
51
0
}
52
53
8.77k
fn u32_from_ra(r: RegId) -> u32 {
54
8.77k
    (r.0 as u32) << 18
55
8.77k
}
56
57
4.38k
fn u32_from_rb(r: RegId) -> u32 {
58
4.38k
    (r.0 as u32) << 12
59
4.38k
}
60
61
0
fn u32_from_rc(r: RegId) -> u32 {
62
0
    (r.0 as u32) << 6
63
0
}
64
65
0
fn u32_from_rd(r: RegId) -> u32 {
66
0
    r.0 as u32
67
0
}
68
69
0
fn u32_from_imm06(imm: Imm06) -> u32 {
70
0
    imm.0 as u32
71
0
}
72
73
4.38k
fn u32_from_imm12(imm: Imm12) -> u32 {
74
4.38k
    imm.0 as u32
75
4.38k
}
76
77
0
fn u32_from_imm18(imm: Imm18) -> u32 {
78
0
    imm.0
79
0
}
80
81
0
fn u32_from_imm24(imm: Imm24) -> u32 {
82
0
    imm.0
83
0
}
84
85
4.38k
fn u32_from_ra_rb(ra: RegId, rb: RegId) -> u32 {
86
4.38k
    u32_from_ra(ra) | u32_from_rb(rb)
87
4.38k
}
88
89
0
fn u32_from_ra_rb_rc(ra: RegId, rb: RegId, rc: RegId) -> u32 {
90
0
    u32_from_ra_rb(ra, rb) | u32_from_rc(rc)
91
0
}
92
93
0
fn u32_from_ra_rb_rc_rd(ra: RegId, rb: RegId, rc: RegId, rd: RegId) -> u32 {
94
0
    u32_from_ra_rb_rc(ra, rb, rc) | u32_from_rd(rd)
95
0
}
96
97
0
fn u32_from_ra_rb_rc_imm06(ra: RegId, rb: RegId, rc: RegId, imm: Imm06) -> u32 {
98
0
    u32_from_ra_rb_rc(ra, rb, rc) | u32_from_imm06(imm)
99
0
}
100
101
4.38k
fn u32_from_ra_rb_imm12(ra: RegId, rb: RegId, imm: Imm12) -> u32 {
102
4.38k
    u32_from_ra_rb(ra, rb) | u32_from_imm12(imm)
103
4.38k
}
104
105
0
fn u32_from_ra_imm18(ra: RegId, imm: Imm18) -> u32 {
106
0
    u32_from_ra(ra) | u32_from_imm18(imm)
107
0
}
108
109
// Ignore the opcode byte, take the remaining instruction data.
110
8.77k
fn u8x3_from_u8x4([_, a, b, c]: [u8; 4]) -> [u8; 3] {
111
8.77k
    [a, b, c]
112
8.77k
}
/home/marten/fuel/fuel-vm/fuel-asm/src/args/wideint.rs
Line
Count
Source
1
//! Immediate value arguments for wide-math instructions
2
3
use crate::Imm06;
4
5
/// Comparison mode used by WDCM and WQCM instructions.
6
10.2M
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, strum::FromRepr)]
7
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
8
#[repr(u8)]
9
#[must_use]
10
pub enum CompareMode {
11
    /// Equality (`==`)
12
    EQ = 0,
13
    /// Inequality (`!=`)
14
    NE = 1,
15
    /// Less than (`<`)
16
    LT = 2,
17
    /// Greater than (`>`)
18
    GT = 3,
19
    /// Less than or equals (`>=`)
20
    LTE = 4,
21
    /// Greater than or equals (`>=`)
22
    GTE = 5,
23
    /// Number of leading zeroes in lhs (`lzcnt`) (discards rhs)
24
    LZC = 6,
25
}
26
27
/// Arguments for WDCM and WQCM instructions.
28
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
29
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
30
#[must_use]
31
pub struct CompareArgs {
32
    /// Comparison mode
33
    pub mode: CompareMode,
34
    /// Load RHS from register if true, otherwise zero-extend register value
35
    pub indirect_rhs: bool,
36
}
37
38
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
39
impl CompareArgs {
40
    /// Convert to immediate value.
41
0
    pub fn to_imm(self) -> Imm06 {
42
0
        let mut bits = self.mode as u8;
43
0
        bits |= (self.indirect_rhs as u8) << 5;
44
0
        Imm06(bits)
45
0
    }
46
47
    /// Construct from `Imm06`. Returns `None` if the value has reserved flags set.
48
10.2M
    pub fn from_imm(bits: Imm06) -> Option<CompareArgs> {
49
10.2M
        let indirect_rhs = ((bits.0 >> 5) & 1) == 1;
50
10.2M
        let reserved = (bits.0 >> 3) & 0b11;
51
10.2M
        if reserved != 0 {
52
14
            return None
53
10.2M
        }
54
10.2M
        let mode = CompareMode::from_repr(bits.0 & 0b111)?;
55
10.2M
        Some(Self { mode, indirect_rhs })
56
10.2M
    }
57
}
58
/// The operation performed by WDOP and WQOP instructions, determined as
59
2.26M
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, strum::FromRepr)]
60
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
61
#[repr(u8)]
62
#[must_use]
63
pub enum MathOp {
64
    /// Add
65
    ADD = 0,
66
    /// Subtract
67
    SUB = 1,
68
    /// Invert bits (discards rhs)
69
    NOT = 2,
70
    /// Bitwise or
71
    OR = 3,
72
    /// Bitwise exclusive or
73
    XOR = 4,
74
    /// Bitwise and
75
    AND = 5,
76
    /// Shift left
77
    SHL = 6,
78
    /// Shift right
79
    SHR = 7,
80
}
81
82
/// Additional arguments for WDOP and WQOP instructions.
83
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
84
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
85
#[must_use]
86
pub struct MathArgs {
87
    /// The operation to perform
88
    pub op: MathOp,
89
    /// Load RHS from register if true, otherwise zero-extend register value
90
    pub indirect_rhs: bool,
91
}
92
93
impl MathArgs {
94
    /// Convert to immediate value.
95
0
    pub fn to_imm(self) -> Imm06 {
96
0
        let mut bits = self.op as u8;
97
0
        bits |= (self.indirect_rhs as u8) << 5;
98
0
        Imm06(bits)
99
0
    }
100
101
    /// Construct from `Imm06`. Returns `None` if the value has reserved flags set.
102
2.26M
    pub fn from_imm(bits: Imm06) -> Option<Self> {
103
2.26M
        let indirect_rhs = ((bits.0 >> 5) & 1) == 1;
104
2.26M
        let op = MathOp::from_repr(bits.0 & 0b11111)?;
105
2.26M
        Some(Self { op, indirect_rhs })
106
2.26M
    }
107
}
108
109
/// Additional arguments for WDML and WQML instructions.
110
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
111
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
112
#[must_use]
113
pub struct MulArgs {
114
    /// Load LHSS from register if true, otherwise zero-extend register value
115
    pub indirect_lhs: bool,
116
    /// Load RHS from register if true, otherwise zero-extend register value
117
    pub indirect_rhs: bool,
118
}
119
120
impl MulArgs {
121
    /// Convert to immediate value.
122
0
    pub fn to_imm(self) -> Imm06 {
123
0
        let mut bits = 0u8;
124
0
        bits |= (self.indirect_lhs as u8) << 4;
125
0
        bits |= (self.indirect_rhs as u8) << 5;
126
0
        Imm06(bits)
127
0
    }
128
129
    /// Construct from `Imm06`. Returns `None` if the value has reserved flags set.
130
1.57M
    pub fn from_imm(bits: Imm06) -> Option<Self> {
131
1.57M
        let indirect_lhs = ((bits.0 >> 4) & 1) == 1;
132
1.57M
        let indirect_rhs = ((bits.0 >> 5) & 1) == 1;
133
1.57M
        if (bits.0 & 0b1111) != 0 {
134
6
            return None
135
1.57M
        }
136
1.57M
        Some(Self {
137
1.57M
            indirect_lhs,
138
1.57M
            indirect_rhs,
139
1.57M
        })
140
1.57M
    }
_RNvMs0_NtNtCs6P3fQNJKMy0_8fuel_asm4args7wideintNtB5_7MulArgs8from_immCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
130
1.57M
    pub fn from_imm(bits: Imm06) -> Option<Self> {
131
1.57M
        let indirect_lhs = ((bits.0 >> 4) & 1) == 1;
132
1.57M
        let indirect_rhs = ((bits.0 >> 5) & 1) == 1;
133
1.57M
        if (bits.0 & 0b1111) != 0 {
134
6
            return None
135
1.57M
        }
136
1.57M
        Some(Self {
137
1.57M
            indirect_lhs,
138
1.57M
            indirect_rhs,
139
1.57M
        })
140
1.57M
    }
Unexecuted instantiation: _RNvMs0_NtNtCs6P3fQNJKMy0_8fuel_asm4args7wideintNtB5_7MulArgs8from_immB9_
141
}
142
143
/// Additional arguments for WMDV and WDDV instructions.
144
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
145
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
146
#[must_use]
147
pub struct DivArgs {
148
    /// Load RHS from register if true, otherwise zero-extend register value
149
    pub indirect_rhs: bool,
150
}
151
152
impl DivArgs {
153
    /// Convert to immediate value.
154
0
    pub fn to_imm(self) -> Imm06 {
155
0
        let mut bits = 0u8;
156
0
        bits |= (self.indirect_rhs as u8) << 5;
157
0
        Imm06(bits)
158
0
    }
159
160
    /// Construct from `Imm06`. Returns `None` if the value has reserved flags set.
161
1.79M
    pub fn from_imm(bits: Imm06) -> Option<Self> {
162
1.79M
        let indirect_rhs = ((bits.0 >> 5) & 1) == 1;
163
1.79M
        if (bits.0 & 0b11111) != 0 {
164
4
            return None
165
1.79M
        }
166
1.79M
        Some(Self { indirect_rhs })
167
1.79M
    }
_RNvMs1_NtNtCs6P3fQNJKMy0_8fuel_asm4args7wideintNtB5_7DivArgs8from_immCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
161
1.79M
    pub fn from_imm(bits: Imm06) -> Option<Self> {
162
1.79M
        let indirect_rhs = ((bits.0 >> 5) & 1) == 1;
163
1.79M
        if (bits.0 & 0b11111) != 0 {
164
4
            return None
165
1.79M
        }
166
1.79M
        Some(Self { indirect_rhs })
167
1.79M
    }
Unexecuted instantiation: _RNvMs1_NtNtCs6P3fQNJKMy0_8fuel_asm4args7wideintNtB5_7DivArgs8from_immB9_
168
}
169
170
#[cfg(test)]
171
mod tests {
172
    use super::*;
173
174
    #[rstest::rstest]
175
    fn encode_decode_compare(
176
        #[values(CompareMode::EQ, CompareMode::NE, CompareMode::GTE)] mode: CompareMode,
177
        #[values(true, false)] indirect_rhs: bool,
178
    ) {
179
        let orig = CompareArgs { mode, indirect_rhs };
180
        let decoded = CompareArgs::from_imm(orig.to_imm()).expect("decode error");
181
        assert_eq!(orig, decoded);
182
    }
183
184
    #[test]
185
    fn decode_encode_compare() {
186
        for imm in 0..Imm06::MAX.0 {
187
            let bits = Imm06::from(imm);
188
            if let Some(decoded) = CompareArgs::from_imm(bits) {
189
                assert_eq!(decoded.to_imm().0, imm);
190
            }
191
        }
192
    }
193
194
    #[rstest::rstest]
195
    fn encode_decode_mathop(
196
        #[values(MathOp::ADD, MathOp::SUB, MathOp::SHR)] op: MathOp,
197
        #[values(true, false)] indirect_rhs: bool,
198
    ) {
199
        let orig = MathArgs { op, indirect_rhs };
200
        let decoded = MathArgs::from_imm(orig.to_imm()).expect("decode error");
201
        assert_eq!(orig, decoded);
202
    }
203
204
    #[test]
205
    fn decode_encode_mathop() {
206
        for imm in 0..Imm06::MAX.0 {
207
            let bits = Imm06::from(imm);
208
            if let Some(decoded) = MathArgs::from_imm(bits) {
209
                assert_eq!(decoded.to_imm().0, imm);
210
            }
211
        }
212
    }
213
214
    #[rstest::rstest]
215
    fn encode_decode_mul(
216
        #[values(true, false)] indirect_lhs: bool,
217
        #[values(true, false)] indirect_rhs: bool,
218
    ) {
219
        let orig = MulArgs {
220
            indirect_lhs,
221
            indirect_rhs,
222
        };
223
        let decoded = MulArgs::from_imm(orig.to_imm()).expect("decode error");
224
        assert_eq!(orig, decoded);
225
    }
226
227
    #[test]
228
    fn decode_encode_mul() {
229
        for imm in 0..Imm06::MAX.0 {
230
            let bits = Imm06::from(imm);
231
            if let Some(decoded) = MulArgs::from_imm(bits) {
232
                assert_eq!(decoded.to_imm().0, imm);
233
            }
234
        }
235
    }
236
237
    #[rstest::rstest]
238
    fn encode_decode_div(#[values(true, false)] indirect_rhs: bool) {
239
        let orig = DivArgs { indirect_rhs };
240
        let decoded = DivArgs::from_imm(orig.to_imm()).expect("decode error");
241
        assert_eq!(orig, decoded);
242
    }
243
244
    #[test]
245
    fn decode_encode_div() {
246
        for imm in 0..Imm06::MAX.0 {
247
            let bits = Imm06::from(imm);
248
            if let Some(decoded) = DivArgs::from_imm(bits) {
249
                assert_eq!(decoded.to_imm().0, imm);
250
            }
251
        }
252
    }
253
}
/home/marten/fuel/fuel-vm/fuel-asm/src/macros.rs
Line
Count
Source
1
//! # The `impl_instructions!` macro
2
//!
3
//! The heart of this crate's implementation is the private `impl_instructions!` macro.
4
//! This macro is used to generate the `Instruction` and `Opcode` types along with their
5
//! implementations.
6
//!
7
//! The intention is to allow for having a single source of truth from which each of the
8
//! instruction-related types and implementations are derived.
9
//!
10
//! Its usage looks like this:
11
//!
12
//! ```rust,ignore
13
//! impl_instructions! {
14
//!     "Adds two registers."
15
//!     0x10 ADD add [RegId RegId RegId]
16
//!     "Bitwise ANDs two registers."
17
//!     0x11 AND and [RegId RegId RegId]
18
//!     // ...
19
//! }
20
//! ```
21
//!
22
//! Each instruction's row includes:
23
//!
24
//! - A short docstring.
25
//! - The Opcode byte value.
26
//! - An uppercase identifier (for generating variants and types).
27
//! - A lowercase identifier (for generating the shorthand instruction constructor).
28
//! - The instruction layout (for the `new` and `unpack` functions).
29
//!
30
//! The following sections describe each of the items that are derived from the
31
//! `impl_instructions!` table in more detail.
32
//!
33
//! ## The `Opcode` enum
34
//!
35
//! Represents the bytecode portion of an instruction.
36
//!
37
//! ```rust,ignore
38
//! /// Solely the opcode portion of an instruction represented as a single byte.
39
//! #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
40
//! #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
41
//! #[repr(u8)]
42
//! pub enum Opcode {
43
//!     /// Adds two registers.
44
//!     ADD = 0x10,
45
//!     /// Bitwise ANDs two registers.
46
//!     AND = 0x11,
47
//!     // ...
48
//! }
49
//! ```
50
//!
51
//! A `TryFrom<u8>` implementation is also provided, producing an `Err(InvalidOpcode)` in
52
//! the case that the byte represents a reserved or undefined value.
53
//!
54
//! ```rust
55
//! # use fuel_asm::{InvalidOpcode, Opcode};
56
//! assert_eq!(Opcode::try_from(0x10), Ok(Opcode::ADD));
57
//! assert_eq!(Opcode::try_from(0x11), Ok(Opcode::AND));
58
//! assert_eq!(Opcode::try_from(0), Err(InvalidOpcode));
59
//! ```
60
//!
61
//! ## The `Instruction` enum
62
//!
63
//! Represents a single, full instruction, discriminated by its `Opcode`.
64
//!
65
//! ```rust,ignore
66
//! /// Representation of a single instruction for the interpreter.
67
//! ///
68
//! /// The opcode is represented in the tag (variant), or may be retrieved in the form of an
69
//! /// `Opcode` byte using the `opcode` method.
70
//! ///
71
//! /// The register and immediate data associated with the instruction is represented within
72
//! /// an inner unit type wrapper around the 3 remaining bytes.
73
//! #[derive(Clone, Copy, Eq, Hash, PartialEq)]
74
//! #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
75
//! pub enum Instruction {
76
//!     /// Adds two registers.
77
//!     ADD(op::ADD),
78
//!     /// Bitwise ANDs two registers.
79
//!     AND(op::AND),
80
//!     // ...
81
//! }
82
//! ```
83
//!
84
//! The `From<Instruction> for u32` (aka `RawInstruction`) and `TryFrom<u32> for
85
//! Instruction` implementations can be found in the crate root.
86
//!
87
//! ## A unique unit type per operation
88
//!
89
//! In order to reduce the likelihood of misusing unrelated register IDs or immediate
90
//! values, we generate a unique unit type for each type of operation (i.e instruction
91
//! variant) and guard access to the relevant register IDs and immediate values behind
92
//! each type's unique methods.
93
//!
94
//! These unique operation types are generated as follows within a dedicated `op` module:
95
//!
96
//! ```rust,ignore
97
//! pub mod op {
98
//!     //! Definitions and implementations for each unique instruction type, one for each
99
//!     //! unique `Opcode` variant.
100
//!
101
//!     // A unique type for each operation.
102
//!
103
//!     /// Adds two registers.
104
//!     pub struct ADD([u8; 3]);
105
//!
106
//!     /// Bitwise ANDs two registers.
107
//!     pub struct AND([u8; 3]);
108
//!
109
//!     // ...
110
//!
111
//!     // An implementation for each unique type.
112
//!
113
//!     impl ADD {
114
//!         pub const OPCODE: Opcode = Opcode::ADD;
115
//!
116
//!         /// Construct the instruction from its parts.
117
//!         pub fn new(ra: RegId, rb: RegId, rc: RegId) -> Self {
118
//!             Self(pack::bytes_from_ra_rb_rc(ra, rb, rc))
119
//!         }
120
//!
121
//!         /// Convert the instruction into its parts.
122
//!         pub fn unpack(self) -> (RegId, RegId, RegId) {
123
//!             unpack::ra_rb_rc_from_bytes(self.0)
124
//!         }
125
//!     }
126
//!
127
//!     impl AND {
128
//!         // ...
129
//!     }
130
//!
131
//!     // ...
132
//!
133
//!     // A short-hand `Instruction` constructor for each operation to make it easier to
134
//!     // hand-write assembly for tests and benchmarking. As these constructors are public and
135
//!     // accept literal values, we check that the values are within range.
136
//!
137
//!     /// Adds two registers.
138
//!     pub fn add(ra: u8, rb: u8, rc: u8) -> Instruction {
139
//!         ADD::new(check_reg_id(ra), check_reg_id(rb), check_reg_id(rc)).into()
140
//!     }
141
//!
142
//!     /// Bitwise ANDs two registers.
143
//!     pub fn and(ra: u8, rb: u8, rc: u8) -> Instruction {
144
//!         AND::new(check_reg_id(ra), check_reg_id(rb), check_reg_id(rc)).into()
145
//!     }
146
//!
147
//!     // ...
148
//! };
149
//! ```
150
//!
151
//! ### Instruction Layout
152
//!
153
//! The function signatures of the `new` and `unpack` functions are derived from the
154
//! instruction's data layout described in the `impl_instructions!` table.
155
//!
156
//! For example, the `unpack` method for `ADD` looks like this:
157
//!
158
//! ```rust,ignore
159
//! // 0x10 ADD add [RegId RegId RegId]
160
//! pub fn unpack(self) -> (RegId, RegId, RegId)
161
//! ```
162
//!
163
//! While the `unpack` method for `ADDI` looks like this:
164
//!
165
//! ```rust,ignore
166
//! // 0x50 ADDI addi [RegId RegId Imm12]
167
//! pub fn unpack(self) -> (RegId, RegId, Imm12)
168
//! ```
169
//!
170
//! ### Shorthand Constructors
171
//!
172
//! The shorthand instruction constructors (e.g. `add`, `and`, etc) are specifically
173
//! designed to make it easier to handwrite assembly for tests or benchmarking. Unlike the
174
//! `$OP::new` constructors which require typed register ID or immediate inputs, the
175
//! instruction constructors allow for constructing `Instruction`s from convenient literal
176
//! value inputs. E.g.
177
//!
178
//! ```rust
179
//! use fuel_asm::{op, Instruction};
180
//!
181
//! // A sample program to perform ecrecover
182
//! let program: Vec<Instruction> = vec![
183
//!     op::move_(0x10, 0x01),     // set r[0x10] := $one
184
//!     op::slli(0x20, 0x10, 5),   // set r[0x20] := `r[0x10] << 5 == 32`
185
//!     op::slli(0x21, 0x10, 6),   // set r[0x21] := `r[0x10] << 6 == 64`
186
//!     op::aloc(0x21),            // alloc `r[0x21] == 64` to the heap
187
//!     op::addi(0x10, 0x07, 1),   // set r[0x10] := `$hp + 1` (allocated heap)
188
//!     op::move_(0x11, 0x04),     // set r[0x11] := $ssp
189
//!     op::add(0x12, 0x04, 0x20), // set r[0x12] := `$ssp + r[0x20]`
190
//!     op::eck1(0x10, 0x11, 0x12),// recover public key in memory[r[0x10], 64]
191
//!     op::ret(0x01),             // return `1`
192
//! ];
193
//! ```
194
195
// Generate a shorthand free function named after the $op for constructing an
196
// `Instruction`.
197
macro_rules! op_constructor {
198
    ($doc:literal $Op:ident $op:ident[$ra:ident : RegId]) => {
199
        #[doc = $doc]
200
4.38k
        pub fn $op<A: CheckRegId>($ra: A) -> Instruction {
201
4.38k
            $Op::new($ra.check()).into()
202
4.38k
        }
_RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3retNtB4_5RegIdECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
200
2.19k
        pub fn $op<A: CheckRegId>($ra: A) -> Instruction {
201
2.19k
            $Op::new($ra.check()).into()
202
2.19k
        }
_RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3rethECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
200
2.19k
        pub fn $op<A: CheckRegId>($ra: A) -> Instruction {
201
2.19k
            $Op::new($ra.check()).into()
202
2.19k
        }
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3retpEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4alocpEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4bheipEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op2cbpEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4rvrtpEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4flagpEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3jmppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3cfepEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3cfspEB4_
203
204
        #[cfg(feature = "typescript")]
205
        const _: () = {
206
            use super::*;
207
208
            #[wasm_bindgen::prelude::wasm_bindgen]
209
            #[doc = $doc]
210
            pub fn $op($ra: u8) -> typescript::Instruction {
211
                crate::op::$op($ra).into()
212
            }
213
        };
214
    };
215
    ($doc:literal $Op:ident $op:ident[$ra:ident : RegId $rb:ident : RegId]) => {
216
        #[doc = $doc]
217
0
        pub fn $op<A: CheckRegId, B: CheckRegId>($ra: A, $rb: B) -> Instruction {
218
0
            $Op::new($ra.check(), $rb.check()).into()
219
0
        }
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op5move_ppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3notppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4retdppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3mclppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4bhshppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4burnppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4crooppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4csizppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4mintppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4timeppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4bsizppEB4_
220
221
        #[cfg(feature = "typescript")]
222
        const _: () = {
223
            use super::*;
224
225
            #[wasm_bindgen::prelude::wasm_bindgen]
226
            #[doc = $doc]
227
            pub fn $op($ra: u8, $rb: u8) -> typescript::Instruction {
228
                crate::op::$op($ra, $rb).into()
229
            }
230
        };
231
    };
232
    (
233
        $doc:literal
234
        $Op:ident
235
        $op:ident[$ra:ident : RegId $rb:ident : RegId $rc:ident : RegId]
236
    ) => {
237
        #[doc = $doc]
238
0
        pub fn $op<A: CheckRegId, B: CheckRegId, C: CheckRegId>(
239
0
            $ra: A,
240
0
            $rb: B,
241
0
            $rc: C,
242
0
        ) -> Instruction {
243
0
            $Op::new($ra.check(), $rb.check(), $rc.check()).into()
244
0
        }
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3balhhhECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3addpppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3andpppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3divpppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op2eqpppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3exppppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op2gtpppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op2ltpppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4mlogpppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4mroopppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4mod_pppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3mulpppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op2orpppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3sllpppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3srlpppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3subpppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3xorpppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3mcppppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4scwqpppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3srwpppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3swwpppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op2trpppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4eck1pppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4ecr1pppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4k256pppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4s256pppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3balpppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3jnepppEB4_
245
246
        #[cfg(feature = "typescript")]
247
        const _: () = {
248
            use super::*;
249
250
            #[wasm_bindgen::prelude::wasm_bindgen]
251
            #[doc = $doc]
252
            pub fn $op($ra: u8, $rb: u8, $rc: u8) -> typescript::Instruction {
253
                crate::op::$op($ra, $rb, $rc).into()
254
            }
255
        };
256
    };
257
    (
258
        $doc:literal
259
        $Op:ident
260
        $op:ident[$ra:ident : RegId $rb:ident : RegId $rc:ident : RegId $rd:ident : RegId]
261
    ) => {
262
        #[doc = $doc]
263
0
        pub fn $op<A: CheckRegId, B: CheckRegId, C: CheckRegId, D: CheckRegId>(
264
0
            $ra: A,
265
0
            $rb: B,
266
0
            $rc: C,
267
0
            $rd: D,
268
0
        ) -> Instruction {
269
0
            $Op::new($ra.check(), $rb.check(), $rc.check(), $rd.check()).into()
270
0
        }
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3loghNtB4_5RegIdBB_BB_ECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4callhNtB4_5RegIdBC_BC_ECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4mldvppppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3meqppppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4callppppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3ccpppppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3logppppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4logdppppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4srwqppppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4swwqppppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3troppppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4ed19ppppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3smoppppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4wdmdppppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4wqmdppppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4wdamppppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4wqamppppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4wdmmppppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4wqmmppppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4ecalppppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4blddppppEB4_
271
272
        #[cfg(feature = "typescript")]
273
        const _: () = {
274
            use super::*;
275
276
            #[wasm_bindgen::prelude::wasm_bindgen]
277
            #[doc = $doc]
278
            pub fn $op($ra: u8, $rb: u8, $rc: u8, $rd: u8) -> typescript::Instruction {
279
                crate::op::$op($ra, $rb, $rc, $rd).into()
280
            }
281
        };
282
    };
283
    (
284
        $doc:literal
285
        $Op:ident
286
        $op:ident[$ra:ident : RegId $rb:ident : RegId $rc:ident : RegId $imm:ident : Imm06]
287
    ) => {
288
        #[doc = $doc]
289
0
        pub fn $op<A: CheckRegId, B: CheckRegId, C: CheckRegId>(
290
0
            $ra: A,
291
0
            $rb: B,
292
0
            $rc: C,
293
0
            $imm: u8,
294
0
        ) -> Instruction {
295
0
            $Op::new($ra.check(), $rb.check(), $rc.check(), check_imm06($imm)).into()
296
0
        }
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3ldcpppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4jnefpppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4jnebpppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4wdcmpppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4wqcmpppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4wdoppppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4wqoppppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4wdmlpppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4wqmlpppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4wddvpppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4wqdvpppEB4_
297
298
        #[cfg(feature = "typescript")]
299
        const _: () = {
300
            use super::*;
301
302
            #[wasm_bindgen::prelude::wasm_bindgen]
303
            #[doc = $doc]
304
            pub fn $op($ra: u8, $rb: u8, $rc: u8, $imm: u8) -> typescript::Instruction {
305
                crate::op::$op($ra, $rb, $rc, $imm).into()
306
            }
307
        };
308
    };
309
    (
310
        $doc:literal
311
        $Op:ident
312
        $op:ident[$ra:ident : RegId $rb:ident : RegId $imm:ident : Imm12]
313
    ) => {
314
        #[doc = $doc]
315
4.38k
        pub fn $op<A: CheckRegId, B: CheckRegId>(
316
4.38k
            $ra: A,
317
4.38k
            $rb: B,
318
4.38k
            $imm: u16,
319
4.38k
        ) -> Instruction {
320
4.38k
            $Op::new($ra.check(), $rb.check(), check_imm12($imm)).into()
321
4.38k
        }
_RINvNtCs6P3fQNJKMy0_8fuel_asm3__op2lwhhECs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
315
2.19k
        pub fn $op<A: CheckRegId, B: CheckRegId>(
316
2.19k
            $ra: A,
317
2.19k
            $rb: B,
318
2.19k
            $imm: u16,
319
2.19k
        ) -> Instruction {
320
2.19k
            $Op::new($ra.check(), $rb.check(), check_imm12($imm)).into()
321
2.19k
        }
_RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4addihNtB4_5RegIdECs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
315
2.19k
        pub fn $op<A: CheckRegId, B: CheckRegId>(
316
2.19k
            $ra: A,
317
2.19k
            $rb: B,
318
2.19k
            $imm: u16,
319
2.19k
        ) -> Instruction {
320
2.19k
            $Op::new($ra.check(), $rb.check(), check_imm12($imm)).into()
321
2.19k
        }
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3gtfhhECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4addihhECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4addippEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4andippEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4divippEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4expippEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4modippEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4mulippEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3orippEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4sllippEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4srlippEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4subippEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4xorippEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4jneippEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op2lbppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op2lwppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op2sbppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op2swppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4mcpippEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op3gtfppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4jnzfppEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4jnzbppEB4_
322
323
        #[cfg(feature = "typescript")]
324
        const _: () = {
325
            use super::*;
326
327
            #[wasm_bindgen::prelude::wasm_bindgen]
328
            #[doc = $doc]
329
            pub fn $op($ra: u8, $rb: u8, $imm: u16) -> typescript::Instruction {
330
                crate::op::$op($ra, $rb, $imm).into()
331
            }
332
        };
333
    };
334
    ($doc:literal $Op:ident $op:ident[$ra:ident : RegId $imm:ident : Imm18]) => {
335
        #[doc = $doc]
336
0
        pub fn $op<A: CheckRegId>($ra: A, $imm: u32) -> Instruction {
337
0
            $Op::new($ra.check(), check_imm18($imm)).into()
338
0
        }
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4movihECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4mclipEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op2gmpEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4movipEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4jnzipEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4jmpfpEB4_
Unexecuted instantiation: _RINvNtCs6P3fQNJKMy0_8fuel_asm3__op4jmpbpEB4_
339
340
        #[cfg(feature = "typescript")]
341
        const _: () = {
342
            use super::*;
343
344
            #[wasm_bindgen::prelude::wasm_bindgen]
345
            #[doc = $doc]
346
            pub fn $op($ra: u8, $imm: u32) -> typescript::Instruction {
347
                crate::op::$op($ra, $imm).into()
348
            }
349
        };
350
    };
351
    ($doc:literal $Op:ident $op:ident[$imm:ident : Imm24]) => {
352
        #[doc = $doc]
353
0
        pub fn $op($imm: u32) -> Instruction {
354
0
            $Op::new(check_imm24($imm)).into()
355
0
        }
Unexecuted instantiation: _RNvNtCs6P3fQNJKMy0_8fuel_asm3__op2ji
Unexecuted instantiation: _RNvNtCs6P3fQNJKMy0_8fuel_asm3__op4cfei
Unexecuted instantiation: _RNvNtCs6P3fQNJKMy0_8fuel_asm3__op4cfsi
Unexecuted instantiation: _RNvNtCs6P3fQNJKMy0_8fuel_asm3__op4pshl
Unexecuted instantiation: _RNvNtCs6P3fQNJKMy0_8fuel_asm3__op4pshh
Unexecuted instantiation: _RNvNtCs6P3fQNJKMy0_8fuel_asm3__op4popl
Unexecuted instantiation: _RNvNtCs6P3fQNJKMy0_8fuel_asm3__op4poph
356
357
        #[cfg(feature = "typescript")]
358
        const _: () = {
359
            use super::*;
360
361
            #[wasm_bindgen::prelude::wasm_bindgen]
362
            #[doc = $doc]
363
            pub fn $op($imm: u32) -> typescript::Instruction {
364
                crate::op::$op($imm).into()
365
            }
366
        };
367
    };
368
    ($doc:literal $Op:ident $op:ident[]) => {
369
        #[doc = $doc]
370
0
        pub fn $op() -> Instruction {
371
0
            $Op::new().into()
372
0
        }
373
374
        #[cfg(feature = "typescript")]
375
        const _: () = {
376
            use super::*;
377
378
            #[wasm_bindgen::prelude::wasm_bindgen]
379
            #[doc = $doc]
380
            pub fn $op() -> typescript::Instruction {
381
                crate::op::$op().into()
382
            }
383
        };
384
    };
385
}
386
387
// Generate approriate `new` constructor for the instruction
388
macro_rules! op_new {
389
    // Generate a constructor based on the field layout.
390
    ($Op:ident $ra:ident : RegId) => {
391
        impl $Op {
392
            /// Construct the instruction from its parts.
393
4.38k
            pub fn new($ra: RegId) -> Self {
394
4.38k
                Self(pack::bytes_from_ra($ra))
395
4.38k
            }
_RNvMseb_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3RET3new
Line
Count
Source
393
4.38k
            pub fn new($ra: RegId) -> Self {
394
4.38k
                Self(pack::bytes_from_ra($ra))
395
4.38k
            }
Unexecuted instantiation: _RNvMseu_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ALOC3new
Unexecuted instantiation: _RNvMsfk_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BHEI3new
Unexecuted instantiation: _RNvMsgl_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2CB3new
Unexecuted instantiation: _RNvMshe_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4RVRT3new
Unexecuted instantiation: _RNvMsjR_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4FLAG3new
Unexecuted instantiation: _RNvMskb_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3JMP3new
Unexecuted instantiation: _RNvMsq2_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3CFE3new
Unexecuted instantiation: _RNvMsqb_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3CFS3new
396
        }
397
398
        #[cfg(feature = "typescript")]
399
        #[wasm_bindgen::prelude::wasm_bindgen]
400
        impl $Op {
401
            #[wasm_bindgen(constructor)]
402
            /// Construct the instruction from its parts.
403
            pub fn new_typescript($ra: RegId) -> Self {
404
                Self::new($ra)
405
            }
406
        }
407
    };
408
    ($Op:ident $ra:ident : RegId $rb:ident : RegId) => {
409
        impl $Op {
410
            /// Construct the instruction from its parts.
411
0
            pub fn new($ra: RegId, $rb: RegId) -> Self {
412
0
                Self(pack::bytes_from_ra_rb($ra, $rb))
413
0
            }
Unexecuted instantiation: _RNvMscB_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MOVE3new
Unexecuted instantiation: _RNvMscW_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3NOT3new
Unexecuted instantiation: _RNvMsek_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4RETD3new
Unexecuted instantiation: _RNvMseD_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MCL3new
Unexecuted instantiation: _RNvMsfa_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BHSH3new
Unexecuted instantiation: _RNvMsft_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BURN3new
Unexecuted instantiation: _RNvMsg1_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CROO3new
Unexecuted instantiation: _RNvMsgb_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CSIZ3new
Unexecuted instantiation: _RNvMsh4_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MINT3new
Unexecuted instantiation: _RNvMsjz_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4TIME3new
Unexecuted instantiation: _RNvMstO_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BSIZ3new
414
        }
415
416
        #[cfg(feature = "typescript")]
417
        #[wasm_bindgen::prelude::wasm_bindgen]
418
        impl $Op {
419
            #[wasm_bindgen(constructor)]
420
            /// Construct the instruction from its parts.
421
            pub fn new_typescript($ra: RegId, $rb: RegId) -> Self {
422
                Self::new($ra, $rb)
423
            }
424
        }
425
    };
426
    ($Op:ident $ra:ident : RegId $rb:ident : RegId $rc:ident : RegId) => {
427
        impl $Op {
428
            /// Construct the instruction from its parts.
429
0
            pub fn new($ra: RegId, $rb: RegId, $rc: RegId) -> Self {
430
0
                Self(pack::bytes_from_ra_rb_rc($ra, $rb, $rc))
431
0
            }
Unexecuted instantiation: _RNvMsaP_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3ADD3new
Unexecuted instantiation: _RNvMsb0_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3AND3new
Unexecuted instantiation: _RNvMsbb_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3DIV3new
Unexecuted instantiation: _RNvMsbm_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2EQ3new
Unexecuted instantiation: _RNvMsbx_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3EXP3new
Unexecuted instantiation: _RNvMsbI_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2GT3new
Unexecuted instantiation: _RNvMsbT_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2LT3new
Unexecuted instantiation: _RNvMsc4_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MLOG3new
Unexecuted instantiation: _RNvMscf_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MROO3new
Unexecuted instantiation: _RNvMscq_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MOD3new
Unexecuted instantiation: _RNvMscL_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MUL3new
Unexecuted instantiation: _RNvMsd6_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2OR3new
Unexecuted instantiation: _RNvMsdh_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SLL3new
Unexecuted instantiation: _RNvMsds_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SRL3new
Unexecuted instantiation: _RNvMsdD_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SUB3new
Unexecuted instantiation: _RNvMsdO_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3XOR3new
Unexecuted instantiation: _RNvMseN_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MCP3new
Unexecuted instantiation: _RNvMshn_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SCWQ3new
Unexecuted instantiation: _RNvMshy_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SRW3new
Unexecuted instantiation: _RNvMshV_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SWW3new
Unexecuted instantiation: _RNvMsii_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2TR3new
Unexecuted instantiation: _RNvMsiF_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ECK13new
Unexecuted instantiation: _RNvMsiQ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ECR13new
Unexecuted instantiation: _RNvMsjd_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4K2563new
Unexecuted instantiation: _RNvMsjo_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4S2563new
Unexecuted instantiation: _RNvMsk0_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3BAL3new
Unexecuted instantiation: _RNvMskk_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3JNE3new
432
        }
433
434
        #[cfg(feature = "typescript")]
435
        #[wasm_bindgen::prelude::wasm_bindgen]
436
        impl $Op {
437
            #[wasm_bindgen(constructor)]
438
            /// Construct the instruction from its parts.
439
            pub fn new_typescript($ra: RegId, $rb: RegId, $rc: RegId) -> Self {
440
                Self::new($ra, $rb, $rc)
441
            }
442
        }
443
    };
444
    (
445
        $Op:ident $ra:ident : RegId $rb:ident : RegId $rc:ident : RegId $rd:ident : RegId
446
    ) => {
447
        impl $Op {
448
            /// Construct the instruction from its parts.
449
0
            pub fn new($ra: RegId, $rb: RegId, $rc: RegId, $rd: RegId) -> Self {
450
0
                Self(pack::bytes_from_ra_rb_rc_rd($ra, $rb, $rc, $rd))
451
0
            }
Unexecuted instantiation: _RNvMsdZ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MLDV3new
Unexecuted instantiation: _RNvMseY_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MEQ3new
Unexecuted instantiation: _RNvMsfD_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CALL3new
Unexecuted instantiation: _RNvMsfP_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3CCP3new
Unexecuted instantiation: _RNvMsgG_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3LOG3new
Unexecuted instantiation: _RNvMsgS_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4LOGD3new
Unexecuted instantiation: _RNvMshJ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SRWQ3new
Unexecuted instantiation: _RNvMsi6_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SWWQ3new
Unexecuted instantiation: _RNvMsit_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3TRO3new
Unexecuted instantiation: _RNvMsj1_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ED193new
Unexecuted instantiation: _RNvMskv_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SMO3new
Unexecuted instantiation: _RNvMsss_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDMD3new
Unexecuted instantiation: _RNvMssE_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQMD3new
Unexecuted instantiation: _RNvMssQ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDAM3new
Unexecuted instantiation: _RNvMst2_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQAM3new
Unexecuted instantiation: _RNvMste_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDMM3new
Unexecuted instantiation: _RNvMstq_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQMM3new
Unexecuted instantiation: _RNvMstC_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ECAL3new
Unexecuted instantiation: _RNvMstY_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BLDD3new
452
        }
453
454
        #[cfg(feature = "typescript")]
455
        #[wasm_bindgen::prelude::wasm_bindgen]
456
        impl $Op {
457
            #[wasm_bindgen(constructor)]
458
            /// Construct the instruction from its parts.
459
            pub fn new_typescript(
460
                $ra: RegId,
461
                $rb: RegId,
462
                $rc: RegId,
463
                $rd: RegId,
464
            ) -> Self {
465
                Self::new($ra, $rb, $rc, $rd)
466
            }
467
        }
468
    };
469
    (
470
        $Op:ident
471
        $ra:ident : RegId
472
        $rb:ident : RegId
473
        $rc:ident : RegId
474
        $imm:ident : Imm06
475
    ) => {
476
        impl $Op {
477
            /// Construct the instruction from its parts.
478
0
            pub fn new($ra: RegId, $rb: RegId, $rc: RegId, $imm: Imm06) -> Self {
479
0
                Self(pack::bytes_from_ra_rb_rc_imm06($ra, $rb, $rc, $imm))
480
0
            }
Unexecuted instantiation: _RNvMsgu_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3LDC3new
Unexecuted instantiation: _RNvMspd_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNEF3new
Unexecuted instantiation: _RNvMspp_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNEB3new
Unexecuted instantiation: _RNvMsqU_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDCM3new
Unexecuted instantiation: _RNvMsr6_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQCM3new
Unexecuted instantiation: _RNvMsri_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDOP3new
Unexecuted instantiation: _RNvMsru_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQOP3new
Unexecuted instantiation: _RNvMsrG_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDML3new
Unexecuted instantiation: _RNvMsrS_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQML3new
Unexecuted instantiation: _RNvMss4_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDDV3new
Unexecuted instantiation: _RNvMssg_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQDV3new
481
        }
482
483
        #[cfg(feature = "typescript")]
484
        #[wasm_bindgen::prelude::wasm_bindgen]
485
        impl $Op {
486
            #[wasm_bindgen(constructor)]
487
            /// Construct the instruction from its parts.
488
            pub fn new_typescript(
489
                $ra: RegId,
490
                $rb: RegId,
491
                $rc: RegId,
492
                $imm: Imm06,
493
            ) -> Self {
494
                Self::new($ra, $rb, $rc, $imm)
495
            }
496
        }
497
    };
498
    ($Op:ident $ra:ident : RegId $rb:ident : RegId $imm:ident : Imm12) => {
499
        impl $Op {
500
            /// Construct the instruction from its parts.
501
4.38k
            pub fn new($ra: RegId, $rb: RegId, $imm: Imm12) -> Self {
502
4.38k
                Self(pack::bytes_from_ra_rb_imm12($ra, $rb, $imm))
503
4.38k
            }
_RNvMskH_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ADDI3new
Line
Count
Source
501
2.19k
            pub fn new($ra: RegId, $rb: RegId, $imm: Imm12) -> Self {
502
2.19k
                Self(pack::bytes_from_ra_rb_imm12($ra, $rb, $imm))
503
2.19k
            }
Unexecuted instantiation: _RNvMskS_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ANDI3new
Unexecuted instantiation: _RNvMsl3_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4DIVI3new
Unexecuted instantiation: _RNvMsle_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4EXPI3new
Unexecuted instantiation: _RNvMslp_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MODI3new
Unexecuted instantiation: _RNvMslA_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MULI3new
Unexecuted instantiation: _RNvMslL_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3ORI3new
Unexecuted instantiation: _RNvMslW_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SLLI3new
Unexecuted instantiation: _RNvMsm7_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SRLI3new
Unexecuted instantiation: _RNvMsmi_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SUBI3new
Unexecuted instantiation: _RNvMsmt_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4XORI3new
Unexecuted instantiation: _RNvMsmE_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNEI3new
Unexecuted instantiation: _RNvMsmP_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2LB3new
_RNvMsn0_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2LW3new
Line
Count
Source
501
2.19k
            pub fn new($ra: RegId, $rb: RegId, $imm: Imm12) -> Self {
502
2.19k
                Self(pack::bytes_from_ra_rb_imm12($ra, $rb, $imm))
503
2.19k
            }
Unexecuted instantiation: _RNvMsnb_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2SB3new
Unexecuted instantiation: _RNvMsnm_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2SW3new
Unexecuted instantiation: _RNvMsnx_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MCPI3new
Unexecuted instantiation: _RNvMsnI_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3GTF3new
Unexecuted instantiation: _RNvMsoR_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNZF3new
Unexecuted instantiation: _RNvMsp2_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNZB3new
504
        }
505
506
        #[cfg(feature = "typescript")]
507
        #[wasm_bindgen::prelude::wasm_bindgen]
508
        impl $Op {
509
            #[wasm_bindgen(constructor)]
510
            /// Construct the instruction from its parts.
511
            pub fn new_typescript($ra: RegId, $rb: RegId, $imm: Imm12) -> Self {
512
                Self::new($ra, $rb, $imm)
513
            }
514
        }
515
    };
516
    ($Op:ident $ra:ident : RegId $imm:ident : Imm18) => {
517
        impl $Op {
518
            /// Construct the instruction from its parts.
519
0
            pub fn new($ra: RegId, $imm: Imm18) -> Self {
520
0
                Self(pack::bytes_from_ra_imm18($ra, $imm))
521
0
            }
Unexecuted instantiation: _RNvMsnT_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MCLI3new
Unexecuted instantiation: _RNvMso3_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2GM3new
Unexecuted instantiation: _RNvMsod_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MOVI3new
Unexecuted instantiation: _RNvMson_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNZI3new
Unexecuted instantiation: _RNvMsox_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JMPF3new
Unexecuted instantiation: _RNvMsoH_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JMPB3new
522
        }
523
524
        #[cfg(feature = "typescript")]
525
        #[wasm_bindgen::prelude::wasm_bindgen]
526
        impl $Op {
527
            #[wasm_bindgen(constructor)]
528
            /// Construct the instruction from its parts.
529
            pub fn new_typescript($ra: RegId, $imm: Imm18) -> Self {
530
                Self::new($ra, $imm)
531
            }
532
        }
533
    };
534
    ($Op:ident $imm:ident : Imm24) => {
535
        impl $Op {
536
            /// Construct the instruction from its parts.
537
0
            pub fn new($imm: Imm24) -> Self {
538
0
                Self(pack::bytes_from_imm24($imm))
539
0
            }
Unexecuted instantiation: _RNvMspB_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2JI3new
Unexecuted instantiation: _RNvMspK_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CFEI3new
Unexecuted instantiation: _RNvMspT_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CFSI3new
Unexecuted instantiation: _RNvMsqk_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4PSHL3new
Unexecuted instantiation: _RNvMsqt_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4PSHH3new
Unexecuted instantiation: _RNvMsqC_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4POPL3new
Unexecuted instantiation: _RNvMsqL_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4POPH3new
540
        }
541
542
        #[cfg(feature = "typescript")]
543
        #[wasm_bindgen::prelude::wasm_bindgen]
544
        impl $Op {
545
            #[wasm_bindgen(constructor)]
546
            /// Construct the instruction from its parts.
547
            pub fn new_typescript($imm: Imm24) -> Self {
548
                Self::new($imm)
549
            }
550
        }
551
    };
552
    ($Op:ident) => {
553
        impl $Op {
554
            /// Construct the instruction.
555
            #[allow(clippy::new_without_default)]
556
0
            pub fn new() -> Self {
557
0
                Self([0; 3])
558
0
            }
559
        }
560
561
        #[cfg(feature = "typescript")]
562
        #[wasm_bindgen::prelude::wasm_bindgen]
563
        impl $Op {
564
            #[wasm_bindgen(constructor)]
565
            /// Construct the instruction.
566
            #[allow(clippy::new_without_default)]
567
            pub fn new_typescript() -> Self {
568
                Self::new()
569
            }
570
        }
571
    };
572
}
573
574
// Generate an accessor method for each field. Recurse based on layout.
575
macro_rules! op_accessors {
576
    ($Op:ident $ra:ident: RegId) => {
577
        #[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
578
        impl $Op {
579
            /// Access the ID for register A.
580
0
            pub fn ra(&self) -> RegId {
581
0
                unpack::ra_from_bytes(self.0)
582
0
            }
Unexecuted instantiation: _RNvMsaS_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3ADD2ra
Unexecuted instantiation: _RNvMsb3_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3AND2ra
Unexecuted instantiation: _RNvMsbe_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3DIV2ra
Unexecuted instantiation: _RNvMsbp_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2EQ2ra
Unexecuted instantiation: _RNvMsbA_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3EXP2ra
Unexecuted instantiation: _RNvMsbL_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2GT2ra
Unexecuted instantiation: _RNvMsbW_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2LT2ra
Unexecuted instantiation: _RNvMsc7_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MLOG2ra
Unexecuted instantiation: _RNvMsci_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MROO2ra
Unexecuted instantiation: _RNvMsct_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MOD2ra
Unexecuted instantiation: _RNvMscD_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MOVE2ra
Unexecuted instantiation: _RNvMscO_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MUL2ra
Unexecuted instantiation: _RNvMscY_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3NOT2ra
Unexecuted instantiation: _RNvMsd9_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2OR2ra
Unexecuted instantiation: _RNvMsdk_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SLL2ra
Unexecuted instantiation: _RNvMsdv_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SRL2ra
Unexecuted instantiation: _RNvMsdG_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SUB2ra
Unexecuted instantiation: _RNvMsdR_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3XOR2ra
Unexecuted instantiation: _RNvMse3_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MLDV2ra
Unexecuted instantiation: _RNvMsec_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3RET2ra
Unexecuted instantiation: _RNvMsem_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4RETD2ra
Unexecuted instantiation: _RNvMsev_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ALOC2ra
Unexecuted instantiation: _RNvMseF_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MCL2ra
Unexecuted instantiation: _RNvMseQ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MCP2ra
Unexecuted instantiation: _RNvMsf2_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MEQ2ra
Unexecuted instantiation: _RNvMsfc_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BHSH2ra
Unexecuted instantiation: _RNvMsfl_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BHEI2ra
Unexecuted instantiation: _RNvMsfv_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BURN2ra
Unexecuted instantiation: _RNvMsfH_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CALL2ra
Unexecuted instantiation: _RNvMsfT_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3CCP2ra
Unexecuted instantiation: _RNvMsg3_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CROO2ra
Unexecuted instantiation: _RNvMsgd_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CSIZ2ra
Unexecuted instantiation: _RNvMsgm_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2CB2ra
Unexecuted instantiation: _RNvMsgy_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3LDC2ra
Unexecuted instantiation: _RNvMsgK_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3LOG2ra
Unexecuted instantiation: _RNvMsgW_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4LOGD2ra
Unexecuted instantiation: _RNvMsh6_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MINT2ra
Unexecuted instantiation: _RNvMshf_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4RVRT2ra
Unexecuted instantiation: _RNvMshq_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SCWQ2ra
Unexecuted instantiation: _RNvMshB_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SRW2ra
Unexecuted instantiation: _RNvMshN_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SRWQ2ra
Unexecuted instantiation: _RNvMshY_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SWW2ra
Unexecuted instantiation: _RNvMsia_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SWWQ2ra
Unexecuted instantiation: _RNvMsil_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2TR2ra
Unexecuted instantiation: _RNvMsix_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3TRO2ra
Unexecuted instantiation: _RNvMsiI_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ECK12ra
Unexecuted instantiation: _RNvMsiT_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ECR12ra
Unexecuted instantiation: _RNvMsj5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ED192ra
Unexecuted instantiation: _RNvMsjg_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4K2562ra
Unexecuted instantiation: _RNvMsjr_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4S2562ra
Unexecuted instantiation: _RNvMsjB_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4TIME2ra
Unexecuted instantiation: _RNvMsjS_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4FLAG2ra
Unexecuted instantiation: _RNvMsk3_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3BAL2ra
Unexecuted instantiation: _RNvMskc_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3JMP2ra
Unexecuted instantiation: _RNvMskn_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3JNE2ra
Unexecuted instantiation: _RNvMskz_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SMO2ra
Unexecuted instantiation: _RNvMskK_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ADDI2ra
Unexecuted instantiation: _RNvMskV_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ANDI2ra
Unexecuted instantiation: _RNvMsl6_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4DIVI2ra
Unexecuted instantiation: _RNvMslh_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4EXPI2ra
Unexecuted instantiation: _RNvMsls_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MODI2ra
Unexecuted instantiation: _RNvMslD_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MULI2ra
Unexecuted instantiation: _RNvMslO_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3ORI2ra
Unexecuted instantiation: _RNvMslZ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SLLI2ra
Unexecuted instantiation: _RNvMsma_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SRLI2ra
Unexecuted instantiation: _RNvMsml_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SUBI2ra
Unexecuted instantiation: _RNvMsmw_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4XORI2ra
Unexecuted instantiation: _RNvMsmH_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNEI2ra
Unexecuted instantiation: _RNvMsmS_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2LB2ra
Unexecuted instantiation: _RNvMsn3_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2LW2ra
Unexecuted instantiation: _RNvMsne_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2SB2ra
Unexecuted instantiation: _RNvMsnp_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2SW2ra
Unexecuted instantiation: _RNvMsnA_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MCPI2ra
Unexecuted instantiation: _RNvMsnL_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3GTF2ra
Unexecuted instantiation: _RNvMsnV_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MCLI2ra
Unexecuted instantiation: _RNvMso5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2GM2ra
Unexecuted instantiation: _RNvMsof_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MOVI2ra
Unexecuted instantiation: _RNvMsop_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNZI2ra
Unexecuted instantiation: _RNvMsoz_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JMPF2ra
Unexecuted instantiation: _RNvMsoJ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JMPB2ra
Unexecuted instantiation: _RNvMsoU_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNZF2ra
Unexecuted instantiation: _RNvMsp5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNZB2ra
Unexecuted instantiation: _RNvMsph_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNEF2ra
Unexecuted instantiation: _RNvMspt_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNEB2ra
Unexecuted instantiation: _RNvMsq3_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3CFE2ra
Unexecuted instantiation: _RNvMsqc_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3CFS2ra
Unexecuted instantiation: _RNvMsqY_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDCM2ra
Unexecuted instantiation: _RNvMsra_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQCM2ra
Unexecuted instantiation: _RNvMsrm_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDOP2ra
Unexecuted instantiation: _RNvMsry_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQOP2ra
Unexecuted instantiation: _RNvMsrK_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDML2ra
Unexecuted instantiation: _RNvMsrW_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQML2ra
Unexecuted instantiation: _RNvMss8_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDDV2ra
Unexecuted instantiation: _RNvMssk_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQDV2ra
Unexecuted instantiation: _RNvMssw_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDMD2ra
Unexecuted instantiation: _RNvMssI_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQMD2ra
Unexecuted instantiation: _RNvMssU_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDAM2ra
Unexecuted instantiation: _RNvMst6_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQAM2ra
Unexecuted instantiation: _RNvMsti_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDMM2ra
Unexecuted instantiation: _RNvMstu_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQMM2ra
Unexecuted instantiation: _RNvMstG_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ECAL2ra
Unexecuted instantiation: _RNvMstQ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BSIZ2ra
Unexecuted instantiation: _RNvMsu2_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BLDD2ra
583
        }
584
    };
585
    ($Op:ident $ra:ident: RegId $rb:ident: RegId) => {
586
        op_accessors!($Op ra: RegId);
587
588
        #[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
589
        impl $Op {
590
            /// Access the ID for register B.
591
0
            pub fn rb(&self) -> RegId {
592
0
                unpack::rb_from_bytes(self.0)
593
0
            }
Unexecuted instantiation: _RNvMsaR_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3ADD2rb
Unexecuted instantiation: _RNvMsb2_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3AND2rb
Unexecuted instantiation: _RNvMsbd_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3DIV2rb
Unexecuted instantiation: _RNvMsbo_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2EQ2rb
Unexecuted instantiation: _RNvMsbz_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3EXP2rb
Unexecuted instantiation: _RNvMsbK_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2GT2rb
Unexecuted instantiation: _RNvMsbV_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2LT2rb
Unexecuted instantiation: _RNvMsc6_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MLOG2rb
Unexecuted instantiation: _RNvMsch_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MROO2rb
Unexecuted instantiation: _RNvMscs_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MOD2rb
Unexecuted instantiation: _RNvMscC_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MOVE2rb
Unexecuted instantiation: _RNvMscN_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MUL2rb
Unexecuted instantiation: _RNvMscX_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3NOT2rb
Unexecuted instantiation: _RNvMsd8_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2OR2rb
Unexecuted instantiation: _RNvMsdj_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SLL2rb
Unexecuted instantiation: _RNvMsdu_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SRL2rb
Unexecuted instantiation: _RNvMsdF_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SUB2rb
Unexecuted instantiation: _RNvMsdQ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3XOR2rb
Unexecuted instantiation: _RNvMse2_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MLDV2rb
Unexecuted instantiation: _RNvMsel_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4RETD2rb
Unexecuted instantiation: _RNvMseE_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MCL2rb
Unexecuted instantiation: _RNvMseP_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MCP2rb
Unexecuted instantiation: _RNvMsf1_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MEQ2rb
Unexecuted instantiation: _RNvMsfb_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BHSH2rb
Unexecuted instantiation: _RNvMsfu_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BURN2rb
Unexecuted instantiation: _RNvMsfG_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CALL2rb
Unexecuted instantiation: _RNvMsfS_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3CCP2rb
Unexecuted instantiation: _RNvMsg2_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CROO2rb
Unexecuted instantiation: _RNvMsgc_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CSIZ2rb
Unexecuted instantiation: _RNvMsgx_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3LDC2rb
Unexecuted instantiation: _RNvMsgJ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3LOG2rb
Unexecuted instantiation: _RNvMsgV_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4LOGD2rb
Unexecuted instantiation: _RNvMsh5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MINT2rb
Unexecuted instantiation: _RNvMshp_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SCWQ2rb
Unexecuted instantiation: _RNvMshA_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SRW2rb
Unexecuted instantiation: _RNvMshM_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SRWQ2rb
Unexecuted instantiation: _RNvMshX_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SWW2rb
Unexecuted instantiation: _RNvMsi9_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SWWQ2rb
Unexecuted instantiation: _RNvMsik_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2TR2rb
Unexecuted instantiation: _RNvMsiw_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3TRO2rb
Unexecuted instantiation: _RNvMsiH_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ECK12rb
Unexecuted instantiation: _RNvMsiS_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ECR12rb
Unexecuted instantiation: _RNvMsj4_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ED192rb
Unexecuted instantiation: _RNvMsjf_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4K2562rb
Unexecuted instantiation: _RNvMsjq_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4S2562rb
Unexecuted instantiation: _RNvMsjA_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4TIME2rb
Unexecuted instantiation: _RNvMsk2_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3BAL2rb
Unexecuted instantiation: _RNvMskm_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3JNE2rb
Unexecuted instantiation: _RNvMsky_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SMO2rb
Unexecuted instantiation: _RNvMskJ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ADDI2rb
Unexecuted instantiation: _RNvMskU_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ANDI2rb
Unexecuted instantiation: _RNvMsl5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4DIVI2rb
Unexecuted instantiation: _RNvMslg_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4EXPI2rb
Unexecuted instantiation: _RNvMslr_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MODI2rb
Unexecuted instantiation: _RNvMslC_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MULI2rb
Unexecuted instantiation: _RNvMslN_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3ORI2rb
Unexecuted instantiation: _RNvMslY_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SLLI2rb
Unexecuted instantiation: _RNvMsm9_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SRLI2rb
Unexecuted instantiation: _RNvMsmk_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SUBI2rb
Unexecuted instantiation: _RNvMsmv_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4XORI2rb
Unexecuted instantiation: _RNvMsmG_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNEI2rb
Unexecuted instantiation: _RNvMsmR_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2LB2rb
Unexecuted instantiation: _RNvMsn2_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2LW2rb
Unexecuted instantiation: _RNvMsnd_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2SB2rb
Unexecuted instantiation: _RNvMsno_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2SW2rb
Unexecuted instantiation: _RNvMsnz_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MCPI2rb
Unexecuted instantiation: _RNvMsnK_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3GTF2rb
Unexecuted instantiation: _RNvMsoT_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNZF2rb
Unexecuted instantiation: _RNvMsp4_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNZB2rb
Unexecuted instantiation: _RNvMspg_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNEF2rb
Unexecuted instantiation: _RNvMsps_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNEB2rb
Unexecuted instantiation: _RNvMsqX_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDCM2rb
Unexecuted instantiation: _RNvMsr9_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQCM2rb
Unexecuted instantiation: _RNvMsrl_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDOP2rb
Unexecuted instantiation: _RNvMsrx_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQOP2rb
Unexecuted instantiation: _RNvMsrJ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDML2rb
Unexecuted instantiation: _RNvMsrV_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQML2rb
Unexecuted instantiation: _RNvMss7_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDDV2rb
Unexecuted instantiation: _RNvMssj_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQDV2rb
Unexecuted instantiation: _RNvMssv_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDMD2rb
Unexecuted instantiation: _RNvMssH_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQMD2rb
Unexecuted instantiation: _RNvMssT_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDAM2rb
Unexecuted instantiation: _RNvMst5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQAM2rb
Unexecuted instantiation: _RNvMsth_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDMM2rb
Unexecuted instantiation: _RNvMstt_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQMM2rb
Unexecuted instantiation: _RNvMstF_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ECAL2rb
Unexecuted instantiation: _RNvMstP_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BSIZ2rb
Unexecuted instantiation: _RNvMsu1_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BLDD2rb
594
        }
595
    };
596
    ($Op:ident $ra:ident: RegId $rb:ident: RegId $rc:ident: RegId) => {
597
        op_accessors!($Op $ra: RegId $rb: RegId);
598
599
        #[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
600
        impl $Op {
601
            /// Access the ID for register C.
602
0
            pub fn rc(&self) -> RegId {
603
0
                unpack::rc_from_bytes(self.0)
604
0
            }
Unexecuted instantiation: _RNvMsaQ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3ADD2rc
Unexecuted instantiation: _RNvMsb1_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3AND2rc
Unexecuted instantiation: _RNvMsbc_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3DIV2rc
Unexecuted instantiation: _RNvMsbn_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2EQ2rc
Unexecuted instantiation: _RNvMsby_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3EXP2rc
Unexecuted instantiation: _RNvMsbJ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2GT2rc
Unexecuted instantiation: _RNvMsbU_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2LT2rc
Unexecuted instantiation: _RNvMsc5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MLOG2rc
Unexecuted instantiation: _RNvMscg_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MROO2rc
Unexecuted instantiation: _RNvMscr_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MOD2rc
Unexecuted instantiation: _RNvMscM_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MUL2rc
Unexecuted instantiation: _RNvMsd7_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2OR2rc
Unexecuted instantiation: _RNvMsdi_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SLL2rc
Unexecuted instantiation: _RNvMsdt_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SRL2rc
Unexecuted instantiation: _RNvMsdE_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SUB2rc
Unexecuted instantiation: _RNvMsdP_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3XOR2rc
Unexecuted instantiation: _RNvMse1_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MLDV2rc
Unexecuted instantiation: _RNvMseO_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MCP2rc
Unexecuted instantiation: _RNvMsf0_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MEQ2rc
Unexecuted instantiation: _RNvMsfF_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CALL2rc
Unexecuted instantiation: _RNvMsfR_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3CCP2rc
Unexecuted instantiation: _RNvMsgw_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3LDC2rc
Unexecuted instantiation: _RNvMsgI_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3LOG2rc
Unexecuted instantiation: _RNvMsgU_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4LOGD2rc
Unexecuted instantiation: _RNvMsho_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SCWQ2rc
Unexecuted instantiation: _RNvMshz_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SRW2rc
Unexecuted instantiation: _RNvMshL_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SRWQ2rc
Unexecuted instantiation: _RNvMshW_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SWW2rc
Unexecuted instantiation: _RNvMsi8_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SWWQ2rc
Unexecuted instantiation: _RNvMsij_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2TR2rc
Unexecuted instantiation: _RNvMsiv_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3TRO2rc
Unexecuted instantiation: _RNvMsiG_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ECK12rc
Unexecuted instantiation: _RNvMsiR_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ECR12rc
Unexecuted instantiation: _RNvMsj3_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ED192rc
Unexecuted instantiation: _RNvMsje_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4K2562rc
Unexecuted instantiation: _RNvMsjp_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4S2562rc
Unexecuted instantiation: _RNvMsk1_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3BAL2rc
Unexecuted instantiation: _RNvMskl_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3JNE2rc
Unexecuted instantiation: _RNvMskx_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SMO2rc
Unexecuted instantiation: _RNvMspf_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNEF2rc
Unexecuted instantiation: _RNvMspr_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNEB2rc
Unexecuted instantiation: _RNvMsqW_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDCM2rc
Unexecuted instantiation: _RNvMsr8_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQCM2rc
Unexecuted instantiation: _RNvMsrk_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDOP2rc
Unexecuted instantiation: _RNvMsrw_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQOP2rc
Unexecuted instantiation: _RNvMsrI_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDML2rc
Unexecuted instantiation: _RNvMsrU_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQML2rc
Unexecuted instantiation: _RNvMss6_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDDV2rc
Unexecuted instantiation: _RNvMssi_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQDV2rc
Unexecuted instantiation: _RNvMssu_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDMD2rc
Unexecuted instantiation: _RNvMssG_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQMD2rc
Unexecuted instantiation: _RNvMssS_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDAM2rc
Unexecuted instantiation: _RNvMst4_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQAM2rc
Unexecuted instantiation: _RNvMstg_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDMM2rc
Unexecuted instantiation: _RNvMsts_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQMM2rc
Unexecuted instantiation: _RNvMstE_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ECAL2rc
Unexecuted instantiation: _RNvMsu0_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BLDD2rc
605
        }
606
    };
607
    ($Op:ident $ra:ident: RegId $rb:ident: RegId $rc:ident: RegId $rd:ident: RegId) => {
608
        op_accessors!($Op $ra: RegId $rb: RegId $rc: RegId);
609
610
        #[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
611
        impl $Op {
612
            /// Access the ID for register D.
613
0
            pub fn rd(&self) -> RegId {
614
0
                unpack::rd_from_bytes(self.0)
615
0
            }
Unexecuted instantiation: _RNvMse0_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MLDV2rd
Unexecuted instantiation: _RNvMseZ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MEQ2rd
Unexecuted instantiation: _RNvMsfE_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CALL2rd
Unexecuted instantiation: _RNvMsfQ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3CCP2rd
Unexecuted instantiation: _RNvMsgH_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3LOG2rd
Unexecuted instantiation: _RNvMsgT_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4LOGD2rd
Unexecuted instantiation: _RNvMshK_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SRWQ2rd
Unexecuted instantiation: _RNvMsi7_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SWWQ2rd
Unexecuted instantiation: _RNvMsiu_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3TRO2rd
Unexecuted instantiation: _RNvMsj2_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ED192rd
Unexecuted instantiation: _RNvMskw_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SMO2rd
Unexecuted instantiation: _RNvMsst_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDMD2rd
Unexecuted instantiation: _RNvMssF_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQMD2rd
Unexecuted instantiation: _RNvMssR_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDAM2rd
Unexecuted instantiation: _RNvMst3_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQAM2rd
Unexecuted instantiation: _RNvMstf_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDMM2rd
Unexecuted instantiation: _RNvMstr_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQMM2rd
Unexecuted instantiation: _RNvMstD_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ECAL2rd
Unexecuted instantiation: _RNvMstZ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BLDD2rd
616
        }
617
    };
618
    ($Op:ident $ra:ident: RegId $rb:ident: RegId $rc:ident: RegId $imm:ident: Imm06) => {
619
        op_accessors!($Op $ra: RegId rb: RegId $rc: RegId);
620
621
        #[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
622
        impl $Op {
623
            /// Access the 6-bit immediate value.
624
0
            pub fn imm06(&self) -> Imm06 {
625
0
                unpack::imm06_from_bytes(self.0)
626
0
            }
Unexecuted instantiation: _RNvMsgv_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3LDC5imm06
Unexecuted instantiation: _RNvMspe_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNEF5imm06
Unexecuted instantiation: _RNvMspq_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNEB5imm06
Unexecuted instantiation: _RNvMsqV_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDCM5imm06
Unexecuted instantiation: _RNvMsr7_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQCM5imm06
Unexecuted instantiation: _RNvMsrj_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDOP5imm06
Unexecuted instantiation: _RNvMsrv_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQOP5imm06
Unexecuted instantiation: _RNvMsrH_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDML5imm06
Unexecuted instantiation: _RNvMsrT_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQML5imm06
Unexecuted instantiation: _RNvMss5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDDV5imm06
Unexecuted instantiation: _RNvMssh_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQDV5imm06
627
        }
628
    };
629
    ($Op:ident $ra:ident: RegId $rb:ident: RegId $imm:ident: Imm12) => {
630
        op_accessors!($Op $ra: RegId $rb: RegId);
631
632
        #[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
633
        impl $Op {
634
            /// Access the 12-bit immediate value.
635
0
            pub fn imm12(&self) -> Imm12 {
636
0
                unpack::imm12_from_bytes(self.0)
637
0
            }
Unexecuted instantiation: _RNvMskI_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ADDI5imm12
Unexecuted instantiation: _RNvMskT_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ANDI5imm12
Unexecuted instantiation: _RNvMsl4_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4DIVI5imm12
Unexecuted instantiation: _RNvMslf_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4EXPI5imm12
Unexecuted instantiation: _RNvMslq_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MODI5imm12
Unexecuted instantiation: _RNvMslB_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MULI5imm12
Unexecuted instantiation: _RNvMslM_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3ORI5imm12
Unexecuted instantiation: _RNvMslX_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SLLI5imm12
Unexecuted instantiation: _RNvMsm8_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SRLI5imm12
Unexecuted instantiation: _RNvMsmj_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SUBI5imm12
Unexecuted instantiation: _RNvMsmu_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4XORI5imm12
Unexecuted instantiation: _RNvMsmF_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNEI5imm12
Unexecuted instantiation: _RNvMsmQ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2LB5imm12
Unexecuted instantiation: _RNvMsn1_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2LW5imm12
Unexecuted instantiation: _RNvMsnc_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2SB5imm12
Unexecuted instantiation: _RNvMsnn_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2SW5imm12
Unexecuted instantiation: _RNvMsny_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MCPI5imm12
Unexecuted instantiation: _RNvMsnJ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3GTF5imm12
Unexecuted instantiation: _RNvMsoS_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNZF5imm12
Unexecuted instantiation: _RNvMsp3_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNZB5imm12
638
        }
639
    };
640
    ($Op:ident $ra:ident: RegId $imm:ident: Imm18) => {
641
        op_accessors!($Op $ra: RegId);
642
643
        #[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
644
        impl $Op {
645
            /// Access the 18-bit immediate value.
646
0
            pub fn imm18(&self) -> Imm18 {
647
0
                unpack::imm18_from_bytes(self.0)
648
0
            }
Unexecuted instantiation: _RNvMsnU_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MCLI5imm18
Unexecuted instantiation: _RNvMso4_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2GM5imm18
Unexecuted instantiation: _RNvMsoe_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MOVI5imm18
Unexecuted instantiation: _RNvMsoo_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNZI5imm18
Unexecuted instantiation: _RNvMsoy_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JMPF5imm18
Unexecuted instantiation: _RNvMsoI_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JMPB5imm18
649
        }
650
    };
651
    ($Op:ident $ra:ident: Imm24) => {
652
        #[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
653
        impl $Op {
654
            /// Access the 24-bit immediate value.
655
0
            pub fn imm24(&self) -> Imm24 {
656
0
                unpack::imm24_from_bytes(self.0)
657
0
            }
Unexecuted instantiation: _RNvMspC_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2JI5imm24
Unexecuted instantiation: _RNvMspL_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CFEI5imm24
Unexecuted instantiation: _RNvMspU_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CFSI5imm24
Unexecuted instantiation: _RNvMsql_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4PSHL5imm24
Unexecuted instantiation: _RNvMsqu_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4PSHH5imm24
Unexecuted instantiation: _RNvMsqD_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4POPL5imm24
Unexecuted instantiation: _RNvMsqM_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4POPH5imm24
658
        }
659
    };
660
    ($Op:ident) => {};
661
}
662
663
// Generate a method for converting the instruction into its parts.
664
macro_rules! op_unpack {
665
    (RegId) => {
666
        /// Convert the instruction into its parts.
667
6.06M
        pub fn unpack(self) -> RegId {
668
6.06M
            unpack::ra_from_bytes(self.0)
669
6.06M
        }
_RNvMse5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3RET6unpack
Line
Count
Source
667
23
        pub fn unpack(self) -> RegId {
668
23
            unpack::ra_from_bytes(self.0)
669
23
        }
_RNvMseo_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ALOC6unpack
Line
Count
Source
667
898k
        pub fn unpack(self) -> RegId {
668
898k
            unpack::ra_from_bytes(self.0)
669
898k
        }
_RNvMsfe_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BHEI6unpack
Line
Count
Source
667
174k
        pub fn unpack(self) -> RegId {
668
174k
            unpack::ra_from_bytes(self.0)
669
174k
        }
_RNvMsgf_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2CB6unpack
Line
Count
Source
667
231k
        pub fn unpack(self) -> RegId {
668
231k
            unpack::ra_from_bytes(self.0)
669
231k
        }
_RNvMsh8_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4RVRT6unpack
Line
Count
Source
667
10
        pub fn unpack(self) -> RegId {
668
10
            unpack::ra_from_bytes(self.0)
669
10
        }
_RNvMsjL_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4FLAG6unpack
Line
Count
Source
667
583k
        pub fn unpack(self) -> RegId {
668
583k
            unpack::ra_from_bytes(self.0)
669
583k
        }
_RNvMsk5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3JMP6unpack
Line
Count
Source
667
3.45M
        pub fn unpack(self) -> RegId {
668
3.45M
            unpack::ra_from_bytes(self.0)
669
3.45M
        }
_RNvMspW_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3CFE6unpack
Line
Count
Source
667
333k
        pub fn unpack(self) -> RegId {
668
333k
            unpack::ra_from_bytes(self.0)
669
333k
        }
_RNvMsq5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3CFS6unpack
Line
Count
Source
667
394k
        pub fn unpack(self) -> RegId {
668
394k
            unpack::ra_from_bytes(self.0)
669
394k
        }
670
    };
671
    (RegId RegId) => {
672
        /// Convert the instruction into its parts.
673
26.0M
        pub fn unpack(self) -> (RegId, RegId) {
674
26.0M
            unpack::ra_rb_from_bytes(self.0)
675
26.0M
        }
_RNvMscv_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MOVE6unpack
Line
Count
Source
673
25.3M
        pub fn unpack(self) -> (RegId, RegId) {
674
25.3M
            unpack::ra_rb_from_bytes(self.0)
675
25.3M
        }
_RNvMscQ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3NOT6unpack
Line
Count
Source
673
203k
        pub fn unpack(self) -> (RegId, RegId) {
674
203k
            unpack::ra_rb_from_bytes(self.0)
675
203k
        }
_RNvMsee_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4RETD6unpack
Line
Count
Source
673
11.3k
        pub fn unpack(self) -> (RegId, RegId) {
674
11.3k
            unpack::ra_rb_from_bytes(self.0)
675
11.3k
        }
_RNvMsex_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MCL6unpack
Line
Count
Source
673
148k
        pub fn unpack(self) -> (RegId, RegId) {
674
148k
            unpack::ra_rb_from_bytes(self.0)
675
148k
        }
_RNvMsf4_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BHSH6unpack
Line
Count
Source
673
72.8k
        pub fn unpack(self) -> (RegId, RegId) {
674
72.8k
            unpack::ra_rb_from_bytes(self.0)
675
72.8k
        }
_RNvMsfn_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BURN6unpack
Line
Count
Source
673
116
        pub fn unpack(self) -> (RegId, RegId) {
674
116
            unpack::ra_rb_from_bytes(self.0)
675
116
        }
_RNvMsfV_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CROO6unpack
Line
Count
Source
673
7
        pub fn unpack(self) -> (RegId, RegId) {
674
7
            unpack::ra_rb_from_bytes(self.0)
675
7
        }
_RNvMsg5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CSIZ6unpack
Line
Count
Source
673
4
        pub fn unpack(self) -> (RegId, RegId) {
674
4
            unpack::ra_rb_from_bytes(self.0)
675
4
        }
_RNvMsgY_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MINT6unpack
Line
Count
Source
673
47
        pub fn unpack(self) -> (RegId, RegId) {
674
47
            unpack::ra_rb_from_bytes(self.0)
675
47
        }
_RNvMsjt_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4TIME6unpack
Line
Count
Source
673
326k
        pub fn unpack(self) -> (RegId, RegId) {
674
326k
            unpack::ra_rb_from_bytes(self.0)
675
326k
        }
_RNvMstI_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BSIZ6unpack
Line
Count
Source
673
2
        pub fn unpack(self) -> (RegId, RegId) {
674
2
            unpack::ra_rb_from_bytes(self.0)
675
2
        }
676
    };
677
    (RegId RegId RegId) => {
678
        /// Convert the instruction into its parts.
679
78.7M
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
78.7M
            unpack::ra_rb_rc_from_bytes(self.0)
681
78.7M
        }
_RNvMsaJ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3ADD6unpack
Line
Count
Source
679
30.0M
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
30.0M
            unpack::ra_rb_rc_from_bytes(self.0)
681
30.0M
        }
_RNvMsaU_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3AND6unpack
Line
Count
Source
679
4.64M
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
4.64M
            unpack::ra_rb_rc_from_bytes(self.0)
681
4.64M
        }
_RNvMsb5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3DIV6unpack
Line
Count
Source
679
141k
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
141k
            unpack::ra_rb_rc_from_bytes(self.0)
681
141k
        }
_RNvMsbg_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2EQ6unpack
Line
Count
Source
679
6.91M
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
6.91M
            unpack::ra_rb_rc_from_bytes(self.0)
681
6.91M
        }
_RNvMsbr_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3EXP6unpack
Line
Count
Source
679
1.59M
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
1.59M
            unpack::ra_rb_rc_from_bytes(self.0)
681
1.59M
        }
_RNvMsbC_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2GT6unpack
Line
Count
Source
679
5.78M
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
5.78M
            unpack::ra_rb_rc_from_bytes(self.0)
681
5.78M
        }
_RNvMsbN_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2LT6unpack
Line
Count
Source
679
2.39M
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
2.39M
            unpack::ra_rb_rc_from_bytes(self.0)
681
2.39M
        }
_RNvMsbY_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MLOG6unpack
Line
Count
Source
679
1.04M
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
1.04M
            unpack::ra_rb_rc_from_bytes(self.0)
681
1.04M
        }
_RNvMsc9_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MROO6unpack
Line
Count
Source
679
1.48M
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
1.48M
            unpack::ra_rb_rc_from_bytes(self.0)
681
1.48M
        }
_RNvMsck_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MOD6unpack
Line
Count
Source
679
1.63M
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
1.63M
            unpack::ra_rb_rc_from_bytes(self.0)
681
1.63M
        }
_RNvMscF_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MUL6unpack
Line
Count
Source
679
3.49M
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
3.49M
            unpack::ra_rb_rc_from_bytes(self.0)
681
3.49M
        }
_RNvMsd0_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2OR6unpack
Line
Count
Source
679
466k
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
466k
            unpack::ra_rb_rc_from_bytes(self.0)
681
466k
        }
_RNvMsdb_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SLL6unpack
Line
Count
Source
679
2.40M
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
2.40M
            unpack::ra_rb_rc_from_bytes(self.0)
681
2.40M
        }
_RNvMsdm_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SRL6unpack
Line
Count
Source
679
470k
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
470k
            unpack::ra_rb_rc_from_bytes(self.0)
681
470k
        }
_RNvMsdx_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SUB6unpack
Line
Count
Source
679
750k
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
750k
            unpack::ra_rb_rc_from_bytes(self.0)
681
750k
        }
_RNvMsdI_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3XOR6unpack
Line
Count
Source
679
893k
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
893k
            unpack::ra_rb_rc_from_bytes(self.0)
681
893k
        }
_RNvMseH_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MCP6unpack
Line
Count
Source
679
7.30M
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
7.30M
            unpack::ra_rb_rc_from_bytes(self.0)
681
7.30M
        }
_RNvMshh_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SCWQ6unpack
Line
Count
Source
679
5.19k
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
5.19k
            unpack::ra_rb_rc_from_bytes(self.0)
681
5.19k
        }
_RNvMshs_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SRW6unpack
Line
Count
Source
679
2.04k
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
2.04k
            unpack::ra_rb_rc_from_bytes(self.0)
681
2.04k
        }
_RNvMshP_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SWW6unpack
Line
Count
Source
679
352
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
352
            unpack::ra_rb_rc_from_bytes(self.0)
681
352
        }
_RNvMsic_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2TR6unpack
Line
Count
Source
679
8
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
8
            unpack::ra_rb_rc_from_bytes(self.0)
681
8
        }
_RNvMsiz_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ECK16unpack
Line
Count
Source
679
11.1k
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
11.1k
            unpack::ra_rb_rc_from_bytes(self.0)
681
11.1k
        }
_RNvMsiK_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ECR16unpack
Line
Count
Source
679
4.52k
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
4.52k
            unpack::ra_rb_rc_from_bytes(self.0)
681
4.52k
        }
_RNvMsj7_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4K2566unpack
Line
Count
Source
679
38.7k
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
38.7k
            unpack::ra_rb_rc_from_bytes(self.0)
681
38.7k
        }
_RNvMsji_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4S2566unpack
Line
Count
Source
679
146k
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
146k
            unpack::ra_rb_rc_from_bytes(self.0)
681
146k
        }
_RNvMsjU_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3BAL6unpack
Line
Count
Source
679
7
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
7
            unpack::ra_rb_rc_from_bytes(self.0)
681
7
        }
_RNvMske_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3JNE6unpack
Line
Count
Source
679
7.04M
        pub fn unpack(self) -> (RegId, RegId, RegId) {
680
7.04M
            unpack::ra_rb_rc_from_bytes(self.0)
681
7.04M
        }
682
    };
683
    (RegId RegId RegId RegId) => {
684
        /// Convert the instruction into its parts.
685
11.0M
        pub fn unpack(self) -> (RegId, RegId, RegId, RegId) {
686
11.0M
            unpack::ra_rb_rc_rd_from_bytes(self.0)
687
11.0M
        }
_RNvMsdT_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MLDV6unpack
Line
Count
Source
685
3.50M
        pub fn unpack(self) -> (RegId, RegId, RegId, RegId) {
686
3.50M
            unpack::ra_rb_rc_rd_from_bytes(self.0)
687
3.50M
        }
_RNvMseS_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MEQ6unpack
Line
Count
Source
685
1.63M
        pub fn unpack(self) -> (RegId, RegId, RegId, RegId) {
686
1.63M
            unpack::ra_rb_rc_rd_from_bytes(self.0)
687
1.63M
        }
_RNvMsfx_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CALL6unpack
Line
Count
Source
685
12.3k
        pub fn unpack(self) -> (RegId, RegId, RegId, RegId) {
686
12.3k
            unpack::ra_rb_rc_rd_from_bytes(self.0)
687
12.3k
        }
_RNvMsfJ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3CCP6unpack
Line
Count
Source
685
14
        pub fn unpack(self) -> (RegId, RegId, RegId, RegId) {
686
14
            unpack::ra_rb_rc_rd_from_bytes(self.0)
687
14
        }
_RNvMsgA_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3LOG6unpack
Line
Count
Source
685
631k
        pub fn unpack(self) -> (RegId, RegId, RegId, RegId) {
686
631k
            unpack::ra_rb_rc_rd_from_bytes(self.0)
687
631k
        }
_RNvMsgM_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4LOGD6unpack
Line
Count
Source
685
176k
        pub fn unpack(self) -> (RegId, RegId, RegId, RegId) {
686
176k
            unpack::ra_rb_rc_rd_from_bytes(self.0)
687
176k
        }
_RNvMshD_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SRWQ6unpack
Line
Count
Source
685
896
        pub fn unpack(self) -> (RegId, RegId, RegId, RegId) {
686
896
            unpack::ra_rb_rc_rd_from_bytes(self.0)
687
896
        }
_RNvMsi0_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SWWQ6unpack
Line
Count
Source
685
3.79k
        pub fn unpack(self) -> (RegId, RegId, RegId, RegId) {
686
3.79k
            unpack::ra_rb_rc_rd_from_bytes(self.0)
687
3.79k
        }
_RNvMsin_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3TRO6unpack
Line
Count
Source
685
13
        pub fn unpack(self) -> (RegId, RegId, RegId, RegId) {
686
13
            unpack::ra_rb_rc_rd_from_bytes(self.0)
687
13
        }
_RNvMsiV_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ED196unpack
Line
Count
Source
685
11.9k
        pub fn unpack(self) -> (RegId, RegId, RegId, RegId) {
686
11.9k
            unpack::ra_rb_rc_rd_from_bytes(self.0)
687
11.9k
        }
_RNvMskp_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SMO6unpack
Line
Count
Source
685
88.9k
        pub fn unpack(self) -> (RegId, RegId, RegId, RegId) {
686
88.9k
            unpack::ra_rb_rc_rd_from_bytes(self.0)
687
88.9k
        }
_RNvMssm_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDMD6unpack
Line
Count
Source
685
899k
        pub fn unpack(self) -> (RegId, RegId, RegId, RegId) {
686
899k
            unpack::ra_rb_rc_rd_from_bytes(self.0)
687
899k
        }
_RNvMssy_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQMD6unpack
Line
Count
Source
685
1.66M
        pub fn unpack(self) -> (RegId, RegId, RegId, RegId) {
686
1.66M
            unpack::ra_rb_rc_rd_from_bytes(self.0)
687
1.66M
        }
_RNvMssK_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDAM6unpack
Line
Count
Source
685
127k
        pub fn unpack(self) -> (RegId, RegId, RegId, RegId) {
686
127k
            unpack::ra_rb_rc_rd_from_bytes(self.0)
687
127k
        }
_RNvMssW_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQAM6unpack
Line
Count
Source
685
1.22M
        pub fn unpack(self) -> (RegId, RegId, RegId, RegId) {
686
1.22M
            unpack::ra_rb_rc_rd_from_bytes(self.0)
687
1.22M
        }
_RNvMst8_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDMM6unpack
Line
Count
Source
685
800k
        pub fn unpack(self) -> (RegId, RegId, RegId, RegId) {
686
800k
            unpack::ra_rb_rc_rd_from_bytes(self.0)
687
800k
        }
_RNvMstk_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQMM6unpack
Line
Count
Source
685
252k
        pub fn unpack(self) -> (RegId, RegId, RegId, RegId) {
686
252k
            unpack::ra_rb_rc_rd_from_bytes(self.0)
687
252k
        }
_RNvMstw_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ECAL6unpack
Line
Count
Source
685
2
        pub fn unpack(self) -> (RegId, RegId, RegId, RegId) {
686
2
            unpack::ra_rb_rc_rd_from_bytes(self.0)
687
2
        }
_RNvMstS_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BLDD6unpack
Line
Count
Source
685
3
        pub fn unpack(self) -> (RegId, RegId, RegId, RegId) {
686
3
            unpack::ra_rb_rc_rd_from_bytes(self.0)
687
3
        }
688
    };
689
    (RegId RegId RegId Imm06) => {
690
        /// Convert the instruction into its parts.
691
24.4M
        pub fn unpack(self) -> (RegId, RegId, RegId, Imm06) {
692
24.4M
            unpack::ra_rb_rc_imm06_from_bytes(self.0)
693
24.4M
        }
_RNvMsgo_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3LDC6unpack
Line
Count
Source
691
597k
        pub fn unpack(self) -> (RegId, RegId, RegId, Imm06) {
692
597k
            unpack::ra_rb_rc_imm06_from_bytes(self.0)
693
597k
        }
_RNvMsp7_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNEF6unpack
Line
Count
Source
691
792k
        pub fn unpack(self) -> (RegId, RegId, RegId, Imm06) {
692
792k
            unpack::ra_rb_rc_imm06_from_bytes(self.0)
693
792k
        }
_RNvMspj_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNEB6unpack
Line
Count
Source
691
7.13M
        pub fn unpack(self) -> (RegId, RegId, RegId, Imm06) {
692
7.13M
            unpack::ra_rb_rc_imm06_from_bytes(self.0)
693
7.13M
        }
_RNvMsqO_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDCM6unpack
Line
Count
Source
691
4.77M
        pub fn unpack(self) -> (RegId, RegId, RegId, Imm06) {
692
4.77M
            unpack::ra_rb_rc_imm06_from_bytes(self.0)
693
4.77M
        }
_RNvMsr0_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQCM6unpack
Line
Count
Source
691
5.48M
        pub fn unpack(self) -> (RegId, RegId, RegId, Imm06) {
692
5.48M
            unpack::ra_rb_rc_imm06_from_bytes(self.0)
693
5.48M
        }
_RNvMsrc_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDOP6unpack
Line
Count
Source
691
706k
        pub fn unpack(self) -> (RegId, RegId, RegId, Imm06) {
692
706k
            unpack::ra_rb_rc_imm06_from_bytes(self.0)
693
706k
        }
_RNvMsro_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQOP6unpack
Line
Count
Source
691
1.55M
        pub fn unpack(self) -> (RegId, RegId, RegId, Imm06) {
692
1.55M
            unpack::ra_rb_rc_imm06_from_bytes(self.0)
693
1.55M
        }
_RNvMsrA_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDML6unpack
Line
Count
Source
691
487k
        pub fn unpack(self) -> (RegId, RegId, RegId, Imm06) {
692
487k
            unpack::ra_rb_rc_imm06_from_bytes(self.0)
693
487k
        }
_RNvMsrM_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQML6unpack
Line
Count
Source
691
1.08M
        pub fn unpack(self) -> (RegId, RegId, RegId, Imm06) {
692
1.08M
            unpack::ra_rb_rc_imm06_from_bytes(self.0)
693
1.08M
        }
_RNvMsrY_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDDV6unpack
Line
Count
Source
691
1.17M
        pub fn unpack(self) -> (RegId, RegId, RegId, Imm06) {
692
1.17M
            unpack::ra_rb_rc_imm06_from_bytes(self.0)
693
1.17M
        }
_RNvMssa_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQDV6unpack
Line
Count
Source
691
615k
        pub fn unpack(self) -> (RegId, RegId, RegId, Imm06) {
692
615k
            unpack::ra_rb_rc_imm06_from_bytes(self.0)
693
615k
        }
694
    };
695
    (RegId RegId Imm12) => {
696
        /// Convert the instruction into its parts.
697
141M
        pub fn unpack(self) -> (RegId, RegId, Imm12) {
698
141M
            unpack::ra_rb_imm12_from_bytes(self.0)
699
141M
        }
_RNvMskB_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ADDI6unpack
Line
Count
Source
697
34.9M
        pub fn unpack(self) -> (RegId, RegId, Imm12) {
698
34.9M
            unpack::ra_rb_imm12_from_bytes(self.0)
699
34.9M
        }
_RNvMskM_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ANDI6unpack
Line
Count
Source
697
3.18M
        pub fn unpack(self) -> (RegId, RegId, Imm12) {
698
3.18M
            unpack::ra_rb_imm12_from_bytes(self.0)
699
3.18M
        }
_RNvMskX_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4DIVI6unpack
Line
Count
Source
697
5.48M
        pub fn unpack(self) -> (RegId, RegId, Imm12) {
698
5.48M
            unpack::ra_rb_imm12_from_bytes(self.0)
699
5.48M
        }
_RNvMsl8_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4EXPI6unpack
Line
Count
Source
697
1.74M
        pub fn unpack(self) -> (RegId, RegId, Imm12) {
698
1.74M
            unpack::ra_rb_imm12_from_bytes(self.0)
699
1.74M
        }
_RNvMslj_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MODI6unpack
Line
Count
Source
697
987k
        pub fn unpack(self) -> (RegId, RegId, Imm12) {
698
987k
            unpack::ra_rb_imm12_from_bytes(self.0)
699
987k
        }
_RNvMslu_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MULI6unpack
Line
Count
Source
697
1.87M
        pub fn unpack(self) -> (RegId, RegId, Imm12) {
698
1.87M
            unpack::ra_rb_imm12_from_bytes(self.0)
699
1.87M
        }
_RNvMslF_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3ORI6unpack
Line
Count
Source
697
1.20M
        pub fn unpack(self) -> (RegId, RegId, Imm12) {
698
1.20M
            unpack::ra_rb_imm12_from_bytes(self.0)
699
1.20M
        }
_RNvMslQ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SLLI6unpack
Line
Count
Source
697
738k
        pub fn unpack(self) -> (RegId, RegId, Imm12) {
698
738k
            unpack::ra_rb_imm12_from_bytes(self.0)
699
738k
        }
_RNvMsm1_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SRLI6unpack
Line
Count
Source
697
1.09M
        pub fn unpack(self) -> (RegId, RegId, Imm12) {
698
1.09M
            unpack::ra_rb_imm12_from_bytes(self.0)
699
1.09M
        }
_RNvMsmc_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SUBI6unpack
Line
Count
Source
697
2.61M
        pub fn unpack(self) -> (RegId, RegId, Imm12) {
698
2.61M
            unpack::ra_rb_imm12_from_bytes(self.0)
699
2.61M
        }
_RNvMsmn_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4XORI6unpack
Line
Count
Source
697
425k
        pub fn unpack(self) -> (RegId, RegId, Imm12) {
698
425k
            unpack::ra_rb_imm12_from_bytes(self.0)
699
425k
        }
_RNvMsmy_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNEI6unpack
Line
Count
Source
697
4.19M
        pub fn unpack(self) -> (RegId, RegId, Imm12) {
698
4.19M
            unpack::ra_rb_imm12_from_bytes(self.0)
699
4.19M
        }
_RNvMsmJ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2LB6unpack
Line
Count
Source
697
735k
        pub fn unpack(self) -> (RegId, RegId, Imm12) {
698
735k
            unpack::ra_rb_imm12_from_bytes(self.0)
699
735k
        }
_RNvMsmU_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2LW6unpack
Line
Count
Source
697
51.5M
        pub fn unpack(self) -> (RegId, RegId, Imm12) {
698
51.5M
            unpack::ra_rb_imm12_from_bytes(self.0)
699
51.5M
        }
_RNvMsn5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2SB6unpack
Line
Count
Source
697
164k
        pub fn unpack(self) -> (RegId, RegId, Imm12) {
698
164k
            unpack::ra_rb_imm12_from_bytes(self.0)
699
164k
        }
_RNvMsng_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2SW6unpack
Line
Count
Source
697
12.9M
        pub fn unpack(self) -> (RegId, RegId, Imm12) {
698
12.9M
            unpack::ra_rb_imm12_from_bytes(self.0)
699
12.9M
        }
_RNvMsnr_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MCPI6unpack
Line
Count
Source
697
87.0k
        pub fn unpack(self) -> (RegId, RegId, Imm12) {
698
87.0k
            unpack::ra_rb_imm12_from_bytes(self.0)
699
87.0k
        }
_RNvMsnC_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3GTF6unpack
Line
Count
Source
697
10.4M
        pub fn unpack(self) -> (RegId, RegId, Imm12) {
698
10.4M
            unpack::ra_rb_imm12_from_bytes(self.0)
699
10.4M
        }
_RNvMsoL_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNZF6unpack
Line
Count
Source
697
2.12M
        pub fn unpack(self) -> (RegId, RegId, Imm12) {
698
2.12M
            unpack::ra_rb_imm12_from_bytes(self.0)
699
2.12M
        }
_RNvMsoW_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNZB6unpack
Line
Count
Source
697
5.18M
        pub fn unpack(self) -> (RegId, RegId, Imm12) {
698
5.18M
            unpack::ra_rb_imm12_from_bytes(self.0)
699
5.18M
        }
700
    };
701
    (RegId Imm18) => {
702
        /// Convert the instruction into its parts.
703
37.0M
        pub fn unpack(self) -> (RegId, Imm18) {
704
37.0M
            unpack::ra_imm18_from_bytes(self.0)
705
37.0M
        }
_RNvMsnN_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MCLI6unpack
Line
Count
Source
703
114k
        pub fn unpack(self) -> (RegId, Imm18) {
704
114k
            unpack::ra_imm18_from_bytes(self.0)
705
114k
        }
_RNvMsnX_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2GM6unpack
Line
Count
Source
703
1.61M
        pub fn unpack(self) -> (RegId, Imm18) {
704
1.61M
            unpack::ra_imm18_from_bytes(self.0)
705
1.61M
        }
_RNvMso7_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MOVI6unpack
Line
Count
Source
703
13.4M
        pub fn unpack(self) -> (RegId, Imm18) {
704
13.4M
            unpack::ra_imm18_from_bytes(self.0)
705
13.4M
        }
_RNvMsoh_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNZI6unpack
Line
Count
Source
703
20.2M
        pub fn unpack(self) -> (RegId, Imm18) {
704
20.2M
            unpack::ra_imm18_from_bytes(self.0)
705
20.2M
        }
_RNvMsor_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JMPF6unpack
Line
Count
Source
703
464k
        pub fn unpack(self) -> (RegId, Imm18) {
704
464k
            unpack::ra_imm18_from_bytes(self.0)
705
464k
        }
_RNvMsoB_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JMPB6unpack
Line
Count
Source
703
1.19M
        pub fn unpack(self) -> (RegId, Imm18) {
704
1.19M
            unpack::ra_imm18_from_bytes(self.0)
705
1.19M
        }
706
    };
707
    (Imm24) => {
708
        /// Convert the instruction into its parts.
709
62.3M
        pub fn unpack(self) -> Imm24 {
710
62.3M
            unpack::imm24_from_bytes(self.0)
711
62.3M
        }
_RNvMspv_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2JI6unpack
Line
Count
Source
709
40.7M
        pub fn unpack(self) -> Imm24 {
710
40.7M
            unpack::imm24_from_bytes(self.0)
711
40.7M
        }
_RNvMspE_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CFEI6unpack
Line
Count
Source
709
14.9M
        pub fn unpack(self) -> Imm24 {
710
14.9M
            unpack::imm24_from_bytes(self.0)
711
14.9M
        }
_RNvMspN_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CFSI6unpack
Line
Count
Source
709
1.76M
        pub fn unpack(self) -> Imm24 {
710
1.76M
            unpack::imm24_from_bytes(self.0)
711
1.76M
        }
_RNvMsqe_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4PSHL6unpack
Line
Count
Source
709
805k
        pub fn unpack(self) -> Imm24 {
710
805k
            unpack::imm24_from_bytes(self.0)
711
805k
        }
_RNvMsqn_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4PSHH6unpack
Line
Count
Source
709
3.66M
        pub fn unpack(self) -> Imm24 {
710
3.66M
            unpack::imm24_from_bytes(self.0)
711
3.66M
        }
_RNvMsqw_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4POPL6unpack
Line
Count
Source
709
276k
        pub fn unpack(self) -> Imm24 {
710
276k
            unpack::imm24_from_bytes(self.0)
711
276k
        }
_RNvMsqF_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4POPH6unpack
Line
Count
Source
709
159k
        pub fn unpack(self) -> Imm24 {
710
159k
            unpack::imm24_from_bytes(self.0)
711
159k
        }
712
    };
713
    () => {};
714
}
715
716
// Generate a method for checking that the reserved part of the
717
// instruction is zero. This is private, as invalid instructions
718
// cannot be constructed outside this crate.
719
macro_rules! op_reserved_part {
720
    (RegId) => {
721
6.06M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
722
6.06M
            let (_, imm) = unpack::ra_imm18_from_bytes(self.0);
723
6.06M
            imm.0 == 0
724
6.06M
        }
_RNvMse5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3RET21reserved_part_is_zero
Line
Count
Source
721
27
        pub(crate) fn reserved_part_is_zero(self) -> bool {
722
27
            let (_, imm) = unpack::ra_imm18_from_bytes(self.0);
723
27
            imm.0 == 0
724
27
        }
_RNvMseo_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ALOC21reserved_part_is_zero
Line
Count
Source
721
898k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
722
898k
            let (_, imm) = unpack::ra_imm18_from_bytes(self.0);
723
898k
            imm.0 == 0
724
898k
        }
_RNvMsfe_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BHEI21reserved_part_is_zero
Line
Count
Source
721
174k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
722
174k
            let (_, imm) = unpack::ra_imm18_from_bytes(self.0);
723
174k
            imm.0 == 0
724
174k
        }
_RNvMsgf_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2CB21reserved_part_is_zero
Line
Count
Source
721
231k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
722
231k
            let (_, imm) = unpack::ra_imm18_from_bytes(self.0);
723
231k
            imm.0 == 0
724
231k
        }
_RNvMsh8_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4RVRT21reserved_part_is_zero
Line
Count
Source
721
11
        pub(crate) fn reserved_part_is_zero(self) -> bool {
722
11
            let (_, imm) = unpack::ra_imm18_from_bytes(self.0);
723
11
            imm.0 == 0
724
11
        }
_RNvMsjL_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4FLAG21reserved_part_is_zero
Line
Count
Source
721
583k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
722
583k
            let (_, imm) = unpack::ra_imm18_from_bytes(self.0);
723
583k
            imm.0 == 0
724
583k
        }
_RNvMsk5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3JMP21reserved_part_is_zero
Line
Count
Source
721
3.45M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
722
3.45M
            let (_, imm) = unpack::ra_imm18_from_bytes(self.0);
723
3.45M
            imm.0 == 0
724
3.45M
        }
_RNvMspW_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3CFE21reserved_part_is_zero
Line
Count
Source
721
333k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
722
333k
            let (_, imm) = unpack::ra_imm18_from_bytes(self.0);
723
333k
            imm.0 == 0
724
333k
        }
_RNvMsq5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3CFS21reserved_part_is_zero
Line
Count
Source
721
394k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
722
394k
            let (_, imm) = unpack::ra_imm18_from_bytes(self.0);
723
394k
            imm.0 == 0
724
394k
        }
725
    };
726
    (RegId RegId) => {
727
26.0M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
728
26.0M
            let (_, _, imm) = unpack::ra_rb_imm12_from_bytes(self.0);
729
26.0M
            imm.0 == 0
730
26.0M
        }
_RNvMscv_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MOVE21reserved_part_is_zero
Line
Count
Source
727
25.3M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
728
25.3M
            let (_, _, imm) = unpack::ra_rb_imm12_from_bytes(self.0);
729
25.3M
            imm.0 == 0
730
25.3M
        }
_RNvMscQ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3NOT21reserved_part_is_zero
Line
Count
Source
727
203k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
728
203k
            let (_, _, imm) = unpack::ra_rb_imm12_from_bytes(self.0);
729
203k
            imm.0 == 0
730
203k
        }
_RNvMsee_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4RETD21reserved_part_is_zero
Line
Count
Source
727
11.3k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
728
11.3k
            let (_, _, imm) = unpack::ra_rb_imm12_from_bytes(self.0);
729
11.3k
            imm.0 == 0
730
11.3k
        }
_RNvMsex_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MCL21reserved_part_is_zero
Line
Count
Source
727
148k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
728
148k
            let (_, _, imm) = unpack::ra_rb_imm12_from_bytes(self.0);
729
148k
            imm.0 == 0
730
148k
        }
_RNvMsf4_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BHSH21reserved_part_is_zero
Line
Count
Source
727
72.8k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
728
72.8k
            let (_, _, imm) = unpack::ra_rb_imm12_from_bytes(self.0);
729
72.8k
            imm.0 == 0
730
72.8k
        }
_RNvMsfn_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BURN21reserved_part_is_zero
Line
Count
Source
727
122
        pub(crate) fn reserved_part_is_zero(self) -> bool {
728
122
            let (_, _, imm) = unpack::ra_rb_imm12_from_bytes(self.0);
729
122
            imm.0 == 0
730
122
        }
_RNvMsfV_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CROO21reserved_part_is_zero
Line
Count
Source
727
11
        pub(crate) fn reserved_part_is_zero(self) -> bool {
728
11
            let (_, _, imm) = unpack::ra_rb_imm12_from_bytes(self.0);
729
11
            imm.0 == 0
730
11
        }
_RNvMsg5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CSIZ21reserved_part_is_zero
Line
Count
Source
727
7
        pub(crate) fn reserved_part_is_zero(self) -> bool {
728
7
            let (_, _, imm) = unpack::ra_rb_imm12_from_bytes(self.0);
729
7
            imm.0 == 0
730
7
        }
_RNvMsgY_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MINT21reserved_part_is_zero
Line
Count
Source
727
50
        pub(crate) fn reserved_part_is_zero(self) -> bool {
728
50
            let (_, _, imm) = unpack::ra_rb_imm12_from_bytes(self.0);
729
50
            imm.0 == 0
730
50
        }
_RNvMsjt_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4TIME21reserved_part_is_zero
Line
Count
Source
727
326k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
728
326k
            let (_, _, imm) = unpack::ra_rb_imm12_from_bytes(self.0);
729
326k
            imm.0 == 0
730
326k
        }
_RNvMstI_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BSIZ21reserved_part_is_zero
Line
Count
Source
727
3
        pub(crate) fn reserved_part_is_zero(self) -> bool {
728
3
            let (_, _, imm) = unpack::ra_rb_imm12_from_bytes(self.0);
729
3
            imm.0 == 0
730
3
        }
731
    };
732
    (RegId RegId RegId) => {
733
78.7M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
78.7M
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
78.7M
            imm.0 == 0
736
78.7M
        }
_RNvMsaJ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3ADD21reserved_part_is_zero
Line
Count
Source
733
30.0M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
30.0M
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
30.0M
            imm.0 == 0
736
30.0M
        }
_RNvMsaU_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3AND21reserved_part_is_zero
Line
Count
Source
733
4.64M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
4.64M
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
4.64M
            imm.0 == 0
736
4.64M
        }
_RNvMsb5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3DIV21reserved_part_is_zero
Line
Count
Source
733
141k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
141k
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
141k
            imm.0 == 0
736
141k
        }
_RNvMsbg_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2EQ21reserved_part_is_zero
Line
Count
Source
733
6.91M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
6.91M
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
6.91M
            imm.0 == 0
736
6.91M
        }
_RNvMsbr_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3EXP21reserved_part_is_zero
Line
Count
Source
733
1.59M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
1.59M
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
1.59M
            imm.0 == 0
736
1.59M
        }
_RNvMsbC_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2GT21reserved_part_is_zero
Line
Count
Source
733
5.78M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
5.78M
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
5.78M
            imm.0 == 0
736
5.78M
        }
_RNvMsbN_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2LT21reserved_part_is_zero
Line
Count
Source
733
2.39M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
2.39M
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
2.39M
            imm.0 == 0
736
2.39M
        }
_RNvMsbY_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MLOG21reserved_part_is_zero
Line
Count
Source
733
1.04M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
1.04M
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
1.04M
            imm.0 == 0
736
1.04M
        }
_RNvMsc9_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MROO21reserved_part_is_zero
Line
Count
Source
733
1.48M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
1.48M
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
1.48M
            imm.0 == 0
736
1.48M
        }
_RNvMsck_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MOD21reserved_part_is_zero
Line
Count
Source
733
1.63M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
1.63M
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
1.63M
            imm.0 == 0
736
1.63M
        }
_RNvMscF_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MUL21reserved_part_is_zero
Line
Count
Source
733
3.49M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
3.49M
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
3.49M
            imm.0 == 0
736
3.49M
        }
_RNvMsd0_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2OR21reserved_part_is_zero
Line
Count
Source
733
466k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
466k
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
466k
            imm.0 == 0
736
466k
        }
_RNvMsdb_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SLL21reserved_part_is_zero
Line
Count
Source
733
2.40M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
2.40M
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
2.40M
            imm.0 == 0
736
2.40M
        }
_RNvMsdm_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SRL21reserved_part_is_zero
Line
Count
Source
733
470k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
470k
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
470k
            imm.0 == 0
736
470k
        }
_RNvMsdx_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SUB21reserved_part_is_zero
Line
Count
Source
733
750k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
750k
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
750k
            imm.0 == 0
736
750k
        }
_RNvMsdI_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3XOR21reserved_part_is_zero
Line
Count
Source
733
893k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
893k
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
893k
            imm.0 == 0
736
893k
        }
_RNvMseH_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MCP21reserved_part_is_zero
Line
Count
Source
733
7.30M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
7.30M
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
7.30M
            imm.0 == 0
736
7.30M
        }
_RNvMshh_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SCWQ21reserved_part_is_zero
Line
Count
Source
733
5.19k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
5.19k
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
5.19k
            imm.0 == 0
736
5.19k
        }
_RNvMshs_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SRW21reserved_part_is_zero
Line
Count
Source
733
2.05k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
2.05k
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
2.05k
            imm.0 == 0
736
2.05k
        }
_RNvMshP_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SWW21reserved_part_is_zero
Line
Count
Source
733
358
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
358
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
358
            imm.0 == 0
736
358
        }
_RNvMsic_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2TR21reserved_part_is_zero
Line
Count
Source
733
11
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
11
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
11
            imm.0 == 0
736
11
        }
_RNvMsiz_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ECK121reserved_part_is_zero
Line
Count
Source
733
11.1k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
11.1k
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
11.1k
            imm.0 == 0
736
11.1k
        }
_RNvMsiK_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ECR121reserved_part_is_zero
Line
Count
Source
733
4.54k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
4.54k
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
4.54k
            imm.0 == 0
736
4.54k
        }
_RNvMsj7_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4K25621reserved_part_is_zero
Line
Count
Source
733
38.7k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
38.7k
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
38.7k
            imm.0 == 0
736
38.7k
        }
_RNvMsji_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4S25621reserved_part_is_zero
Line
Count
Source
733
146k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
146k
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
146k
            imm.0 == 0
736
146k
        }
_RNvMsjU_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3BAL21reserved_part_is_zero
Line
Count
Source
733
12
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
12
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
12
            imm.0 == 0
736
12
        }
_RNvMske_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3JNE21reserved_part_is_zero
Line
Count
Source
733
7.04M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
734
7.04M
            let (_, _, _, imm) = unpack::ra_rb_rc_imm06_from_bytes(self.0);
735
7.04M
            imm.0 == 0
736
7.04M
        }
737
    };
738
    (RegId RegId RegId RegId) => {
739
11.0M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
740
11.0M
            true
741
11.0M
        }
_RNvMsdT_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MLDV21reserved_part_is_zeroB8_
Line
Count
Source
739
3.50M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
740
3.50M
            true
741
3.50M
        }
_RNvMseS_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MEQ21reserved_part_is_zeroB8_
Line
Count
Source
739
1.63M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
740
1.63M
            true
741
1.63M
        }
_RNvMsfx_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CALL21reserved_part_is_zeroB8_
Line
Count
Source
739
12.3k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
740
12.3k
            true
741
12.3k
        }
_RNvMsfJ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3CCP21reserved_part_is_zeroB8_
Line
Count
Source
739
14
        pub(crate) fn reserved_part_is_zero(self) -> bool {
740
14
            true
741
14
        }
_RNvMsgA_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3LOG21reserved_part_is_zeroB8_
Line
Count
Source
739
631k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
740
631k
            true
741
631k
        }
_RNvMsgM_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4LOGD21reserved_part_is_zeroB8_
Line
Count
Source
739
176k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
740
176k
            true
741
176k
        }
_RNvMshD_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SRWQ21reserved_part_is_zeroB8_
Line
Count
Source
739
896
        pub(crate) fn reserved_part_is_zero(self) -> bool {
740
896
            true
741
896
        }
_RNvMsi0_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SWWQ21reserved_part_is_zeroB8_
Line
Count
Source
739
3.79k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
740
3.79k
            true
741
3.79k
        }
_RNvMsin_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3TRO21reserved_part_is_zeroB8_
Line
Count
Source
739
13
        pub(crate) fn reserved_part_is_zero(self) -> bool {
740
13
            true
741
13
        }
_RNvMsiV_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ED1921reserved_part_is_zeroB8_
Line
Count
Source
739
11.9k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
740
11.9k
            true
741
11.9k
        }
_RNvMskp_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SMO21reserved_part_is_zeroB8_
Line
Count
Source
739
88.9k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
740
88.9k
            true
741
88.9k
        }
_RNvMssm_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDMD21reserved_part_is_zeroB8_
Line
Count
Source
739
899k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
740
899k
            true
741
899k
        }
_RNvMssy_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQMD21reserved_part_is_zeroB8_
Line
Count
Source
739
1.66M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
740
1.66M
            true
741
1.66M
        }
_RNvMssK_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDAM21reserved_part_is_zeroB8_
Line
Count
Source
739
127k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
740
127k
            true
741
127k
        }
_RNvMssW_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQAM21reserved_part_is_zeroB8_
Line
Count
Source
739
1.22M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
740
1.22M
            true
741
1.22M
        }
_RNvMst8_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDMM21reserved_part_is_zeroB8_
Line
Count
Source
739
800k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
740
800k
            true
741
800k
        }
_RNvMstk_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQMM21reserved_part_is_zeroB8_
Line
Count
Source
739
252k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
740
252k
            true
741
252k
        }
_RNvMstw_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ECAL21reserved_part_is_zeroB8_
Line
Count
Source
739
2
        pub(crate) fn reserved_part_is_zero(self) -> bool {
740
2
            true
741
2
        }
_RNvMstS_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BLDD21reserved_part_is_zeroB8_
Line
Count
Source
739
3
        pub(crate) fn reserved_part_is_zero(self) -> bool {
740
3
            true
741
3
        }
742
    };
743
    (RegId RegId RegId Imm06) => {
744
24.4M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
745
24.4M
            true
746
24.4M
        }
_RNvMsgo_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3LDC21reserved_part_is_zeroB8_
Line
Count
Source
744
597k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
745
597k
            true
746
597k
        }
_RNvMsp7_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNEF21reserved_part_is_zeroB8_
Line
Count
Source
744
792k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
745
792k
            true
746
792k
        }
_RNvMspj_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNEB21reserved_part_is_zeroB8_
Line
Count
Source
744
7.13M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
745
7.13M
            true
746
7.13M
        }
_RNvMsqO_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDCM21reserved_part_is_zeroB8_
Line
Count
Source
744
4.77M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
745
4.77M
            true
746
4.77M
        }
_RNvMsr0_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQCM21reserved_part_is_zeroB8_
Line
Count
Source
744
5.48M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
745
5.48M
            true
746
5.48M
        }
_RNvMsrc_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDOP21reserved_part_is_zeroB8_
Line
Count
Source
744
706k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
745
706k
            true
746
706k
        }
_RNvMsro_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQOP21reserved_part_is_zeroB8_
Line
Count
Source
744
1.55M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
745
1.55M
            true
746
1.55M
        }
_RNvMsrA_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDML21reserved_part_is_zeroB8_
Line
Count
Source
744
487k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
745
487k
            true
746
487k
        }
_RNvMsrM_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQML21reserved_part_is_zeroB8_
Line
Count
Source
744
1.08M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
745
1.08M
            true
746
1.08M
        }
_RNvMsrY_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDDV21reserved_part_is_zeroB8_
Line
Count
Source
744
1.17M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
745
1.17M
            true
746
1.17M
        }
_RNvMssa_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQDV21reserved_part_is_zeroB8_
Line
Count
Source
744
615k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
745
615k
            true
746
615k
        }
747
    };
748
    (RegId RegId Imm12) => {
749
141M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
750
141M
            true
751
141M
        }
_RNvMskB_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ADDI21reserved_part_is_zeroB8_
Line
Count
Source
749
34.9M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
750
34.9M
            true
751
34.9M
        }
_RNvMskM_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ANDI21reserved_part_is_zeroB8_
Line
Count
Source
749
3.18M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
750
3.18M
            true
751
3.18M
        }
_RNvMskX_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4DIVI21reserved_part_is_zeroB8_
Line
Count
Source
749
5.48M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
750
5.48M
            true
751
5.48M
        }
_RNvMsl8_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4EXPI21reserved_part_is_zeroB8_
Line
Count
Source
749
1.74M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
750
1.74M
            true
751
1.74M
        }
_RNvMslj_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MODI21reserved_part_is_zeroB8_
Line
Count
Source
749
987k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
750
987k
            true
751
987k
        }
_RNvMslu_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MULI21reserved_part_is_zeroB8_
Line
Count
Source
749
1.87M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
750
1.87M
            true
751
1.87M
        }
_RNvMslF_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3ORI21reserved_part_is_zeroB8_
Line
Count
Source
749
1.20M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
750
1.20M
            true
751
1.20M
        }
_RNvMslQ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SLLI21reserved_part_is_zeroB8_
Line
Count
Source
749
738k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
750
738k
            true
751
738k
        }
_RNvMsm1_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SRLI21reserved_part_is_zeroB8_
Line
Count
Source
749
1.09M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
750
1.09M
            true
751
1.09M
        }
_RNvMsmc_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SUBI21reserved_part_is_zeroB8_
Line
Count
Source
749
2.61M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
750
2.61M
            true
751
2.61M
        }
_RNvMsmn_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4XORI21reserved_part_is_zeroB8_
Line
Count
Source
749
425k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
750
425k
            true
751
425k
        }
_RNvMsmy_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNEI21reserved_part_is_zeroB8_
Line
Count
Source
749
4.19M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
750
4.19M
            true
751
4.19M
        }
_RNvMsmJ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2LB21reserved_part_is_zeroB8_
Line
Count
Source
749
735k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
750
735k
            true
751
735k
        }
_RNvMsmU_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2LW21reserved_part_is_zeroB8_
Line
Count
Source
749
51.5M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
750
51.5M
            true
751
51.5M
        }
_RNvMsn5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2SB21reserved_part_is_zeroB8_
Line
Count
Source
749
164k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
750
164k
            true
751
164k
        }
_RNvMsng_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2SW21reserved_part_is_zeroB8_
Line
Count
Source
749
12.9M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
750
12.9M
            true
751
12.9M
        }
_RNvMsnr_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MCPI21reserved_part_is_zeroB8_
Line
Count
Source
749
87.0k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
750
87.0k
            true
751
87.0k
        }
_RNvMsnC_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3GTF21reserved_part_is_zeroB8_
Line
Count
Source
749
10.4M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
750
10.4M
            true
751
10.4M
        }
_RNvMsoL_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNZF21reserved_part_is_zeroB8_
Line
Count
Source
749
2.12M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
750
2.12M
            true
751
2.12M
        }
_RNvMsoW_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNZB21reserved_part_is_zeroB8_
Line
Count
Source
749
5.18M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
750
5.18M
            true
751
5.18M
        }
752
    };
753
    (RegId Imm18) => {
754
37.0M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
755
37.0M
            true
756
37.0M
        }
_RNvMsnN_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MCLI21reserved_part_is_zeroB8_
Line
Count
Source
754
114k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
755
114k
            true
756
114k
        }
_RNvMsnX_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2GM21reserved_part_is_zeroB8_
Line
Count
Source
754
1.61M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
755
1.61M
            true
756
1.61M
        }
_RNvMso7_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MOVI21reserved_part_is_zeroB8_
Line
Count
Source
754
13.4M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
755
13.4M
            true
756
13.4M
        }
_RNvMsoh_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNZI21reserved_part_is_zeroB8_
Line
Count
Source
754
20.2M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
755
20.2M
            true
756
20.2M
        }
_RNvMsor_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JMPF21reserved_part_is_zeroB8_
Line
Count
Source
754
464k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
755
464k
            true
756
464k
        }
_RNvMsoB_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JMPB21reserved_part_is_zeroB8_
Line
Count
Source
754
1.19M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
755
1.19M
            true
756
1.19M
        }
757
    };
758
    (Imm24) => {
759
62.3M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
760
62.3M
            true
761
62.3M
        }
_RNvMspv_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2JI21reserved_part_is_zeroB8_
Line
Count
Source
759
40.7M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
760
40.7M
            true
761
40.7M
        }
_RNvMspE_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CFEI21reserved_part_is_zeroB8_
Line
Count
Source
759
14.9M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
760
14.9M
            true
761
14.9M
        }
_RNvMspN_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CFSI21reserved_part_is_zeroB8_
Line
Count
Source
759
1.76M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
760
1.76M
            true
761
1.76M
        }
_RNvMsqe_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4PSHL21reserved_part_is_zeroB8_
Line
Count
Source
759
805k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
760
805k
            true
761
805k
        }
_RNvMsqn_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4PSHH21reserved_part_is_zeroB8_
Line
Count
Source
759
3.66M
        pub(crate) fn reserved_part_is_zero(self) -> bool {
760
3.66M
            true
761
3.66M
        }
_RNvMsqw_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4POPL21reserved_part_is_zeroB8_
Line
Count
Source
759
276k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
760
276k
            true
761
276k
        }
_RNvMsqF_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4POPH21reserved_part_is_zeroB8_
Line
Count
Source
759
159k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
760
159k
            true
761
159k
        }
762
    };
763
    () => {
764
448k
        pub(crate) fn reserved_part_is_zero(self) -> bool {
765
448k
            self.0 == [0; 3]
766
448k
        }
767
    };
768
}
769
770
// Generate a private fn for use within the `Instruction::reg_ids` implementation.
771
macro_rules! op_reg_ids {
772
    (RegId) => {
773
0
        pub(super) fn reg_ids(&self) -> [Option<RegId>; 4] {
774
0
            let ra = self.unpack();
775
0
            [Some(ra), None, None, None]
776
0
        }
Unexecuted instantiation: _RNvMse5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3RET7reg_ids
Unexecuted instantiation: _RNvMseo_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ALOC7reg_ids
Unexecuted instantiation: _RNvMsfe_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BHEI7reg_ids
Unexecuted instantiation: _RNvMsgf_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2CB7reg_ids
Unexecuted instantiation: _RNvMsh8_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4RVRT7reg_ids
Unexecuted instantiation: _RNvMsjL_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4FLAG7reg_ids
Unexecuted instantiation: _RNvMsk5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3JMP7reg_ids
Unexecuted instantiation: _RNvMspW_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3CFE7reg_ids
Unexecuted instantiation: _RNvMsq5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3CFS7reg_ids
777
    };
778
    (RegId RegId) => {
779
0
        pub(super) fn reg_ids(&self) -> [Option<RegId>; 4] {
780
0
            let (ra, rb) = self.unpack();
781
0
            [Some(ra), Some(rb), None, None]
782
0
        }
Unexecuted instantiation: _RNvMscv_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MOVE7reg_ids
Unexecuted instantiation: _RNvMscQ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3NOT7reg_ids
Unexecuted instantiation: _RNvMsee_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4RETD7reg_ids
Unexecuted instantiation: _RNvMsex_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MCL7reg_ids
Unexecuted instantiation: _RNvMsf4_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BHSH7reg_ids
Unexecuted instantiation: _RNvMsfn_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BURN7reg_ids
Unexecuted instantiation: _RNvMsfV_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CROO7reg_ids
Unexecuted instantiation: _RNvMsg5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CSIZ7reg_ids
Unexecuted instantiation: _RNvMsgY_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MINT7reg_ids
Unexecuted instantiation: _RNvMsjt_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4TIME7reg_ids
Unexecuted instantiation: _RNvMstI_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BSIZ7reg_ids
783
    };
784
    (RegId RegId RegId) => {
785
0
        pub(super) fn reg_ids(&self) -> [Option<RegId>; 4] {
786
0
            let (ra, rb, rc) = self.unpack();
787
0
            [Some(ra), Some(rb), Some(rc), None]
788
0
        }
Unexecuted instantiation: _RNvMsaJ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3ADD7reg_ids
Unexecuted instantiation: _RNvMsaU_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3AND7reg_ids
Unexecuted instantiation: _RNvMsb5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3DIV7reg_ids
Unexecuted instantiation: _RNvMsbg_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2EQ7reg_ids
Unexecuted instantiation: _RNvMsbr_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3EXP7reg_ids
Unexecuted instantiation: _RNvMsbC_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2GT7reg_ids
Unexecuted instantiation: _RNvMsbN_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2LT7reg_ids
Unexecuted instantiation: _RNvMsbY_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MLOG7reg_ids
Unexecuted instantiation: _RNvMsc9_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MROO7reg_ids
Unexecuted instantiation: _RNvMsck_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MOD7reg_ids
Unexecuted instantiation: _RNvMscF_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MUL7reg_ids
Unexecuted instantiation: _RNvMsd0_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2OR7reg_ids
Unexecuted instantiation: _RNvMsdb_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SLL7reg_ids
Unexecuted instantiation: _RNvMsdm_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SRL7reg_ids
Unexecuted instantiation: _RNvMsdx_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SUB7reg_ids
Unexecuted instantiation: _RNvMsdI_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3XOR7reg_ids
Unexecuted instantiation: _RNvMseH_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MCP7reg_ids
Unexecuted instantiation: _RNvMshh_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SCWQ7reg_ids
Unexecuted instantiation: _RNvMshs_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SRW7reg_ids
Unexecuted instantiation: _RNvMshP_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SWW7reg_ids
Unexecuted instantiation: _RNvMsic_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2TR7reg_ids
Unexecuted instantiation: _RNvMsiz_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ECK17reg_ids
Unexecuted instantiation: _RNvMsiK_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ECR17reg_ids
Unexecuted instantiation: _RNvMsj7_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4K2567reg_ids
Unexecuted instantiation: _RNvMsji_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4S2567reg_ids
Unexecuted instantiation: _RNvMsjU_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3BAL7reg_ids
Unexecuted instantiation: _RNvMske_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3JNE7reg_ids
789
    };
790
    (RegId RegId RegId RegId) => {
791
0
        pub(super) fn reg_ids(&self) -> [Option<RegId>; 4] {
792
0
            let (ra, rb, rc, rd) = self.unpack();
793
0
            [Some(ra), Some(rb), Some(rc), Some(rd)]
794
0
        }
Unexecuted instantiation: _RNvMsdT_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MLDV7reg_ids
Unexecuted instantiation: _RNvMseS_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MEQ7reg_ids
Unexecuted instantiation: _RNvMsfx_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CALL7reg_ids
Unexecuted instantiation: _RNvMsfJ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3CCP7reg_ids
Unexecuted instantiation: _RNvMsgA_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3LOG7reg_ids
Unexecuted instantiation: _RNvMsgM_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4LOGD7reg_ids
Unexecuted instantiation: _RNvMshD_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SRWQ7reg_ids
Unexecuted instantiation: _RNvMsi0_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SWWQ7reg_ids
Unexecuted instantiation: _RNvMsin_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3TRO7reg_ids
Unexecuted instantiation: _RNvMsiV_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ED197reg_ids
Unexecuted instantiation: _RNvMskp_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SMO7reg_ids
Unexecuted instantiation: _RNvMssm_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDMD7reg_ids
Unexecuted instantiation: _RNvMssy_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQMD7reg_ids
Unexecuted instantiation: _RNvMssK_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDAM7reg_ids
Unexecuted instantiation: _RNvMssW_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQAM7reg_ids
Unexecuted instantiation: _RNvMst8_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDMM7reg_ids
Unexecuted instantiation: _RNvMstk_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQMM7reg_ids
Unexecuted instantiation: _RNvMstw_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ECAL7reg_ids
Unexecuted instantiation: _RNvMstS_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BLDD7reg_ids
795
    };
796
    (RegId RegId RegId Imm06) => {
797
0
        pub(super) fn reg_ids(&self) -> [Option<RegId>; 4] {
798
0
            let (ra, rb, rc, _) = self.unpack();
799
0
            [Some(ra), Some(rb), Some(rc), None]
800
0
        }
Unexecuted instantiation: _RNvMsgo_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3LDC7reg_ids
Unexecuted instantiation: _RNvMsp7_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNEF7reg_ids
Unexecuted instantiation: _RNvMspj_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNEB7reg_ids
Unexecuted instantiation: _RNvMsqO_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDCM7reg_ids
Unexecuted instantiation: _RNvMsr0_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQCM7reg_ids
Unexecuted instantiation: _RNvMsrc_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDOP7reg_ids
Unexecuted instantiation: _RNvMsro_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQOP7reg_ids
Unexecuted instantiation: _RNvMsrA_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDML7reg_ids
Unexecuted instantiation: _RNvMsrM_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQML7reg_ids
Unexecuted instantiation: _RNvMsrY_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDDV7reg_ids
Unexecuted instantiation: _RNvMssa_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQDV7reg_ids
801
    };
802
    (RegId RegId Imm12) => {
803
0
        pub(super) fn reg_ids(&self) -> [Option<RegId>; 4] {
804
0
            let (ra, rb, _) = self.unpack();
805
0
            [Some(ra), Some(rb), None, None]
806
0
        }
Unexecuted instantiation: _RNvMskB_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ADDI7reg_ids
Unexecuted instantiation: _RNvMskM_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ANDI7reg_ids
Unexecuted instantiation: _RNvMskX_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4DIVI7reg_ids
Unexecuted instantiation: _RNvMsl8_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4EXPI7reg_ids
Unexecuted instantiation: _RNvMslj_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MODI7reg_ids
Unexecuted instantiation: _RNvMslu_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MULI7reg_ids
Unexecuted instantiation: _RNvMslF_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3ORI7reg_ids
Unexecuted instantiation: _RNvMslQ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SLLI7reg_ids
Unexecuted instantiation: _RNvMsm1_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SRLI7reg_ids
Unexecuted instantiation: _RNvMsmc_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SUBI7reg_ids
Unexecuted instantiation: _RNvMsmn_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4XORI7reg_ids
Unexecuted instantiation: _RNvMsmy_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNEI7reg_ids
Unexecuted instantiation: _RNvMsmJ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2LB7reg_ids
Unexecuted instantiation: _RNvMsmU_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2LW7reg_ids
Unexecuted instantiation: _RNvMsn5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2SB7reg_ids
Unexecuted instantiation: _RNvMsng_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2SW7reg_ids
Unexecuted instantiation: _RNvMsnr_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MCPI7reg_ids
Unexecuted instantiation: _RNvMsnC_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3GTF7reg_ids
Unexecuted instantiation: _RNvMsoL_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNZF7reg_ids
Unexecuted instantiation: _RNvMsoW_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNZB7reg_ids
807
    };
808
    (RegId Imm18) => {
809
0
        pub(super) fn reg_ids(&self) -> [Option<RegId>; 4] {
810
0
            let (ra, _) = self.unpack();
811
0
            [Some(ra), None, None, None]
812
0
        }
Unexecuted instantiation: _RNvMsnN_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MCLI7reg_ids
Unexecuted instantiation: _RNvMsnX_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2GM7reg_ids
Unexecuted instantiation: _RNvMso7_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MOVI7reg_ids
Unexecuted instantiation: _RNvMsoh_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNZI7reg_ids
Unexecuted instantiation: _RNvMsor_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JMPF7reg_ids
Unexecuted instantiation: _RNvMsoB_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JMPB7reg_ids
813
    };
814
    ($($rest:tt)*) => {
815
0
        pub(super) fn reg_ids(&self) -> [Option<RegId>; 4] {
816
0
            [None; 4]
817
0
        }
Unexecuted instantiation: _RNvMsjD_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4NOOP7reg_idsB8_
Unexecuted instantiation: _RNvMspv_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2JI7reg_idsB8_
Unexecuted instantiation: _RNvMspE_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CFEI7reg_idsB8_
Unexecuted instantiation: _RNvMspN_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CFSI7reg_idsB8_
Unexecuted instantiation: _RNvMsqe_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4PSHL7reg_idsB8_
Unexecuted instantiation: _RNvMsqn_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4PSHH7reg_idsB8_
Unexecuted instantiation: _RNvMsqw_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4POPL7reg_idsB8_
Unexecuted instantiation: _RNvMsqF_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4POPH7reg_idsB8_
818
    };
819
}
820
821
// Generate test constructors that can be used to generate instructions from non-matching
822
// input.
823
#[cfg(test)]
824
macro_rules! op_test_construct_fn {
825
    (RegId) => {
826
        /// Construct the instruction from all possible raw fields, ignoring inapplicable
827
        /// ones.
828
        pub fn test_construct(
829
            ra: RegId,
830
            _rb: RegId,
831
            _rc: RegId,
832
            _rd: RegId,
833
            _imm: u32,
834
        ) -> Self {
835
            Self(pack::bytes_from_ra(ra))
836
        }
837
    };
838
    (RegId RegId) => {
839
        /// Construct the instruction from all possible raw fields, ignoring inapplicable
840
        /// ones.
841
        pub fn test_construct(
842
            ra: RegId,
843
            rb: RegId,
844
            _rc: RegId,
845
            _rd: RegId,
846
            _imm: u32,
847
        ) -> Self {
848
            Self(pack::bytes_from_ra_rb(ra, rb))
849
        }
850
    };
851
    (RegId RegId RegId) => {
852
        /// Construct the instruction from all possible raw fields, ignoring inapplicable
853
        /// ones.
854
        pub fn test_construct(
855
            ra: RegId,
856
            rb: RegId,
857
            rc: RegId,
858
            _rd: RegId,
859
            _imm: u32,
860
        ) -> Self {
861
            Self(pack::bytes_from_ra_rb_rc(ra, rb, rc))
862
        }
863
    };
864
    (RegId RegId RegId RegId) => {
865
        /// Construct the instruction from all possible raw fields, ignoring inapplicable
866
        /// ones.
867
        pub fn test_construct(
868
            ra: RegId,
869
            rb: RegId,
870
            rc: RegId,
871
            rd: RegId,
872
            _imm: u32,
873
        ) -> Self {
874
            Self(pack::bytes_from_ra_rb_rc_rd(ra, rb, rc, rd))
875
        }
876
    };
877
    (RegId RegId RegId Imm06) => {
878
        /// Construct the instruction from all possible raw fields, ignoring inapplicable
879
        /// ones.
880
        pub fn test_construct(
881
            ra: RegId,
882
            rb: RegId,
883
            rc: RegId,
884
            _rd: RegId,
885
            imm: u32,
886
        ) -> Self {
887
            Self(pack::bytes_from_ra_rb_rc_imm06(
888
                ra,
889
                rb,
890
                rc,
891
                Imm06::from(imm as u8),
892
            ))
893
        }
894
    };
895
    (RegId RegId Imm12) => {
896
        /// Construct the instruction from all possible raw fields, ignoring inapplicable
897
        /// ones.
898
        pub fn test_construct(
899
            ra: RegId,
900
            rb: RegId,
901
            _rc: RegId,
902
            _rd: RegId,
903
            imm: u32,
904
        ) -> Self {
905
            Self(pack::bytes_from_ra_rb_imm12(
906
                ra,
907
                rb,
908
                Imm12::from(imm as u16),
909
            ))
910
        }
911
    };
912
    (RegId Imm18) => {
913
        /// Construct the instruction from all possible raw fields, ignoring inapplicable
914
        /// ones.
915
        pub fn test_construct(
916
            ra: RegId,
917
            _rb: RegId,
918
            _rc: RegId,
919
            _rd: RegId,
920
            imm: u32,
921
        ) -> Self {
922
            Self(pack::bytes_from_ra_imm18(ra, Imm18::from(imm)))
923
        }
924
    };
925
    (Imm24) => {
926
        /// Construct the instruction from all possible raw fields, ignoring inapplicable
927
        /// ones.
928
        pub fn test_construct(
929
            _ra: RegId,
930
            _rb: RegId,
931
            _rc: RegId,
932
            _rd: RegId,
933
            imm: u32,
934
        ) -> Self {
935
            Self(pack::bytes_from_imm24(Imm24::from(imm)))
936
        }
937
    };
938
    () => {
939
        /// Construct the instruction from all possible raw fields, ignoring inapplicable
940
        /// ones.
941
        #[allow(clippy::new_without_default)]
942
        pub fn test_construct(
943
            _ra: RegId,
944
            _rb: RegId,
945
            _rc: RegId,
946
            _rd: RegId,
947
            _imm: u32,
948
        ) -> Self {
949
            Self([0; 3])
950
        }
951
    };
952
}
953
954
// Debug implementations for each instruction.
955
macro_rules! op_debug_fmt {
956
    ($Op:ident[$ra:ident : RegId]) => {
957
0
        fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
958
0
            let ra = self.unpack();
959
0
            f.debug_struct(stringify!($Op))
960
0
                .field(stringify!($ra), &format_args!("{:#02x}", u8::from(ra)))
961
0
                .finish()
962
0
        }
Unexecuted instantiation: _RNvXsea_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3RETNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXset_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ALOCNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsfj_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BHEINtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsgk_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2CBNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXshd_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4RVRTNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsjQ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4FLAGNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXska_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3JMPNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsq1_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3CFENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsqa_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3CFSNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
963
    };
964
    ($Op:ident[$ra:ident : RegId $rb:ident : RegId]) => {
965
0
        fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
966
0
            let (ra, rb) = self.unpack();
967
0
            f.debug_struct(stringify!($Op))
968
0
                .field(stringify!($ra), &format_args!("{:#02x}", u8::from(ra)))
969
0
                .field(stringify!($rb), &format_args!("{:#02x}", u8::from(rb)))
970
0
                .finish()
971
0
        }
Unexecuted instantiation: _RNvXscA_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MOVENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXscV_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3NOTNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsej_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4RETDNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXseC_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MCLNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsf9_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BHSHNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsfs_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BURNNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsg0_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CROONtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsga_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CSIZNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsh3_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MINTNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsjy_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4TIMENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXstN_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BSIZNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
972
    };
973
    ($Op:ident[$ra:ident : RegId $rb:ident : RegId $rc:ident : RegId]) => {
974
0
        fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
975
0
            let (ra, rb, rc) = self.unpack();
976
0
            f.debug_struct(stringify!($Op))
977
0
                .field(stringify!($ra), &format_args!("{:#02x}", u8::from(ra)))
978
0
                .field(stringify!($rb), &format_args!("{:#02x}", u8::from(rb)))
979
0
                .field(stringify!($rc), &format_args!("{:#02x}", u8::from(rc)))
980
0
                .finish()
981
0
        }
Unexecuted instantiation: _RNvXsaO_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3ADDNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsaZ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3ANDNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsba_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3DIVNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsbl_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2EQNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsbw_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3EXPNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsbH_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2GTNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsbS_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2LTNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsc3_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MLOGNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsce_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MROONtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXscp_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MODNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXscK_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MULNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsd5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2ORNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsdg_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SLLNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsdr_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SRLNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsdC_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SUBNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsdN_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3XORNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXseM_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MCPNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXshm_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SCWQNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXshx_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SRWNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXshU_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SWWNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsih_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2TRNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsiE_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ECK1NtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsiP_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ECR1NtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsjc_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4K256NtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsjn_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4S256NtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsjZ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3BALNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXskj_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3JNENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
982
    };
983
    (
984
        $Op:ident[$ra:ident : RegId $rb:ident : RegId $rc:ident : RegId $rd:ident : RegId]
985
    ) => {
986
0
        fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
987
0
            let (ra, rb, rc, rd) = self.unpack();
988
0
            f.debug_struct(stringify!($Op))
989
0
                .field(stringify!($ra), &format_args!("{:#02x}", u8::from(ra)))
990
0
                .field(stringify!($rb), &format_args!("{:#02x}", u8::from(rb)))
991
0
                .field(stringify!($rc), &format_args!("{:#02x}", u8::from(rc)))
992
0
                .field(stringify!($rd), &format_args!("{:#02x}", u8::from(rd)))
993
0
                .finish()
994
0
        }
Unexecuted instantiation: _RNvXsdY_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MLDVNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXseX_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3MEQNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsfC_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CALLNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsfO_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3CCPNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsgF_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3LOGNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsgR_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4LOGDNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXshI_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SRWQNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsi5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SWWQNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsis_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3TRONtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsj0_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ED19NtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsku_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3SMONtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXssr_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDMDNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXssD_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQMDNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXssP_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDAMNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXst1_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQAMNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXstd_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDMMNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXstp_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQMMNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXstB_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ECALNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXstX_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4BLDDNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
995
    };
996
    (
997
        $Op:ident[$ra:ident : RegId $rb:ident : RegId $rc:ident : RegId $imm:ident : Imm06]
998
    ) => {
999
0
        fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
1000
0
            let (ra, rb, rc, imm) = self.unpack();
1001
0
            f.debug_struct(stringify!($Op))
1002
0
                .field(stringify!($ra), &format_args!("{:#02x}", u8::from(ra)))
1003
0
                .field(stringify!($rb), &format_args!("{:#02x}", u8::from(rb)))
1004
0
                .field(stringify!($rc), &format_args!("{:#02x}", u8::from(rc)))
1005
0
                .field(stringify!($imm), &u8::from(imm))
1006
0
                .finish()
1007
0
        }
Unexecuted instantiation: _RNvXsgt_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3LDCNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXspc_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNEFNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXspo_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNEBNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsqT_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDCMNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsr5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQCMNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsrh_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDOPNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsrt_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQOPNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsrF_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDMLNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsrR_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQMLNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXss3_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WDDVNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXssf_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4WQDVNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
1008
    };
1009
    ($Op:ident[$ra:ident : RegId $rb:ident : RegId $imm:ident : Imm12]) => {
1010
0
        fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
1011
0
            let (ra, rb, imm) = self.unpack();
1012
0
            f.debug_struct(stringify!($Op))
1013
0
                .field(stringify!($ra), &format_args!("{:#02x}", u8::from(ra)))
1014
0
                .field(stringify!($rb), &format_args!("{:#02x}", u8::from(rb)))
1015
0
                .field(stringify!($imm), &u16::from(imm))
1016
0
                .finish()
1017
0
        }
Unexecuted instantiation: _RNvXskG_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ADDINtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXskR_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4ANDINtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsl2_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4DIVINtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsld_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4EXPINtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXslo_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MODINtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXslz_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MULINtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXslK_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3ORINtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXslV_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SLLINtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsm6_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SRLINtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsmh_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4SUBINtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsms_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4XORINtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsmD_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNEINtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsmO_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2LBNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsmZ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2LWNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsna_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2SBNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsnl_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2SWNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsnw_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MCPINtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsnH_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_3GTFNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsoQ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNZFNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsp1_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNZBNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
1018
    };
1019
    ($Op:ident[$ra:ident : RegId $imm:ident : Imm18]) => {
1020
0
        fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
1021
0
            let (ra, imm) = self.unpack();
1022
0
            f.debug_struct(stringify!($Op))
1023
0
                .field(stringify!($ra), &format_args!("{:#02x}", u8::from(ra)))
1024
0
                .field(stringify!($imm), &u32::from(imm))
1025
0
                .finish()
1026
0
        }
Unexecuted instantiation: _RNvXsnS_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MCLINtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXso2_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2GMNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsoc_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4MOVINtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsom_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JNZINtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsow_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JMPFNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsoG_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4JMPBNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
1027
    };
1028
    ($Op:ident[$imm:ident : Imm24]) => {
1029
0
        fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
1030
0
            let imm = self.unpack();
1031
0
            f.debug_struct(stringify!($Op))
1032
0
                .field(stringify!($imm), &u32::from(imm))
1033
0
                .finish()
1034
0
        }
Unexecuted instantiation: _RNvXspA_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_2JINtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXspJ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CFEINtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXspS_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4CFSINtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsqj_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4PSHLNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsqs_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4PSHHNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsqB_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4POPLNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsqK_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB6_4POPHNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
1035
    };
1036
    ($Op:ident[]) => {
1037
0
        fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
1038
0
            f.debug_struct(stringify!($Op)).finish()
1039
0
        }
1040
    };
1041
}
1042
1043
// Recursively declares a unique struct for each opcode.
1044
macro_rules! decl_op_struct {
1045
    ($doc:literal $ix:literal $Op:ident $op:ident [$($fname:ident: $field:ident)*] $($rest:tt)*) => {
1046
        #[doc = $doc]
1047
        #[derive(Clone, Copy, Eq, Hash, PartialEq)]
1048
0
        #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops_1__NtB7_3ADDNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBR_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1_1__NtB7_3ANDNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBS_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3_1__NtB7_3DIVNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBS_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops5_1__NtB7_2EQNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBR_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops7_1__NtB7_3EXPNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBS_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops9_1__NtB7_2GTNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBR_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsb_1__NtB7_2LTNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBR_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsd_1__NtB7_4MLOGNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBT_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsf_1__NtB7_4MROONtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBT_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsh_1__NtB7_3MODNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBS_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsj_1__NtB7_4MOVENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBT_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsl_1__NtB7_3MULNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBS_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsn_1__NtB7_3NOTNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBS_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsp_1__NtB7_2ORNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBR_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsr_1__NtB7_3SLLNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBS_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opst_1__NtB7_3SRLNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBS_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsv_1__NtB7_3SUBNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBS_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsx_1__NtB7_3XORNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBS_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsz_1__NtB7_4MLDVNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBT_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsB_1__NtB7_3RETNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBS_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsD_1__NtB7_4RETDNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBT_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsF_1__NtB7_4ALOCNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBT_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsH_1__NtB7_3MCLNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBS_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsJ_1__NtB7_3MCPNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBS_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsL_1__NtB7_3MEQNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBS_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsN_1__NtB7_4BHSHNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBT_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsP_1__NtB7_4BHEINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBT_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsR_1__NtB7_4BURNNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBT_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsT_1__NtB7_4CALLNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBT_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsV_1__NtB7_3CCPNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBS_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsX_1__NtB7_4CROONtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBT_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsZ_1__NtB7_4CSIZNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBT_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops11_1__NtB7_2CBNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBS_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops13_1__NtB7_3LDCNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBT_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops15_1__NtB7_3LOGNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBT_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops17_1__NtB7_4LOGDNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops19_1__NtB7_4MINTNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1b_1__NtB7_4RVRTNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1d_1__NtB7_4SCWQNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1f_1__NtB7_3SRWNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBT_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1h_1__NtB7_4SRWQNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1j_1__NtB7_3SWWNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBT_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1l_1__NtB7_4SWWQNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1n_1__NtB7_2TRNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBS_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1p_1__NtB7_3TRONtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBT_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1r_1__NtB7_4ECK1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1t_1__NtB7_4ECR1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1v_1__NtB7_4ED19NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1x_1__NtB7_4K256NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1z_1__NtB7_4S256NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1B_1__NtB7_4TIMENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1D_1__NtB7_4NOOPNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1F_1__NtB7_4FLAGNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1H_1__NtB7_3BALNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBT_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1J_1__NtB7_3JMPNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBT_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1L_1__NtB7_3JNENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBT_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1N_1__NtB7_3SMONtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBT_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1P_1__NtB7_4ADDINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1R_1__NtB7_4ANDINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1T_1__NtB7_4DIVINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1V_1__NtB7_4EXPINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1X_1__NtB7_4MODINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1Z_1__NtB7_4MULINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops21_1__NtB7_3ORINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBT_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops23_1__NtB7_4SLLINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops25_1__NtB7_4SRLINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops27_1__NtB7_4SUBINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops29_1__NtB7_4XORINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2b_1__NtB7_4JNEINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2d_1__NtB7_2LBNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBS_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2f_1__NtB7_2LWNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBS_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2h_1__NtB7_2SBNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBS_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2j_1__NtB7_2SWNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBS_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2l_1__NtB7_4MCPINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2n_1__NtB7_3GTFNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBT_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2p_1__NtB7_4MCLINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2r_1__NtB7_2GMNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBS_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2t_1__NtB7_4MOVINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2v_1__NtB7_4JNZINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2x_1__NtB7_4JMPFNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2z_1__NtB7_4JMPBNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2B_1__NtB7_4JNZFNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2D_1__NtB7_4JNZBNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2F_1__NtB7_4JNEFNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2H_1__NtB7_4JNEBNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2J_1__NtB7_2JINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBS_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2L_1__NtB7_4CFEINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2N_1__NtB7_4CFSINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2P_1__NtB7_3CFENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBT_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2R_1__NtB7_3CFSNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBT_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2T_1__NtB7_4PSHLNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2V_1__NtB7_4PSHHNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2X_1__NtB7_4POPLNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2Z_1__NtB7_4POPHNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops31_1__NtB7_4WDCMNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops33_1__NtB7_4WQCMNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops35_1__NtB7_4WDOPNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops37_1__NtB7_4WQOPNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops39_1__NtB7_4WDMLNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3b_1__NtB7_4WQMLNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3d_1__NtB7_4WDDVNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3f_1__NtB7_4WQDVNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3h_1__NtB7_4WDMDNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3j_1__NtB7_4WQMDNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3l_1__NtB7_4WDAMNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3n_1__NtB7_4WQAMNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3p_1__NtB7_4WDMMNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3r_1__NtB7_4WQMMNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3t_1__NtB7_4ECALNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3v_1__NtB7_4BSIZNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3x_1__NtB7_4BLDDNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops_1__NtB8_3ADDNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBS_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops_1__NtB8_3ADDNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBS_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1_1__NtB8_3ANDNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1_1__NtB8_3ANDNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3_1__NtB8_3DIVNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3_1__NtB8_3DIVNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops5_1__NtB8_2EQNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBS_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops5_1__NtB8_2EQNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBS_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops7_1__NtB8_3EXPNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops7_1__NtB8_3EXPNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops9_1__NtB8_2GTNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBS_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops9_1__NtB8_2GTNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBS_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsb_1__NtB8_2LTNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBS_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsb_1__NtB8_2LTNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBS_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsd_1__NtB8_4MLOGNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsd_1__NtB8_4MLOGNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsf_1__NtB8_4MROONtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsf_1__NtB8_4MROONtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsh_1__NtB8_3MODNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsh_1__NtB8_3MODNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsj_1__NtB8_4MOVENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsj_1__NtB8_4MOVENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsl_1__NtB8_3MULNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsl_1__NtB8_3MULNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsn_1__NtB8_3NOTNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsn_1__NtB8_3NOTNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsp_1__NtB8_2ORNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBS_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsp_1__NtB8_2ORNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBS_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsr_1__NtB8_3SLLNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsr_1__NtB8_3SLLNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opst_1__NtB8_3SRLNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opst_1__NtB8_3SRLNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsv_1__NtB8_3SUBNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsv_1__NtB8_3SUBNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsx_1__NtB8_3XORNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsx_1__NtB8_3XORNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsz_1__NtB8_4MLDVNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsz_1__NtB8_4MLDVNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsB_1__NtB8_3RETNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsB_1__NtB8_3RETNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsD_1__NtB8_4RETDNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsD_1__NtB8_4RETDNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsF_1__NtB8_4ALOCNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsF_1__NtB8_4ALOCNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsH_1__NtB8_3MCLNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsH_1__NtB8_3MCLNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsJ_1__NtB8_3MCPNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsJ_1__NtB8_3MCPNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsL_1__NtB8_3MEQNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsL_1__NtB8_3MEQNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsN_1__NtB8_4BHSHNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsN_1__NtB8_4BHSHNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsP_1__NtB8_4BHEINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsP_1__NtB8_4BHEINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsR_1__NtB8_4BURNNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsR_1__NtB8_4BURNNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsT_1__NtB8_4CALLNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsT_1__NtB8_4CALLNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsV_1__NtB8_3CCPNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsV_1__NtB8_3CCPNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsX_1__NtB8_4CROONtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsX_1__NtB8_4CROONtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsZ_1__NtB8_4CSIZNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__opsZ_1__NtB8_4CSIZNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops11_1__NtB8_2CBNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops11_1__NtB8_2CBNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops13_1__NtB8_3LDCNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops13_1__NtB8_3LDCNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops15_1__NtB8_3LOGNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops15_1__NtB8_3LOGNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops17_1__NtB8_4LOGDNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops17_1__NtB8_4LOGDNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops19_1__NtB8_4MINTNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops19_1__NtB8_4MINTNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1b_1__NtB8_4RVRTNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1b_1__NtB8_4RVRTNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1d_1__NtB8_4SCWQNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1d_1__NtB8_4SCWQNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1f_1__NtB8_3SRWNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1f_1__NtB8_3SRWNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1h_1__NtB8_4SRWQNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1h_1__NtB8_4SRWQNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1j_1__NtB8_3SWWNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1j_1__NtB8_3SWWNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1l_1__NtB8_4SWWQNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1l_1__NtB8_4SWWQNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1n_1__NtB8_2TRNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1n_1__NtB8_2TRNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1p_1__NtB8_3TRONtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1p_1__NtB8_3TRONtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1r_1__NtB8_4ECK1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1r_1__NtB8_4ECK1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1t_1__NtB8_4ECR1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1t_1__NtB8_4ECR1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1v_1__NtB8_4ED19NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1v_1__NtB8_4ED19NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1x_1__NtB8_4K256NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1x_1__NtB8_4K256NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1z_1__NtB8_4S256NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1z_1__NtB8_4S256NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1B_1__NtB8_4TIMENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1B_1__NtB8_4TIMENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1D_1__NtB8_4NOOPNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1D_1__NtB8_4NOOPNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1F_1__NtB8_4FLAGNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1F_1__NtB8_4FLAGNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1H_1__NtB8_3BALNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1H_1__NtB8_3BALNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1J_1__NtB8_3JMPNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1J_1__NtB8_3JMPNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1L_1__NtB8_3JNENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1L_1__NtB8_3JNENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1N_1__NtB8_3SMONtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1N_1__NtB8_3SMONtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1P_1__NtB8_4ADDINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1P_1__NtB8_4ADDINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1R_1__NtB8_4ANDINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1R_1__NtB8_4ANDINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1T_1__NtB8_4DIVINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1T_1__NtB8_4DIVINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1V_1__NtB8_4EXPINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1V_1__NtB8_4EXPINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1X_1__NtB8_4MODINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1X_1__NtB8_4MODINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1Z_1__NtB8_4MULINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops1Z_1__NtB8_4MULINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops21_1__NtB8_3ORINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops21_1__NtB8_3ORINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops23_1__NtB8_4SLLINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops23_1__NtB8_4SLLINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops25_1__NtB8_4SRLINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops25_1__NtB8_4SRLINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops27_1__NtB8_4SUBINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops27_1__NtB8_4SUBINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops29_1__NtB8_4XORINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops29_1__NtB8_4XORINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2b_1__NtB8_4JNEINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2b_1__NtB8_4JNEINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2d_1__NtB8_2LBNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2d_1__NtB8_2LBNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2f_1__NtB8_2LWNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2f_1__NtB8_2LWNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2h_1__NtB8_2SBNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2h_1__NtB8_2SBNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2j_1__NtB8_2SWNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2j_1__NtB8_2SWNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2l_1__NtB8_4MCPINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2l_1__NtB8_4MCPINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2n_1__NtB8_3GTFNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2n_1__NtB8_3GTFNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2p_1__NtB8_4MCLINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2p_1__NtB8_4MCLINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2r_1__NtB8_2GMNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2r_1__NtB8_2GMNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2t_1__NtB8_4MOVINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2t_1__NtB8_4MOVINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2v_1__NtB8_4JNZINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2v_1__NtB8_4JNZINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2x_1__NtB8_4JMPFNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2x_1__NtB8_4JMPFNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2z_1__NtB8_4JMPBNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2z_1__NtB8_4JMPBNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2B_1__NtB8_4JNZFNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2B_1__NtB8_4JNZFNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2D_1__NtB8_4JNZBNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2D_1__NtB8_4JNZBNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2F_1__NtB8_4JNEFNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2F_1__NtB8_4JNEFNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2H_1__NtB8_4JNEBNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2H_1__NtB8_4JNEBNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2J_1__NtB8_2JINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2J_1__NtB8_2JINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBT_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2L_1__NtB8_4CFEINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2L_1__NtB8_4CFEINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2N_1__NtB8_4CFSINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2N_1__NtB8_4CFSINtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2P_1__NtB8_3CFENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2P_1__NtB8_3CFENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2R_1__NtB8_3CFSNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2R_1__NtB8_3CFSNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBU_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2T_1__NtB8_4PSHLNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2T_1__NtB8_4PSHLNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2V_1__NtB8_4PSHHNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2V_1__NtB8_4PSHHNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2X_1__NtB8_4POPLNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2X_1__NtB8_4POPLNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2Z_1__NtB8_4POPHNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops2Z_1__NtB8_4POPHNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops31_1__NtB8_4WDCMNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops31_1__NtB8_4WDCMNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops33_1__NtB8_4WQCMNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops33_1__NtB8_4WQCMNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops35_1__NtB8_4WDOPNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops35_1__NtB8_4WDOPNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops37_1__NtB8_4WQOPNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops37_1__NtB8_4WQOPNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops39_1__NtB8_4WDMLNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops39_1__NtB8_4WDMLNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3b_1__NtB8_4WQMLNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3b_1__NtB8_4WQMLNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3d_1__NtB8_4WDDVNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3d_1__NtB8_4WDDVNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3f_1__NtB8_4WQDVNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3f_1__NtB8_4WQDVNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3h_1__NtB8_4WDMDNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3h_1__NtB8_4WDMDNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3j_1__NtB8_4WQMDNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3j_1__NtB8_4WQMDNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3l_1__NtB8_4WDAMNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3l_1__NtB8_4WDAMNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3n_1__NtB8_4WQAMNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3n_1__NtB8_4WQAMNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3p_1__NtB8_4WDMMNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3p_1__NtB8_4WDMMNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3r_1__NtB8_4WQMMNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3r_1__NtB8_4WQMMNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3t_1__NtB8_4ECALNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3t_1__NtB8_4ECALNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3v_1__NtB8_4BSIZNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3v_1__NtB8_4BSIZNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3x_1__NtB8_4BLDDNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCs6P3fQNJKMy0_8fuel_asm3__ops3x_1__NtB8_4BLDDNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtBV_7Visitor9visit_seqpEBa_
1049
        #[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
1050
        pub struct $Op(pub (super) [u8; 3]);
1051
        decl_op_struct!($($rest)*);
1052
    };
1053
    () => {};
1054
}
1055
1056
/// This macro is intentionaly private. See the module-level documentation for a thorough
1057
/// explanation of how this macro works.
1058
macro_rules! impl_instructions {
1059
    // Define the `Opcode` enum.
1060
    (decl_opcode_enum $($doc:literal $ix:literal $Op:ident $op:ident [$($fname:ident: $field:ident)*])*) => {
1061
        /// Solely the opcode portion of an instruction represented as a single byte.
1062
        #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
1063
0
        #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
Unexecuted instantiation: _RNvXNvXNvCs6P3fQNJKMy0_8fuel_asms0_1__NtB7_6OpcodeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtBO_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvCs6P3fQNJKMy0_8fuel_asms0_1__NtBa_6OpcodeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtBR_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvCs6P3fQNJKMy0_8fuel_asms0_1__NtB8_6OpcodeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtBP_7Visitor9visit_u64pEB8_
Unexecuted instantiation: _RINvXNvXNvCs6P3fQNJKMy0_8fuel_asms0_1__NtB8_6OpcodeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtBP_7Visitor9visit_strpEB8_
Unexecuted instantiation: _RINvXNvXNvCs6P3fQNJKMy0_8fuel_asms0_1__NtB8_6OpcodeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtBP_7Visitor11visit_bytespEB8_
Unexecuted instantiation: _RINvXs_NvXNvCs6P3fQNJKMy0_8fuel_asms0_1__NtBa_6OpcodeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldBP_11deserializepEBa_
Unexecuted instantiation: _RINvXs0_NvXNvCs6P3fQNJKMy0_8fuel_asms0_1__NtBb_6OpcodeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtBS_7Visitor10visit_enumpEBb_
1064
        #[repr(u8)]
1065
        pub enum Opcode {
1066
            $(
1067
                #[doc = $doc]
1068
                $Op = $ix,
1069
            )*
1070
        }
1071
    };
1072
1073
    // Define the `Instruction` enum.
1074
    (decl_instruction_enum $($doc:literal $ix:literal $Op:ident $op:ident [$($fname:ident: $field:ident)*])*) => {
1075
        /// Representation of a single instruction for the interpreter.
1076
        ///
1077
        /// The opcode is represented in the tag (variant), or may be retrieved in the form of an
1078
        /// `Opcode` byte using the `opcode` method.
1079
        ///
1080
        /// The register and immediate data associated with the instruction is represented within
1081
        /// an inner unit type wrapper around the 3 remaining bytes.
1082
        #[derive(Clone, Copy, Eq, Hash, PartialEq)]
1083
0
        #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
Unexecuted instantiation: _RNvXNvXNvCs6P3fQNJKMy0_8fuel_asms2_1__NtB7_11InstructionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtBU_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvCs6P3fQNJKMy0_8fuel_asms2_1__NtBa_11InstructionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtBX_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvCs6P3fQNJKMy0_8fuel_asms2_1__NtB8_11InstructionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtBV_7Visitor9visit_u64pEB8_
Unexecuted instantiation: _RINvXNvXNvCs6P3fQNJKMy0_8fuel_asms2_1__NtB8_11InstructionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtBV_7Visitor9visit_strpEB8_
Unexecuted instantiation: _RINvXNvXNvCs6P3fQNJKMy0_8fuel_asms2_1__NtB8_11InstructionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtBV_7Visitor11visit_bytespEB8_
Unexecuted instantiation: _RINvXs_NvXNvCs6P3fQNJKMy0_8fuel_asms2_1__NtBa_11InstructionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldBV_11deserializepEBa_
Unexecuted instantiation: _RINvXs0_NvXNvCs6P3fQNJKMy0_8fuel_asms2_1__NtBb_11InstructionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtBY_7Visitor10visit_enumpEBb_
1084
        pub enum Instruction {
1085
            $(
1086
                #[doc = $doc]
1087
                $Op(op::$Op),
1088
            )*
1089
        }
1090
    };
1091
1092
    // Recursively generate a test constructor for each opcode
1093
    (impl_opcode_test_construct $doc:literal $ix:literal $Op:ident $op:ident [$($fname:ident: $field:ident)*] $($rest:tt)*) => {
1094
        #[cfg(test)]
1095
        #[allow(clippy::cast_possible_truncation)]
1096
        impl crate::_op::$Op {
1097
            op_test_construct_fn!($($field)*);
1098
        }
1099
        impl_instructions!(impl_opcode_test_construct $($rest)*);
1100
    };
1101
    (impl_opcode_test_construct) => {};
1102
1103
    // Recursively generate a test constructor for each opcode
1104
    (tests $doc:literal $ix:literal $Op:ident $op:ident [$($fname:ident: $field:ident)*] $($rest:tt)*) => {
1105
        op_test!($Op $op [$($field)*]);
1106
        impl_instructions!(tests $($rest)*);
1107
    };
1108
    (tests) => {};
1109
1110
    // Implement constructors and accessors for register and immediate values.
1111
    (impl_op $doc:literal $ix:literal $Op:ident $op:ident [$($fname:ident: $field:ident)*] $($rest:tt)*) => {
1112
        impl $Op {
1113
            /// The associated 8-bit Opcode value.
1114
            pub const OPCODE: Opcode = Opcode::$Op;
1115
        }
1116
1117
        op_new!($Op $($fname: $field)*);
1118
        op_accessors!($Op $($fname: $field)*);
1119
1120
        impl $Op {
1121
            op_unpack!($($field)*);
1122
            op_reserved_part!($($field)*);
1123
            op_reg_ids!($($field)*);
1124
        }
1125
1126
        op_constructor!($doc $Op $op [$($fname: $field)*]);
1127
1128
        impl From<$Op> for [u8; 3] {
1129
0
            fn from($Op(arr): $Op) -> Self {
1130
0
                arr
1131
0
            }
Unexecuted instantiation: _RNvXsaK_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3ADDE4fromB8_
Unexecuted instantiation: _RNvXsaV_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3ANDE4fromB8_
Unexecuted instantiation: _RNvXsb6_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3DIVE4fromB8_
Unexecuted instantiation: _RNvXsbh_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2EQE4fromB8_
Unexecuted instantiation: _RNvXsbs_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3EXPE4fromB8_
Unexecuted instantiation: _RNvXsbD_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2GTE4fromB8_
Unexecuted instantiation: _RNvXsbO_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2LTE4fromB8_
Unexecuted instantiation: _RNvXsbZ_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MLOGE4fromB8_
Unexecuted instantiation: _RNvXsca_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MROOE4fromB8_
Unexecuted instantiation: _RNvXscl_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3MODE4fromB8_
Unexecuted instantiation: _RNvXscw_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MOVEE4fromB8_
Unexecuted instantiation: _RNvXscG_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3MULE4fromB8_
Unexecuted instantiation: _RNvXscR_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3NOTE4fromB8_
Unexecuted instantiation: _RNvXsd1_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2ORE4fromB8_
Unexecuted instantiation: _RNvXsdc_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3SLLE4fromB8_
Unexecuted instantiation: _RNvXsdn_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3SRLE4fromB8_
Unexecuted instantiation: _RNvXsdy_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3SUBE4fromB8_
Unexecuted instantiation: _RNvXsdJ_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3XORE4fromB8_
Unexecuted instantiation: _RNvXsdU_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MLDVE4fromB8_
Unexecuted instantiation: _RNvXse6_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3RETE4fromB8_
Unexecuted instantiation: _RNvXsef_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4RETDE4fromB8_
Unexecuted instantiation: _RNvXsep_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ALOCE4fromB8_
Unexecuted instantiation: _RNvXsey_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3MCLE4fromB8_
Unexecuted instantiation: _RNvXseI_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3MCPE4fromB8_
Unexecuted instantiation: _RNvXseT_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3MEQE4fromB8_
Unexecuted instantiation: _RNvXsf5_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4BHSHE4fromB8_
Unexecuted instantiation: _RNvXsff_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4BHEIE4fromB8_
Unexecuted instantiation: _RNvXsfo_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4BURNE4fromB8_
Unexecuted instantiation: _RNvXsfy_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4CALLE4fromB8_
Unexecuted instantiation: _RNvXsfK_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3CCPE4fromB8_
Unexecuted instantiation: _RNvXsfW_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4CROOE4fromB8_
Unexecuted instantiation: _RNvXsg6_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4CSIZE4fromB8_
Unexecuted instantiation: _RNvXsgg_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2CBE4fromB8_
Unexecuted instantiation: _RNvXsgp_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3LDCE4fromB8_
Unexecuted instantiation: _RNvXsgB_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3LOGE4fromB8_
Unexecuted instantiation: _RNvXsgN_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4LOGDE4fromB8_
Unexecuted instantiation: _RNvXsgZ_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MINTE4fromB8_
Unexecuted instantiation: _RNvXsh9_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4RVRTE4fromB8_
Unexecuted instantiation: _RNvXshi_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4SCWQE4fromB8_
Unexecuted instantiation: _RNvXsht_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3SRWE4fromB8_
Unexecuted instantiation: _RNvXshE_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4SRWQE4fromB8_
Unexecuted instantiation: _RNvXshQ_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3SWWE4fromB8_
Unexecuted instantiation: _RNvXsi1_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4SWWQE4fromB8_
Unexecuted instantiation: _RNvXsid_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2TRE4fromB8_
Unexecuted instantiation: _RNvXsio_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3TROE4fromB8_
Unexecuted instantiation: _RNvXsiA_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ECK1E4fromB8_
Unexecuted instantiation: _RNvXsiL_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ECR1E4fromB8_
Unexecuted instantiation: _RNvXsiW_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ED19E4fromB8_
Unexecuted instantiation: _RNvXsj8_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4K256E4fromB8_
Unexecuted instantiation: _RNvXsjj_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4S256E4fromB8_
Unexecuted instantiation: _RNvXsju_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4TIMEE4fromB8_
Unexecuted instantiation: _RNvXsjE_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4NOOPE4fromB8_
Unexecuted instantiation: _RNvXsjM_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4FLAGE4fromB8_
Unexecuted instantiation: _RNvXsjV_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3BALE4fromB8_
Unexecuted instantiation: _RNvXsk6_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3JMPE4fromB8_
Unexecuted instantiation: _RNvXskf_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3JNEE4fromB8_
Unexecuted instantiation: _RNvXskq_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3SMOE4fromB8_
Unexecuted instantiation: _RNvXskC_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ADDIE4fromB8_
Unexecuted instantiation: _RNvXskN_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ANDIE4fromB8_
Unexecuted instantiation: _RNvXskY_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4DIVIE4fromB8_
Unexecuted instantiation: _RNvXsl9_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4EXPIE4fromB8_
Unexecuted instantiation: _RNvXslk_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MODIE4fromB8_
Unexecuted instantiation: _RNvXslv_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MULIE4fromB8_
Unexecuted instantiation: _RNvXslG_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3ORIE4fromB8_
Unexecuted instantiation: _RNvXslR_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4SLLIE4fromB8_
Unexecuted instantiation: _RNvXsm2_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4SRLIE4fromB8_
Unexecuted instantiation: _RNvXsmd_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4SUBIE4fromB8_
Unexecuted instantiation: _RNvXsmo_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4XORIE4fromB8_
Unexecuted instantiation: _RNvXsmz_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JNEIE4fromB8_
Unexecuted instantiation: _RNvXsmK_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2LBE4fromB8_
Unexecuted instantiation: _RNvXsmV_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2LWE4fromB8_
Unexecuted instantiation: _RNvXsn6_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2SBE4fromB8_
Unexecuted instantiation: _RNvXsnh_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2SWE4fromB8_
Unexecuted instantiation: _RNvXsns_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MCPIE4fromB8_
Unexecuted instantiation: _RNvXsnD_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3GTFE4fromB8_
Unexecuted instantiation: _RNvXsnO_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MCLIE4fromB8_
Unexecuted instantiation: _RNvXsnY_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2GME4fromB8_
Unexecuted instantiation: _RNvXso8_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MOVIE4fromB8_
Unexecuted instantiation: _RNvXsoi_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JNZIE4fromB8_
Unexecuted instantiation: _RNvXsos_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JMPFE4fromB8_
Unexecuted instantiation: _RNvXsoC_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JMPBE4fromB8_
Unexecuted instantiation: _RNvXsoM_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JNZFE4fromB8_
Unexecuted instantiation: _RNvXsoX_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JNZBE4fromB8_
Unexecuted instantiation: _RNvXsp8_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JNEFE4fromB8_
Unexecuted instantiation: _RNvXspk_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JNEBE4fromB8_
Unexecuted instantiation: _RNvXspw_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2JIE4fromB8_
Unexecuted instantiation: _RNvXspF_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4CFEIE4fromB8_
Unexecuted instantiation: _RNvXspO_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4CFSIE4fromB8_
Unexecuted instantiation: _RNvXspX_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3CFEE4fromB8_
Unexecuted instantiation: _RNvXsq6_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3CFSE4fromB8_
Unexecuted instantiation: _RNvXsqf_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4PSHLE4fromB8_
Unexecuted instantiation: _RNvXsqo_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4PSHHE4fromB8_
Unexecuted instantiation: _RNvXsqx_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4POPLE4fromB8_
Unexecuted instantiation: _RNvXsqG_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4POPHE4fromB8_
Unexecuted instantiation: _RNvXsqP_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDCME4fromB8_
Unexecuted instantiation: _RNvXsr1_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQCME4fromB8_
Unexecuted instantiation: _RNvXsrd_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDOPE4fromB8_
Unexecuted instantiation: _RNvXsrp_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQOPE4fromB8_
Unexecuted instantiation: _RNvXsrB_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDMLE4fromB8_
Unexecuted instantiation: _RNvXsrN_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQMLE4fromB8_
Unexecuted instantiation: _RNvXsrZ_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDDVE4fromB8_
Unexecuted instantiation: _RNvXssb_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQDVE4fromB8_
Unexecuted instantiation: _RNvXssn_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDMDE4fromB8_
Unexecuted instantiation: _RNvXssz_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQMDE4fromB8_
Unexecuted instantiation: _RNvXssL_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDAME4fromB8_
Unexecuted instantiation: _RNvXssX_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQAME4fromB8_
Unexecuted instantiation: _RNvXst9_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDMME4fromB8_
Unexecuted instantiation: _RNvXstl_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQMME4fromB8_
Unexecuted instantiation: _RNvXstx_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ECALE4fromB8_
Unexecuted instantiation: _RNvXstJ_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4BSIZE4fromB8_
Unexecuted instantiation: _RNvXstT_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj3_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4BLDDE4fromB8_
1132
        }
1133
1134
        impl From<$Op> for [u8; 4] {
1135
8.77k
            fn from($Op([a, b, c]): $Op) -> Self {
1136
8.77k
                [$Op::OPCODE as u8, a, b, c]
1137
8.77k
            }
Unexecuted instantiation: _RNvXsaL_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3ADDE4fromB8_
Unexecuted instantiation: _RNvXsaW_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3ANDE4fromB8_
Unexecuted instantiation: _RNvXsb7_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3DIVE4fromB8_
Unexecuted instantiation: _RNvXsbi_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2EQE4fromB8_
Unexecuted instantiation: _RNvXsbt_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3EXPE4fromB8_
Unexecuted instantiation: _RNvXsbE_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2GTE4fromB8_
Unexecuted instantiation: _RNvXsbP_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2LTE4fromB8_
Unexecuted instantiation: _RNvXsc0_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MLOGE4fromB8_
Unexecuted instantiation: _RNvXscb_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MROOE4fromB8_
Unexecuted instantiation: _RNvXscm_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3MODE4fromB8_
Unexecuted instantiation: _RNvXscx_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MOVEE4fromB8_
Unexecuted instantiation: _RNvXscH_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3MULE4fromB8_
Unexecuted instantiation: _RNvXscS_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3NOTE4fromB8_
Unexecuted instantiation: _RNvXsd2_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2ORE4fromB8_
Unexecuted instantiation: _RNvXsdd_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3SLLE4fromB8_
Unexecuted instantiation: _RNvXsdo_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3SRLE4fromB8_
Unexecuted instantiation: _RNvXsdz_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3SUBE4fromB8_
Unexecuted instantiation: _RNvXsdK_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3XORE4fromB8_
Unexecuted instantiation: _RNvXsdV_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MLDVE4fromB8_
_RNvXse7_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3RETE4fromB8_
Line
Count
Source
1135
4.38k
            fn from($Op([a, b, c]): $Op) -> Self {
1136
4.38k
                [$Op::OPCODE as u8, a, b, c]
1137
4.38k
            }
Unexecuted instantiation: _RNvXseg_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4RETDE4fromB8_
Unexecuted instantiation: _RNvXseq_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ALOCE4fromB8_
Unexecuted instantiation: _RNvXsez_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3MCLE4fromB8_
Unexecuted instantiation: _RNvXseJ_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3MCPE4fromB8_
Unexecuted instantiation: _RNvXseU_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3MEQE4fromB8_
Unexecuted instantiation: _RNvXsf6_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4BHSHE4fromB8_
Unexecuted instantiation: _RNvXsfg_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4BHEIE4fromB8_
Unexecuted instantiation: _RNvXsfp_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4BURNE4fromB8_
Unexecuted instantiation: _RNvXsfz_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4CALLE4fromB8_
Unexecuted instantiation: _RNvXsfL_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3CCPE4fromB8_
Unexecuted instantiation: _RNvXsfX_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4CROOE4fromB8_
Unexecuted instantiation: _RNvXsg7_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4CSIZE4fromB8_
Unexecuted instantiation: _RNvXsgh_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2CBE4fromB8_
Unexecuted instantiation: _RNvXsgq_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3LDCE4fromB8_
Unexecuted instantiation: _RNvXsgC_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3LOGE4fromB8_
Unexecuted instantiation: _RNvXsgO_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4LOGDE4fromB8_
Unexecuted instantiation: _RNvXsh0_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MINTE4fromB8_
Unexecuted instantiation: _RNvXsha_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4RVRTE4fromB8_
Unexecuted instantiation: _RNvXshj_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4SCWQE4fromB8_
Unexecuted instantiation: _RNvXshu_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3SRWE4fromB8_
Unexecuted instantiation: _RNvXshF_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4SRWQE4fromB8_
Unexecuted instantiation: _RNvXshR_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3SWWE4fromB8_
Unexecuted instantiation: _RNvXsi2_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4SWWQE4fromB8_
Unexecuted instantiation: _RNvXsie_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2TRE4fromB8_
Unexecuted instantiation: _RNvXsip_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3TROE4fromB8_
Unexecuted instantiation: _RNvXsiB_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ECK1E4fromB8_
Unexecuted instantiation: _RNvXsiM_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ECR1E4fromB8_
Unexecuted instantiation: _RNvXsiX_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ED19E4fromB8_
Unexecuted instantiation: _RNvXsj9_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4K256E4fromB8_
Unexecuted instantiation: _RNvXsjk_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4S256E4fromB8_
Unexecuted instantiation: _RNvXsjv_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4TIMEE4fromB8_
Unexecuted instantiation: _RNvXsjF_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4NOOPE4fromB8_
Unexecuted instantiation: _RNvXsjN_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4FLAGE4fromB8_
Unexecuted instantiation: _RNvXsjW_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3BALE4fromB8_
Unexecuted instantiation: _RNvXsk7_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3JMPE4fromB8_
Unexecuted instantiation: _RNvXskg_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3JNEE4fromB8_
Unexecuted instantiation: _RNvXskr_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3SMOE4fromB8_
_RNvXskD_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ADDIE4fromB8_
Line
Count
Source
1135
2.19k
            fn from($Op([a, b, c]): $Op) -> Self {
1136
2.19k
                [$Op::OPCODE as u8, a, b, c]
1137
2.19k
            }
Unexecuted instantiation: _RNvXskO_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ANDIE4fromB8_
Unexecuted instantiation: _RNvXskZ_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4DIVIE4fromB8_
Unexecuted instantiation: _RNvXsla_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4EXPIE4fromB8_
Unexecuted instantiation: _RNvXsll_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MODIE4fromB8_
Unexecuted instantiation: _RNvXslw_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MULIE4fromB8_
Unexecuted instantiation: _RNvXslH_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3ORIE4fromB8_
Unexecuted instantiation: _RNvXslS_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4SLLIE4fromB8_
Unexecuted instantiation: _RNvXsm3_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4SRLIE4fromB8_
Unexecuted instantiation: _RNvXsme_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4SUBIE4fromB8_
Unexecuted instantiation: _RNvXsmp_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4XORIE4fromB8_
Unexecuted instantiation: _RNvXsmA_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JNEIE4fromB8_
Unexecuted instantiation: _RNvXsmL_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2LBE4fromB8_
_RNvXsmW_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2LWE4fromB8_
Line
Count
Source
1135
2.19k
            fn from($Op([a, b, c]): $Op) -> Self {
1136
2.19k
                [$Op::OPCODE as u8, a, b, c]
1137
2.19k
            }
Unexecuted instantiation: _RNvXsn7_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2SBE4fromB8_
Unexecuted instantiation: _RNvXsni_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2SWE4fromB8_
Unexecuted instantiation: _RNvXsnt_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MCPIE4fromB8_
Unexecuted instantiation: _RNvXsnE_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3GTFE4fromB8_
Unexecuted instantiation: _RNvXsnP_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MCLIE4fromB8_
Unexecuted instantiation: _RNvXsnZ_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2GME4fromB8_
Unexecuted instantiation: _RNvXso9_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MOVIE4fromB8_
Unexecuted instantiation: _RNvXsoj_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JNZIE4fromB8_
Unexecuted instantiation: _RNvXsot_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JMPFE4fromB8_
Unexecuted instantiation: _RNvXsoD_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JMPBE4fromB8_
Unexecuted instantiation: _RNvXsoN_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JNZFE4fromB8_
Unexecuted instantiation: _RNvXsoY_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JNZBE4fromB8_
Unexecuted instantiation: _RNvXsp9_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JNEFE4fromB8_
Unexecuted instantiation: _RNvXspl_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JNEBE4fromB8_
Unexecuted instantiation: _RNvXspx_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2JIE4fromB8_
Unexecuted instantiation: _RNvXspG_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4CFEIE4fromB8_
Unexecuted instantiation: _RNvXspP_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4CFSIE4fromB8_
Unexecuted instantiation: _RNvXspY_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3CFEE4fromB8_
Unexecuted instantiation: _RNvXsq7_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3CFSE4fromB8_
Unexecuted instantiation: _RNvXsqg_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4PSHLE4fromB8_
Unexecuted instantiation: _RNvXsqp_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4PSHHE4fromB8_
Unexecuted instantiation: _RNvXsqy_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4POPLE4fromB8_
Unexecuted instantiation: _RNvXsqH_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4POPHE4fromB8_
Unexecuted instantiation: _RNvXsqQ_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDCME4fromB8_
Unexecuted instantiation: _RNvXsr2_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQCME4fromB8_
Unexecuted instantiation: _RNvXsre_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDOPE4fromB8_
Unexecuted instantiation: _RNvXsrq_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQOPE4fromB8_
Unexecuted instantiation: _RNvXsrC_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDMLE4fromB8_
Unexecuted instantiation: _RNvXsrO_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQMLE4fromB8_
Unexecuted instantiation: _RNvXss0_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDDVE4fromB8_
Unexecuted instantiation: _RNvXssc_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQDVE4fromB8_
Unexecuted instantiation: _RNvXsso_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDMDE4fromB8_
Unexecuted instantiation: _RNvXssA_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQMDE4fromB8_
Unexecuted instantiation: _RNvXssM_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDAME4fromB8_
Unexecuted instantiation: _RNvXssY_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQAME4fromB8_
Unexecuted instantiation: _RNvXsta_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDMME4fromB8_
Unexecuted instantiation: _RNvXstm_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQMME4fromB8_
Unexecuted instantiation: _RNvXsty_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ECALE4fromB8_
Unexecuted instantiation: _RNvXstK_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4BSIZE4fromB8_
Unexecuted instantiation: _RNvXstU_NtCs6P3fQNJKMy0_8fuel_asm3__opAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4BLDDE4fromB8_
1138
        }
1139
1140
        impl From<$Op> for u32 {
1141
0
            fn from(op: $Op) -> Self {
1142
0
                u32::from_be_bytes(op.into())
1143
0
            }
Unexecuted instantiation: _RNvXsaM_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3ADDE4from
Unexecuted instantiation: _RNvXsaX_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3ANDE4from
Unexecuted instantiation: _RNvXsb8_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3DIVE4from
Unexecuted instantiation: _RNvXsbj_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2EQE4from
Unexecuted instantiation: _RNvXsbu_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3EXPE4from
Unexecuted instantiation: _RNvXsbF_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2GTE4from
Unexecuted instantiation: _RNvXsbQ_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2LTE4from
Unexecuted instantiation: _RNvXsc1_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MLOGE4from
Unexecuted instantiation: _RNvXscc_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MROOE4from
Unexecuted instantiation: _RNvXscn_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3MODE4from
Unexecuted instantiation: _RNvXscy_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MOVEE4from
Unexecuted instantiation: _RNvXscI_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3MULE4from
Unexecuted instantiation: _RNvXscT_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3NOTE4from
Unexecuted instantiation: _RNvXsd3_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2ORE4from
Unexecuted instantiation: _RNvXsde_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3SLLE4from
Unexecuted instantiation: _RNvXsdp_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3SRLE4from
Unexecuted instantiation: _RNvXsdA_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3SUBE4from
Unexecuted instantiation: _RNvXsdL_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3XORE4from
Unexecuted instantiation: _RNvXsdW_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MLDVE4from
Unexecuted instantiation: _RNvXse8_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3RETE4from
Unexecuted instantiation: _RNvXseh_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4RETDE4from
Unexecuted instantiation: _RNvXser_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ALOCE4from
Unexecuted instantiation: _RNvXseA_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3MCLE4from
Unexecuted instantiation: _RNvXseK_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3MCPE4from
Unexecuted instantiation: _RNvXseV_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3MEQE4from
Unexecuted instantiation: _RNvXsf7_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4BHSHE4from
Unexecuted instantiation: _RNvXsfh_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4BHEIE4from
Unexecuted instantiation: _RNvXsfq_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4BURNE4from
Unexecuted instantiation: _RNvXsfA_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4CALLE4from
Unexecuted instantiation: _RNvXsfM_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3CCPE4from
Unexecuted instantiation: _RNvXsfY_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4CROOE4from
Unexecuted instantiation: _RNvXsg8_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4CSIZE4from
Unexecuted instantiation: _RNvXsgi_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2CBE4from
Unexecuted instantiation: _RNvXsgr_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3LDCE4from
Unexecuted instantiation: _RNvXsgD_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3LOGE4from
Unexecuted instantiation: _RNvXsgP_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4LOGDE4from
Unexecuted instantiation: _RNvXsh1_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MINTE4from
Unexecuted instantiation: _RNvXshb_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4RVRTE4from
Unexecuted instantiation: _RNvXshk_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4SCWQE4from
Unexecuted instantiation: _RNvXshv_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3SRWE4from
Unexecuted instantiation: _RNvXshG_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4SRWQE4from
Unexecuted instantiation: _RNvXshS_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3SWWE4from
Unexecuted instantiation: _RNvXsi3_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4SWWQE4from
Unexecuted instantiation: _RNvXsif_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2TRE4from
Unexecuted instantiation: _RNvXsiq_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3TROE4from
Unexecuted instantiation: _RNvXsiC_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ECK1E4from
Unexecuted instantiation: _RNvXsiN_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ECR1E4from
Unexecuted instantiation: _RNvXsiY_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ED19E4from
Unexecuted instantiation: _RNvXsja_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4K256E4from
Unexecuted instantiation: _RNvXsjl_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4S256E4from
Unexecuted instantiation: _RNvXsjw_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4TIMEE4from
Unexecuted instantiation: _RNvXsjG_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4NOOPE4from
Unexecuted instantiation: _RNvXsjO_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4FLAGE4from
Unexecuted instantiation: _RNvXsjX_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3BALE4from
Unexecuted instantiation: _RNvXsk8_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3JMPE4from
Unexecuted instantiation: _RNvXskh_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3JNEE4from
Unexecuted instantiation: _RNvXsks_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3SMOE4from
Unexecuted instantiation: _RNvXskE_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ADDIE4from
Unexecuted instantiation: _RNvXskP_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ANDIE4from
Unexecuted instantiation: _RNvXsl0_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4DIVIE4from
Unexecuted instantiation: _RNvXslb_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4EXPIE4from
Unexecuted instantiation: _RNvXslm_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MODIE4from
Unexecuted instantiation: _RNvXslx_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MULIE4from
Unexecuted instantiation: _RNvXslI_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3ORIE4from
Unexecuted instantiation: _RNvXslT_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4SLLIE4from
Unexecuted instantiation: _RNvXsm4_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4SRLIE4from
Unexecuted instantiation: _RNvXsmf_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4SUBIE4from
Unexecuted instantiation: _RNvXsmq_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4XORIE4from
Unexecuted instantiation: _RNvXsmB_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JNEIE4from
Unexecuted instantiation: _RNvXsmM_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2LBE4from
Unexecuted instantiation: _RNvXsmX_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2LWE4from
Unexecuted instantiation: _RNvXsn8_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2SBE4from
Unexecuted instantiation: _RNvXsnj_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2SWE4from
Unexecuted instantiation: _RNvXsnu_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MCPIE4from
Unexecuted instantiation: _RNvXsnF_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3GTFE4from
Unexecuted instantiation: _RNvXsnQ_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MCLIE4from
Unexecuted instantiation: _RNvXso0_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2GME4from
Unexecuted instantiation: _RNvXsoa_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MOVIE4from
Unexecuted instantiation: _RNvXsok_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JNZIE4from
Unexecuted instantiation: _RNvXsou_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JMPFE4from
Unexecuted instantiation: _RNvXsoE_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JMPBE4from
Unexecuted instantiation: _RNvXsoO_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JNZFE4from
Unexecuted instantiation: _RNvXsoZ_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JNZBE4from
Unexecuted instantiation: _RNvXspa_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JNEFE4from
Unexecuted instantiation: _RNvXspm_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JNEBE4from
Unexecuted instantiation: _RNvXspy_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2JIE4from
Unexecuted instantiation: _RNvXspH_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4CFEIE4from
Unexecuted instantiation: _RNvXspQ_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4CFSIE4from
Unexecuted instantiation: _RNvXspZ_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3CFEE4from
Unexecuted instantiation: _RNvXsq8_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3CFSE4from
Unexecuted instantiation: _RNvXsqh_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4PSHLE4from
Unexecuted instantiation: _RNvXsqq_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4PSHHE4from
Unexecuted instantiation: _RNvXsqz_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4POPLE4from
Unexecuted instantiation: _RNvXsqI_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4POPHE4from
Unexecuted instantiation: _RNvXsqR_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDCME4from
Unexecuted instantiation: _RNvXsr3_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQCME4from
Unexecuted instantiation: _RNvXsrf_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDOPE4from
Unexecuted instantiation: _RNvXsrr_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQOPE4from
Unexecuted instantiation: _RNvXsrD_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDMLE4from
Unexecuted instantiation: _RNvXsrP_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQMLE4from
Unexecuted instantiation: _RNvXss1_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDDVE4from
Unexecuted instantiation: _RNvXssd_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQDVE4from
Unexecuted instantiation: _RNvXssp_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDMDE4from
Unexecuted instantiation: _RNvXssB_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQMDE4from
Unexecuted instantiation: _RNvXssN_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDAME4from
Unexecuted instantiation: _RNvXssZ_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQAME4from
Unexecuted instantiation: _RNvXstb_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDMME4from
Unexecuted instantiation: _RNvXstn_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQMME4from
Unexecuted instantiation: _RNvXstz_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ECALE4from
Unexecuted instantiation: _RNvXstL_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4BSIZE4from
Unexecuted instantiation: _RNvXstV_NtCs6P3fQNJKMy0_8fuel_asm3__opmINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4BLDDE4from
1144
        }
1145
1146
        impl From<$Op> for Instruction {
1147
8.77k
            fn from(op: $Op) -> Self {
1148
8.77k
                Instruction::$Op(op)
1149
8.77k
            }
_RNvXsmY_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2LWE4fromCs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
1147
2.19k
            fn from(op: $Op) -> Self {
1148
2.19k
                Instruction::$Op(op)
1149
2.19k
            }
_RNvXskF_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ADDIE4fromCs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
1147
2.19k
            fn from(op: $Op) -> Self {
1148
2.19k
                Instruction::$Op(op)
1149
2.19k
            }
Unexecuted instantiation: _RNvXsjY_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3BALE4fromCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXsnG_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3GTFE4fromCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXsgE_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3LOGE4fromCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXskF_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ADDIE4fromCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXsfB_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4CALLE4fromCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXsob_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MOVIE4fromCsg6P9hFxt0iW_7fuel_vm
_RNvXse9_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3RETE4fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
1147
2.19k
            fn from(op: $Op) -> Self {
1148
2.19k
                Instruction::$Op(op)
1149
2.19k
            }
_RNvXse9_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3RETE4fromCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
1147
2.19k
            fn from(op: $Op) -> Self {
1148
2.19k
                Instruction::$Op(op)
1149
2.19k
            }
Unexecuted instantiation: _RNvXsaN_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3ADDE4fromB8_
Unexecuted instantiation: _RNvXsaY_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3ANDE4fromB8_
Unexecuted instantiation: _RNvXsb9_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3DIVE4fromB8_
Unexecuted instantiation: _RNvXsbk_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2EQE4fromB8_
Unexecuted instantiation: _RNvXsbv_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3EXPE4fromB8_
Unexecuted instantiation: _RNvXsbG_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2GTE4fromB8_
Unexecuted instantiation: _RNvXsbR_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2LTE4fromB8_
Unexecuted instantiation: _RNvXsc2_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MLOGE4fromB8_
Unexecuted instantiation: _RNvXscd_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MROOE4fromB8_
Unexecuted instantiation: _RNvXsco_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3MODE4fromB8_
Unexecuted instantiation: _RNvXscz_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MOVEE4fromB8_
Unexecuted instantiation: _RNvXscJ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3MULE4fromB8_
Unexecuted instantiation: _RNvXscU_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3NOTE4fromB8_
Unexecuted instantiation: _RNvXsd4_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2ORE4fromB8_
Unexecuted instantiation: _RNvXsdf_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3SLLE4fromB8_
Unexecuted instantiation: _RNvXsdq_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3SRLE4fromB8_
Unexecuted instantiation: _RNvXsdB_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3SUBE4fromB8_
Unexecuted instantiation: _RNvXsdM_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3XORE4fromB8_
Unexecuted instantiation: _RNvXsdX_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MLDVE4fromB8_
Unexecuted instantiation: _RNvXse9_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3RETE4fromB8_
Unexecuted instantiation: _RNvXsei_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4RETDE4fromB8_
Unexecuted instantiation: _RNvXses_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ALOCE4fromB8_
Unexecuted instantiation: _RNvXseB_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3MCLE4fromB8_
Unexecuted instantiation: _RNvXseL_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3MCPE4fromB8_
Unexecuted instantiation: _RNvXseW_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3MEQE4fromB8_
Unexecuted instantiation: _RNvXsf8_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4BHSHE4fromB8_
Unexecuted instantiation: _RNvXsfi_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4BHEIE4fromB8_
Unexecuted instantiation: _RNvXsfr_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4BURNE4fromB8_
Unexecuted instantiation: _RNvXsfB_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4CALLE4fromB8_
Unexecuted instantiation: _RNvXsfN_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3CCPE4fromB8_
Unexecuted instantiation: _RNvXsfZ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4CROOE4fromB8_
Unexecuted instantiation: _RNvXsg9_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4CSIZE4fromB8_
Unexecuted instantiation: _RNvXsgj_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2CBE4fromB8_
Unexecuted instantiation: _RNvXsgs_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3LDCE4fromB8_
Unexecuted instantiation: _RNvXsgE_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3LOGE4fromB8_
Unexecuted instantiation: _RNvXsgQ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4LOGDE4fromB8_
Unexecuted instantiation: _RNvXsh2_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MINTE4fromB8_
Unexecuted instantiation: _RNvXshc_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4RVRTE4fromB8_
Unexecuted instantiation: _RNvXshl_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4SCWQE4fromB8_
Unexecuted instantiation: _RNvXshw_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3SRWE4fromB8_
Unexecuted instantiation: _RNvXshH_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4SRWQE4fromB8_
Unexecuted instantiation: _RNvXshT_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3SWWE4fromB8_
Unexecuted instantiation: _RNvXsi4_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4SWWQE4fromB8_
Unexecuted instantiation: _RNvXsig_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2TRE4fromB8_
Unexecuted instantiation: _RNvXsir_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3TROE4fromB8_
Unexecuted instantiation: _RNvXsiD_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ECK1E4fromB8_
Unexecuted instantiation: _RNvXsiO_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ECR1E4fromB8_
Unexecuted instantiation: _RNvXsiZ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ED19E4fromB8_
Unexecuted instantiation: _RNvXsjb_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4K256E4fromB8_
Unexecuted instantiation: _RNvXsjm_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4S256E4fromB8_
Unexecuted instantiation: _RNvXsjx_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4TIMEE4fromB8_
Unexecuted instantiation: _RNvXsjH_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4NOOPE4fromB8_
Unexecuted instantiation: _RNvXsjP_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4FLAGE4fromB8_
Unexecuted instantiation: _RNvXsjY_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3BALE4fromB8_
Unexecuted instantiation: _RNvXsk9_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3JMPE4fromB8_
Unexecuted instantiation: _RNvXski_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3JNEE4fromB8_
Unexecuted instantiation: _RNvXskt_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3SMOE4fromB8_
Unexecuted instantiation: _RNvXskF_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ADDIE4fromB8_
Unexecuted instantiation: _RNvXskQ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ANDIE4fromB8_
Unexecuted instantiation: _RNvXsl1_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4DIVIE4fromB8_
Unexecuted instantiation: _RNvXslc_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4EXPIE4fromB8_
Unexecuted instantiation: _RNvXsln_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MODIE4fromB8_
Unexecuted instantiation: _RNvXsly_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MULIE4fromB8_
Unexecuted instantiation: _RNvXslJ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3ORIE4fromB8_
Unexecuted instantiation: _RNvXslU_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4SLLIE4fromB8_
Unexecuted instantiation: _RNvXsm5_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4SRLIE4fromB8_
Unexecuted instantiation: _RNvXsmg_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4SUBIE4fromB8_
Unexecuted instantiation: _RNvXsmr_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4XORIE4fromB8_
Unexecuted instantiation: _RNvXsmC_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JNEIE4fromB8_
Unexecuted instantiation: _RNvXsmN_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2LBE4fromB8_
Unexecuted instantiation: _RNvXsmY_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2LWE4fromB8_
Unexecuted instantiation: _RNvXsn9_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2SBE4fromB8_
Unexecuted instantiation: _RNvXsnk_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2SWE4fromB8_
Unexecuted instantiation: _RNvXsnv_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MCPIE4fromB8_
Unexecuted instantiation: _RNvXsnG_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3GTFE4fromB8_
Unexecuted instantiation: _RNvXsnR_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MCLIE4fromB8_
Unexecuted instantiation: _RNvXso1_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2GME4fromB8_
Unexecuted instantiation: _RNvXsob_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4MOVIE4fromB8_
Unexecuted instantiation: _RNvXsol_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JNZIE4fromB8_
Unexecuted instantiation: _RNvXsov_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JMPFE4fromB8_
Unexecuted instantiation: _RNvXsoF_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JMPBE4fromB8_
Unexecuted instantiation: _RNvXsoP_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JNZFE4fromB8_
Unexecuted instantiation: _RNvXsp0_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JNZBE4fromB8_
Unexecuted instantiation: _RNvXspb_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JNEFE4fromB8_
Unexecuted instantiation: _RNvXspn_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4JNEBE4fromB8_
Unexecuted instantiation: _RNvXspz_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_2JIE4fromB8_
Unexecuted instantiation: _RNvXspI_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4CFEIE4fromB8_
Unexecuted instantiation: _RNvXspR_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4CFSIE4fromB8_
Unexecuted instantiation: _RNvXsq0_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3CFEE4fromB8_
Unexecuted instantiation: _RNvXsq9_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_3CFSE4fromB8_
Unexecuted instantiation: _RNvXsqi_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4PSHLE4fromB8_
Unexecuted instantiation: _RNvXsqr_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4PSHHE4fromB8_
Unexecuted instantiation: _RNvXsqA_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4POPLE4fromB8_
Unexecuted instantiation: _RNvXsqJ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4POPHE4fromB8_
Unexecuted instantiation: _RNvXsqS_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDCME4fromB8_
Unexecuted instantiation: _RNvXsr4_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQCME4fromB8_
Unexecuted instantiation: _RNvXsrg_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDOPE4fromB8_
Unexecuted instantiation: _RNvXsrs_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQOPE4fromB8_
Unexecuted instantiation: _RNvXsrE_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDMLE4fromB8_
Unexecuted instantiation: _RNvXsrQ_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQMLE4fromB8_
Unexecuted instantiation: _RNvXss2_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDDVE4fromB8_
Unexecuted instantiation: _RNvXsse_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQDVE4fromB8_
Unexecuted instantiation: _RNvXssq_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDMDE4fromB8_
Unexecuted instantiation: _RNvXssC_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQMDE4fromB8_
Unexecuted instantiation: _RNvXssO_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDAME4fromB8_
Unexecuted instantiation: _RNvXst0_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQAME4fromB8_
Unexecuted instantiation: _RNvXstc_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WDMME4fromB8_
Unexecuted instantiation: _RNvXsto_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4WQMME4fromB8_
Unexecuted instantiation: _RNvXstA_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4ECALE4fromB8_
Unexecuted instantiation: _RNvXstM_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4BSIZE4fromB8_
Unexecuted instantiation: _RNvXstW_NtCs6P3fQNJKMy0_8fuel_asm3__opNtB8_11InstructionINtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4BLDDE4fromB8_
1150
        }
1151
1152
        #[cfg(feature = "typescript")]
1153
        impl From<$Op> for typescript::Instruction {
1154
            fn from(opcode: $Op) -> Self {
1155
                typescript::Instruction::new(opcode.into())
1156
            }
1157
        }
1158
1159
        impl core::fmt::Debug for $Op {
1160
            op_debug_fmt!($Op [$($fname: $field)*]);
1161
        }
1162
1163
        impl_instructions!(impl_op $($rest)*);
1164
    };
1165
    (impl_op) => {};
1166
1167
    // Implement functions for all opcode variants
1168
    (impl_opcode $($doc:literal $ix:literal $Op:ident $op:ident [$($fname:ident: $field:ident)*])*) => {
1169
        impl core::convert::TryFrom<u8> for Opcode {
1170
            type Error = InvalidOpcode;
1171
387M
            fn try_from(u: u8) -> Result<Self, Self::Error> {
1172
387M
                match u {
1173
                    $(
1174
30.0M
                        $ix => Ok(Opcode::$Op),
1175
                    )*
1176
231
                    _ => Err(InvalidOpcode),
1177
                }
1178
387M
            }
1179
        }
1180
1181
        impl Opcode {
1182
            /// Construct the instruction from all possible raw fields, ignoring inapplicable ones.
1183
            #[cfg(test)]
1184
            pub fn test_construct(self, ra: RegId, rb: RegId, rc: RegId, rd: RegId, imm: u32) -> Instruction {
1185
                match self {
1186
                    $(
1187
                        Self::$Op => Instruction::$Op(crate::_op::$Op::test_construct(ra, rb, rc, rd, imm)),
1188
                    )*
1189
                }
1190
            }
1191
        }
1192
    };
1193
1194
    // Implement accessors for register and immediate values.
1195
    (impl_instruction $($doc:literal $ix:literal $Op:ident $op:ident [$($fname:ident: $field:ident)*])*) => {
1196
        impl Instruction {
1197
            /// This instruction's opcode.
1198
0
            pub fn opcode(&self) -> Opcode {
1199
0
                match self {
1200
                    $(
1201
0
                        Self::$Op(_) => Opcode::$Op,
1202
                    )*
1203
                }
1204
0
            }
1205
1206
            /// Unpacks all register IDs into a slice of options.
1207
0
            pub fn reg_ids(&self) -> [Option<RegId>; 4] {
1208
0
                match self {
1209
                    $(
1210
0
                        Self::$Op(op) => op.reg_ids(),
1211
                    )*
1212
                }
1213
0
            }
1214
        }
1215
1216
        impl From<Instruction> for [u8; 4] {
1217
8.77k
            fn from(inst: Instruction) -> Self {
1218
8.77k
                match inst {
1219
                    $(
1220
0
                        Instruction::$Op(op) => op.into(),
1221
                    )*
1222
                }
1223
8.77k
            }
1224
        }
1225
1226
        #[cfg(feature = "typescript")]
1227
        impl From<Instruction> for typescript::Instruction {
1228
            fn from(inst: Instruction) -> Self {
1229
                typescript::Instruction::new(inst)
1230
            }
1231
        }
1232
1233
        impl core::convert::TryFrom<[u8; 4]> for Instruction {
1234
            type Error = InvalidOpcode;
1235
387M
            fn try_from([op, a, b, c]: [u8; 4]) -> Result<Self, Self::Error> {
1236
387M
                match Opcode::try_from(op)? {
1237
                    $(
1238
                        Opcode::$Op => Ok(Self::$Op({
1239
30.0M
                            let op = op::$Op([a, b, c]);
1240
30.0M
                            if !op.reserved_part_is_zero() {
1241
27
                                return Err(InvalidOpcode);
1242
30.0M
                            }
1243
30.0M
                            op
1244
                        })),
1245
                    )*
1246
                }
1247
387M
            }
1248
        }
1249
1250
        impl core::fmt::Debug for Instruction {
1251
0
            fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
1252
0
                match self {
1253
                    $(
1254
0
                        Self::$Op(op) => op.fmt(f),
1255
                    )*
1256
                }
1257
0
            }
1258
        }
1259
    };
1260
1261
    // Entrypoint to the macro, generates structs, methods, opcode enum and instruction enum
1262
    // separately.
1263
    ($($tts:tt)*) => {
1264
        mod _op {
1265
            use super::*;
1266
            decl_op_struct!($($tts)*);
1267
            impl_instructions!(impl_op $($tts)*);
1268
        }
1269
        impl_instructions!(decl_opcode_enum $($tts)*);
1270
        impl_instructions!(decl_instruction_enum $($tts)*);
1271
        impl_instructions!(impl_opcode $($tts)*);
1272
        impl_instructions!(impl_instruction $($tts)*);
1273
        impl_instructions!(impl_opcode_test_construct $($tts)*);
1274
1275
1276
        #[cfg(test)]
1277
        mod opcode_tests {
1278
            use super::*;
1279
            impl_instructions!(tests $($tts)*);
1280
        }
1281
    };
1282
}
1283
1284
/// Defines the enum with `TryFrom` trait implementation.
1285
#[macro_export]
1286
macro_rules! enum_try_from {
1287
    (
1288
        $(#[$meta:meta])* $vis:vis enum $name:ident {
1289
            $($(#[$vmeta:meta])* $vname:ident $(= $val:expr)?,)*
1290
        },
1291
        $from:ident
1292
    ) => {
1293
        $(#[$meta])*
1294
        $vis enum $name {
1295
            $($(#[$vmeta])* $vname $(= $val)?,)*
1296
        }
1297
1298
        impl core::convert::TryFrom<$from> for $name {
1299
            type Error = $crate::PanicReason;
1300
1301
12.0M
            fn try_from(v: $from) -> Result<Self, Self::Error> {
1302
12.0M
                match v {
1303
283k
                    $(x if x == $name::$vname as $from => Ok($name::$vname),)*
1304
11
                    _ => Err($crate::PanicReason::InvalidMetadataIdentifier),
1305
                }
1306
12.0M
            }
_RNvXs0_NtCs6P3fQNJKMy0_8fuel_asm4argsNtB5_6GMArgsINtNtCsd3UI3IJrzMw_4core7convert7TryFrommE8try_fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
1301
1.61M
            fn try_from(v: $from) -> Result<Self, Self::Error> {
1302
1.61M
                match v {
1303
200k
                    $(x if x == $name::$vname as $from => Ok($name::$vname),)*
1304
3
                    _ => Err($crate::PanicReason::InvalidMetadataIdentifier),
1305
                }
1306
1.61M
            }
Unexecuted instantiation: _RNvXs0_NtCs6P3fQNJKMy0_8fuel_asm4argsNtB5_6GMArgsINtNtCsd3UI3IJrzMw_4core7convert7TryFrommE8try_fromB7_
_RNvXse_NtCs6P3fQNJKMy0_8fuel_asm4argsNtB5_7GTFArgsINtNtCsd3UI3IJrzMw_4core7convert7TryFromtE8try_from
Line
Count
Source
1301
10.4M
            fn try_from(v: $from) -> Result<Self, Self::Error> {
1302
10.4M
                match v {
1303
83.3k
                    $(x if x == $name::$vname as $from => Ok($name::$vname),)*
1304
8
                    _ => Err($crate::PanicReason::InvalidMetadataIdentifier),
1305
                }
1306
10.4M
            }
1307
        }
1308
    }
1309
}
1310
1311
#[cfg(test)]
1312
// Generate a test for the instruction.
1313
macro_rules! op_test {
1314
    ($Op:ident $op:ident[RegId]) => {
1315
        #[test]
1316
        fn $op() {
1317
            crate::macros::test_reserved_part(Opcode::$Op, true, false, false, false);
1318
        }
1319
    };
1320
    ($Op:ident $op:ident[RegId RegId]) => {
1321
        #[test]
1322
        fn $op() {
1323
            crate::macros::test_reserved_part(Opcode::$Op, true, true, false, false);
1324
        }
1325
    };
1326
    ($Op:ident $op:ident[RegId RegId RegId]) => {
1327
        #[test]
1328
        fn $op() {
1329
            crate::macros::test_reserved_part(Opcode::$Op, true, true, true, false);
1330
        }
1331
    };
1332
    ($Op:ident $op:ident[RegId RegId RegId RegId]) => {
1333
        #[test]
1334
        fn $op() {
1335
            crate::macros::test_reserved_part(Opcode::$Op, true, true, true, true);
1336
        }
1337
    };
1338
    ($Op:ident $op:ident[RegId RegId RegId Imm06]) => {
1339
        #[test]
1340
        fn $op() {
1341
            crate::macros::test_reserved_part(Opcode::$Op, true, true, true, true);
1342
        }
1343
    };
1344
    ($Op:ident $op:ident[RegId RegId Imm12]) => {
1345
        #[test]
1346
        fn $op() {
1347
            crate::macros::test_reserved_part(Opcode::$Op, true, true, true, true);
1348
        }
1349
    };
1350
    ($Op:ident $op:ident[RegId Imm18]) => {
1351
        #[test]
1352
        fn $op() {
1353
            crate::macros::test_reserved_part(Opcode::$Op, true, true, true, true);
1354
        }
1355
    };
1356
    ($Op:ident $op:ident[Imm24]) => {
1357
        #[test]
1358
        fn $op() {
1359
            crate::macros::test_reserved_part(Opcode::$Op, true, true, true, true);
1360
        }
1361
    };
1362
    ($Op:ident $op:ident[]) => {
1363
        #[test]
1364
        fn $op() {
1365
            crate::macros::test_reserved_part(Opcode::$Op, false, false, false, false);
1366
        }
1367
    };
1368
}
1369
1370
#[cfg(test)]
1371
fn bytes(a: u8, b: u8, c: u8, d: u8) -> [u8; 3] {
1372
    use crate::RegId;
1373
    crate::pack::bytes_from_ra_rb_rc_rd(
1374
        RegId::new(a),
1375
        RegId::new(b),
1376
        RegId::new(c),
1377
        RegId::new(d),
1378
    )
1379
}
1380
1381
#[cfg(test)]
1382
pub(crate) fn test_reserved_part(
1383
    opcode: crate::Opcode,
1384
    zero_should_pass: bool,
1385
    first_should_pass: bool,
1386
    second_should_pass: bool,
1387
    third_should_pass: bool,
1388
) {
1389
    use crate::Instruction;
1390
1391
    // Args: 0
1392
    let [a, b, c] = bytes(0, 0, 0, 0);
1393
    Instruction::try_from([opcode as u8, a, b, c]).unwrap();
1394
    let [a, b, c] = bytes(1, 0, 0, 0);
1395
    let zero_is_error = Instruction::try_from([opcode as u8, a, b, c]).is_ok();
1396
    assert_eq!(
1397
        zero_should_pass, zero_is_error,
1398
        "Opcode: {opcode:?} failed zero"
1399
    );
1400
1401
    // Args: 1
1402
    let [a, b, c] = bytes(0, 0, 0, 0);
1403
    Instruction::try_from([opcode as u8, a, b, c]).unwrap();
1404
    let [a, b, c] = bytes(0, 1, 0, 0);
1405
    let first_is_error = Instruction::try_from([opcode as u8, a, b, c]).is_ok();
1406
    assert_eq!(
1407
        first_should_pass, first_is_error,
1408
        "Opcode: {opcode:?} failed first"
1409
    );
1410
1411
    // Args: 2
1412
    let [a, b, c] = bytes(0, 0, 0, 0);
1413
    Instruction::try_from([opcode as u8, a, b, c]).unwrap();
1414
    let [a, b, c] = bytes(0, 0, 1, 0);
1415
    let second_is_error = Instruction::try_from([opcode as u8, a, b, c]).is_ok();
1416
    assert_eq!(
1417
        second_should_pass, second_is_error,
1418
        "Opcode: {opcode:?} failed second"
1419
    );
1420
1421
    // Args: 3
1422
    let [a, b, c] = bytes(0, 0, 0, 0);
1423
    Instruction::try_from([opcode as u8, a, b, c]).unwrap();
1424
    let [a, b, c] = bytes(0, 0, 0, 1);
1425
    let third_is_error = Instruction::try_from([opcode as u8, a, b, c]).is_ok();
1426
    assert_eq!(
1427
        third_should_pass, third_is_error,
1428
        "Opcode: {opcode:?} failed third"
1429
    );
1430
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction.rs
Line
Count
Source
1
use crate::{
2
    input::{
3
        coin::{
4
            CoinPredicate,
5
            CoinSigned,
6
        },
7
        message::{
8
            MessageCoinPredicate,
9
            MessageDataPredicate,
10
        },
11
    },
12
    policies::Policies,
13
    TxPointer,
14
};
15
use fuel_crypto::{
16
    Hasher,
17
    PublicKey,
18
};
19
use fuel_types::{
20
    canonical::{
21
        Deserialize,
22
        Error,
23
        Serialize,
24
    },
25
    Address,
26
    AssetId,
27
    BlobId,
28
    Bytes32,
29
    Nonce,
30
    Salt,
31
    Word,
32
};
33
34
use input::*;
35
use output::*;
36
37
#[cfg(feature = "typescript")]
38
use self::{
39
    input::typescript as input_ts,
40
    output::typescript as output_ts,
41
};
42
43
use alloc::vec::{
44
    IntoIter,
45
    Vec,
46
};
47
use itertools::Itertools;
48
49
mod fee;
50
mod metadata;
51
mod repr;
52
mod types;
53
mod validity;
54
55
mod id;
56
57
pub mod consensus_parameters;
58
pub mod policies;
59
60
pub use consensus_parameters::{
61
    ConsensusParameters,
62
    ContractParameters,
63
    DependentCost,
64
    FeeParameters,
65
    GasCosts,
66
    GasCostsValues,
67
    PredicateParameters,
68
    ScriptParameters,
69
    TxParameters,
70
};
71
pub use fee::{
72
    Chargeable,
73
    TransactionFee,
74
};
75
pub use metadata::Cacheable;
76
pub use repr::TransactionRepr;
77
pub use types::*;
78
pub use validity::{
79
    FormatValidityChecks,
80
    ValidityError,
81
};
82
83
#[cfg(feature = "alloc")]
84
pub use id::Signable;
85
86
pub use id::{
87
    PrepareSign,
88
    UniqueIdentifier,
89
};
90
91
/// Identification of transaction (also called transaction hash)
92
pub type TxId = Bytes32;
93
94
/// The fuel transaction entity <https://github.com/FuelLabs/fuel-specs/blob/master/src/tx-format/transaction.md>.
95
#[derive(
96
    Debug,
97
    Clone,
98
    PartialEq,
99
    Eq,
100
    Hash,
101
    strum_macros::EnumCount,
102
    serde::Serialize,
103
0
    serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtCseSMGV7FMBK4_7fuel_tx11transactions_1__NtB7_11TransactionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB17_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx11transactions_1__NtBa_11TransactionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1a_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtCseSMGV7FMBK4_7fuel_tx11transactions_1__NtB8_11TransactionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB18_7Visitor9visit_u64pEBa_
Unexecuted instantiation: _RINvXNvXNvNtCseSMGV7FMBK4_7fuel_tx11transactions_1__NtB8_11TransactionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB18_7Visitor9visit_strpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCseSMGV7FMBK4_7fuel_tx11transactions_1__NtB8_11TransactionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB18_7Visitor11visit_bytespEBa_
Unexecuted instantiation: _RINvXs_NvXNvNtCseSMGV7FMBK4_7fuel_tx11transactions_1__NtBa_11TransactionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB18_11deserializepEBc_
Unexecuted instantiation: _RINvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx11transactions_1__NtBb_11TransactionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1b_7Visitor10visit_enumpEBd_
104
)]
105
#[cfg_attr(
106
    feature = "da-compression",
107
    derive(fuel_compression::Compress, fuel_compression::Decompress)
108
)]
109
#[allow(clippy::large_enum_variant)]
110
pub enum Transaction {
111
    Script(Script),
112
    Create(Create),
113
    Mint(Mint),
114
    Upgrade(Upgrade),
115
    Upload(Upload),
116
    Blob(Blob),
117
}
118
119
#[cfg(feature = "test-helpers")]
120
impl Default for Transaction {
121
0
    fn default() -> Self {
122
0
        Script::default().into()
123
0
    }
124
}
125
126
impl Transaction {
127
    /// Return default valid transaction useful for tests.
128
    #[cfg(all(feature = "random", feature = "std", feature = "test-helpers"))]
129
0
    pub fn default_test_tx() -> Self {
130
        use crate::Finalizable;
131
132
0
        crate::TransactionBuilder::script(vec![], vec![])
133
0
            .max_fee_limit(0)
134
0
            .add_fee_input()
135
0
            .finalize()
136
0
            .into()
137
0
    }
138
139
0
    pub const fn script(
140
0
        gas_limit: Word,
141
0
        script: Vec<u8>,
142
0
        script_data: Vec<u8>,
143
0
        policies: Policies,
144
0
        inputs: Vec<Input>,
145
0
        outputs: Vec<Output>,
146
0
        witnesses: Vec<Witness>,
147
0
    ) -> Script {
148
0
        let receipts_root = Bytes32::zeroed();
149
0
150
0
        Script {
151
0
            body: ScriptBody {
152
0
                script_gas_limit: gas_limit,
153
0
                receipts_root,
154
0
                script: ScriptCode { bytes: script },
155
0
                script_data,
156
0
            },
157
0
            policies,
158
0
            inputs,
159
0
            outputs,
160
0
            witnesses,
161
0
            metadata: None,
162
0
        }
163
0
    }
164
165
0
    pub fn create(
166
0
        bytecode_witness_index: u16,
167
0
        policies: Policies,
168
0
        salt: Salt,
169
0
        mut storage_slots: Vec<StorageSlot>,
170
0
        inputs: Vec<Input>,
171
0
        outputs: Vec<Output>,
172
0
        witnesses: Vec<Witness>,
173
0
    ) -> Create {
174
0
        // sort incoming storage slots
175
0
        storage_slots.sort();
176
0
177
0
        Create {
178
0
            body: CreateBody {
179
0
                bytecode_witness_index,
180
0
                salt,
181
0
                storage_slots,
182
0
            },
183
0
            policies,
184
0
            inputs,
185
0
            outputs,
186
0
            witnesses,
187
0
            metadata: None,
188
0
        }
189
0
    }
190
191
0
    pub fn mint(
192
0
        tx_pointer: TxPointer,
193
0
        input_contract: input::contract::Contract,
194
0
        output_contract: output::contract::Contract,
195
0
        mint_amount: Word,
196
0
        mint_asset_id: AssetId,
197
0
        gas_price: Word,
198
0
    ) -> Mint {
199
0
        Mint {
200
0
            tx_pointer,
201
0
            input_contract,
202
0
            output_contract,
203
0
            mint_amount,
204
0
            mint_asset_id,
205
0
            gas_price,
206
0
            metadata: None,
207
0
        }
208
0
    }
209
210
0
    pub fn upgrade(
211
0
        upgrade_purpose: UpgradePurpose,
212
0
        policies: Policies,
213
0
        inputs: Vec<Input>,
214
0
        outputs: Vec<Output>,
215
0
        witnesses: Vec<Witness>,
216
0
    ) -> Upgrade {
217
0
        Upgrade {
218
0
            body: UpgradeBody {
219
0
                purpose: upgrade_purpose,
220
0
            },
221
0
            policies,
222
0
            inputs,
223
0
            outputs,
224
0
            witnesses,
225
0
            metadata: None,
226
0
        }
227
0
    }
228
229
    /// Creates an `Upgrade` transaction with the purpose of upgrading the consensus
230
    /// parameters.
231
0
    pub fn upgrade_consensus_parameters(
232
0
        consensus_parameters: &ConsensusParameters,
233
0
        policies: Policies,
234
0
        inputs: Vec<Input>,
235
0
        outputs: Vec<Output>,
236
0
        mut witnesses: Vec<Witness>,
237
0
    ) -> Result<Upgrade, ValidityError> {
238
0
        let serialized_consensus_parameters = postcard::to_allocvec(consensus_parameters)
239
0
            .map_err(|_| {
240
0
                ValidityError::TransactionUpgradeConsensusParametersSerialization
241
0
            })?;
242
0
        let checksum = Hasher::hash(&serialized_consensus_parameters);
243
0
        let witness_index = u16::try_from(witnesses.len())
244
0
            .map_err(|_| ValidityError::TransactionWitnessesMax)?;
245
0
        witnesses.push(serialized_consensus_parameters.into());
246
0
247
0
        Ok(Upgrade {
248
0
            body: UpgradeBody {
249
0
                purpose: UpgradePurpose::ConsensusParameters {
250
0
                    witness_index,
251
0
                    checksum,
252
0
                },
253
0
            },
254
0
            policies,
255
0
            inputs,
256
0
            outputs,
257
0
            witnesses,
258
0
            metadata: None,
259
0
        })
260
0
    }
261
262
0
    pub fn upload(
263
0
        upload_body: UploadBody,
264
0
        policies: Policies,
265
0
        inputs: Vec<Input>,
266
0
        outputs: Vec<Output>,
267
0
        witnesses: Vec<Witness>,
268
0
    ) -> Upload {
269
0
        Upload {
270
0
            body: upload_body,
271
0
            policies,
272
0
            inputs,
273
0
            outputs,
274
0
            witnesses,
275
0
            metadata: None,
276
0
        }
277
0
    }
278
279
0
    pub fn upload_from_subsection(
280
0
        subsection: UploadSubsection,
281
0
        policies: Policies,
282
0
        inputs: Vec<Input>,
283
0
        outputs: Vec<Output>,
284
0
        mut witnesses: Vec<Witness>,
285
0
    ) -> Upload {
286
0
        let body = UploadBody {
287
0
            root: subsection.root,
288
0
            witness_index: u16::try_from(witnesses.len()).unwrap_or(u16::MAX),
289
0
            subsection_index: subsection.subsection_index,
290
0
            subsections_number: subsection.subsections_number,
291
0
            proof_set: subsection.proof_set,
292
0
        };
293
0
        witnesses.push(subsection.subsection.into());
294
0
        Upload {
295
0
            body,
296
0
            policies,
297
0
            inputs,
298
0
            outputs,
299
0
            witnesses,
300
0
            metadata: None,
301
0
        }
302
0
    }
303
304
0
    pub fn blob(
305
0
        body: BlobBody,
306
0
        policies: Policies,
307
0
        inputs: Vec<Input>,
308
0
        outputs: Vec<Output>,
309
0
        witnesses: Vec<Witness>,
310
0
    ) -> Blob {
311
0
        Blob {
312
0
            body,
313
0
            policies,
314
0
            inputs,
315
0
            outputs,
316
0
            witnesses,
317
0
            metadata: None,
318
0
        }
319
0
    }
320
321
0
    pub fn blob_from_bytes(
322
0
        bytes: Vec<u8>,
323
0
        policies: Policies,
324
0
        inputs: Vec<Input>,
325
0
        outputs: Vec<Output>,
326
0
        mut witnesses: Vec<Witness>,
327
0
    ) -> Blob {
328
0
        let body = BlobBody {
329
0
            id: BlobId::compute(&bytes),
330
0
            witness_index: u16::try_from(witnesses.len()).unwrap_or(u16::MAX),
331
0
        };
332
0
        witnesses.push(bytes.into());
333
0
        Blob {
334
0
            body,
335
0
            policies,
336
0
            inputs,
337
0
            outputs,
338
0
            witnesses,
339
0
            metadata: None,
340
0
        }
341
0
    }
342
343
    /// Convert the type into a JSON string
344
    ///
345
    /// This is implemented as infallible because serde_json will fail only if the type
346
    /// can't serialize one of its attributes. We don't have such case with the
347
    /// transaction because all of its attributes are trivially serialized.
348
    ///
349
    /// If an error happens, a JSON string with the error description will be returned
350
    #[cfg(test)]
351
    pub fn to_json(&self) -> alloc::string::String {
352
        serde_json::to_string(self)
353
            .unwrap_or_else(|e| alloc::format!(r#"{{"error": "{e}"}}"#))
354
    }
355
356
    /// Attempt to deserialize a transaction from a JSON string, returning `None` if it
357
    /// fails
358
    #[cfg(test)]
359
    pub fn from_json<J>(json: J) -> Option<Self>
360
    where
361
        J: AsRef<str>,
362
    {
363
        // we opt to return `Option` to not leak serde concrete error implementations in
364
        // the crate. considering we don't expect to handle failures downstream
365
        // (e.g. if a string is not a valid json, then we simply don't have a
366
        // transaction out of that), then its not required to leak the type
367
        serde_json::from_str(json.as_ref()).ok()
368
    }
369
370
0
    pub const fn is_script(&self) -> bool {
371
0
        matches!(self, Self::Script { .. })
372
0
    }
373
374
0
    pub const fn is_create(&self) -> bool {
375
0
        matches!(self, Self::Create { .. })
376
0
    }
377
378
0
    pub const fn is_mint(&self) -> bool {
379
0
        matches!(self, Self::Mint { .. })
380
0
    }
381
382
0
    pub const fn is_upgrade(&self) -> bool {
383
0
        matches!(self, Self::Upgrade { .. })
384
0
    }
385
386
0
    pub const fn is_upload(&self) -> bool {
387
0
        matches!(self, Self::Upload { .. })
388
0
    }
389
390
0
    pub const fn is_blob(&self) -> bool {
391
0
        matches!(self, Self::Blob { .. })
392
0
    }
393
394
0
    pub const fn as_script(&self) -> Option<&Script> {
395
0
        match self {
396
0
            Self::Script(script) => Some(script),
397
0
            _ => None,
398
        }
399
0
    }
400
401
0
    pub fn as_script_mut(&mut self) -> Option<&mut Script> {
402
0
        match self {
403
0
            Self::Script(script) => Some(script),
404
0
            _ => None,
405
        }
406
0
    }
407
408
0
    pub const fn as_create(&self) -> Option<&Create> {
409
0
        match self {
410
0
            Self::Create(create) => Some(create),
411
0
            _ => None,
412
        }
413
0
    }
414
415
0
    pub fn as_create_mut(&mut self) -> Option<&mut Create> {
416
0
        match self {
417
0
            Self::Create(create) => Some(create),
418
0
            _ => None,
419
        }
420
0
    }
421
422
0
    pub const fn as_mint(&self) -> Option<&Mint> {
423
0
        match self {
424
0
            Self::Mint(mint) => Some(mint),
425
0
            _ => None,
426
        }
427
0
    }
428
429
0
    pub fn as_mint_mut(&mut self) -> Option<&mut Mint> {
430
0
        match self {
431
0
            Self::Mint(mint) => Some(mint),
432
0
            _ => None,
433
        }
434
0
    }
435
436
0
    pub const fn as_upgrade(&self) -> Option<&Upgrade> {
437
0
        match self {
438
0
            Self::Upgrade(tx) => Some(tx),
439
0
            _ => None,
440
        }
441
0
    }
442
443
0
    pub fn as_upgrade_mut(&mut self) -> Option<&mut Upgrade> {
444
0
        match self {
445
0
            Self::Upgrade(tx) => Some(tx),
446
0
            _ => None,
447
        }
448
0
    }
449
450
0
    pub const fn as_upload(&self) -> Option<&Upload> {
451
0
        match self {
452
0
            Self::Upload(tx) => Some(tx),
453
0
            _ => None,
454
        }
455
0
    }
456
457
0
    pub fn as_upload_mut(&mut self) -> Option<&mut Upload> {
458
0
        match self {
459
0
            Self::Upload(tx) => Some(tx),
460
0
            _ => None,
461
        }
462
0
    }
463
464
0
    pub const fn as_blob(&self) -> Option<&Blob> {
465
0
        match self {
466
0
            Self::Blob(tx) => Some(tx),
467
0
            _ => None,
468
        }
469
0
    }
470
471
0
    pub fn as_blob_mut(&mut self) -> Option<&mut Blob> {
472
0
        match self {
473
0
            Self::Blob(tx) => Some(tx),
474
0
            _ => None,
475
        }
476
0
    }
477
}
478
479
pub trait Executable: field::Inputs + field::Outputs + field::Witnesses {
480
    /// Returns the assets' ids used in the inputs in the order of inputs.
481
6.57k
    fn input_asset_ids<'a>(
482
6.57k
        &'a self,
483
6.57k
        base_asset_id: &'a AssetId,
484
6.57k
    ) -> IntoIter<&'a AssetId> {
485
6.57k
        self.inputs()
486
6.57k
            .iter()
487
10.9k
            .filter_map(|input| match input {
488
0
                Input::CoinPredicate(CoinPredicate { asset_id, .. })
489
6.57k
                | Input::CoinSigned(CoinSigned { asset_id, .. }) => Some(asset_id),
490
                Input::MessageCoinSigned(_)
491
                | Input::MessageCoinPredicate(_)
492
                | Input::MessageDataPredicate(_)
493
0
                | Input::MessageDataSigned(_) => Some(base_asset_id),
494
4.38k
                _ => None,
495
10.9k
            })
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_4blob8BlobBodyNtB1F_12BlobMetadataENtBb_10Executable15input_asset_ids0Csg6P9hFxt0iW_7fuel_vm
_RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1F_14CreateMetadataENtBb_10Executable15input_asset_ids0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
487
2.19k
            .filter_map(|input| match input {
488
0
                Input::CoinPredicate(CoinPredicate { asset_id, .. })
489
2.19k
                | Input::CoinSigned(CoinSigned { asset_id, .. }) => Some(asset_id),
490
                Input::MessageCoinSigned(_)
491
                | Input::MessageCoinPredicate(_)
492
                | Input::MessageDataPredicate(_)
493
0
                | Input::MessageDataSigned(_) => Some(base_asset_id),
494
0
                _ => None,
495
2.19k
            })
_RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1F_14ScriptMetadataENtBb_10Executable15input_asset_ids0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
487
8.77k
            .filter_map(|input| match input {
488
0
                Input::CoinPredicate(CoinPredicate { asset_id, .. })
489
4.38k
                | Input::CoinSigned(CoinSigned { asset_id, .. }) => Some(asset_id),
490
                Input::MessageCoinSigned(_)
491
                | Input::MessageCoinPredicate(_)
492
                | Input::MessageDataPredicate(_)
493
0
                | Input::MessageDataSigned(_) => Some(base_asset_id),
494
4.38k
                _ => None,
495
8.77k
            })
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6upload10UploadBodyNtB1F_14UploadMetadataENtBb_10Executable15input_asset_ids0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1F_15UpgradeMetadataENtBb_10Executable15input_asset_ids0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_4blob8BlobBodyNtB1F_12BlobMetadataENtBb_10Executable15input_asset_ids0Bd_
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1F_14CreateMetadataENtBb_10Executable15input_asset_ids0Bd_
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1F_14ScriptMetadataENtBb_10Executable15input_asset_ids0Bd_
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6upload10UploadBodyNtB1F_14UploadMetadataENtBb_10Executable15input_asset_ids0Bd_
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1F_15UpgradeMetadataENtBb_10Executable15input_asset_ids0Bd_
496
6.57k
            .collect_vec()
497
6.57k
            .into_iter()
498
6.57k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtB9_10Executable15input_asset_idsCsg6P9hFxt0iW_7fuel_vm
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtB9_10Executable15input_asset_idsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
481
2.19k
    fn input_asset_ids<'a>(
482
2.19k
        &'a self,
483
2.19k
        base_asset_id: &'a AssetId,
484
2.19k
    ) -> IntoIter<&'a AssetId> {
485
2.19k
        self.inputs()
486
2.19k
            .iter()
487
2.19k
            .filter_map(|input| match input {
488
                Input::CoinPredicate(CoinPredicate { asset_id, .. })
489
                | Input::CoinSigned(CoinSigned { asset_id, .. }) => Some(asset_id),
490
                Input::MessageCoinSigned(_)
491
                | Input::MessageCoinPredicate(_)
492
                | Input::MessageDataPredicate(_)
493
                | Input::MessageDataSigned(_) => Some(base_asset_id),
494
                _ => None,
495
2.19k
            })
496
2.19k
            .collect_vec()
497
2.19k
            .into_iter()
498
2.19k
    }
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtB9_10Executable15input_asset_idsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
481
4.38k
    fn input_asset_ids<'a>(
482
4.38k
        &'a self,
483
4.38k
        base_asset_id: &'a AssetId,
484
4.38k
    ) -> IntoIter<&'a AssetId> {
485
4.38k
        self.inputs()
486
4.38k
            .iter()
487
4.38k
            .filter_map(|input| match input {
488
                Input::CoinPredicate(CoinPredicate { asset_id, .. })
489
                | Input::CoinSigned(CoinSigned { asset_id, .. }) => Some(asset_id),
490
                Input::MessageCoinSigned(_)
491
                | Input::MessageCoinPredicate(_)
492
                | Input::MessageDataPredicate(_)
493
                | Input::MessageDataSigned(_) => Some(base_asset_id),
494
                _ => None,
495
4.38k
            })
496
4.38k
            .collect_vec()
497
4.38k
            .into_iter()
498
4.38k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1D_14UploadMetadataENtB9_10Executable15input_asset_idsCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtB9_10Executable15input_asset_idsCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtB9_10Executable15input_asset_idsBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtB9_10Executable15input_asset_idsBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtB9_10Executable15input_asset_idsBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1D_14UploadMetadataENtB9_10Executable15input_asset_idsBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtB9_10Executable15input_asset_idsBb_
499
500
    /// Returns unique assets' ids used in the inputs.
501
4.38k
    fn input_asset_ids_unique<'a>(
502
4.38k
        &'a self,
503
4.38k
        base_asset_id: &'a AssetId,
504
4.38k
    ) -> IntoIter<&'a AssetId> {
505
4.38k
        let asset_ids = self.input_asset_ids(base_asset_id);
506
4.38k
507
4.38k
        #[cfg(feature = "std")]
508
4.38k
        let asset_ids = asset_ids.unique();
509
4.38k
510
4.38k
        #[cfg(not(feature = "std"))]
511
4.38k
        let asset_ids = asset_ids.sorted().dedup();
512
4.38k
513
4.38k
        asset_ids.collect_vec().into_iter()
514
4.38k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtB9_10Executable22input_asset_ids_uniqueCsg6P9hFxt0iW_7fuel_vm
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtB9_10Executable22input_asset_ids_uniqueCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
501
2.19k
    fn input_asset_ids_unique<'a>(
502
2.19k
        &'a self,
503
2.19k
        base_asset_id: &'a AssetId,
504
2.19k
    ) -> IntoIter<&'a AssetId> {
505
2.19k
        let asset_ids = self.input_asset_ids(base_asset_id);
506
2.19k
507
2.19k
        #[cfg(feature = "std")]
508
2.19k
        let asset_ids = asset_ids.unique();
509
2.19k
510
2.19k
        #[cfg(not(feature = "std"))]
511
2.19k
        let asset_ids = asset_ids.sorted().dedup();
512
2.19k
513
2.19k
        asset_ids.collect_vec().into_iter()
514
2.19k
    }
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtB9_10Executable22input_asset_ids_uniqueCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
501
2.19k
    fn input_asset_ids_unique<'a>(
502
2.19k
        &'a self,
503
2.19k
        base_asset_id: &'a AssetId,
504
2.19k
    ) -> IntoIter<&'a AssetId> {
505
2.19k
        let asset_ids = self.input_asset_ids(base_asset_id);
506
2.19k
507
2.19k
        #[cfg(feature = "std")]
508
2.19k
        let asset_ids = asset_ids.unique();
509
2.19k
510
2.19k
        #[cfg(not(feature = "std"))]
511
2.19k
        let asset_ids = asset_ids.sorted().dedup();
512
2.19k
513
2.19k
        asset_ids.collect_vec().into_iter()
514
2.19k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1D_14UploadMetadataENtB9_10Executable22input_asset_ids_uniqueCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtB9_10Executable22input_asset_ids_uniqueCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtB9_10Executable22input_asset_ids_uniqueBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtB9_10Executable22input_asset_ids_uniqueBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtB9_10Executable22input_asset_ids_uniqueBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1D_14UploadMetadataENtB9_10Executable22input_asset_ids_uniqueBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtB9_10Executable22input_asset_ids_uniqueBb_
515
516
    /// Checks that all owners of inputs in the predicates are valid.
517
0
    fn check_predicate_owners(&self) -> bool {
518
0
        self.inputs()
519
0
            .iter()
520
0
            .filter_map(|i| match i {
521
                Input::CoinPredicate(CoinPredicate {
522
0
                    owner, predicate, ..
523
0
                }) => Some((owner, predicate)),
524
                Input::MessageDataPredicate(MessageDataPredicate {
525
0
                    recipient,
526
0
                    predicate,
527
0
                    ..
528
0
                }) => Some((recipient, predicate)),
529
                Input::MessageCoinPredicate(MessageCoinPredicate {
530
0
                    recipient,
531
0
                    predicate,
532
0
                    ..
533
0
                }) => Some((recipient, predicate)),
534
0
                _ => None,
535
0
            })
536
0
            .fold(true, |result, (owner, predicate)| {
537
0
                result && Input::is_predicate_owner_valid(owner, &**predicate)
538
0
            })
539
0
    }
540
541
    /// Append a new unsigned coin input to the transaction.
542
    ///
543
    /// When the transaction is constructed, [`Signable::sign_inputs`] should
544
    /// be called for every secret key used with this method.
545
    ///
546
    /// The production of the signatures can be done only after the full
547
    /// transaction skeleton is built because the input of the hash message
548
    /// is the ID of the final transaction.
549
4.38k
    fn add_unsigned_coin_input(
550
4.38k
        &mut self,
551
4.38k
        utxo_id: UtxoId,
552
4.38k
        owner: &PublicKey,
553
4.38k
        amount: Word,
554
4.38k
        asset_id: AssetId,
555
4.38k
        tx_pointer: TxPointer,
556
4.38k
        witness_index: u16,
557
4.38k
    ) {
558
4.38k
        let owner = Input::owner(owner);
559
4.38k
560
4.38k
        let input = Input::coin_signed(
561
4.38k
            utxo_id,
562
4.38k
            owner,
563
4.38k
            amount,
564
4.38k
            asset_id,
565
4.38k
            tx_pointer,
566
4.38k
            witness_index,
567
4.38k
        );
568
4.38k
        self.inputs_mut().push(input);
569
4.38k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtB9_10Executable23add_unsigned_coin_inputCsg6P9hFxt0iW_7fuel_vm
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtB9_10Executable23add_unsigned_coin_inputCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
549
2.19k
    fn add_unsigned_coin_input(
550
2.19k
        &mut self,
551
2.19k
        utxo_id: UtxoId,
552
2.19k
        owner: &PublicKey,
553
2.19k
        amount: Word,
554
2.19k
        asset_id: AssetId,
555
2.19k
        tx_pointer: TxPointer,
556
2.19k
        witness_index: u16,
557
2.19k
    ) {
558
2.19k
        let owner = Input::owner(owner);
559
2.19k
560
2.19k
        let input = Input::coin_signed(
561
2.19k
            utxo_id,
562
2.19k
            owner,
563
2.19k
            amount,
564
2.19k
            asset_id,
565
2.19k
            tx_pointer,
566
2.19k
            witness_index,
567
2.19k
        );
568
2.19k
        self.inputs_mut().push(input);
569
2.19k
    }
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtB9_10Executable23add_unsigned_coin_inputCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
549
2.19k
    fn add_unsigned_coin_input(
550
2.19k
        &mut self,
551
2.19k
        utxo_id: UtxoId,
552
2.19k
        owner: &PublicKey,
553
2.19k
        amount: Word,
554
2.19k
        asset_id: AssetId,
555
2.19k
        tx_pointer: TxPointer,
556
2.19k
        witness_index: u16,
557
2.19k
    ) {
558
2.19k
        let owner = Input::owner(owner);
559
2.19k
560
2.19k
        let input = Input::coin_signed(
561
2.19k
            utxo_id,
562
2.19k
            owner,
563
2.19k
            amount,
564
2.19k
            asset_id,
565
2.19k
            tx_pointer,
566
2.19k
            witness_index,
567
2.19k
        );
568
2.19k
        self.inputs_mut().push(input);
569
2.19k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtB9_10Executable23add_unsigned_coin_inputBb_
570
571
    /// Append a new unsigned message input to the transaction.
572
    ///
573
    /// When the transaction is constructed, [`Signable::sign_inputs`] should
574
    /// be called for every secret key used with this method.
575
    ///
576
    /// The production of the signatures can be done only after the full
577
    /// transaction skeleton is built because the input of the hash message
578
    /// is the ID of the final transaction.
579
0
    fn add_unsigned_message_input(
580
0
        &mut self,
581
0
        sender: Address,
582
0
        recipient: Address,
583
0
        nonce: Nonce,
584
0
        amount: Word,
585
0
        data: Vec<u8>,
586
0
        witness_index: u16,
587
0
    ) {
588
0
        let input = if data.is_empty() {
589
0
            Input::message_coin_signed(sender, recipient, amount, nonce, witness_index)
590
        } else {
591
0
            Input::message_data_signed(
592
0
                sender,
593
0
                recipient,
594
0
                amount,
595
0
                nonce,
596
0
                witness_index,
597
0
                data,
598
0
            )
599
        };
600
601
0
        self.inputs_mut().push(input);
602
0
    }
603
}
604
605
impl<T: field::Inputs + field::Outputs + field::Witnesses> Executable for T {}
606
607
impl From<Script> for Transaction {
608
4.38k
    fn from(tx: Script) -> Self {
609
4.38k
        Self::Script(tx)
610
4.38k
    }
_RNvXs1_NtCseSMGV7FMBK4_7fuel_tx11transactionNtB5_11TransactionINtNtCsd3UI3IJrzMw_4core7convert4FromINtNtNtB5_5types22chargeable_transaction21ChargeableTransactionNtNtB1E_6script10ScriptBodyNtB2C_14ScriptMetadataEE4fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
608
4.38k
    fn from(tx: Script) -> Self {
609
4.38k
        Self::Script(tx)
610
4.38k
    }
Unexecuted instantiation: _RNvXs1_NtCseSMGV7FMBK4_7fuel_tx11transactionNtB5_11TransactionINtNtCsd3UI3IJrzMw_4core7convert4FromINtNtNtB5_5types22chargeable_transaction21ChargeableTransactionNtNtB1E_6script10ScriptBodyNtB2C_14ScriptMetadataEE4fromB7_
611
}
612
613
impl From<Create> for Transaction {
614
4.38k
    fn from(tx: Create) -> Self {
615
4.38k
        Self::Create(tx)
616
4.38k
    }
_RNvXs2_NtCseSMGV7FMBK4_7fuel_tx11transactionNtB5_11TransactionINtNtCsd3UI3IJrzMw_4core7convert4FromINtNtNtB5_5types22chargeable_transaction21ChargeableTransactionNtNtB1E_6create10CreateBodyNtB2C_14CreateMetadataEE4fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
614
4.38k
    fn from(tx: Create) -> Self {
615
4.38k
        Self::Create(tx)
616
4.38k
    }
Unexecuted instantiation: _RNvXs2_NtCseSMGV7FMBK4_7fuel_tx11transactionNtB5_11TransactionINtNtCsd3UI3IJrzMw_4core7convert4FromINtNtNtB5_5types22chargeable_transaction21ChargeableTransactionNtNtB1E_6create10CreateBodyNtB2C_14CreateMetadataEE4fromB7_
617
}
618
619
impl From<Mint> for Transaction {
620
0
    fn from(tx: Mint) -> Self {
621
0
        Self::Mint(tx)
622
0
    }
Unexecuted instantiation: _RNvXs3_NtCseSMGV7FMBK4_7fuel_tx11transactionNtB5_11TransactionINtNtCsd3UI3IJrzMw_4core7convert4FromNtNtNtB5_5types4mint4MintE4fromCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs3_NtCseSMGV7FMBK4_7fuel_tx11transactionNtB5_11TransactionINtNtCsd3UI3IJrzMw_4core7convert4FromNtNtNtB5_5types4mint4MintE4fromB7_
623
}
624
625
impl From<Upgrade> for Transaction {
626
0
    fn from(tx: Upgrade) -> Self {
627
0
        Self::Upgrade(tx)
628
0
    }
Unexecuted instantiation: _RNvXs4_NtCseSMGV7FMBK4_7fuel_tx11transactionNtB5_11TransactionINtNtCsd3UI3IJrzMw_4core7convert4FromINtNtNtB5_5types22chargeable_transaction21ChargeableTransactionNtNtB1E_7upgrade11UpgradeBodyNtB2C_15UpgradeMetadataEE4fromCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs4_NtCseSMGV7FMBK4_7fuel_tx11transactionNtB5_11TransactionINtNtCsd3UI3IJrzMw_4core7convert4FromINtNtNtB5_5types22chargeable_transaction21ChargeableTransactionNtNtB1E_7upgrade11UpgradeBodyNtB2C_15UpgradeMetadataEE4fromB7_
629
}
630
631
impl From<Upload> for Transaction {
632
0
    fn from(tx: Upload) -> Self {
633
0
        Self::Upload(tx)
634
0
    }
Unexecuted instantiation: _RNvXs5_NtCseSMGV7FMBK4_7fuel_tx11transactionNtB5_11TransactionINtNtCsd3UI3IJrzMw_4core7convert4FromINtNtNtB5_5types22chargeable_transaction21ChargeableTransactionNtNtB1E_6upload10UploadBodyNtB2C_14UploadMetadataEE4fromCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs5_NtCseSMGV7FMBK4_7fuel_tx11transactionNtB5_11TransactionINtNtCsd3UI3IJrzMw_4core7convert4FromINtNtNtB5_5types22chargeable_transaction21ChargeableTransactionNtNtB1E_6upload10UploadBodyNtB2C_14UploadMetadataEE4fromB7_
635
}
636
637
impl From<Blob> for Transaction {
638
0
    fn from(tx: Blob) -> Self {
639
0
        Self::Blob(tx)
640
0
    }
Unexecuted instantiation: _RNvXs6_NtCseSMGV7FMBK4_7fuel_tx11transactionNtB5_11TransactionINtNtCsd3UI3IJrzMw_4core7convert4FromINtNtNtB5_5types22chargeable_transaction21ChargeableTransactionNtNtB1E_4blob8BlobBodyNtB2C_12BlobMetadataEE4fromCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs6_NtCseSMGV7FMBK4_7fuel_tx11transactionNtB5_11TransactionINtNtCsd3UI3IJrzMw_4core7convert4FromINtNtNtB5_5types22chargeable_transaction21ChargeableTransactionNtNtB1E_4blob8BlobBodyNtB2C_12BlobMetadataEE4fromB7_
641
}
642
643
impl Serialize for Transaction {
644
4.38k
    fn size_static(&self) -> usize {
645
4.38k
        match self {
646
2.19k
            Self::Script(tx) => tx.size_static(),
647
2.19k
            Self::Create(tx) => tx.size_static(),
648
0
            Self::Mint(tx) => tx.size_static(),
649
0
            Self::Upgrade(tx) => tx.size_static(),
650
0
            Self::Upload(tx) => tx.size_static(),
651
0
            Self::Blob(tx) => tx.size_static(),
652
        }
653
4.38k
    }
654
655
4.38k
    fn size_dynamic(&self) -> usize {
656
4.38k
        match self {
657
2.19k
            Self::Script(tx) => tx.size_dynamic(),
658
2.19k
            Self::Create(tx) => tx.size_dynamic(),
659
0
            Self::Mint(tx) => tx.size_dynamic(),
660
0
            Self::Upgrade(tx) => tx.size_dynamic(),
661
0
            Self::Upload(tx) => tx.size_dynamic(),
662
0
            Self::Blob(tx) => tx.size_dynamic(),
663
        }
664
4.38k
    }
665
666
0
    fn encode_static<O: fuel_types::canonical::Output + ?Sized>(
667
0
        &self,
668
0
        buffer: &mut O,
669
0
    ) -> Result<(), Error> {
670
0
        match self {
671
0
            Self::Script(tx) => tx.encode_static(buffer),
672
0
            Self::Create(tx) => tx.encode_static(buffer),
673
0
            Self::Mint(tx) => tx.encode_static(buffer),
674
0
            Self::Upgrade(tx) => tx.encode_static(buffer),
675
0
            Self::Upload(tx) => tx.encode_static(buffer),
676
0
            Self::Blob(tx) => tx.encode_static(buffer),
677
        }
678
0
    }
679
680
0
    fn encode_dynamic<O: fuel_types::canonical::Output + ?Sized>(
681
0
        &self,
682
0
        buffer: &mut O,
683
0
    ) -> Result<(), Error> {
684
0
        match self {
685
0
            Self::Script(tx) => tx.encode_dynamic(buffer),
686
0
            Self::Create(tx) => tx.encode_dynamic(buffer),
687
0
            Self::Mint(tx) => tx.encode_dynamic(buffer),
688
0
            Self::Upgrade(tx) => tx.encode_dynamic(buffer),
689
0
            Self::Upload(tx) => tx.encode_dynamic(buffer),
690
0
            Self::Blob(tx) => tx.encode_dynamic(buffer),
691
        }
692
0
    }
693
}
694
695
impl Deserialize for Transaction {
696
4.38k
    fn decode_static<I: fuel_types::canonical::Input + ?Sized>(
697
4.38k
        buffer: &mut I,
698
4.38k
    ) -> Result<Self, Error> {
699
4.38k
        let mut discriminant_buffer = [0u8; 8];
700
4.38k
        buffer.peek(&mut discriminant_buffer)?;
701
702
4.38k
        let discriminant =
703
4.38k
            <TransactionRepr as Deserialize>::decode(&mut &discriminant_buffer[..])?;
704
705
4.38k
        match discriminant {
706
            TransactionRepr::Script => {
707
2.19k
                Ok(<Script as Deserialize>::decode_static(buffer)?.into())
708
            }
709
            TransactionRepr::Create => {
710
2.19k
                Ok(<Create as Deserialize>::decode_static(buffer)?.into())
711
            }
712
            TransactionRepr::Mint => {
713
0
                Ok(<Mint as Deserialize>::decode_static(buffer)?.into())
714
            }
715
            TransactionRepr::Upgrade => {
716
0
                Ok(<Upgrade as Deserialize>::decode_static(buffer)?.into())
717
            }
718
            TransactionRepr::Upload => {
719
0
                Ok(<Upload as Deserialize>::decode_static(buffer)?.into())
720
            }
721
            TransactionRepr::Blob => {
722
0
                Ok(<Blob as Deserialize>::decode_static(buffer)?.into())
723
            }
724
        }
725
4.38k
    }
_RINvXs8_NtCseSMGV7FMBK4_7fuel_tx11transactionNtB6_11TransactionNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
696
4.38k
    fn decode_static<I: fuel_types::canonical::Input + ?Sized>(
697
4.38k
        buffer: &mut I,
698
4.38k
    ) -> Result<Self, Error> {
699
4.38k
        let mut discriminant_buffer = [0u8; 8];
700
4.38k
        buffer.peek(&mut discriminant_buffer)?;
701
702
4.38k
        let discriminant =
703
4.38k
            <TransactionRepr as Deserialize>::decode(&mut &discriminant_buffer[..])?;
704
705
4.38k
        match discriminant {
706
            TransactionRepr::Script => {
707
2.19k
                Ok(<Script as Deserialize>::decode_static(buffer)?.into())
708
            }
709
            TransactionRepr::Create => {
710
2.19k
                Ok(<Create as Deserialize>::decode_static(buffer)?.into())
711
            }
712
            TransactionRepr::Mint => {
713
0
                Ok(<Mint as Deserialize>::decode_static(buffer)?.into())
714
            }
715
            TransactionRepr::Upgrade => {
716
0
                Ok(<Upgrade as Deserialize>::decode_static(buffer)?.into())
717
            }
718
            TransactionRepr::Upload => {
719
0
                Ok(<Upload as Deserialize>::decode_static(buffer)?.into())
720
            }
721
            TransactionRepr::Blob => {
722
0
                Ok(<Blob as Deserialize>::decode_static(buffer)?.into())
723
            }
724
        }
725
4.38k
    }
Unexecuted instantiation: _RINvXs8_NtCseSMGV7FMBK4_7fuel_tx11transactionNtB6_11TransactionNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEB8_
726
727
4.38k
    fn decode_dynamic<I: fuel_types::canonical::Input + ?Sized>(
728
4.38k
        &mut self,
729
4.38k
        buffer: &mut I,
730
4.38k
    ) -> Result<(), Error> {
731
4.38k
        match self {
732
2.19k
            Self::Script(tx) => tx.decode_dynamic(buffer),
733
2.19k
            Self::Create(tx) => tx.decode_dynamic(buffer),
734
0
            Self::Mint(tx) => tx.decode_dynamic(buffer),
735
0
            Self::Upgrade(tx) => tx.decode_dynamic(buffer),
736
0
            Self::Upload(tx) => tx.decode_dynamic(buffer),
737
0
            Self::Blob(tx) => tx.decode_dynamic(buffer),
738
        }
739
4.38k
    }
_RINvXs8_NtCseSMGV7FMBK4_7fuel_tx11transactionNtB6_11TransactionNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
727
4.38k
    fn decode_dynamic<I: fuel_types::canonical::Input + ?Sized>(
728
4.38k
        &mut self,
729
4.38k
        buffer: &mut I,
730
4.38k
    ) -> Result<(), Error> {
731
4.38k
        match self {
732
2.19k
            Self::Script(tx) => tx.decode_dynamic(buffer),
733
2.19k
            Self::Create(tx) => tx.decode_dynamic(buffer),
734
0
            Self::Mint(tx) => tx.decode_dynamic(buffer),
735
0
            Self::Upgrade(tx) => tx.decode_dynamic(buffer),
736
0
            Self::Upload(tx) => tx.decode_dynamic(buffer),
737
0
            Self::Blob(tx) => tx.decode_dynamic(buffer),
738
        }
739
4.38k
    }
Unexecuted instantiation: _RINvXs8_NtCseSMGV7FMBK4_7fuel_tx11transactionNtB6_11TransactionNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEB8_
740
}
741
742
/// The module contains traits for each possible field in the `Transaction`. Those traits
743
/// can be used to write generic code based on the different combinations of the fields.
744
pub mod field {
745
    use crate::{
746
        input,
747
        output,
748
        policies,
749
        Input,
750
        Output,
751
        StorageSlot,
752
        UpgradePurpose as UpgradePurposeType,
753
        Witness,
754
    };
755
    use fuel_types::{
756
        AssetId,
757
        BlockHeight,
758
        Bytes32,
759
        Word,
760
    };
761
762
    use crate::policies::PolicyType;
763
    use alloc::vec::Vec;
764
    use core::ops::{
765
        Deref,
766
        DerefMut,
767
    };
768
769
    pub trait Tip {
770
        fn tip(&self) -> Word;
771
        fn set_tip(&mut self, value: Word);
772
    }
773
774
    impl<T: Policies + ?Sized> Tip for T {
775
        #[inline(always)]
776
8.77k
        fn tip(&self) -> Word {
777
8.77k
            self.policies().get(PolicyType::Tip).unwrap_or_default()
778
8.77k
        }
Unexecuted instantiation: _RNvXNtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtBQ_4blob8BlobBodyNtB1O_12BlobMetadataENtB2_3Tip3tipCsg6P9hFxt0iW_7fuel_vm
_RNvXNtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtBQ_6create10CreateBodyNtB1O_14CreateMetadataENtB2_3Tip3tipCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
776
4.38k
        fn tip(&self) -> Word {
777
4.38k
            self.policies().get(PolicyType::Tip).unwrap_or_default()
778
4.38k
        }
_RNvXNtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtBQ_6script10ScriptBodyNtB1O_14ScriptMetadataENtB2_3Tip3tipCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
776
4.38k
        fn tip(&self) -> Word {
777
4.38k
            self.policies().get(PolicyType::Tip).unwrap_or_default()
778
4.38k
        }
Unexecuted instantiation: _RNvXNtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtBQ_4blob8BlobBodyNtB1O_12BlobMetadataENtB2_3Tip3tipB6_
Unexecuted instantiation: _RNvXNtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtBQ_6create10CreateBodyNtB1O_14CreateMetadataENtB2_3Tip3tipB6_
Unexecuted instantiation: _RNvXNtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtBQ_6script10ScriptBodyNtB1O_14ScriptMetadataENtB2_3Tip3tipB6_
Unexecuted instantiation: _RNvXNtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtBQ_6upload10UploadBodyNtB1O_14UploadMetadataENtB2_3Tip3tipB6_
Unexecuted instantiation: _RNvXNtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtBQ_7upgrade11UpgradeBodyNtB1O_15UpgradeMetadataENtB2_3Tip3tipB6_
779
780
        #[inline(always)]
781
0
        fn set_tip(&mut self, price: Word) {
782
0
            self.policies_mut().set(PolicyType::Tip, Some(price))
783
0
        }
784
    }
785
786
    pub trait WitnessLimit {
787
        fn witness_limit(&self) -> Word;
788
        fn set_witness_limit(&mut self, value: Word);
789
    }
790
791
    impl<T: Policies + ?Sized> WitnessLimit for T {
792
        #[inline(always)]
793
26.3k
        fn witness_limit(&self) -> Word {
794
26.3k
            self.policies().get(PolicyType::WitnessLimit).unwrap_or(0)
795
26.3k
        }
_RNvXs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtBS_6script10ScriptBodyNtB1Q_14ScriptMetadataENtB4_12WitnessLimit13witness_limitCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
793
13.1k
        fn witness_limit(&self) -> Word {
794
13.1k
            self.policies().get(PolicyType::WitnessLimit).unwrap_or(0)
795
13.1k
        }
Unexecuted instantiation: _RNvXs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtBS_4blob8BlobBodyNtB1Q_12BlobMetadataENtB4_12WitnessLimit13witness_limitCsg6P9hFxt0iW_7fuel_vm
_RNvXs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtBS_6create10CreateBodyNtB1Q_14CreateMetadataENtB4_12WitnessLimit13witness_limitCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
793
13.1k
        fn witness_limit(&self) -> Word {
794
13.1k
            self.policies().get(PolicyType::WitnessLimit).unwrap_or(0)
795
13.1k
        }
Unexecuted instantiation: _RNvXs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtBS_6upload10UploadBodyNtB1Q_14UploadMetadataENtB4_12WitnessLimit13witness_limitCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtBS_7upgrade11UpgradeBodyNtB1Q_15UpgradeMetadataENtB4_12WitnessLimit13witness_limitCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtBS_6script10ScriptBodyNtB1Q_14ScriptMetadataENtB4_12WitnessLimit13witness_limitB8_
Unexecuted instantiation: _RNvXs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtBS_4blob8BlobBodyNtB1Q_12BlobMetadataENtB4_12WitnessLimit13witness_limitB8_
Unexecuted instantiation: _RNvXs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtBS_6create10CreateBodyNtB1Q_14CreateMetadataENtB4_12WitnessLimit13witness_limitB8_
Unexecuted instantiation: _RNvXs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtBS_6upload10UploadBodyNtB1Q_14UploadMetadataENtB4_12WitnessLimit13witness_limitB8_
Unexecuted instantiation: _RNvXs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtBS_7upgrade11UpgradeBodyNtB1Q_15UpgradeMetadataENtB4_12WitnessLimit13witness_limitB8_
796
797
        #[inline(always)]
798
0
        fn set_witness_limit(&mut self, value: Word) {
799
0
            self.policies_mut()
800
0
                .set(PolicyType::WitnessLimit, Some(value))
801
0
        }
802
    }
803
804
    pub trait ScriptGasLimit {
805
        fn script_gas_limit(&self) -> &Word;
806
        fn script_gas_limit_mut(&mut self) -> &mut Word;
807
0
        fn script_gas_limit_offset(&self) -> usize {
808
0
            Self::script_gas_limit_offset_static()
809
0
        }
810
811
        fn script_gas_limit_offset_static() -> usize;
812
    }
813
814
    pub trait Maturity {
815
        fn maturity(&self) -> BlockHeight;
816
        fn set_maturity(&mut self, value: BlockHeight);
817
    }
818
819
    impl<T: Policies + ?Sized> Maturity for T {
820
        #[inline(always)]
821
4.38k
        fn maturity(&self) -> BlockHeight {
822
4.38k
            self.policies()
823
4.38k
                .get(PolicyType::Maturity)
824
4.38k
                .map(|value| u32::try_from(value).unwrap_or(u32::MAX).into())
Unexecuted instantiation: _RNCNvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB9_5types22chargeable_transaction21ChargeableTransactionNtNtBV_4blob8BlobBodyNtB1T_12BlobMetadataENtB7_8Maturity8maturity0Csg6P9hFxt0iW_7fuel_vm
_RNCNvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB9_5types22chargeable_transaction21ChargeableTransactionNtNtBV_6create10CreateBodyNtB1T_14CreateMetadataENtB7_8Maturity8maturity0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
824
2.19k
                .map(|value| u32::try_from(value).unwrap_or(u32::MAX).into())
Unexecuted instantiation: _RNCNvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB9_5types22chargeable_transaction21ChargeableTransactionNtNtBV_6script10ScriptBodyNtB1T_14ScriptMetadataENtB7_8Maturity8maturity0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB9_5types22chargeable_transaction21ChargeableTransactionNtNtBV_6upload10UploadBodyNtB1T_14UploadMetadataENtB7_8Maturity8maturity0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB9_5types22chargeable_transaction21ChargeableTransactionNtNtBV_7upgrade11UpgradeBodyNtB1T_15UpgradeMetadataENtB7_8Maturity8maturity0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB9_5types22chargeable_transaction21ChargeableTransactionNtNtBV_4blob8BlobBodyNtB1T_12BlobMetadataENtB7_8Maturity8maturity0Bb_
Unexecuted instantiation: _RNCNvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB9_5types22chargeable_transaction21ChargeableTransactionNtNtBV_6create10CreateBodyNtB1T_14CreateMetadataENtB7_8Maturity8maturity0Bb_
Unexecuted instantiation: _RNCNvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB9_5types22chargeable_transaction21ChargeableTransactionNtNtBV_6script10ScriptBodyNtB1T_14ScriptMetadataENtB7_8Maturity8maturity0Bb_
Unexecuted instantiation: _RNCNvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB9_5types22chargeable_transaction21ChargeableTransactionNtNtBV_6upload10UploadBodyNtB1T_14UploadMetadataENtB7_8Maturity8maturity0Bb_
Unexecuted instantiation: _RNCNvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB9_5types22chargeable_transaction21ChargeableTransactionNtNtBV_7upgrade11UpgradeBodyNtB1T_15UpgradeMetadataENtB7_8Maturity8maturity0Bb_
825
4.38k
                .unwrap_or_default()
826
4.38k
        }
Unexecuted instantiation: _RNvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_4blob8BlobBodyNtB1R_12BlobMetadataENtB5_8Maturity8maturityCsg6P9hFxt0iW_7fuel_vm
_RNvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_6create10CreateBodyNtB1R_14CreateMetadataENtB5_8Maturity8maturityCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
821
2.19k
        fn maturity(&self) -> BlockHeight {
822
2.19k
            self.policies()
823
2.19k
                .get(PolicyType::Maturity)
824
2.19k
                .map(|value| u32::try_from(value).unwrap_or(u32::MAX).into())
825
2.19k
                .unwrap_or_default()
826
2.19k
        }
_RNvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_6script10ScriptBodyNtB1R_14ScriptMetadataENtB5_8Maturity8maturityCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
821
2.19k
        fn maturity(&self) -> BlockHeight {
822
2.19k
            self.policies()
823
2.19k
                .get(PolicyType::Maturity)
824
2.19k
                .map(|value| u32::try_from(value).unwrap_or(u32::MAX).into())
825
2.19k
                .unwrap_or_default()
826
2.19k
        }
Unexecuted instantiation: _RNvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_6upload10UploadBodyNtB1R_14UploadMetadataENtB5_8Maturity8maturityCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_7upgrade11UpgradeBodyNtB1R_15UpgradeMetadataENtB5_8Maturity8maturityCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_4blob8BlobBodyNtB1R_12BlobMetadataENtB5_8Maturity8maturityB9_
Unexecuted instantiation: _RNvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_6create10CreateBodyNtB1R_14CreateMetadataENtB5_8Maturity8maturityB9_
Unexecuted instantiation: _RNvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_6script10ScriptBodyNtB1R_14ScriptMetadataENtB5_8Maturity8maturityB9_
Unexecuted instantiation: _RNvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_6upload10UploadBodyNtB1R_14UploadMetadataENtB5_8Maturity8maturityB9_
Unexecuted instantiation: _RNvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_7upgrade11UpgradeBodyNtB1R_15UpgradeMetadataENtB5_8Maturity8maturityB9_
827
828
        #[inline(always)]
829
2.19k
        fn set_maturity(&mut self, block_height: BlockHeight) {
830
2.19k
            self.policies_mut()
831
2.19k
                .set(PolicyType::Maturity, Some(*block_height.deref() as u64))
832
2.19k
        }
_RNvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_6create10CreateBodyNtB1R_14CreateMetadataENtB5_8Maturity12set_maturityCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
829
2.19k
        fn set_maturity(&mut self, block_height: BlockHeight) {
830
2.19k
            self.policies_mut()
831
2.19k
                .set(PolicyType::Maturity, Some(*block_height.deref() as u64))
832
2.19k
        }
Unexecuted instantiation: _RNvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_4blob8BlobBodyNtB1R_12BlobMetadataENtB5_8Maturity12set_maturityCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_6script10ScriptBodyNtB1R_14ScriptMetadataENtB5_8Maturity12set_maturityCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXININtNtCseSMGV7FMBK4_7fuel_tx11transaction5fields0_0pEpNtB5_8Maturity12set_maturityB9_
833
    }
834
835
    pub trait MaxFeeLimit {
836
        fn max_fee_limit(&self) -> Word;
837
        fn set_max_fee_limit(&mut self, value: Word);
838
    }
839
840
    impl<T: Policies + ?Sized> MaxFeeLimit for T {
841
        #[inline(always)]
842
8.77k
        fn max_fee_limit(&self) -> Word {
843
8.77k
            self.policies().get(PolicyType::MaxFee).unwrap_or(0)
844
8.77k
        }
Unexecuted instantiation: _RNvXs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_4blob8BlobBodyNtB1R_12BlobMetadataENtB5_11MaxFeeLimit13max_fee_limitCsg6P9hFxt0iW_7fuel_vm
_RNvXs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_6create10CreateBodyNtB1R_14CreateMetadataENtB5_11MaxFeeLimit13max_fee_limitCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
842
4.38k
        fn max_fee_limit(&self) -> Word {
843
4.38k
            self.policies().get(PolicyType::MaxFee).unwrap_or(0)
844
4.38k
        }
_RNvXs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_6script10ScriptBodyNtB1R_14ScriptMetadataENtB5_11MaxFeeLimit13max_fee_limitCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
842
4.38k
        fn max_fee_limit(&self) -> Word {
843
4.38k
            self.policies().get(PolicyType::MaxFee).unwrap_or(0)
844
4.38k
        }
Unexecuted instantiation: _RNvXs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_6upload10UploadBodyNtB1R_14UploadMetadataENtB5_11MaxFeeLimit13max_fee_limitCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_7upgrade11UpgradeBodyNtB1R_15UpgradeMetadataENtB5_11MaxFeeLimit13max_fee_limitCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_4blob8BlobBodyNtB1R_12BlobMetadataENtB5_11MaxFeeLimit13max_fee_limitB9_
Unexecuted instantiation: _RNvXs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_6create10CreateBodyNtB1R_14CreateMetadataENtB5_11MaxFeeLimit13max_fee_limitB9_
Unexecuted instantiation: _RNvXs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_6script10ScriptBodyNtB1R_14ScriptMetadataENtB5_11MaxFeeLimit13max_fee_limitB9_
Unexecuted instantiation: _RNvXs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_6upload10UploadBodyNtB1R_14UploadMetadataENtB5_11MaxFeeLimit13max_fee_limitB9_
Unexecuted instantiation: _RNvXs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_7upgrade11UpgradeBodyNtB1R_15UpgradeMetadataENtB5_11MaxFeeLimit13max_fee_limitB9_
845
846
        #[inline(always)]
847
4.38k
        fn set_max_fee_limit(&mut self, value: Word) {
848
4.38k
            self.policies_mut().set(PolicyType::MaxFee, Some(value))
849
4.38k
        }
_RNvXs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_6script10ScriptBodyNtB1R_14ScriptMetadataENtB5_11MaxFeeLimit17set_max_fee_limitCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
847
2.19k
        fn set_max_fee_limit(&mut self, value: Word) {
848
2.19k
            self.policies_mut().set(PolicyType::MaxFee, Some(value))
849
2.19k
        }
_RNvXs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_6create10CreateBodyNtB1R_14CreateMetadataENtB5_11MaxFeeLimit17set_max_fee_limitCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
847
2.19k
        fn set_max_fee_limit(&mut self, value: Word) {
848
2.19k
            self.policies_mut().set(PolicyType::MaxFee, Some(value))
849
2.19k
        }
Unexecuted instantiation: _RNvXs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_4blob8BlobBodyNtB1R_12BlobMetadataENtB5_11MaxFeeLimit17set_max_fee_limitCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction5fieldINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtBT_6script10ScriptBodyNtB1R_14ScriptMetadataENtB5_11MaxFeeLimit17set_max_fee_limitB9_
850
    }
851
852
    pub trait TxPointer {
853
        fn tx_pointer(&self) -> &crate::TxPointer;
854
        fn tx_pointer_mut(&mut self) -> &mut crate::TxPointer;
855
0
        fn tx_pointer_offset(&self) -> usize {
856
0
            Self::tx_pointer_static()
857
0
        }
858
859
        fn tx_pointer_static() -> usize;
860
    }
861
862
    pub trait InputContract {
863
        fn input_contract(&self) -> &input::contract::Contract;
864
        fn input_contract_mut(&mut self) -> &mut input::contract::Contract;
865
        fn input_contract_offset(&self) -> usize;
866
    }
867
868
    pub trait OutputContract {
869
        fn output_contract(&self) -> &output::contract::Contract;
870
        fn output_contract_mut(&mut self) -> &mut output::contract::Contract;
871
        fn output_contract_offset(&self) -> usize;
872
    }
873
874
    pub trait MintAmount {
875
        fn mint_amount(&self) -> &Word;
876
        fn mint_amount_mut(&mut self) -> &mut Word;
877
        fn mint_amount_offset(&self) -> usize;
878
    }
879
880
    pub trait MintAssetId {
881
        fn mint_asset_id(&self) -> &AssetId;
882
        fn mint_asset_id_mut(&mut self) -> &mut AssetId;
883
        fn mint_asset_id_offset(&self) -> usize;
884
    }
885
886
    pub trait MintGasPrice {
887
        fn gas_price(&self) -> &Word;
888
        fn gas_price_mut(&mut self) -> &mut Word;
889
        fn gas_price_offset(&self) -> usize;
890
    }
891
892
    pub trait ReceiptsRoot {
893
        fn receipts_root(&self) -> &Bytes32;
894
        fn receipts_root_mut(&mut self) -> &mut Bytes32;
895
0
        fn receipts_root_offset(&self) -> usize {
896
0
            Self::receipts_root_offset_static()
897
0
        }
898
899
        fn receipts_root_offset_static() -> usize;
900
    }
901
902
    pub trait Script {
903
        fn script(&self) -> &Vec<u8>;
904
        fn script_mut(&mut self) -> &mut Vec<u8>;
905
414k
        fn script_offset(&self) -> usize {
906
414k
            Self::script_offset_static()
907
414k
        }
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtB9_5field6Script13script_offsetCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
905
384k
        fn script_offset(&self) -> usize {
906
384k
            Self::script_offset_static()
907
384k
        }
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtB9_5field6Script13script_offsetBb_
Line
Count
Source
905
30.7k
        fn script_offset(&self) -> usize {
906
30.7k
            Self::script_offset_static()
907
30.7k
        }
908
909
        fn script_offset_static() -> usize;
910
    }
911
912
    pub trait ScriptData {
913
        fn script_data(&self) -> &Vec<u8>;
914
        fn script_data_mut(&mut self) -> &mut Vec<u8>;
915
        fn script_data_offset(&self) -> usize;
916
    }
917
918
    pub trait ChargeableBody<Body> {
919
        fn body(&self) -> &Body;
920
        fn body_mut(&mut self) -> &mut Body;
921
        fn body_offset_end(&self) -> usize;
922
    }
923
924
    pub trait Policies {
925
        fn policies(&self) -> &policies::Policies;
926
        fn policies_mut(&mut self) -> &mut policies::Policies;
927
        fn policies_offset(&self) -> usize;
928
    }
929
930
    pub trait BytecodeWitnessIndex {
931
        fn bytecode_witness_index(&self) -> &u16;
932
        fn bytecode_witness_index_mut(&mut self) -> &mut u16;
933
0
        fn bytecode_witness_index_offset(&self) -> usize {
934
0
            Self::bytecode_witness_index_offset_static()
935
0
        }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtNtB9_5field20BytecodeWitnessIndex29bytecode_witness_index_offsetBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtB9_5field20BytecodeWitnessIndex29bytecode_witness_index_offsetBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1D_14UploadMetadataENtNtB9_5field20BytecodeWitnessIndex29bytecode_witness_index_offsetBb_
936
937
        fn bytecode_witness_index_offset_static() -> usize;
938
    }
939
940
    pub trait Salt {
941
        fn salt(&self) -> &fuel_types::Salt;
942
        fn salt_mut(&mut self) -> &mut fuel_types::Salt;
943
0
        fn salt_offset(&self) -> usize {
944
0
            Self::salt_offset_static()
945
0
        }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtB9_5field4Salt11salt_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtB9_5field4Salt11salt_offsetBb_
946
947
        fn salt_offset_static() -> usize;
948
    }
949
950
    pub trait StorageSlots {
951
        fn storage_slots(&self) -> &Vec<StorageSlot>;
952
        fn storage_slots_mut(&mut self) -> StorageSlotRef;
953
        fn storage_slots_offset_static() -> usize;
954
955
        /// Returns the offset to the `StorageSlot` at `idx` index, if any.
956
        fn storage_slots_offset_at(&self, idx: usize) -> Option<usize>;
957
    }
958
959
    /// Reference object for mutating storage slots which will automatically
960
    /// sort the slots when dropped.
961
    pub struct StorageSlotRef<'a> {
962
        pub(crate) storage_slots: &'a mut Vec<StorageSlot>,
963
    }
964
965
    impl<'a> AsMut<Vec<StorageSlot>> for StorageSlotRef<'a> {
966
0
        fn as_mut(&mut self) -> &mut Vec<StorageSlot> {
967
0
            self.storage_slots
968
0
        }
969
    }
970
971
    impl<'a> Deref for StorageSlotRef<'a> {
972
        type Target = [StorageSlot];
973
974
0
        fn deref(&self) -> &Self::Target {
975
0
            self.storage_slots.deref()
976
0
        }
977
    }
978
979
    impl<'a> DerefMut for StorageSlotRef<'a> {
980
0
        fn deref_mut(&mut self) -> &mut Self::Target {
981
0
            self.storage_slots.deref_mut()
982
0
        }
983
    }
984
985
    /// Ensure the storage slots are sorted after being set
986
    impl<'a> Drop for StorageSlotRef<'a> {
987
0
        fn drop(&mut self) {
988
0
            self.storage_slots.sort()
989
0
        }
990
    }
991
992
    pub trait Inputs {
993
        fn inputs(&self) -> &Vec<Input>;
994
        fn inputs_mut(&mut self) -> &mut Vec<Input>;
995
        fn inputs_offset(&self) -> usize;
996
997
        /// Returns the offset to the `Input` at `idx` index, if any.
998
        fn inputs_offset_at(&self, idx: usize) -> Option<usize>;
999
1000
        /// Returns predicate's offset and length of the `Input` at `idx`, if any.
1001
        fn inputs_predicate_offset_at(&self, idx: usize) -> Option<(usize, usize)>;
1002
    }
1003
1004
    pub trait Outputs {
1005
        fn outputs(&self) -> &Vec<Output>;
1006
        fn outputs_mut(&mut self) -> &mut Vec<Output>;
1007
        fn outputs_offset(&self) -> usize;
1008
1009
        /// Returns the offset to the `Output` at `idx` index, if any.
1010
        fn outputs_offset_at(&self, idx: usize) -> Option<usize>;
1011
    }
1012
1013
    pub trait Witnesses {
1014
        fn witnesses(&self) -> &Vec<Witness>;
1015
        fn witnesses_mut(&mut self) -> &mut Vec<Witness>;
1016
        fn witnesses_offset(&self) -> usize;
1017
1018
        /// Returns the offset to the `Witness` at `idx` index, if any.
1019
        fn witnesses_offset_at(&self, idx: usize) -> Option<usize>;
1020
    }
1021
1022
    pub trait UpgradePurpose {
1023
        fn upgrade_purpose(&self) -> &UpgradePurposeType;
1024
        fn upgrade_purpose_mut(&mut self) -> &mut UpgradePurposeType;
1025
0
        fn upgrade_purpose_offset(&self) -> usize {
1026
0
            Self::upgrade_purpose_offset_static()
1027
0
        }
1028
1029
        fn upgrade_purpose_offset_static() -> usize;
1030
    }
1031
1032
    pub trait BytecodeRoot {
1033
        fn bytecode_root(&self) -> &Bytes32;
1034
        fn bytecode_root_mut(&mut self) -> &mut Bytes32;
1035
0
        fn bytecode_root_offset(&self) -> usize {
1036
0
            Self::bytecode_root_offset_static()
1037
0
        }
1038
1039
        fn bytecode_root_offset_static() -> usize;
1040
    }
1041
1042
    pub trait BlobId {
1043
        fn blob_id(&self) -> &fuel_types::BlobId;
1044
        fn blob_id_mut(&mut self) -> &mut fuel_types::BlobId;
1045
0
        fn blob_id_offset(&self) -> usize {
1046
0
            Self::blob_id_offset_static()
1047
0
        }
1048
1049
        fn blob_id_offset_static() -> usize;
1050
    }
1051
1052
    pub trait SubsectionIndex {
1053
        fn subsection_index(&self) -> &u16;
1054
        fn subsection_index_mut(&mut self) -> &mut u16;
1055
0
        fn subsection_index_offset(&self) -> usize {
1056
0
            Self::subsection_index_offset_static()
1057
0
        }
1058
1059
        fn subsection_index_offset_static() -> usize;
1060
    }
1061
1062
    pub trait SubsectionsNumber {
1063
        fn subsections_number(&self) -> &u16;
1064
        fn subsections_number_mut(&mut self) -> &mut u16;
1065
0
        fn subsections_number_offset(&self) -> usize {
1066
0
            Self::subsections_number_offset_static()
1067
0
        }
1068
1069
        fn subsections_number_offset_static() -> usize;
1070
    }
1071
1072
    pub trait ProofSet {
1073
        fn proof_set(&self) -> &Vec<Bytes32>;
1074
        fn proof_set_mut(&mut self) -> &mut Vec<Bytes32>;
1075
0
        fn proof_set_offset(&self) -> usize {
1076
0
            Self::proof_set_offset_static()
1077
0
        }
1078
1079
        fn proof_set_offset_static() -> usize;
1080
    }
1081
}
1082
1083
#[cfg(feature = "typescript")]
1084
pub mod typescript {
1085
    use wasm_bindgen::prelude::*;
1086
1087
    use crate::{
1088
        transaction::{
1089
            input_ts::Input,
1090
            output_ts::Output,
1091
            Policies,
1092
        },
1093
        AssetId,
1094
        Witness,
1095
        Word,
1096
    };
1097
    use alloc::{
1098
        boxed::Box,
1099
        format,
1100
        string::String,
1101
        vec::Vec,
1102
    };
1103
    use fuel_types::Bytes32;
1104
1105
    #[derive(Debug, Clone, Eq, Hash, PartialEq, serde::Serialize, serde::Deserialize)]
1106
    #[wasm_bindgen]
1107
    pub struct Transaction(#[wasm_bindgen(skip)] pub Box<crate::Transaction>);
1108
1109
    #[derive(
1110
        Default, Debug, Clone, Eq, Hash, PartialEq, serde::Serialize, serde::Deserialize,
1111
    )]
1112
    #[wasm_bindgen]
1113
    pub struct Create(#[wasm_bindgen(skip)] pub Box<crate::Create>);
1114
1115
    #[derive(
1116
        Default, Debug, Clone, Eq, Hash, PartialEq, serde::Serialize, serde::Deserialize,
1117
    )]
1118
    #[wasm_bindgen]
1119
    pub struct Script(#[wasm_bindgen(skip)] pub Box<crate::Script>);
1120
1121
    #[derive(
1122
        Default, Debug, Clone, Eq, Hash, PartialEq, serde::Serialize, serde::Deserialize,
1123
    )]
1124
    #[wasm_bindgen]
1125
    pub struct Mint(#[wasm_bindgen(skip)] pub Box<crate::Mint>);
1126
1127
    #[derive(
1128
        Default, Debug, Clone, Eq, Hash, PartialEq, serde::Serialize, serde::Deserialize,
1129
    )]
1130
    #[wasm_bindgen]
1131
    pub struct Upgrade(#[wasm_bindgen(skip)] pub Box<crate::Upgrade>);
1132
1133
    #[derive(Debug, Clone, Eq, Hash, PartialEq, serde::Serialize, serde::Deserialize)]
1134
    #[wasm_bindgen]
1135
    pub struct UpgradePurpose(#[wasm_bindgen(skip)] pub Box<crate::UpgradePurpose>);
1136
1137
    #[derive(
1138
        Default, Debug, Clone, Eq, Hash, PartialEq, serde::Serialize, serde::Deserialize,
1139
    )]
1140
    #[wasm_bindgen]
1141
    pub struct Upload(#[wasm_bindgen(skip)] pub Box<crate::Upload>);
1142
1143
    #[wasm_bindgen]
1144
    impl Transaction {
1145
        #[wasm_bindgen(js_name = toJSON)]
1146
        pub fn to_json(&self) -> String {
1147
            serde_json::to_string(&self.0).expect("unable to json format")
1148
        }
1149
1150
        #[wasm_bindgen(js_name = toString)]
1151
        pub fn typescript_to_string(&self) -> String {
1152
            format!("{:?}", self.0)
1153
        }
1154
1155
        #[wasm_bindgen(js_name = to_bytes)]
1156
        pub fn typescript_to_bytes(&self) -> Vec<u8> {
1157
            use fuel_types::canonical::Serialize;
1158
            self.0.to_bytes()
1159
        }
1160
1161
        #[wasm_bindgen(js_name = from_bytes)]
1162
        pub fn typescript_from_bytes(value: &[u8]) -> Result<Transaction, js_sys::Error> {
1163
            use fuel_types::canonical::Deserialize;
1164
            crate::Transaction::from_bytes(value)
1165
                .map(|v| Transaction(Box::new(v)))
1166
                .map_err(|e| js_sys::Error::new(&format!("{:?}", e)))
1167
        }
1168
1169
        #[wasm_bindgen]
1170
        pub fn script(
1171
            gas_limit: Word,
1172
            script: Vec<u8>,
1173
            script_data: Vec<u8>,
1174
            policies: Policies,
1175
            inputs: Vec<Input>,
1176
            outputs: Vec<Output>,
1177
            witnesses: Vec<Witness>,
1178
        ) -> Script {
1179
            Script(
1180
                crate::Transaction::script(
1181
                    gas_limit,
1182
                    script,
1183
                    script_data,
1184
                    policies,
1185
                    inputs.into_iter().map(|v| *v.0).collect(),
1186
                    outputs.into_iter().map(|v| *v.0).collect(),
1187
                    witnesses,
1188
                )
1189
                .into(),
1190
            )
1191
        }
1192
1193
        #[wasm_bindgen]
1194
        pub fn create(
1195
            bytecode_witness_index: u16,
1196
            policies: Policies,
1197
            salt: crate::Salt,
1198
            storage_slots: Vec<crate::StorageSlot>,
1199
            inputs: Vec<Input>,
1200
            outputs: Vec<Output>,
1201
            witnesses: Vec<Witness>,
1202
        ) -> Create {
1203
            Create(
1204
                crate::Transaction::create(
1205
                    bytecode_witness_index,
1206
                    policies,
1207
                    salt,
1208
                    storage_slots,
1209
                    inputs.into_iter().map(|v| *v.0).collect(),
1210
                    outputs.into_iter().map(|v| *v.0).collect(),
1211
                    witnesses,
1212
                )
1213
                .into(),
1214
            )
1215
        }
1216
1217
        #[wasm_bindgen]
1218
        pub fn mint(
1219
            tx_pointer: crate::TxPointer,
1220
            input_contract: crate::input::contract::Contract,
1221
            output_contract: crate::output::contract::Contract,
1222
            mint_amount: Word,
1223
            mint_asset_id: AssetId,
1224
            gas_price: Word,
1225
        ) -> Mint {
1226
            Mint(
1227
                crate::Mint {
1228
                    tx_pointer,
1229
                    input_contract,
1230
                    output_contract,
1231
                    mint_amount,
1232
                    mint_asset_id,
1233
                    gas_price,
1234
                    metadata: None,
1235
                }
1236
                .into(),
1237
            )
1238
        }
1239
1240
        #[wasm_bindgen]
1241
        pub fn upgrade(
1242
            purpose: UpgradePurpose,
1243
            policies: Policies,
1244
            inputs: Vec<Input>,
1245
            outputs: Vec<Output>,
1246
            witnesses: Vec<Witness>,
1247
        ) -> Upgrade {
1248
            Upgrade(
1249
                crate::Transaction::upgrade(
1250
                    *purpose.0.as_ref(),
1251
                    policies,
1252
                    inputs.into_iter().map(|v| *v.0).collect(),
1253
                    outputs.into_iter().map(|v| *v.0).collect(),
1254
                    witnesses,
1255
                )
1256
                .into(),
1257
            )
1258
        }
1259
1260
        #[wasm_bindgen]
1261
        pub fn upload(
1262
            root: Bytes32,
1263
            witness_index: u16,
1264
            subsection_index: u16,
1265
            subsections_number: u16,
1266
            proof_set: Vec<Bytes32>,
1267
            policies: Policies,
1268
            inputs: Vec<Input>,
1269
            outputs: Vec<Output>,
1270
            witnesses: Vec<Witness>,
1271
        ) -> Upload {
1272
            Upload(
1273
                crate::Transaction::upload(
1274
                    crate::UploadBody {
1275
                        root,
1276
                        witness_index,
1277
                        subsection_index,
1278
                        subsections_number,
1279
                        proof_set,
1280
                    },
1281
                    policies,
1282
                    inputs.into_iter().map(|v| *v.0).collect(),
1283
                    outputs.into_iter().map(|v| *v.0).collect(),
1284
                    witnesses,
1285
                )
1286
                .into(),
1287
            )
1288
        }
1289
    }
1290
1291
    macro_rules! ts_methods {
1292
        ($t:ty, $tx:expr) => {
1293
            #[wasm_bindgen]
1294
            impl $t {
1295
                #[wasm_bindgen(js_name = as_tx)]
1296
                pub fn typescript_wrap_tx(self) -> Transaction {
1297
                    Transaction(Box::new($tx(self.0.as_ref().clone())))
1298
                }
1299
1300
                #[wasm_bindgen(constructor)]
1301
                pub fn typescript_new() -> $t {
1302
                    <$t>::default()
1303
                }
1304
1305
                #[wasm_bindgen(js_name = toJSON)]
1306
                pub fn to_json(&self) -> String {
1307
                    serde_json::to_string(&self).expect("unable to json format")
1308
                }
1309
1310
                #[wasm_bindgen(js_name = toString)]
1311
                pub fn typescript_to_string(&self) -> String {
1312
                    format!("{:?}", self)
1313
                }
1314
1315
                #[wasm_bindgen(js_name = to_bytes)]
1316
                pub fn typescript_to_bytes(&self) -> Vec<u8> {
1317
                    use fuel_types::canonical::Serialize;
1318
                    <_ as Serialize>::to_bytes(self.0.as_ref())
1319
                }
1320
1321
                #[wasm_bindgen(js_name = from_bytes)]
1322
                pub fn typescript_from_bytes(value: &[u8]) -> Result<$t, js_sys::Error> {
1323
                    use fuel_types::canonical::Deserialize;
1324
                    let res = <_ as Deserialize>::from_bytes(value)
1325
                        .map_err(|e| js_sys::Error::new(&format!("{:?}", e)))?;
1326
                    Ok(Self(Box::new(res)))
1327
                }
1328
            }
1329
        };
1330
    }
1331
1332
    ts_methods!(Script, crate::Transaction::Script);
1333
    ts_methods!(Create, crate::Transaction::Create);
1334
    ts_methods!(Mint, crate::Transaction::Mint);
1335
    ts_methods!(Upgrade, crate::Transaction::Upgrade);
1336
    ts_methods!(Upload, crate::Transaction::Upload);
1337
}
1338
1339
#[allow(non_snake_case)]
1340
#[cfg(test)]
1341
mod tests {
1342
    use super::*;
1343
1344
    #[test]
1345
    fn script__metered_bytes_size___includes_witnesses() {
1346
        let witness = [0u8; 64].to_vec();
1347
        let script_with_no_witnesses = Transaction::script(
1348
            Default::default(),
1349
            vec![],
1350
            vec![],
1351
            Default::default(),
1352
            vec![],
1353
            vec![],
1354
            vec![],
1355
        );
1356
        let script_with_witnesses = Transaction::script(
1357
            Default::default(),
1358
            vec![],
1359
            vec![],
1360
            Default::default(),
1361
            vec![],
1362
            vec![],
1363
            vec![witness.clone().into()],
1364
        );
1365
1366
        assert_eq!(
1367
            script_with_witnesses.metered_bytes_size(),
1368
            script_with_no_witnesses.metered_bytes_size() + witness.size()
1369
        );
1370
    }
1371
1372
    #[test]
1373
    fn create__metered_bytes_size___includes_witnesses() {
1374
        let witness = [0u8; 64].to_vec();
1375
        let create_with_no_witnesses = Transaction::create(
1376
            0,
1377
            Default::default(),
1378
            Default::default(),
1379
            vec![],
1380
            vec![],
1381
            vec![],
1382
            vec![],
1383
        );
1384
        let create_with_witnesses = Transaction::create(
1385
            0,
1386
            Default::default(),
1387
            Default::default(),
1388
            vec![],
1389
            vec![],
1390
            vec![],
1391
            vec![witness.clone().into()],
1392
        );
1393
        assert_eq!(
1394
            create_with_witnesses.metered_bytes_size(),
1395
            create_with_no_witnesses.metered_bytes_size() + witness.size()
1396
        );
1397
    }
1398
1399
    #[test]
1400
    fn upgrade__metered_bytes_size___includes_witnesses() {
1401
        let witness = [0u8; 64].to_vec();
1402
        let tx_with_no_witnesses = Transaction::upgrade(
1403
            UpgradePurpose::StateTransition {
1404
                root: Default::default(),
1405
            },
1406
            Default::default(),
1407
            vec![],
1408
            vec![],
1409
            vec![],
1410
        );
1411
        let tx_with_witnesses = Transaction::upgrade(
1412
            UpgradePurpose::StateTransition {
1413
                root: Default::default(),
1414
            },
1415
            Default::default(),
1416
            vec![],
1417
            vec![],
1418
            vec![witness.clone().into()],
1419
        );
1420
        assert_eq!(
1421
            tx_with_witnesses.metered_bytes_size(),
1422
            tx_with_no_witnesses.metered_bytes_size() + witness.size()
1423
        );
1424
    }
1425
1426
    #[test]
1427
    fn upload__metered_bytes_size__includes_witness() {
1428
        let witness = [0u8; 64].to_vec();
1429
        let tx_with_no_witnesses = Transaction::upload(
1430
            Default::default(),
1431
            Default::default(),
1432
            vec![],
1433
            vec![],
1434
            vec![],
1435
        );
1436
        let tx_with_witnesses = Transaction::upload(
1437
            Default::default(),
1438
            Default::default(),
1439
            vec![],
1440
            vec![],
1441
            vec![witness.clone().into()],
1442
        );
1443
        assert_eq!(
1444
            tx_with_witnesses.metered_bytes_size(),
1445
            tx_with_no_witnesses.metered_bytes_size() + witness.size()
1446
        );
1447
    }
1448
}
/home/marten/fuel/fuel-vm/fuel-tx/src/builder.rs
Line
Count
Source
1
use crate::{
2
    input,
3
    output,
4
    transaction::{
5
        field::{
6
            self,
7
            BytecodeWitnessIndex,
8
            Maturity,
9
            Tip,
10
            Witnesses,
11
        },
12
        Chargeable,
13
        Create,
14
        Executable,
15
        Script,
16
    },
17
    Blob,
18
    BlobBody,
19
    ConsensusParameters,
20
    ContractParameters,
21
    CreateMetadata,
22
    FeeParameters,
23
    GasCosts,
24
    Input,
25
    Mint,
26
    Output,
27
    PredicateParameters,
28
    ScriptParameters,
29
    StorageSlot,
30
    Transaction,
31
    TxParameters,
32
    TxPointer,
33
    Upgrade,
34
    UpgradePurpose,
35
    Upload,
36
    UploadBody,
37
    Witness,
38
};
39
40
use crate::{
41
    Cacheable,
42
    Signable,
43
};
44
45
use crate::{
46
    field::{
47
        MaxFeeLimit,
48
        Outputs,
49
        WitnessLimit,
50
    },
51
    policies::Policies,
52
    transaction::{
53
        CreateBody,
54
        ScriptBody,
55
        UpgradeBody,
56
    },
57
};
58
use alloc::{
59
    collections::BTreeMap,
60
    vec::Vec,
61
};
62
use fuel_crypto::SecretKey;
63
use fuel_types::{
64
    AssetId,
65
    BlockHeight,
66
    ChainId,
67
    Nonce,
68
    Salt,
69
    Word,
70
};
71
#[cfg(feature = "rand")]
72
use rand::{
73
    rngs::StdRng,
74
    Rng,
75
};
76
77
pub trait BuildableAloc
78
where
79
    Self: Default + Clone + Executable + Chargeable + field::Policies + Into<Transaction>,
80
{
81
}
82
83
pub trait BuildableStd: Signable + Cacheable {}
84
85
pub trait BuildableSet: BuildableAloc + BuildableStd {}
86
87
pub trait Buildable
88
where
89
    Self: BuildableSet,
90
{
91
    /// Append an input to the transaction
92
2.19k
    fn add_input(&mut self, input: Input) {
93
2.19k
        self.inputs_mut().push(input)
94
2.19k
    }
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtBb_7builder9Buildable9add_inputCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
92
2.19k
    fn add_input(&mut self, input: Input) {
93
2.19k
        self.inputs_mut().push(input)
94
2.19k
    }
Unexecuted instantiation: _RNvYpNtNtCseSMGV7FMBK4_7fuel_tx7builder9Buildable9add_inputB7_
95
96
    /// Append a witness to the transaction
97
0
    fn add_witness(&mut self, witness: Witness) {
98
0
        self.witnesses_mut().push(witness);
99
0
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtBb_7builder9Buildable11add_witnessCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtNtBb_7builder9Buildable11add_witnessCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvYpNtNtCseSMGV7FMBK4_7fuel_tx7builder9Buildable11add_witnessB7_
100
101
    /// Set the `Script`'s gas limit
102
4.38k
    fn set_script_gas_limit(&mut self, limit: Word)
103
4.38k
    where
104
4.38k
        Self: field::ScriptGasLimit,
105
4.38k
    {
106
4.38k
        *self.script_gas_limit_mut() = limit;
107
4.38k
    }
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtBb_7builder9Buildable20set_script_gas_limitCs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
102
2.19k
    fn set_script_gas_limit(&mut self, limit: Word)
103
2.19k
    where
104
2.19k
        Self: field::ScriptGasLimit,
105
2.19k
    {
106
2.19k
        *self.script_gas_limit_mut() = limit;
107
2.19k
    }
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtBb_7builder9Buildable20set_script_gas_limitCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
102
2.19k
    fn set_script_gas_limit(&mut self, limit: Word)
103
2.19k
    where
104
2.19k
        Self: field::ScriptGasLimit,
105
2.19k
    {
106
2.19k
        *self.script_gas_limit_mut() = limit;
107
2.19k
    }
Unexecuted instantiation: _RNvYpNtNtCseSMGV7FMBK4_7fuel_tx7builder9Buildable20set_script_gas_limitB7_
108
}
109
110
impl<T> BuildableAloc for T where
111
    Self: Default + Clone + Executable + Chargeable + field::Policies + Into<Transaction>
112
{
113
}
114
115
impl<T> BuildableStd for T where T: Signable + Cacheable {}
116
117
impl<T> BuildableSet for T where T: BuildableAloc + BuildableStd {}
118
119
impl<T> Buildable for T where T: BuildableSet {}
120
121
#[derive(Debug, Clone)]
122
pub struct TransactionBuilder<Tx> {
123
    tx: Tx,
124
125
    params: ConsensusParameters,
126
127
    // We take the key by reference so this lib won't have the responsibility to properly
128
    // zeroize the keys
129
    // Maps signing keys -> witness indexes
130
    sign_keys: BTreeMap<SecretKey, u16>,
131
}
132
133
impl TransactionBuilder<Script> {
134
4.38k
    pub fn script(script: Vec<u8>, script_data: Vec<u8>) -> Self {
135
4.38k
        let tx = Script {
136
4.38k
            body: ScriptBody {
137
4.38k
                script_gas_limit: Default::default(),
138
4.38k
                receipts_root: Default::default(),
139
4.38k
                script: script.into(),
140
4.38k
                script_data,
141
4.38k
            },
142
4.38k
            policies: Policies::new().with_max_fee(0),
143
4.38k
            inputs: Default::default(),
144
4.38k
            outputs: Default::default(),
145
4.38k
            witnesses: Default::default(),
146
4.38k
            metadata: None,
147
4.38k
        };
148
4.38k
        Self::with_tx(tx)
149
4.38k
    }
150
}
151
152
impl TransactionBuilder<Create> {
153
2.19k
    pub fn create(
154
2.19k
        bytecode: Witness,
155
2.19k
        salt: Salt,
156
2.19k
        mut storage_slots: Vec<StorageSlot>,
157
2.19k
    ) -> Self {
158
2.19k
        // sort the storage slots before initializing the builder
159
2.19k
        storage_slots.sort();
160
2.19k
        let mut tx = Create {
161
2.19k
            body: CreateBody {
162
2.19k
                bytecode_witness_index: Default::default(),
163
2.19k
                salt,
164
2.19k
                storage_slots,
165
2.19k
            },
166
2.19k
            policies: Policies::new().with_max_fee(0),
167
2.19k
            inputs: Default::default(),
168
2.19k
            outputs: Default::default(),
169
2.19k
            witnesses: Default::default(),
170
2.19k
            metadata: None,
171
2.19k
        };
172
2.19k
173
2.19k
        *tx.bytecode_witness_index_mut() = 0;
174
2.19k
175
2.19k
        tx.witnesses_mut().push(bytecode);
176
2.19k
177
2.19k
        Self::with_tx(tx)
178
2.19k
    }
179
180
2.19k
    pub fn add_contract_created(&mut self) -> &mut Self {
181
2.19k
        let create_metadata = CreateMetadata::compute(&self.tx)
182
2.19k
            .expect("Should be able to compute metadata");
183
2.19k
184
2.19k
        self.tx.outputs_mut().push(Output::contract_created(
185
2.19k
            create_metadata.contract_id,
186
2.19k
            create_metadata.state_root,
187
2.19k
        ));
188
2.19k
        self
189
2.19k
    }
190
}
191
192
impl TransactionBuilder<Upgrade> {
193
0
    pub fn upgrade(purpose: UpgradePurpose) -> Self {
194
0
        let tx = Upgrade {
195
0
            body: UpgradeBody { purpose },
196
0
            policies: Policies::new().with_max_fee(0),
197
0
            inputs: Default::default(),
198
0
            outputs: Default::default(),
199
0
            witnesses: Default::default(),
200
0
            metadata: None,
201
0
        };
202
0
        Self::with_tx(tx)
203
0
    }
204
}
205
206
impl TransactionBuilder<Upload> {
207
0
    pub fn upload(body: UploadBody) -> Self {
208
0
        let tx = Upload {
209
0
            body,
210
0
            policies: Policies::new().with_max_fee(0),
211
0
            inputs: Default::default(),
212
0
            outputs: Default::default(),
213
0
            witnesses: Default::default(),
214
0
            metadata: None,
215
0
        };
216
0
        Self::with_tx(tx)
217
0
    }
218
}
219
220
impl TransactionBuilder<Blob> {
221
0
    pub fn blob(body: BlobBody) -> Self {
222
0
        let tx = Blob {
223
0
            body,
224
0
            policies: Policies::new().with_max_fee(0),
225
0
            inputs: Default::default(),
226
0
            outputs: Default::default(),
227
0
            witnesses: Default::default(),
228
0
            metadata: None,
229
0
        };
230
0
        Self::with_tx(tx)
231
0
    }
232
}
233
234
impl TransactionBuilder<Mint> {
235
0
    pub fn mint(
236
0
        block_height: BlockHeight,
237
0
        tx_index: u16,
238
0
        input_contract: input::contract::Contract,
239
0
        output_contract: output::contract::Contract,
240
0
        mint_amount: Word,
241
0
        mint_asset_id: AssetId,
242
0
        gas_price: Word,
243
0
    ) -> Self {
244
0
        let tx = Mint {
245
0
            tx_pointer: TxPointer::new(block_height, tx_index),
246
0
            input_contract,
247
0
            output_contract,
248
0
            mint_amount,
249
0
            mint_asset_id,
250
0
            gas_price,
251
0
            metadata: None,
252
0
        };
253
0
254
0
        Self::with_tx(tx)
255
0
    }
256
}
257
258
impl<Tx> TransactionBuilder<Tx> {
259
6.57k
    fn with_tx(tx: Tx) -> Self {
260
6.57k
        let sign_keys = BTreeMap::new();
261
6.57k
262
6.57k
        Self {
263
6.57k
            tx,
264
6.57k
            params: ConsensusParameters::standard(),
265
6.57k
            sign_keys,
266
6.57k
        }
267
6.57k
    }
_RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE7with_txB7_
Line
Count
Source
259
4.38k
    fn with_tx(tx: Tx) -> Self {
260
4.38k
        let sign_keys = BTreeMap::new();
261
4.38k
262
4.38k
        Self {
263
4.38k
            tx,
264
4.38k
            params: ConsensusParameters::standard(),
265
4.38k
            sign_keys,
266
4.38k
        }
267
4.38k
    }
_RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6create10CreateBodyNtB2j_14CreateMetadataEE7with_txB7_
Line
Count
Source
259
2.19k
    fn with_tx(tx: Tx) -> Self {
260
2.19k
        let sign_keys = BTreeMap::new();
261
2.19k
262
2.19k
        Self {
263
2.19k
            tx,
264
2.19k
            params: ConsensusParameters::standard(),
265
2.19k
            sign_keys,
266
2.19k
        }
267
2.19k
    }
Unexecuted instantiation: _RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_7upgrade11UpgradeBodyNtB2j_15UpgradeMetadataEE7with_txB7_
Unexecuted instantiation: _RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6upload10UploadBodyNtB2j_14UploadMetadataEE7with_txB7_
Unexecuted instantiation: _RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_4blob8BlobBodyNtB2j_12BlobMetadataEE7with_txB7_
Unexecuted instantiation: _RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderNtNtNtNtB7_11transaction5types4mint4MintE7with_txB7_
268
269
2.19k
    pub fn get_params(&self) -> &ConsensusParameters {
270
2.19k
        &self.params
271
2.19k
    }
Unexecuted instantiation: _RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6create10CreateBodyNtB2j_14CreateMetadataEE10get_paramsCsg6P9hFxt0iW_7fuel_vm
_RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE10get_paramsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
269
2.19k
    pub fn get_params(&self) -> &ConsensusParameters {
270
2.19k
        &self.params
271
2.19k
    }
Unexecuted instantiation: _RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderpE10get_paramsB7_
272
273
0
    pub fn get_tx_params(&self) -> &TxParameters {
274
0
        self.params.tx_params()
275
0
    }
276
277
0
    pub fn get_predicate_params(&self) -> &PredicateParameters {
278
0
        self.params.predicate_params()
279
0
    }
280
281
0
    pub fn get_script_params(&self) -> &ScriptParameters {
282
0
        self.params.script_params()
283
0
    }
284
285
0
    pub fn get_contract_params(&self) -> &ContractParameters {
286
0
        self.params.contract_params()
287
0
    }
288
289
0
    pub fn get_fee_params(&self) -> &FeeParameters {
290
0
        self.params.fee_params()
291
0
    }
292
293
8.77k
    pub fn get_chain_id(&self) -> ChainId {
294
8.77k
        self.params.chain_id()
295
8.77k
    }
Unexecuted instantiation: _RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_4blob8BlobBodyNtB2j_12BlobMetadataEE12get_chain_idCsg6P9hFxt0iW_7fuel_vm
_RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6create10CreateBodyNtB2j_14CreateMetadataEE12get_chain_idCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
293
4.38k
    pub fn get_chain_id(&self) -> ChainId {
294
4.38k
        self.params.chain_id()
295
4.38k
    }
_RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE12get_chain_idCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
293
4.38k
    pub fn get_chain_id(&self) -> ChainId {
294
4.38k
        self.params.chain_id()
295
4.38k
    }
Unexecuted instantiation: _RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE12get_chain_idB7_
Unexecuted instantiation: _RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderNtNtNtNtB7_11transaction5types4mint4MintE12get_chain_idB7_
296
297
0
    pub fn with_params(&mut self, params: ConsensusParameters) -> &mut Self {
298
0
        self.params = params;
299
0
        self
300
0
    }
301
302
2.19k
    pub fn with_tx_params(&mut self, tx_params: TxParameters) -> &mut Self {
303
2.19k
        self.params.set_tx_params(tx_params);
304
2.19k
        self
305
2.19k
    }
_RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE14with_tx_paramsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
302
2.19k
    pub fn with_tx_params(&mut self, tx_params: TxParameters) -> &mut Self {
303
2.19k
        self.params.set_tx_params(tx_params);
304
2.19k
        self
305
2.19k
    }
Unexecuted instantiation: _RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6create10CreateBodyNtB2j_14CreateMetadataEE14with_tx_paramsCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderpE14with_tx_paramsB7_
306
307
2.19k
    pub fn with_predicate_params(
308
2.19k
        &mut self,
309
2.19k
        predicate_params: PredicateParameters,
310
2.19k
    ) -> &mut Self {
311
2.19k
        self.params.set_predicate_params(predicate_params);
312
2.19k
        self
313
2.19k
    }
_RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE21with_predicate_paramsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
307
2.19k
    pub fn with_predicate_params(
308
2.19k
        &mut self,
309
2.19k
        predicate_params: PredicateParameters,
310
2.19k
    ) -> &mut Self {
311
2.19k
        self.params.set_predicate_params(predicate_params);
312
2.19k
        self
313
2.19k
    }
Unexecuted instantiation: _RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderpE21with_predicate_paramsB7_
314
315
2.19k
    pub fn with_script_params(&mut self, script_params: ScriptParameters) -> &mut Self {
316
2.19k
        self.params.set_script_params(script_params);
317
2.19k
        self
318
2.19k
    }
_RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE18with_script_paramsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
315
2.19k
    pub fn with_script_params(&mut self, script_params: ScriptParameters) -> &mut Self {
316
2.19k
        self.params.set_script_params(script_params);
317
2.19k
        self
318
2.19k
    }
Unexecuted instantiation: _RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderpE18with_script_paramsB7_
319
320
2.19k
    pub fn with_contract_params(
321
2.19k
        &mut self,
322
2.19k
        contract_params: ContractParameters,
323
2.19k
    ) -> &mut Self {
324
2.19k
        self.params.set_contract_params(contract_params);
325
2.19k
        self
326
2.19k
    }
_RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE20with_contract_paramsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
320
2.19k
    pub fn with_contract_params(
321
2.19k
        &mut self,
322
2.19k
        contract_params: ContractParameters,
323
2.19k
    ) -> &mut Self {
324
2.19k
        self.params.set_contract_params(contract_params);
325
2.19k
        self
326
2.19k
    }
Unexecuted instantiation: _RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderpE20with_contract_paramsB7_
327
328
2.19k
    pub fn with_fee_params(&mut self, fee_params: FeeParameters) -> &mut Self {
329
2.19k
        self.params.set_fee_params(fee_params);
330
2.19k
        self
331
2.19k
    }
_RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE15with_fee_paramsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
328
2.19k
    pub fn with_fee_params(&mut self, fee_params: FeeParameters) -> &mut Self {
329
2.19k
        self.params.set_fee_params(fee_params);
330
2.19k
        self
331
2.19k
    }
Unexecuted instantiation: _RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderpE15with_fee_paramsB7_
332
333
0
    pub fn with_chain_id(&mut self, chain_id: ChainId) -> &mut Self {
334
0
        self.params.set_chain_id(chain_id);
335
0
        self
336
0
    }
337
338
0
    pub fn with_gas_costs(&mut self, gas_costs: GasCosts) -> &mut Self {
339
0
        self.params.set_gas_costs(gas_costs);
340
0
        self
341
0
    }
342
343
2.19k
    pub fn with_base_asset_id(&mut self, base_asset_id: AssetId) -> &mut Self {
344
2.19k
        self.params.set_base_asset_id(base_asset_id);
345
2.19k
        self
346
2.19k
    }
_RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE18with_base_asset_idCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
343
2.19k
    pub fn with_base_asset_id(&mut self, base_asset_id: AssetId) -> &mut Self {
344
2.19k
        self.params.set_base_asset_id(base_asset_id);
345
2.19k
        self
346
2.19k
    }
Unexecuted instantiation: _RNvMs8_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderpE18with_base_asset_idB7_
347
348
0
    pub fn with_block_gas_limit(&mut self, block_gas_limit: u64) -> &mut Self {
349
0
        self.params.set_block_gas_limit(block_gas_limit);
350
0
        self
351
0
    }
352
}
353
354
impl<Tx: Buildable> TransactionBuilder<Tx> {
355
0
    pub fn sign_keys(&self) -> impl Iterator<Item = &SecretKey> {
356
0
        self.sign_keys.keys()
357
0
    }
358
359
0
    pub fn tip(&mut self, tip: Word) -> &mut Self {
360
0
        self.tx.set_tip(tip);
361
0
        self
362
0
    }
363
364
4.38k
    pub fn script_gas_limit(&mut self, gas_limit: Word) -> &mut Self
365
4.38k
    where
366
4.38k
        Tx: field::ScriptGasLimit,
367
4.38k
    {
368
4.38k
        self.tx.set_script_gas_limit(gas_limit);
369
4.38k
370
4.38k
        self
371
4.38k
    }
_RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE16script_gas_limitCs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
364
2.19k
    pub fn script_gas_limit(&mut self, gas_limit: Word) -> &mut Self
365
2.19k
    where
366
2.19k
        Tx: field::ScriptGasLimit,
367
2.19k
    {
368
2.19k
        self.tx.set_script_gas_limit(gas_limit);
369
2.19k
370
2.19k
        self
371
2.19k
    }
_RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE16script_gas_limitCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
364
2.19k
    pub fn script_gas_limit(&mut self, gas_limit: Word) -> &mut Self
365
2.19k
    where
366
2.19k
        Tx: field::ScriptGasLimit,
367
2.19k
    {
368
2.19k
        self.tx.set_script_gas_limit(gas_limit);
369
2.19k
370
2.19k
        self
371
2.19k
    }
Unexecuted instantiation: _RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderpE16script_gas_limitB7_
372
373
2.19k
    pub fn maturity(&mut self, maturity: BlockHeight) -> &mut Self {
374
2.19k
        self.tx.set_maturity(maturity);
375
2.19k
376
2.19k
        self
377
2.19k
    }
_RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6create10CreateBodyNtB2j_14CreateMetadataEE8maturityCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
373
2.19k
    pub fn maturity(&mut self, maturity: BlockHeight) -> &mut Self {
374
2.19k
        self.tx.set_maturity(maturity);
375
2.19k
376
2.19k
        self
377
2.19k
    }
Unexecuted instantiation: _RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_4blob8BlobBodyNtB2j_12BlobMetadataEE8maturityCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE8maturityCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderpE8maturityB7_
378
379
0
    pub fn witness_limit(&mut self, witness_limit: Word) -> &mut Self {
380
0
        self.tx.set_witness_limit(witness_limit);
381
0
382
0
        self
383
0
    }
384
385
4.38k
    pub fn max_fee_limit(&mut self, max_fee: Word) -> &mut Self {
386
4.38k
        self.tx.set_max_fee_limit(max_fee);
387
4.38k
388
4.38k
        self
389
4.38k
    }
_RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE13max_fee_limitCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
385
2.19k
    pub fn max_fee_limit(&mut self, max_fee: Word) -> &mut Self {
386
2.19k
        self.tx.set_max_fee_limit(max_fee);
387
2.19k
388
2.19k
        self
389
2.19k
    }
_RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6create10CreateBodyNtB2j_14CreateMetadataEE13max_fee_limitCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
385
2.19k
    pub fn max_fee_limit(&mut self, max_fee: Word) -> &mut Self {
386
2.19k
        self.tx.set_max_fee_limit(max_fee);
387
2.19k
388
2.19k
        self
389
2.19k
    }
Unexecuted instantiation: _RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_4blob8BlobBodyNtB2j_12BlobMetadataEE13max_fee_limitCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE13max_fee_limitB7_
390
391
4.38k
    pub fn add_unsigned_coin_input(
392
4.38k
        &mut self,
393
4.38k
        secret: SecretKey,
394
4.38k
        utxo_id: crate::UtxoId,
395
4.38k
        amount: Word,
396
4.38k
        asset_id: fuel_types::AssetId,
397
4.38k
        tx_pointer: TxPointer,
398
4.38k
    ) -> &mut Self {
399
4.38k
        let pk = secret.public_key();
400
4.38k
401
4.38k
        let witness_index = self.upsert_secret(secret);
402
4.38k
403
4.38k
        self.tx.add_unsigned_coin_input(
404
4.38k
            utxo_id,
405
4.38k
            &pk,
406
4.38k
            amount,
407
4.38k
            asset_id,
408
4.38k
            tx_pointer,
409
4.38k
            witness_index,
410
4.38k
        );
411
4.38k
412
4.38k
        self
413
4.38k
    }
Unexecuted instantiation: _RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_4blob8BlobBodyNtB2j_12BlobMetadataEE23add_unsigned_coin_inputCsg6P9hFxt0iW_7fuel_vm
_RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6create10CreateBodyNtB2j_14CreateMetadataEE23add_unsigned_coin_inputCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
391
2.19k
    pub fn add_unsigned_coin_input(
392
2.19k
        &mut self,
393
2.19k
        secret: SecretKey,
394
2.19k
        utxo_id: crate::UtxoId,
395
2.19k
        amount: Word,
396
2.19k
        asset_id: fuel_types::AssetId,
397
2.19k
        tx_pointer: TxPointer,
398
2.19k
    ) -> &mut Self {
399
2.19k
        let pk = secret.public_key();
400
2.19k
401
2.19k
        let witness_index = self.upsert_secret(secret);
402
2.19k
403
2.19k
        self.tx.add_unsigned_coin_input(
404
2.19k
            utxo_id,
405
2.19k
            &pk,
406
2.19k
            amount,
407
2.19k
            asset_id,
408
2.19k
            tx_pointer,
409
2.19k
            witness_index,
410
2.19k
        );
411
2.19k
412
2.19k
        self
413
2.19k
    }
_RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE23add_unsigned_coin_inputCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
391
2.19k
    pub fn add_unsigned_coin_input(
392
2.19k
        &mut self,
393
2.19k
        secret: SecretKey,
394
2.19k
        utxo_id: crate::UtxoId,
395
2.19k
        amount: Word,
396
2.19k
        asset_id: fuel_types::AssetId,
397
2.19k
        tx_pointer: TxPointer,
398
2.19k
    ) -> &mut Self {
399
2.19k
        let pk = secret.public_key();
400
2.19k
401
2.19k
        let witness_index = self.upsert_secret(secret);
402
2.19k
403
2.19k
        self.tx.add_unsigned_coin_input(
404
2.19k
            utxo_id,
405
2.19k
            &pk,
406
2.19k
            amount,
407
2.19k
            asset_id,
408
2.19k
            tx_pointer,
409
2.19k
            witness_index,
410
2.19k
        );
411
2.19k
412
2.19k
        self
413
2.19k
    }
Unexecuted instantiation: _RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE23add_unsigned_coin_inputB7_
414
415
    #[cfg(feature = "rand")]
416
0
    pub fn add_random_fee_input(&mut self, rng: &mut StdRng) -> &mut Self {
417
0
        self.add_unsigned_coin_input(
418
0
            SecretKey::random(rng),
419
0
            rng.gen(),
420
0
            u32::MAX as u64,
421
0
            *self.params.base_asset_id(),
422
0
            Default::default(),
423
0
        )
424
0
    }
425
426
    #[cfg(feature = "rand")]
427
2.19k
    pub fn add_fee_input(&mut self) -> &mut Self {
428
        use rand::{
429
            Rng,
430
            SeedableRng,
431
        };
432
2.19k
        let mut rng = rand::rngs::StdRng::seed_from_u64(2322u64);
433
2.19k
        self.add_unsigned_coin_input(
434
2.19k
            SecretKey::random(&mut rng),
435
2.19k
            rng.gen(),
436
2.19k
            u32::MAX as u64,
437
2.19k
            *self.params.base_asset_id(),
438
2.19k
            Default::default(),
439
2.19k
        )
440
2.19k
    }
Unexecuted instantiation: _RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_4blob8BlobBodyNtB2j_12BlobMetadataEE13add_fee_inputCsg6P9hFxt0iW_7fuel_vm
_RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6create10CreateBodyNtB2j_14CreateMetadataEE13add_fee_inputCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
427
2.19k
    pub fn add_fee_input(&mut self) -> &mut Self {
428
        use rand::{
429
            Rng,
430
            SeedableRng,
431
        };
432
2.19k
        let mut rng = rand::rngs::StdRng::seed_from_u64(2322u64);
433
2.19k
        self.add_unsigned_coin_input(
434
2.19k
            SecretKey::random(&mut rng),
435
2.19k
            rng.gen(),
436
2.19k
            u32::MAX as u64,
437
2.19k
            *self.params.base_asset_id(),
438
2.19k
            Default::default(),
439
2.19k
        )
440
2.19k
    }
Unexecuted instantiation: _RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE13add_fee_inputCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE13add_fee_inputB7_
441
442
0
    pub fn add_unsigned_message_input(
443
0
        &mut self,
444
0
        secret: SecretKey,
445
0
        sender: fuel_types::Address,
446
0
        nonce: Nonce,
447
0
        amount: Word,
448
0
        data: Vec<u8>,
449
0
    ) -> &mut Self {
450
0
        let pk = secret.public_key();
451
0
        let recipient = Input::owner(&pk);
452
0
453
0
        let witness_index = self.upsert_secret(secret);
454
0
455
0
        self.tx.add_unsigned_message_input(
456
0
            sender,
457
0
            recipient,
458
0
            nonce,
459
0
            amount,
460
0
            data,
461
0
            witness_index,
462
0
        );
463
0
464
0
        self
465
0
    }
466
467
2.19k
    pub fn inputs(&self) -> &[Input] {
468
2.19k
        self.tx.inputs()
469
2.19k
    }
_RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE6inputsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
467
2.19k
    pub fn inputs(&self) -> &[Input] {
468
2.19k
        self.tx.inputs()
469
2.19k
    }
Unexecuted instantiation: _RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderpE6inputsB7_
470
471
0
    pub fn outputs(&self) -> &[Output] {
472
0
        self.tx.outputs()
473
0
    }
474
475
4.38k
    pub fn witnesses(&self) -> &[Witness] {
476
4.38k
        self.tx.witnesses()
477
4.38k
    }
Unexecuted instantiation: _RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_4blob8BlobBodyNtB2j_12BlobMetadataEE9witnessesCsg6P9hFxt0iW_7fuel_vm
_RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6create10CreateBodyNtB2j_14CreateMetadataEE9witnessesCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
475
2.19k
    pub fn witnesses(&self) -> &[Witness] {
476
2.19k
        self.tx.witnesses()
477
2.19k
    }
_RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE9witnessesCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
475
2.19k
    pub fn witnesses(&self) -> &[Witness] {
476
2.19k
        self.tx.witnesses()
477
2.19k
    }
Unexecuted instantiation: _RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE9witnessesB7_
478
479
2.19k
    pub fn add_input(&mut self, input: Input) -> &mut Self {
480
2.19k
        self.tx.add_input(input);
481
2.19k
482
2.19k
        self
483
2.19k
    }
_RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE9add_inputCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
479
2.19k
    pub fn add_input(&mut self, input: Input) -> &mut Self {
480
2.19k
        self.tx.add_input(input);
481
2.19k
482
2.19k
        self
483
2.19k
    }
Unexecuted instantiation: _RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderpE9add_inputB7_
484
485
0
    pub fn add_witness(&mut self, witness: Witness) -> &mut Self {
486
0
        self.tx.add_witness(witness);
487
0
488
0
        self
489
0
    }
Unexecuted instantiation: _RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE11add_witnessCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_4blob8BlobBodyNtB2j_12BlobMetadataEE11add_witnessCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderpE11add_witnessB7_
490
491
    /// Adds a secret to the builder, and adds a corresponding witness if it's a new entry
492
4.38k
    fn upsert_secret(&mut self, secret_key: SecretKey) -> u16 {
493
4.38k
        let witness_len = u16::try_from(self.witnesses().len())
494
4.38k
            .expect("The number of witnesses can't exceed `u16::MAX`");
495
4.38k
496
4.38k
        if u32::from(witness_len) > self.params.tx_params().max_witnesses() {
497
0
            panic!("Max witnesses exceeded");
498
4.38k
        }
499
4.38k
500
4.38k
        let witness_index = self.sign_keys.entry(secret_key).or_insert_with(|| {
501
4.38k
            // if this private key hasn't been used before,
502
4.38k
            // add a new witness entry and return its index
503
4.38k
            self.tx.witnesses_mut().push(Witness::default());
504
4.38k
            witness_len
505
4.38k
        });
Unexecuted instantiation: _RNCNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB7_18TransactionBuilderINtNtNtNtB9_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB18_4blob8BlobBodyNtB2l_12BlobMetadataEE13upsert_secret0Csg6P9hFxt0iW_7fuel_vm
_RNCNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB7_18TransactionBuilderINtNtNtNtB9_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB18_6create10CreateBodyNtB2l_14CreateMetadataEE13upsert_secret0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
500
2.19k
        let witness_index = self.sign_keys.entry(secret_key).or_insert_with(|| {
501
2.19k
            // if this private key hasn't been used before,
502
2.19k
            // add a new witness entry and return its index
503
2.19k
            self.tx.witnesses_mut().push(Witness::default());
504
2.19k
            witness_len
505
2.19k
        });
_RNCNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB7_18TransactionBuilderINtNtNtNtB9_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB18_6script10ScriptBodyNtB2l_14ScriptMetadataEE13upsert_secret0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
500
2.19k
        let witness_index = self.sign_keys.entry(secret_key).or_insert_with(|| {
501
2.19k
            // if this private key hasn't been used before,
502
2.19k
            // add a new witness entry and return its index
503
2.19k
            self.tx.witnesses_mut().push(Witness::default());
504
2.19k
            witness_len
505
2.19k
        });
Unexecuted instantiation: _RNCNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB7_18TransactionBuilderINtNtNtNtB9_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB18_6script10ScriptBodyNtB2l_14ScriptMetadataEE13upsert_secret0B9_
506
4.38k
        *witness_index
507
4.38k
    }
Unexecuted instantiation: _RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_4blob8BlobBodyNtB2j_12BlobMetadataEE13upsert_secretCsg6P9hFxt0iW_7fuel_vm
_RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6create10CreateBodyNtB2j_14CreateMetadataEE13upsert_secretCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
492
2.19k
    fn upsert_secret(&mut self, secret_key: SecretKey) -> u16 {
493
2.19k
        let witness_len = u16::try_from(self.witnesses().len())
494
2.19k
            .expect("The number of witnesses can't exceed `u16::MAX`");
495
2.19k
496
2.19k
        if u32::from(witness_len) > self.params.tx_params().max_witnesses() {
497
0
            panic!("Max witnesses exceeded");
498
2.19k
        }
499
2.19k
500
2.19k
        let witness_index = self.sign_keys.entry(secret_key).or_insert_with(|| {
501
            // if this private key hasn't been used before,
502
            // add a new witness entry and return its index
503
            self.tx.witnesses_mut().push(Witness::default());
504
            witness_len
505
2.19k
        });
506
2.19k
        *witness_index
507
2.19k
    }
_RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE13upsert_secretCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
492
2.19k
    fn upsert_secret(&mut self, secret_key: SecretKey) -> u16 {
493
2.19k
        let witness_len = u16::try_from(self.witnesses().len())
494
2.19k
            .expect("The number of witnesses can't exceed `u16::MAX`");
495
2.19k
496
2.19k
        if u32::from(witness_len) > self.params.tx_params().max_witnesses() {
497
0
            panic!("Max witnesses exceeded");
498
2.19k
        }
499
2.19k
500
2.19k
        let witness_index = self.sign_keys.entry(secret_key).or_insert_with(|| {
501
            // if this private key hasn't been used before,
502
            // add a new witness entry and return its index
503
            self.tx.witnesses_mut().push(Witness::default());
504
            witness_len
505
2.19k
        });
506
2.19k
        *witness_index
507
2.19k
    }
Unexecuted instantiation: _RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE13upsert_secretB7_
508
509
4.38k
    fn finalize_inner(&self) -> Tx {
510
4.38k
        let mut tx = self.tx.clone();
511
4.38k
512
4.38k
        self.sign_keys
513
4.38k
            .iter()
514
4.38k
            .for_each(|(k, _)| tx.sign_inputs(k, &self.get_chain_id()));
Unexecuted instantiation: _RNCNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB7_18TransactionBuilderINtNtNtNtB9_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB18_4blob8BlobBodyNtB2l_12BlobMetadataEE14finalize_inner0Csg6P9hFxt0iW_7fuel_vm
_RNCNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB7_18TransactionBuilderINtNtNtNtB9_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB18_6create10CreateBodyNtB2l_14CreateMetadataEE14finalize_inner0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
514
2.19k
            .for_each(|(k, _)| tx.sign_inputs(k, &self.get_chain_id()));
_RNCNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB7_18TransactionBuilderINtNtNtNtB9_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB18_6script10ScriptBodyNtB2l_14ScriptMetadataEE14finalize_inner0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
514
2.19k
            .for_each(|(k, _)| tx.sign_inputs(k, &self.get_chain_id()));
Unexecuted instantiation: _RNCNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB7_18TransactionBuilderINtNtNtNtB9_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB18_6script10ScriptBodyNtB2l_14ScriptMetadataEE14finalize_inner0B9_
515
4.38k
516
4.38k
        tx.precompute(&self.get_chain_id())
517
4.38k
            .expect("Should be able to calculate cache");
518
4.38k
519
4.38k
        tx
520
4.38k
    }
Unexecuted instantiation: _RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_4blob8BlobBodyNtB2j_12BlobMetadataEE14finalize_innerCsg6P9hFxt0iW_7fuel_vm
_RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6create10CreateBodyNtB2j_14CreateMetadataEE14finalize_innerCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
509
2.19k
    fn finalize_inner(&self) -> Tx {
510
2.19k
        let mut tx = self.tx.clone();
511
2.19k
512
2.19k
        self.sign_keys
513
2.19k
            .iter()
514
2.19k
            .for_each(|(k, _)| tx.sign_inputs(k, &self.get_chain_id()));
515
2.19k
516
2.19k
        tx.precompute(&self.get_chain_id())
517
2.19k
            .expect("Should be able to calculate cache");
518
2.19k
519
2.19k
        tx
520
2.19k
    }
_RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE14finalize_innerCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
509
2.19k
    fn finalize_inner(&self) -> Tx {
510
2.19k
        let mut tx = self.tx.clone();
511
2.19k
512
2.19k
        self.sign_keys
513
2.19k
            .iter()
514
2.19k
            .for_each(|(k, _)| tx.sign_inputs(k, &self.get_chain_id()));
515
2.19k
516
2.19k
        tx.precompute(&self.get_chain_id())
517
2.19k
            .expect("Should be able to calculate cache");
518
2.19k
519
2.19k
        tx
520
2.19k
    }
Unexecuted instantiation: _RNvMs9_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE14finalize_innerB7_
521
522
0
    pub fn finalize_without_signature_inner(&self) -> Tx {
523
0
        let mut tx = self.tx.clone();
524
0
525
0
        tx.precompute(&self.get_chain_id())
526
0
            .expect("Should be able to calculate cache");
527
0
528
0
        tx
529
0
    }
530
}
531
532
impl<Tx: field::Outputs> TransactionBuilder<Tx> {
533
4.38k
    pub fn add_output(&mut self, output: Output) -> &mut Self {
534
4.38k
        self.tx.outputs_mut().push(output);
535
4.38k
        self
536
4.38k
    }
_RNvMsa_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEE10add_outputCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
533
4.38k
    pub fn add_output(&mut self, output: Output) -> &mut Self {
534
4.38k
        self.tx.outputs_mut().push(output);
535
4.38k
        self
536
4.38k
    }
Unexecuted instantiation: _RNvMsa_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderpE10add_outputB7_
537
}
538
539
pub trait Finalizable<Tx> {
540
    fn finalize(&self) -> Tx;
541
542
    fn finalize_without_signature(&self) -> Tx;
543
}
544
545
impl Finalizable<Mint> for TransactionBuilder<Mint> {
546
0
    fn finalize(&self) -> Mint {
547
0
        let mut tx = self.tx.clone();
548
0
        tx.precompute(&self.get_chain_id())
549
0
            .expect("Should be able to calculate cache");
550
0
        tx
551
0
    }
552
553
0
    fn finalize_without_signature(&self) -> Mint {
554
0
        self.finalize()
555
0
    }
556
}
557
558
impl<Tx> Finalizable<Tx> for TransactionBuilder<Tx>
559
where
560
    Tx: Buildable,
561
{
562
4.38k
    fn finalize(&self) -> Tx {
563
4.38k
        self.finalize_inner()
564
4.38k
    }
_RNvXsc_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6create10CreateBodyNtB2j_14CreateMetadataEEINtB5_11FinalizableB11_E8finalizeCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
562
2.19k
    fn finalize(&self) -> Tx {
563
2.19k
        self.finalize_inner()
564
2.19k
    }
_RNvXsc_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEEINtB5_11FinalizableB11_E8finalizeCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
562
2.19k
    fn finalize(&self) -> Tx {
563
2.19k
        self.finalize_inner()
564
2.19k
    }
Unexecuted instantiation: _RNvXsc_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_4blob8BlobBodyNtB2j_12BlobMetadataEEINtB5_11FinalizableB11_E8finalizeCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXsc_NtCseSMGV7FMBK4_7fuel_tx7builderINtB5_18TransactionBuilderINtNtNtNtB7_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2j_14ScriptMetadataEEINtB5_11FinalizableB11_E8finalizeB7_
565
566
0
    fn finalize_without_signature(&self) -> Tx {
567
0
        self.finalize_without_signature_inner()
568
0
    }
569
}
570
571
impl<Tx> TransactionBuilder<Tx>
572
where
573
    Self: Finalizable<Tx>,
574
    Transaction: From<Tx>,
575
{
576
0
    pub fn finalize_as_transaction(&mut self) -> Transaction {
577
0
        self.finalize().into()
578
0
    }
579
580
0
    pub fn finalize_without_signature_as_transaction(&mut self) -> Transaction {
581
0
        self.finalize_without_signature().into()
582
0
    }
583
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/id.rs
Line
Count
Source
1
use crate::{
2
    field,
3
    input::{
4
        coin::CoinSigned,
5
        message::{
6
            MessageCoinSigned,
7
            MessageDataSigned,
8
        },
9
    },
10
    Input,
11
    Transaction,
12
};
13
use fuel_crypto::{
14
    Message,
15
    PublicKey,
16
    SecretKey,
17
    Signature,
18
};
19
use fuel_types::{
20
    Bytes32,
21
    ChainId,
22
};
23
24
/// Prepares transaction for signing.
25
pub trait PrepareSign {
26
    /// Prepares transaction for signing zeroing required fields.
27
    fn prepare_sign(&mut self);
28
}
29
30
/// Means that transaction has a unique identifier.
31
pub trait UniqueIdentifier {
32
    /// The unique identifier of the transaction is based on its content.
33
    fn id(&self, chain_id: &ChainId) -> Bytes32;
34
35
    /// The cached unique identifier of the transaction.
36
    /// Returns None if transaction was not precomputed.
37
    fn cached_id(&self) -> Option<Bytes32>;
38
}
39
40
impl UniqueIdentifier for Transaction {
41
0
    fn id(&self, chain_id: &ChainId) -> Bytes32 {
42
0
        match self {
43
0
            Self::Script(tx) => tx.id(chain_id),
44
0
            Self::Create(tx) => tx.id(chain_id),
45
0
            Self::Mint(tx) => tx.id(chain_id),
46
0
            Self::Upgrade(tx) => tx.id(chain_id),
47
0
            Self::Upload(tx) => tx.id(chain_id),
48
0
            Self::Blob(tx) => tx.id(chain_id),
49
        }
50
0
    }
51
52
0
    fn cached_id(&self) -> Option<Bytes32> {
53
0
        match self {
54
0
            Self::Script(tx) => tx.cached_id(),
55
0
            Self::Create(tx) => tx.cached_id(),
56
0
            Self::Mint(tx) => tx.cached_id(),
57
0
            Self::Upgrade(tx) => tx.cached_id(),
58
0
            Self::Upload(tx) => tx.cached_id(),
59
0
            Self::Blob(tx) => tx.cached_id(),
60
        }
61
0
    }
62
}
63
64
/// Means that transaction can be singed.
65
///
66
/// # Note: Autogenerated transactions are not signable.
67
pub trait Signable: UniqueIdentifier {
68
    /// Signs inputs of the transaction.
69
    fn sign_inputs(&mut self, secret: &SecretKey, chain_id: &ChainId);
70
}
71
72
impl<T> Signable for T
73
where
74
    T: UniqueIdentifier + field::Witnesses + field::Inputs,
75
{
76
    /// For all inputs of type `coin` or `message`, check if its `owner` equals the public
77
    /// counterpart of the provided key. Sign all matches.
78
4.38k
    fn sign_inputs(&mut self, secret: &SecretKey, chain_id: &ChainId) {
79
        use itertools::Itertools;
80
81
4.38k
        let pk = PublicKey::from(secret);
82
4.38k
        let pk = Input::owner(&pk);
83
4.38k
        let id = self.id(chain_id);
84
4.38k
85
4.38k
        let message = Message::from_bytes_ref(&id);
86
4.38k
87
4.38k
        let signature = Signature::sign(secret, message);
88
4.38k
89
4.38k
        let inputs = self.inputs();
90
4.38k
91
4.38k
        let witness_indexes = inputs
92
4.38k
            .iter()
93
6.57k
            .filter_map(|input| match input {
94
4.38k
                Input::CoinSigned(CoinSigned {
95
4.38k
                    owner,
96
4.38k
                    witness_index,
97
                    ..
98
                })
99
                | Input::MessageCoinSigned(MessageCoinSigned {
100
0
                    recipient: owner,
101
0
                    witness_index,
102
                    ..
103
                })
104
                | Input::MessageDataSigned(MessageDataSigned {
105
0
                    recipient: owner,
106
0
                    witness_index,
107
                    ..
108
4.38k
                }) if owner == &pk => Some(*witness_index as usize),
109
2.19k
                _ => None,
110
6.57k
            })
Unexecuted instantiation: _RNCNvXs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction2idINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtBR_4blob8BlobBodyNtB1P_12BlobMetadataENtB6_8Signable11sign_inputs0Csg6P9hFxt0iW_7fuel_vm
_RNCNvXs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction2idINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtBR_6create10CreateBodyNtB1P_14CreateMetadataENtB6_8Signable11sign_inputs0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
93
2.19k
            .filter_map(|input| match input {
94
2.19k
                Input::CoinSigned(CoinSigned {
95
2.19k
                    owner,
96
2.19k
                    witness_index,
97
                    ..
98
                })
99
                | Input::MessageCoinSigned(MessageCoinSigned {
100
0
                    recipient: owner,
101
0
                    witness_index,
102
                    ..
103
                })
104
                | Input::MessageDataSigned(MessageDataSigned {
105
0
                    recipient: owner,
106
0
                    witness_index,
107
                    ..
108
2.19k
                }) if owner == &pk => Some(*witness_index as usize),
109
0
                _ => None,
110
2.19k
            })
_RNCNvXs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction2idINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtBR_6script10ScriptBodyNtB1P_14ScriptMetadataENtB6_8Signable11sign_inputs0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
93
4.38k
            .filter_map(|input| match input {
94
2.19k
                Input::CoinSigned(CoinSigned {
95
2.19k
                    owner,
96
2.19k
                    witness_index,
97
                    ..
98
                })
99
                | Input::MessageCoinSigned(MessageCoinSigned {
100
0
                    recipient: owner,
101
0
                    witness_index,
102
                    ..
103
                })
104
                | Input::MessageDataSigned(MessageDataSigned {
105
0
                    recipient: owner,
106
0
                    witness_index,
107
                    ..
108
2.19k
                }) if owner == &pk => Some(*witness_index as usize),
109
2.19k
                _ => None,
110
4.38k
            })
Unexecuted instantiation: _RNCNvXs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction2idINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtBR_6script10ScriptBodyNtB1P_14ScriptMetadataENtB6_8Signable11sign_inputs0Ba_
111
4.38k
            .sorted()
112
4.38k
            .dedup()
113
4.38k
            .collect_vec();
114
115
8.77k
        for w in witness_indexes {
116
4.38k
            if let Some(w) = self.witnesses_mut().get_mut(w) {
117
4.38k
                *w = signature.as_ref().into();
118
4.38k
            }
119
        }
120
4.38k
    }
Unexecuted instantiation: _RNvXs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction2idINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtBP_4blob8BlobBodyNtB1N_12BlobMetadataENtB4_8Signable11sign_inputsCsg6P9hFxt0iW_7fuel_vm
_RNvXs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction2idINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtBP_6create10CreateBodyNtB1N_14CreateMetadataENtB4_8Signable11sign_inputsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
78
2.19k
    fn sign_inputs(&mut self, secret: &SecretKey, chain_id: &ChainId) {
79
        use itertools::Itertools;
80
81
2.19k
        let pk = PublicKey::from(secret);
82
2.19k
        let pk = Input::owner(&pk);
83
2.19k
        let id = self.id(chain_id);
84
2.19k
85
2.19k
        let message = Message::from_bytes_ref(&id);
86
2.19k
87
2.19k
        let signature = Signature::sign(secret, message);
88
2.19k
89
2.19k
        let inputs = self.inputs();
90
2.19k
91
2.19k
        let witness_indexes = inputs
92
2.19k
            .iter()
93
2.19k
            .filter_map(|input| match input {
94
                Input::CoinSigned(CoinSigned {
95
                    owner,
96
                    witness_index,
97
                    ..
98
                })
99
                | Input::MessageCoinSigned(MessageCoinSigned {
100
                    recipient: owner,
101
                    witness_index,
102
                    ..
103
                })
104
                | Input::MessageDataSigned(MessageDataSigned {
105
                    recipient: owner,
106
                    witness_index,
107
                    ..
108
                }) if owner == &pk => Some(*witness_index as usize),
109
                _ => None,
110
2.19k
            })
111
2.19k
            .sorted()
112
2.19k
            .dedup()
113
2.19k
            .collect_vec();
114
115
4.38k
        for w in witness_indexes {
116
2.19k
            if let Some(w) = self.witnesses_mut().get_mut(w) {
117
2.19k
                *w = signature.as_ref().into();
118
2.19k
            }
119
        }
120
2.19k
    }
_RNvXs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction2idINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtBP_6script10ScriptBodyNtB1N_14ScriptMetadataENtB4_8Signable11sign_inputsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
78
2.19k
    fn sign_inputs(&mut self, secret: &SecretKey, chain_id: &ChainId) {
79
        use itertools::Itertools;
80
81
2.19k
        let pk = PublicKey::from(secret);
82
2.19k
        let pk = Input::owner(&pk);
83
2.19k
        let id = self.id(chain_id);
84
2.19k
85
2.19k
        let message = Message::from_bytes_ref(&id);
86
2.19k
87
2.19k
        let signature = Signature::sign(secret, message);
88
2.19k
89
2.19k
        let inputs = self.inputs();
90
2.19k
91
2.19k
        let witness_indexes = inputs
92
2.19k
            .iter()
93
2.19k
            .filter_map(|input| match input {
94
                Input::CoinSigned(CoinSigned {
95
                    owner,
96
                    witness_index,
97
                    ..
98
                })
99
                | Input::MessageCoinSigned(MessageCoinSigned {
100
                    recipient: owner,
101
                    witness_index,
102
                    ..
103
                })
104
                | Input::MessageDataSigned(MessageDataSigned {
105
                    recipient: owner,
106
                    witness_index,
107
                    ..
108
                }) if owner == &pk => Some(*witness_index as usize),
109
                _ => None,
110
2.19k
            })
111
2.19k
            .sorted()
112
2.19k
            .dedup()
113
2.19k
            .collect_vec();
114
115
4.38k
        for w in witness_indexes {
116
2.19k
            if let Some(w) = self.witnesses_mut().get_mut(w) {
117
2.19k
                *w = signature.as_ref().into();
118
2.19k
            }
119
        }
120
2.19k
    }
Unexecuted instantiation: _RNvXs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction2idINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtBP_6script10ScriptBodyNtB1N_14ScriptMetadataENtB4_8Signable11sign_inputsB8_
121
}
122
123
#[cfg(test)]
124
mod tests {
125
    use crate::{
126
        field::*,
127
        input,
128
        input::{
129
            coin::{
130
                CoinPredicate,
131
                CoinSigned,
132
            },
133
            message::{
134
                MessageCoinPredicate,
135
                MessageCoinSigned,
136
                MessageDataPredicate,
137
                MessageDataSigned,
138
            },
139
        },
140
        output,
141
        test_helper::{
142
            generate_bytes,
143
            generate_nonempty_padded_bytes,
144
        },
145
        Buildable,
146
        Input,
147
        Output,
148
        StorageSlot,
149
        Transaction,
150
        UpgradePurpose as UpgradePurposeType,
151
        UploadBody,
152
        UtxoId,
153
    };
154
    use core::{
155
        mem,
156
        ops::Not,
157
    };
158
    use fuel_types::{
159
        canonical::{
160
            Deserialize,
161
            Serialize,
162
        },
163
        ChainId,
164
    };
165
    use rand::{
166
        rngs::StdRng,
167
        Rng,
168
        RngCore,
169
        SeedableRng,
170
    };
171
172
    fn invert<B>(mut bytes: B)
173
    where
174
        B: AsMut<[u8]>,
175
    {
176
        bytes.as_mut().iter_mut().for_each(|b| *b = b.not());
177
    }
178
179
    fn invert_utxo_id(utxo_id: &mut UtxoId) {
180
        let mut tx_id = *utxo_id.tx_id();
181
        invert(&mut tx_id);
182
        let out_idx = utxo_id.output_index().not();
183
184
        *utxo_id = UtxoId::new(tx_id, out_idx)
185
    }
186
187
    fn invert_storage_slot(storage_slot: &mut StorageSlot) {
188
        let mut data = storage_slot.to_bytes();
189
        invert(&mut data);
190
        *storage_slot =
191
            StorageSlot::from_bytes(&data).expect("Failed to decode storage slot");
192
    }
193
194
    fn inv_v(bytes: &mut Vec<u8>) {
195
        if bytes.is_empty() {
196
            bytes.push(0xfb);
197
        } else {
198
            invert(bytes.as_mut_slice());
199
        }
200
    }
201
202
    fn not<T>(t: &mut T)
203
    where
204
        T: Copy + Not<Output = T>,
205
    {
206
        let mut t_p = t.not();
207
        mem::swap(t, &mut t_p);
208
    }
209
210
    fn assert_id_eq<Tx: Buildable, F>(tx: &Tx, mut f: F)
211
    where
212
        F: FnMut(&mut Tx),
213
    {
214
        let mut tx_p = tx.clone();
215
216
        let tx_q = tx.clone();
217
218
        f(&mut tx_p);
219
220
        let chain_id = ChainId::default();
221
222
        assert_eq!(tx.id(&chain_id), tx_p.id(&chain_id));
223
        assert_eq!(tx.id(&chain_id), tx_q.id(&chain_id));
224
    }
225
226
    fn assert_id_ne<Tx: Buildable, F>(tx: &Tx, mut f: F)
227
    where
228
        F: FnMut(&mut Tx),
229
    {
230
        let mut tx_p = tx.clone();
231
232
        f(&mut tx_p);
233
234
        let tx_q = tx_p.clone();
235
236
        let chain_id = ChainId::default();
237
238
        assert_ne!(tx.id(&chain_id), tx_p.id(&chain_id));
239
        assert_ne!(tx.id(&chain_id), tx_q.id(&chain_id));
240
    }
241
242
    macro_rules! assert_io_ne {
243
        ($tx:expr, $t:ident, $i:path, $a:ident, $inv:expr) => {
244
            assert_id_ne($tx, |t| {
245
                t.$t().iter_mut().for_each(|x| match x {
246
                    $i { $a, .. } => $inv($a),
247
                    _ => (),
248
                })
249
            });
250
        };
251
        ($tx:expr, $t:ident, $i:path[$it:path], $a:ident, $inv:expr) => {
252
            assert_id_ne($tx, |t| {
253
                t.$t().iter_mut().for_each(|x| match x {
254
                    $i($it { $a, .. }) => $inv($a),
255
                    _ => (),
256
                })
257
            });
258
        };
259
    }
260
261
    macro_rules! assert_io_eq {
262
        ($tx:expr, $t:ident, $i:path, $a:ident, $inv:expr) => {
263
            assert_id_eq($tx, |t| {
264
                t.$t().iter_mut().for_each(|x| match x {
265
                    $i { $a, .. } => $inv($a),
266
                    _ => (),
267
                })
268
            });
269
        };
270
        ($tx:expr, $t:ident, $i:path[$it:path], $a:ident, $inv:expr) => {
271
            assert_id_eq($tx, |t| {
272
                t.$t().iter_mut().for_each(|x| match x {
273
                    $i($it { $a, .. }) => $inv($a),
274
                    _ => (),
275
                })
276
            });
277
        };
278
    }
279
280
    fn assert_id_common_attrs<Tx: Buildable>(tx: &Tx) {
281
        use core::ops::Deref;
282
        assert_id_ne(tx, |t| t.set_tip(t.tip().not()));
283
        assert_id_ne(tx, |t| t.set_maturity((t.maturity().deref().not()).into()));
284
285
        if !tx.inputs().is_empty() {
286
            assert_io_ne!(
287
                tx,
288
                inputs_mut,
289
                Input::CoinSigned[CoinSigned],
290
                utxo_id,
291
                invert_utxo_id
292
            );
293
            assert_io_ne!(tx, inputs_mut, Input::CoinSigned[CoinSigned], owner, invert);
294
            assert_io_ne!(tx, inputs_mut, Input::CoinSigned[CoinSigned], amount, not);
295
            assert_io_ne!(
296
                tx,
297
                inputs_mut,
298
                Input::CoinSigned[CoinSigned],
299
                asset_id,
300
                invert
301
            );
302
            assert_io_ne!(
303
                tx,
304
                inputs_mut,
305
                Input::CoinSigned[CoinSigned],
306
                witness_index,
307
                not
308
            );
309
310
            assert_io_ne!(
311
                tx,
312
                inputs_mut,
313
                Input::CoinPredicate[CoinPredicate],
314
                utxo_id,
315
                invert_utxo_id
316
            );
317
            assert_io_ne!(
318
                tx,
319
                inputs_mut,
320
                Input::CoinPredicate[CoinPredicate],
321
                owner,
322
                invert
323
            );
324
            assert_io_ne!(
325
                tx,
326
                inputs_mut,
327
                Input::CoinPredicate[CoinPredicate],
328
                amount,
329
                not
330
            );
331
            assert_io_ne!(
332
                tx,
333
                inputs_mut,
334
                Input::CoinPredicate[CoinPredicate],
335
                asset_id,
336
                invert
337
            );
338
            assert_io_ne!(
339
                tx,
340
                inputs_mut,
341
                Input::CoinPredicate[CoinPredicate],
342
                predicate,
343
                inv_v
344
            );
345
            assert_io_ne!(
346
                tx,
347
                inputs_mut,
348
                Input::CoinPredicate[CoinPredicate],
349
                predicate_data,
350
                inv_v
351
            );
352
353
            assert_io_eq!(
354
                tx,
355
                inputs_mut,
356
                Input::Contract[input::contract::Contract],
357
                utxo_id,
358
                invert_utxo_id
359
            );
360
            assert_io_eq!(
361
                tx,
362
                inputs_mut,
363
                Input::Contract[input::contract::Contract],
364
                balance_root,
365
                invert
366
            );
367
            assert_io_eq!(
368
                tx,
369
                inputs_mut,
370
                Input::Contract[input::contract::Contract],
371
                state_root,
372
                invert
373
            );
374
            assert_io_ne!(
375
                tx,
376
                inputs_mut,
377
                Input::Contract[input::contract::Contract],
378
                contract_id,
379
                invert
380
            );
381
382
            assert_io_ne!(
383
                tx,
384
                inputs_mut,
385
                Input::MessageCoinSigned[MessageCoinSigned],
386
                sender,
387
                invert
388
            );
389
            assert_io_ne!(
390
                tx,
391
                inputs_mut,
392
                Input::MessageCoinSigned[MessageCoinSigned],
393
                recipient,
394
                invert
395
            );
396
            assert_io_ne!(
397
                tx,
398
                inputs_mut,
399
                Input::MessageCoinSigned[MessageCoinSigned],
400
                amount,
401
                not
402
            );
403
            assert_io_ne!(
404
                tx,
405
                inputs_mut,
406
                Input::MessageCoinSigned[MessageCoinSigned],
407
                nonce,
408
                invert
409
            );
410
            assert_io_ne!(
411
                tx,
412
                inputs_mut,
413
                Input::MessageCoinSigned[MessageCoinSigned],
414
                witness_index,
415
                not
416
            );
417
418
            assert_io_ne!(
419
                tx,
420
                inputs_mut,
421
                Input::MessageDataSigned[MessageDataSigned],
422
                sender,
423
                invert
424
            );
425
            assert_io_ne!(
426
                tx,
427
                inputs_mut,
428
                Input::MessageDataSigned[MessageDataSigned],
429
                recipient,
430
                invert
431
            );
432
            assert_io_ne!(
433
                tx,
434
                inputs_mut,
435
                Input::MessageDataSigned[MessageDataSigned],
436
                amount,
437
                not
438
            );
439
            assert_io_ne!(
440
                tx,
441
                inputs_mut,
442
                Input::MessageDataSigned[MessageDataSigned],
443
                nonce,
444
                invert
445
            );
446
            assert_io_ne!(
447
                tx,
448
                inputs_mut,
449
                Input::MessageDataSigned[MessageDataSigned],
450
                witness_index,
451
                not
452
            );
453
            assert_io_ne!(
454
                tx,
455
                inputs_mut,
456
                Input::MessageDataSigned[MessageDataSigned],
457
                data,
458
                inv_v
459
            );
460
461
            assert_io_ne!(
462
                tx,
463
                inputs_mut,
464
                Input::MessageDataPredicate[MessageDataPredicate],
465
                sender,
466
                invert
467
            );
468
            assert_io_ne!(
469
                tx,
470
                inputs_mut,
471
                Input::MessageCoinPredicate[MessageCoinPredicate],
472
                recipient,
473
                invert
474
            );
475
            assert_io_ne!(
476
                tx,
477
                inputs_mut,
478
                Input::MessageCoinPredicate[MessageCoinPredicate],
479
                amount,
480
                not
481
            );
482
            assert_io_ne!(
483
                tx,
484
                inputs_mut,
485
                Input::MessageCoinPredicate[MessageCoinPredicate],
486
                nonce,
487
                invert
488
            );
489
            assert_io_ne!(
490
                tx,
491
                inputs_mut,
492
                Input::MessageCoinPredicate[MessageCoinPredicate],
493
                predicate,
494
                inv_v
495
            );
496
            assert_io_ne!(
497
                tx,
498
                inputs_mut,
499
                Input::MessageCoinPredicate[MessageCoinPredicate],
500
                predicate_data,
501
                inv_v
502
            );
503
504
            assert_io_ne!(
505
                tx,
506
                inputs_mut,
507
                Input::MessageDataPredicate[MessageDataPredicate],
508
                sender,
509
                invert
510
            );
511
            assert_io_ne!(
512
                tx,
513
                inputs_mut,
514
                Input::MessageDataPredicate[MessageDataPredicate],
515
                recipient,
516
                invert
517
            );
518
            assert_io_ne!(
519
                tx,
520
                inputs_mut,
521
                Input::MessageDataPredicate[MessageDataPredicate],
522
                amount,
523
                not
524
            );
525
            assert_io_ne!(
526
                tx,
527
                inputs_mut,
528
                Input::MessageDataPredicate[MessageDataPredicate],
529
                data,
530
                inv_v
531
            );
532
            assert_io_ne!(
533
                tx,
534
                inputs_mut,
535
                Input::MessageDataPredicate[MessageDataPredicate],
536
                nonce,
537
                invert
538
            );
539
            assert_io_ne!(
540
                tx,
541
                inputs_mut,
542
                Input::MessageDataPredicate[MessageDataPredicate],
543
                data,
544
                inv_v
545
            );
546
            assert_io_ne!(
547
                tx,
548
                inputs_mut,
549
                Input::MessageDataPredicate[MessageDataPredicate],
550
                predicate,
551
                inv_v
552
            );
553
            assert_io_ne!(
554
                tx,
555
                inputs_mut,
556
                Input::MessageDataPredicate[MessageDataPredicate],
557
                predicate_data,
558
                inv_v
559
            );
560
        }
561
562
        if !tx.outputs().is_empty() {
563
            assert_io_ne!(tx, outputs_mut, Output::Coin, to, invert);
564
            assert_io_ne!(tx, outputs_mut, Output::Coin, amount, not);
565
            assert_io_ne!(tx, outputs_mut, Output::Coin, asset_id, invert);
566
567
            assert_io_ne!(
568
                tx,
569
                outputs_mut,
570
                Output::Contract[output::contract::Contract],
571
                input_index,
572
                not
573
            );
574
            assert_io_eq!(
575
                tx,
576
                outputs_mut,
577
                Output::Contract[output::contract::Contract],
578
                balance_root,
579
                invert
580
            );
581
            assert_io_eq!(
582
                tx,
583
                outputs_mut,
584
                Output::Contract[output::contract::Contract],
585
                state_root,
586
                invert
587
            );
588
589
            assert_io_ne!(tx, outputs_mut, Output::Change, to, invert);
590
            assert_io_eq!(tx, outputs_mut, Output::Change, amount, not);
591
            assert_io_ne!(tx, outputs_mut, Output::Change, asset_id, invert);
592
593
            assert_io_eq!(tx, outputs_mut, Output::Variable, to, invert);
594
            assert_io_eq!(tx, outputs_mut, Output::Variable, amount, not);
595
            assert_io_eq!(tx, outputs_mut, Output::Variable, asset_id, invert);
596
597
            assert_io_ne!(
598
                tx,
599
                outputs_mut,
600
                Output::ContractCreated,
601
                contract_id,
602
                invert
603
            );
604
        }
605
606
        if !tx.witnesses().is_empty() {
607
            assert_id_eq(tx, |t| {
608
                inv_v(t.witnesses_mut().first_mut().unwrap().as_vec_mut())
609
            });
610
        }
611
    }
612
613
    #[test]
614
    fn id() {
615
        let rng = &mut StdRng::seed_from_u64(8586);
616
617
        let inputs = [
618
            vec![],
619
            vec![
620
                Input::coin_signed(
621
                    rng.gen(),
622
                    rng.gen(),
623
                    rng.next_u64(),
624
                    rng.gen(),
625
                    rng.gen(),
626
                    rng.gen(),
627
                ),
628
                Input::coin_predicate(
629
                    rng.gen(),
630
                    rng.gen(),
631
                    rng.next_u64(),
632
                    rng.gen(),
633
                    rng.gen(),
634
                    rng.gen(),
635
                    generate_nonempty_padded_bytes(rng),
636
                    generate_bytes(rng),
637
                ),
638
                Input::contract(rng.gen(), rng.gen(), rng.gen(), rng.gen(), rng.gen()),
639
                Input::message_coin_signed(
640
                    rng.gen(),
641
                    rng.gen(),
642
                    rng.next_u64(),
643
                    rng.gen(),
644
                    rng.gen(),
645
                ),
646
                Input::message_coin_predicate(
647
                    rng.gen(),
648
                    rng.gen(),
649
                    rng.next_u64(),
650
                    rng.gen(),
651
                    rng.gen(),
652
                    generate_nonempty_padded_bytes(rng),
653
                    generate_bytes(rng),
654
                ),
655
                Input::message_data_signed(
656
                    rng.gen(),
657
                    rng.gen(),
658
                    rng.next_u64(),
659
                    rng.gen(),
660
                    rng.gen(),
661
                    generate_nonempty_padded_bytes(rng),
662
                ),
663
                Input::message_data_predicate(
664
                    rng.gen(),
665
                    rng.gen(),
666
                    rng.next_u64(),
667
                    rng.gen(),
668
                    rng.gen(),
669
                    generate_nonempty_padded_bytes(rng),
670
                    generate_nonempty_padded_bytes(rng),
671
                    generate_bytes(rng),
672
                ),
673
            ],
674
        ];
675
676
        let outputs = [
677
            vec![],
678
            vec![
679
                Output::coin(rng.gen(), rng.next_u64(), rng.gen()),
680
                Output::contract(rng.gen(), rng.gen(), rng.gen()),
681
                Output::change(rng.gen(), rng.next_u64(), rng.gen()),
682
                Output::variable(rng.gen(), rng.next_u64(), rng.gen()),
683
                Output::contract_created(rng.gen(), rng.gen()),
684
            ],
685
        ];
686
687
        let witnesses = [
688
            vec![],
689
            vec![generate_bytes(rng).into(), generate_bytes(rng).into()],
690
        ];
691
692
        let scripts = [vec![], generate_bytes(rng), generate_bytes(rng)];
693
        let script_data = [vec![], generate_bytes(rng), generate_bytes(rng)];
694
        let storage_slots = [vec![], vec![rng.gen(), rng.gen()]];
695
        let purposes = [
696
            UpgradePurposeType::ConsensusParameters {
697
                witness_index: rng.gen(),
698
                checksum: rng.gen(),
699
            },
700
            UpgradePurposeType::StateTransition { root: rng.gen() },
701
        ];
702
703
        for inputs in inputs.iter() {
704
            for outputs in outputs.iter() {
705
                for witnesses in witnesses.iter() {
706
                    for script in scripts.iter() {
707
                        for script_data in script_data.iter() {
708
                            let tx = Transaction::script(
709
                                rng.next_u64(),
710
                                script.clone(),
711
                                script_data.clone(),
712
                                rng.gen(),
713
                                inputs.clone(),
714
                                outputs.clone(),
715
                                witnesses.clone(),
716
                            );
717
718
                            assert_id_common_attrs(&tx);
719
                            assert_id_ne(&tx, |t| {
720
                                t.set_script_gas_limit(t.script_gas_limit().not())
721
                            });
722
                            assert_id_ne(&tx, |t| inv_v(t.script_mut()));
723
                            assert_id_ne(&tx, |t| inv_v(t.script_data_mut()));
724
                        }
725
                    }
726
727
                    for storage_slots in storage_slots.iter() {
728
                        let tx = Transaction::create(
729
                            rng.gen(),
730
                            rng.gen(),
731
                            rng.gen(),
732
                            storage_slots.clone(),
733
                            inputs.clone(),
734
                            outputs.clone(),
735
                            witnesses.clone(),
736
                        );
737
738
                        assert_id_ne(&tx, |t| not(t.bytecode_witness_index_mut()));
739
                        assert_id_ne(&tx, |t| invert(t.salt_mut()));
740
                        assert_id_ne(&tx, |t| invert(t.salt_mut()));
741
742
                        if !storage_slots.is_empty() {
743
                            assert_id_ne(&tx, |t| {
744
                                invert_storage_slot(
745
                                    t.storage_slots_mut().first_mut().unwrap(),
746
                                )
747
                            });
748
                        }
749
750
                        assert_id_common_attrs(&tx);
751
                    }
752
753
                    for purpose in purposes.iter() {
754
                        let tx = Transaction::upgrade(
755
                            *purpose,
756
                            rng.gen(),
757
                            inputs.clone(),
758
                            outputs.clone(),
759
                            witnesses.clone(),
760
                        );
761
762
                        assert_id_common_attrs(&tx);
763
                        assert_id_ne(&tx, |t| match t.upgrade_purpose_mut() {
764
                            UpgradePurposeType::ConsensusParameters {
765
                                witness_index,
766
                                checksum,
767
                            } => {
768
                                *witness_index = witness_index.not();
769
                                invert(checksum);
770
                            }
771
                            UpgradePurposeType::StateTransition { root } => {
772
                                invert(root);
773
                            }
774
                        });
775
                    }
776
777
                    // Upload
778
                    {
779
                        let tx = Transaction::upload(
780
                            UploadBody {
781
                                root: rng.gen(),
782
                                witness_index: rng.gen(),
783
                                subsection_index: rng.gen(),
784
                                subsections_number: rng.gen(),
785
                                proof_set: vec![rng.gen(), rng.gen(), rng.gen()],
786
                            },
787
                            rng.gen(),
788
                            inputs.clone(),
789
                            outputs.clone(),
790
                            witnesses.clone(),
791
                        );
792
793
                        assert_id_common_attrs(&tx);
794
                        assert_id_ne(&tx, |t| invert(t.bytecode_root_mut()));
795
                        assert_id_ne(&tx, |t| not(t.bytecode_witness_index_mut()));
796
                        assert_id_ne(&tx, |t| not(t.subsection_index_mut()));
797
                        assert_id_ne(&tx, |t| not(t.subsections_number_mut()));
798
                        assert_id_ne(&tx, |t| {
799
                            t.proof_set_mut().iter_mut().for_each(invert)
800
                        });
801
                    }
802
                }
803
            }
804
        }
805
    }
806
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/validity/error.rs
Line
Count
Source
1
use crate::UtxoId;
2
use fuel_types::{
3
    AssetId,
4
    ContractId,
5
    MessageId,
6
};
7
8
/// The error returned during the checking of the transaction's validity rules.
9
#[derive(
10
    Debug,
11
    Clone,
12
    PartialEq,
13
    Eq,
14
    Hash,
15
0
    derive_more::Display,
Unexecuted instantiation: _RNvXs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errorNtB5_13ValidityErrorNtNtCsd3UI3IJrzMw_4core3fmt7Display3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errorNtB5_13ValidityErrorNtNtCsd3UI3IJrzMw_4core3fmt7Display3fmtBb_
16
    serde::Serialize,
17
0
    serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtB7_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1s_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBa_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1v_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBd_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB8_9___VisitorNtB1y_7Visitor10visit_enumNtB2_14___FieldVisitorB2D_9expecting
Unexecuted instantiation: _RNvXs0_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_9___VisitorB2G_9expecting
Unexecuted instantiation: _RNvXs1_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_s_14___FieldVisitorB2G_9expecting
Unexecuted instantiation: _RNvXs3_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_s_9___VisitorB2G_9expecting
Unexecuted instantiation: _RNvXs4_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_s0_14___FieldVisitorB2G_9expecting
Unexecuted instantiation: _RNvXs6_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_s0_9___VisitorB2G_9expecting
Unexecuted instantiation: _RNvXs7_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_s1_14___FieldVisitorB2G_9expecting
Unexecuted instantiation: _RNvXs9_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_s1_9___VisitorB2G_9expecting
Unexecuted instantiation: _RNvXsa_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_s2_14___FieldVisitorB2G_9expecting
Unexecuted instantiation: _RNvXsc_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_s2_9___VisitorB2G_9expecting
Unexecuted instantiation: _RNvXsd_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_s3_14___FieldVisitorB2G_9expecting
Unexecuted instantiation: _RNvXsf_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_s3_9___VisitorB2G_9expecting
Unexecuted instantiation: _RNvXsg_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_s4_14___FieldVisitorB2G_9expecting
Unexecuted instantiation: _RNvXsi_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_s4_9___VisitorB2G_9expecting
Unexecuted instantiation: _RNvXsj_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_s5_14___FieldVisitorB2G_9expecting
Unexecuted instantiation: _RNvXsl_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_s5_9___VisitorB2G_9expecting
Unexecuted instantiation: _RNvXsm_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_s6_14___FieldVisitorB2G_9expecting
Unexecuted instantiation: _RNvXso_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_s6_9___VisitorB2G_9expecting
Unexecuted instantiation: _RNvXsp_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_s7_14___FieldVisitorB2G_9expecting
Unexecuted instantiation: _RNvXsr_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_s7_9___VisitorB2G_9expecting
Unexecuted instantiation: _RNvXss_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_s8_14___FieldVisitorB2G_9expecting
Unexecuted instantiation: _RNvXsu_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_s8_9___VisitorB2G_9expecting
Unexecuted instantiation: _RNvXsv_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_s9_14___FieldVisitorB2G_9expecting
Unexecuted instantiation: _RNvXsx_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_s9_9___VisitorB2G_9expecting
Unexecuted instantiation: _RNvXsy_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_sa_14___FieldVisitorB2G_9expecting
Unexecuted instantiation: _RNvXsA_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_sa_9___VisitorB2G_9expecting
Unexecuted instantiation: _RNvXsB_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_sb_14___FieldVisitorB2G_9expecting
Unexecuted instantiation: _RNvXsD_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_sb_9___VisitorB2G_9expecting
Unexecuted instantiation: _RNvXsE_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_sc_14___FieldVisitorB2G_9expecting
Unexecuted instantiation: _RNvXsG_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_sc_9___VisitorB2G_9expecting
Unexecuted instantiation: _RNvXsH_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_sd_14___FieldVisitorB2G_9expecting
Unexecuted instantiation: _RNvXsJ_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_sd_9___VisitorB2G_9expecting
Unexecuted instantiation: _RNvXsK_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_se_14___FieldVisitorB2G_9expecting
Unexecuted instantiation: _RNvXsM_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_se_9___VisitorB2G_9expecting
Unexecuted instantiation: _RNvXsN_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_sf_14___FieldVisitorB2G_9expecting
Unexecuted instantiation: _RNvXsP_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_sf_9___VisitorB2G_9expecting
Unexecuted instantiation: _RNvXsQ_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_sg_14___FieldVisitorB2G_9expecting
Unexecuted instantiation: _RNvXsS_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_sg_9___VisitorB2G_9expecting
Unexecuted instantiation: _RNvXsT_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_sh_14___FieldVisitorB2G_9expecting
Unexecuted instantiation: _RNvXsV_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_sh_9___VisitorB2G_9expecting
Unexecuted instantiation: _RNvXsW_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_si_14___FieldVisitorB2G_9expecting
Unexecuted instantiation: _RNvXsY_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_si_9___VisitorB2G_9expecting
Unexecuted instantiation: _RNvXsZ_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_sj_14___FieldVisitorB2G_9expecting
Unexecuted instantiation: _RNvXs11_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sj_9___VisitorB2H_9expecting
Unexecuted instantiation: _RNvXs12_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sk_14___FieldVisitorB2H_9expecting
Unexecuted instantiation: _RNvXs14_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sk_9___VisitorB2H_9expecting
Unexecuted instantiation: _RNvXs15_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sl_14___FieldVisitorB2H_9expecting
Unexecuted instantiation: _RNvXs17_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sl_9___VisitorB2H_9expecting
Unexecuted instantiation: _RNvXs18_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sm_14___FieldVisitorB2H_9expecting
Unexecuted instantiation: _RNvXs1a_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sm_9___VisitorB2H_9expecting
Unexecuted instantiation: _RNvXs1b_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sn_14___FieldVisitorB2H_9expecting
Unexecuted instantiation: _RNvXs1d_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sn_9___VisitorB2H_9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtB8_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1t_7Visitor9visit_u64pEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtB8_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1t_7Visitor9visit_strpEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtB8_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1t_7Visitor11visit_bytespEBe_
Unexecuted instantiation: _RINvXs_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBa_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1t_11deserializepEBg_
Unexecuted instantiation: _RINvXNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBe_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB9_9___VisitorNtB1z_7Visitor10visit_enumNtB3_14___FieldVisitorB2E_9visit_u64pEBk_
Unexecuted instantiation: _RINvXNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBe_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB9_9___VisitorNtB1z_7Visitor10visit_enumNtB3_14___FieldVisitorB2E_9visit_strpEBk_
Unexecuted instantiation: _RINvXNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBe_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB9_9___VisitorNtB1z_7Visitor10visit_enumNtB3_14___FieldVisitorB2E_11visit_bytespEBk_
Unexecuted instantiation: _RINvXs_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBg_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_7___FieldB1z_11deserializepEBm_
Unexecuted instantiation: _RINvXs0_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_9___VisitorB2H_9visit_seqpEBn_
Unexecuted instantiation: _RINvXs0_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_9___VisitorB2H_9visit_mappEBn_
Unexecuted instantiation: _RINvXs1_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s_14___FieldVisitorB2H_9visit_u64pEBn_
Unexecuted instantiation: _RINvXs1_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s_14___FieldVisitorB2H_9visit_strpEBn_
Unexecuted instantiation: _RINvXs1_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s_14___FieldVisitorB2H_11visit_bytespEBn_
Unexecuted instantiation: _RINvXs2_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s_7___FieldB1A_11deserializepEBn_
Unexecuted instantiation: _RINvXs3_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s_9___VisitorB2H_9visit_seqpEBn_
Unexecuted instantiation: _RINvXs3_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s_9___VisitorB2H_9visit_mappEBn_
Unexecuted instantiation: _RINvXs4_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s0_14___FieldVisitorB2H_9visit_u64pEBn_
Unexecuted instantiation: _RINvXs4_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s0_14___FieldVisitorB2H_9visit_strpEBn_
Unexecuted instantiation: _RINvXs4_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s0_14___FieldVisitorB2H_11visit_bytespEBn_
Unexecuted instantiation: _RINvXs5_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s0_7___FieldB1A_11deserializepEBn_
Unexecuted instantiation: _RINvXs6_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s0_9___VisitorB2H_9visit_seqpEBn_
Unexecuted instantiation: _RINvXs6_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s0_9___VisitorB2H_9visit_mappEBn_
Unexecuted instantiation: _RINvXs7_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s1_14___FieldVisitorB2H_9visit_u64pEBn_
Unexecuted instantiation: _RINvXs7_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s1_14___FieldVisitorB2H_9visit_strpEBn_
Unexecuted instantiation: _RINvXs7_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s1_14___FieldVisitorB2H_11visit_bytespEBn_
Unexecuted instantiation: _RINvXs8_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s1_7___FieldB1A_11deserializepEBn_
Unexecuted instantiation: _RINvXs9_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s1_9___VisitorB2H_9visit_seqpEBn_
Unexecuted instantiation: _RINvXs9_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s1_9___VisitorB2H_9visit_mappEBn_
Unexecuted instantiation: _RINvXsa_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s2_14___FieldVisitorB2H_9visit_u64pEBn_
Unexecuted instantiation: _RINvXsa_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s2_14___FieldVisitorB2H_9visit_strpEBn_
Unexecuted instantiation: _RINvXsa_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s2_14___FieldVisitorB2H_11visit_bytespEBn_
Unexecuted instantiation: _RINvXsb_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s2_7___FieldB1A_11deserializepEBn_
Unexecuted instantiation: _RINvXsc_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s2_9___VisitorB2H_9visit_seqpEBn_
Unexecuted instantiation: _RINvXsc_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s2_9___VisitorB2H_9visit_mappEBn_
Unexecuted instantiation: _RINvXsd_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s3_14___FieldVisitorB2H_9visit_u64pEBn_
Unexecuted instantiation: _RINvXsd_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s3_14___FieldVisitorB2H_9visit_strpEBn_
Unexecuted instantiation: _RINvXsd_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s3_14___FieldVisitorB2H_11visit_bytespEBn_
Unexecuted instantiation: _RINvXse_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s3_7___FieldB1A_11deserializepEBn_
Unexecuted instantiation: _RINvXsf_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s3_9___VisitorB2H_9visit_seqpEBn_
Unexecuted instantiation: _RINvXsf_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s3_9___VisitorB2H_9visit_mappEBn_
Unexecuted instantiation: _RINvXsg_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s4_14___FieldVisitorB2H_9visit_u64pEBn_
Unexecuted instantiation: _RINvXsg_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s4_14___FieldVisitorB2H_9visit_strpEBn_
Unexecuted instantiation: _RINvXsg_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s4_14___FieldVisitorB2H_11visit_bytespEBn_
Unexecuted instantiation: _RINvXsh_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s4_7___FieldB1A_11deserializepEBn_
Unexecuted instantiation: _RINvXsi_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s4_9___VisitorB2H_9visit_seqpEBn_
Unexecuted instantiation: _RINvXsi_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s4_9___VisitorB2H_9visit_mappEBn_
Unexecuted instantiation: _RINvXsj_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s5_14___FieldVisitorB2H_9visit_u64pEBn_
Unexecuted instantiation: _RINvXsj_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s5_14___FieldVisitorB2H_9visit_strpEBn_
Unexecuted instantiation: _RINvXsj_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s5_14___FieldVisitorB2H_11visit_bytespEBn_
Unexecuted instantiation: _RINvXsk_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s5_7___FieldB1A_11deserializepEBn_
Unexecuted instantiation: _RINvXsl_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s5_9___VisitorB2H_9visit_seqpEBn_
Unexecuted instantiation: _RINvXsl_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s5_9___VisitorB2H_9visit_mappEBn_
Unexecuted instantiation: _RINvXsm_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s6_14___FieldVisitorB2H_9visit_u64pEBn_
Unexecuted instantiation: _RINvXsm_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s6_14___FieldVisitorB2H_9visit_strpEBn_
Unexecuted instantiation: _RINvXsm_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s6_14___FieldVisitorB2H_11visit_bytespEBn_
Unexecuted instantiation: _RINvXsn_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s6_7___FieldB1A_11deserializepEBn_
Unexecuted instantiation: _RINvXso_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s6_9___VisitorB2H_9visit_seqpEBn_
Unexecuted instantiation: _RINvXso_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s6_9___VisitorB2H_9visit_mappEBn_
Unexecuted instantiation: _RINvXsp_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s7_14___FieldVisitorB2H_9visit_u64pEBn_
Unexecuted instantiation: _RINvXsp_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s7_14___FieldVisitorB2H_9visit_strpEBn_
Unexecuted instantiation: _RINvXsp_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s7_14___FieldVisitorB2H_11visit_bytespEBn_
Unexecuted instantiation: _RINvXsq_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s7_7___FieldB1A_11deserializepEBn_
Unexecuted instantiation: _RINvXsr_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s7_9___VisitorB2H_9visit_seqpEBn_
Unexecuted instantiation: _RINvXsr_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s7_9___VisitorB2H_9visit_mappEBn_
Unexecuted instantiation: _RINvXss_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s8_14___FieldVisitorB2H_9visit_u64pEBn_
Unexecuted instantiation: _RINvXss_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s8_14___FieldVisitorB2H_9visit_strpEBn_
Unexecuted instantiation: _RINvXss_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s8_14___FieldVisitorB2H_11visit_bytespEBn_
Unexecuted instantiation: _RINvXst_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s8_7___FieldB1A_11deserializepEBn_
Unexecuted instantiation: _RINvXsu_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s8_9___VisitorB2H_9visit_seqpEBn_
Unexecuted instantiation: _RINvXsu_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s8_9___VisitorB2H_9visit_mappEBn_
Unexecuted instantiation: _RINvXsv_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s9_14___FieldVisitorB2H_9visit_u64pEBn_
Unexecuted instantiation: _RINvXsv_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s9_14___FieldVisitorB2H_9visit_strpEBn_
Unexecuted instantiation: _RINvXsv_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s9_14___FieldVisitorB2H_11visit_bytespEBn_
Unexecuted instantiation: _RINvXsw_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s9_7___FieldB1A_11deserializepEBn_
Unexecuted instantiation: _RINvXsx_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s9_9___VisitorB2H_9visit_seqpEBn_
Unexecuted instantiation: _RINvXsx_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s9_9___VisitorB2H_9visit_mappEBn_
Unexecuted instantiation: _RINvXsy_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sa_14___FieldVisitorB2H_9visit_u64pEBn_
Unexecuted instantiation: _RINvXsy_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sa_14___FieldVisitorB2H_9visit_strpEBn_
Unexecuted instantiation: _RINvXsy_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sa_14___FieldVisitorB2H_11visit_bytespEBn_
Unexecuted instantiation: _RINvXsz_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sa_7___FieldB1A_11deserializepEBn_
Unexecuted instantiation: _RINvXsA_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sa_9___VisitorB2H_9visit_seqpEBn_
Unexecuted instantiation: _RINvXsA_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sa_9___VisitorB2H_9visit_mappEBn_
Unexecuted instantiation: _RINvXsB_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sb_14___FieldVisitorB2H_9visit_u64pEBn_
Unexecuted instantiation: _RINvXsB_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sb_14___FieldVisitorB2H_9visit_strpEBn_
Unexecuted instantiation: _RINvXsB_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sb_14___FieldVisitorB2H_11visit_bytespEBn_
Unexecuted instantiation: _RINvXsC_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sb_7___FieldB1A_11deserializepEBn_
Unexecuted instantiation: _RINvXsD_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sb_9___VisitorB2H_9visit_seqpEBn_
Unexecuted instantiation: _RINvXsD_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sb_9___VisitorB2H_9visit_mappEBn_
Unexecuted instantiation: _RINvXsE_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sc_14___FieldVisitorB2H_9visit_u64pEBn_
Unexecuted instantiation: _RINvXsE_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sc_14___FieldVisitorB2H_9visit_strpEBn_
Unexecuted instantiation: _RINvXsE_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sc_14___FieldVisitorB2H_11visit_bytespEBn_
Unexecuted instantiation: _RINvXsF_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sc_7___FieldB1A_11deserializepEBn_
Unexecuted instantiation: _RINvXsG_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sc_9___VisitorB2H_9visit_seqpEBn_
Unexecuted instantiation: _RINvXsG_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sc_9___VisitorB2H_9visit_mappEBn_
Unexecuted instantiation: _RINvXsH_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sd_14___FieldVisitorB2H_9visit_u64pEBn_
Unexecuted instantiation: _RINvXsH_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sd_14___FieldVisitorB2H_9visit_strpEBn_
Unexecuted instantiation: _RINvXsH_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sd_14___FieldVisitorB2H_11visit_bytespEBn_
Unexecuted instantiation: _RINvXsI_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sd_7___FieldB1A_11deserializepEBn_
Unexecuted instantiation: _RINvXsJ_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sd_9___VisitorB2H_9visit_seqpEBn_
Unexecuted instantiation: _RINvXsJ_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sd_9___VisitorB2H_9visit_mappEBn_
Unexecuted instantiation: _RINvXsK_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_se_14___FieldVisitorB2H_9visit_u64pEBn_
Unexecuted instantiation: _RINvXsK_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_se_14___FieldVisitorB2H_9visit_strpEBn_
Unexecuted instantiation: _RINvXsK_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_se_14___FieldVisitorB2H_11visit_bytespEBn_
Unexecuted instantiation: _RINvXsL_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_se_7___FieldB1A_11deserializepEBn_
Unexecuted instantiation: _RINvXsM_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_se_9___VisitorB2H_9visit_seqpEBn_
Unexecuted instantiation: _RINvXsM_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_se_9___VisitorB2H_9visit_mappEBn_
Unexecuted instantiation: _RINvXsN_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sf_14___FieldVisitorB2H_9visit_u64pEBn_
Unexecuted instantiation: _RINvXsN_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sf_14___FieldVisitorB2H_9visit_strpEBn_
Unexecuted instantiation: _RINvXsN_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sf_14___FieldVisitorB2H_11visit_bytespEBn_
Unexecuted instantiation: _RINvXsO_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sf_7___FieldB1A_11deserializepEBn_
Unexecuted instantiation: _RINvXsP_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sf_9___VisitorB2H_9visit_seqpEBn_
Unexecuted instantiation: _RINvXsP_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sf_9___VisitorB2H_9visit_mappEBn_
Unexecuted instantiation: _RINvXsQ_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sg_14___FieldVisitorB2H_9visit_u64pEBn_
Unexecuted instantiation: _RINvXsQ_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sg_14___FieldVisitorB2H_9visit_strpEBn_
Unexecuted instantiation: _RINvXsQ_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sg_14___FieldVisitorB2H_11visit_bytespEBn_
Unexecuted instantiation: _RINvXsR_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sg_7___FieldB1A_11deserializepEBn_
Unexecuted instantiation: _RINvXsS_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sg_9___VisitorB2H_9visit_seqpEBn_
Unexecuted instantiation: _RINvXsS_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sg_9___VisitorB2H_9visit_mappEBn_
Unexecuted instantiation: _RINvXsT_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sh_14___FieldVisitorB2H_9visit_u64pEBn_
Unexecuted instantiation: _RINvXsT_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sh_14___FieldVisitorB2H_9visit_strpEBn_
Unexecuted instantiation: _RINvXsT_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sh_14___FieldVisitorB2H_11visit_bytespEBn_
Unexecuted instantiation: _RINvXsU_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sh_7___FieldB1A_11deserializepEBn_
Unexecuted instantiation: _RINvXsV_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sh_9___VisitorB2H_9visit_seqpEBn_
Unexecuted instantiation: _RINvXsV_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sh_9___VisitorB2H_9visit_mappEBn_
Unexecuted instantiation: _RINvXsW_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_si_14___FieldVisitorB2H_9visit_u64pEBn_
Unexecuted instantiation: _RINvXsW_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_si_14___FieldVisitorB2H_9visit_strpEBn_
Unexecuted instantiation: _RINvXsW_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_si_14___FieldVisitorB2H_11visit_bytespEBn_
Unexecuted instantiation: _RINvXsX_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_si_7___FieldB1A_11deserializepEBn_
Unexecuted instantiation: _RINvXsY_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_si_9___VisitorB2H_9visit_seqpEBn_
Unexecuted instantiation: _RINvXsY_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_si_9___VisitorB2H_9visit_mappEBn_
Unexecuted instantiation: _RINvXsZ_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sj_14___FieldVisitorB2H_9visit_u64pEBn_
Unexecuted instantiation: _RINvXsZ_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sj_14___FieldVisitorB2H_9visit_strpEBn_
Unexecuted instantiation: _RINvXsZ_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBh_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_sj_14___FieldVisitorB2H_11visit_bytespEBn_
Unexecuted instantiation: _RINvXs10_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sj_7___FieldB1B_11deserializepEBo_
Unexecuted instantiation: _RINvXs11_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sj_9___VisitorB2I_9visit_seqpEBo_
Unexecuted instantiation: _RINvXs11_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sj_9___VisitorB2I_9visit_mappEBo_
Unexecuted instantiation: _RINvXs12_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sk_14___FieldVisitorB2I_9visit_u64pEBo_
Unexecuted instantiation: _RINvXs12_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sk_14___FieldVisitorB2I_9visit_strpEBo_
Unexecuted instantiation: _RINvXs12_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sk_14___FieldVisitorB2I_11visit_bytespEBo_
Unexecuted instantiation: _RINvXs13_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sk_7___FieldB1B_11deserializepEBo_
Unexecuted instantiation: _RINvXs14_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sk_9___VisitorB2I_9visit_seqpEBo_
Unexecuted instantiation: _RINvXs14_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sk_9___VisitorB2I_9visit_mappEBo_
Unexecuted instantiation: _RINvXs15_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sl_14___FieldVisitorB2I_9visit_u64pEBo_
Unexecuted instantiation: _RINvXs15_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sl_14___FieldVisitorB2I_9visit_strpEBo_
Unexecuted instantiation: _RINvXs15_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sl_14___FieldVisitorB2I_11visit_bytespEBo_
Unexecuted instantiation: _RINvXs16_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sl_7___FieldB1B_11deserializepEBo_
Unexecuted instantiation: _RINvXs17_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sl_9___VisitorB2I_9visit_seqpEBo_
Unexecuted instantiation: _RINvXs17_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sl_9___VisitorB2I_9visit_mappEBo_
Unexecuted instantiation: _RINvXs18_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sm_14___FieldVisitorB2I_9visit_u64pEBo_
Unexecuted instantiation: _RINvXs18_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sm_14___FieldVisitorB2I_9visit_strpEBo_
Unexecuted instantiation: _RINvXs18_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sm_14___FieldVisitorB2I_11visit_bytespEBo_
Unexecuted instantiation: _RINvXs19_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sm_7___FieldB1B_11deserializepEBo_
Unexecuted instantiation: _RINvXs1a_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sm_9___VisitorB2I_9visit_seqpEBo_
Unexecuted instantiation: _RINvXs1a_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sm_9___VisitorB2I_9visit_mappEBo_
Unexecuted instantiation: _RINvXs1b_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sn_14___FieldVisitorB2I_9visit_u64pEBo_
Unexecuted instantiation: _RINvXs1b_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sn_14___FieldVisitorB2I_9visit_strpEBo_
Unexecuted instantiation: _RINvXs1b_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sn_14___FieldVisitorB2I_11visit_bytespEBo_
Unexecuted instantiation: _RINvXs1c_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sn_7___FieldB1B_11deserializepEBo_
Unexecuted instantiation: _RINvXs1d_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sn_9___VisitorB2I_9visit_seqpEBo_
Unexecuted instantiation: _RINvXs1d_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5errors_1__NtBi_13ValidityErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBd_9___VisitorNtB1D_7Visitor10visit_enumNtB7_sn_9___VisitorB2I_9visit_mappEBo_
18
)]
19
#[non_exhaustive]
20
pub enum ValidityError {
21
    /// The actual and calculated metadata of the transaction mismatch.
22
    TransactionMetadataMismatch,
23
    /// Transaction doesn't have spendable input message or coin.
24
    NoSpendableInput,
25
    InputWitnessIndexBounds {
26
        index: usize,
27
    },
28
    InputPredicateEmpty {
29
        index: usize,
30
    },
31
    InputPredicateLength {
32
        index: usize,
33
    },
34
    InputPredicateDataLength {
35
        index: usize,
36
    },
37
    InputPredicateOwner {
38
        index: usize,
39
    },
40
    InputInvalidSignature {
41
        index: usize,
42
    },
43
    InputContractAssociatedOutputContract {
44
        index: usize,
45
    },
46
    InputMessageDataLength {
47
        index: usize,
48
    },
49
    DuplicateInputUtxoId {
50
        utxo_id: UtxoId,
51
    },
52
    DuplicateMessageInputId {
53
        message_id: MessageId,
54
    },
55
    DuplicateInputContractId {
56
        contract_id: ContractId,
57
    },
58
    OutputContractInputIndex {
59
        index: usize,
60
    },
61
    /// One of inputs' `AssetId` is not base asset id.
62
    TransactionInputContainsNonBaseAssetId {
63
        index: usize,
64
    },
65
    /// One of inputs is a `Input::Contract` when it is not allowed.
66
    TransactionInputContainsContract {
67
        index: usize,
68
    },
69
    /// One of inputs contains retryable message when it is not allowed.
70
    TransactionInputContainsMessageData {
71
        index: usize,
72
    },
73
    /// One of outputs is a `Output::Contract` when it is not allowed.
74
    TransactionOutputContainsContract {
75
        index: usize,
76
    },
77
    /// One of outputs is a `Output::Variable` when it is not allowed.
78
    TransactionOutputContainsVariable {
79
        index: usize,
80
    },
81
    /// One of `Output::Change` outputs uses a non-base asset id.
82
    TransactionChangeChangeUsesNotBaseAsset {
83
        index: usize,
84
    },
85
    TransactionCreateOutputContractCreatedDoesntMatch {
86
        index: usize,
87
    },
88
    TransactionCreateOutputContractCreatedMultiple {
89
        index: usize,
90
    },
91
    TransactionCreateBytecodeLen,
92
    TransactionCreateBytecodeWitnessIndex,
93
    TransactionCreateStorageSlotMax,
94
    TransactionCreateStorageSlotOrder,
95
    TransactionScriptLength,
96
    TransactionScriptDataLength,
97
    /// The output contains a `Output::ContractCreated` which is not allowed.
98
    TransactionOutputContainsContractCreated {
99
        index: usize,
100
    },
101
    /// The block height of the checking doesn't match the transaction's block height.
102
    /// `Mint` transaction only exists in the scope of the block.
103
    TransactionMintIncorrectBlockHeight,
104
    /// The `Output.input_index` is not zero.
105
    TransactionMintIncorrectOutputIndex,
106
    /// The `Output.mint_base_asset` is not base asset.
107
    TransactionMintNonBaseAsset,
108
    /// The `Upgrade` transaction doesn't have the privileged address as the input
109
    /// owner.
110
    TransactionUpgradeNoPrivilegedAddress,
111
    /// The `Upgrade` transaction's checksum doesn't match the consensus parameters from
112
    /// witness.
113
    TransactionUpgradeConsensusParametersChecksumMismatch,
114
    /// The `Upgrade` transaction's consensus parameters serialization failed.
115
    TransactionUpgradeConsensusParametersSerialization,
116
    /// The `Upgrade` transaction's consensus parameters deserialization failed.
117
    TransactionUpgradeConsensusParametersDeserialization,
118
    /// The verification of the bytecode root of the `Upload` transaction failed.
119
    TransactionUploadRootVerificationFailed,
120
    /// The total number of bytecode subsections in the `Upload` transaction exceeds the
121
    /// limit.
122
    TransactionUploadTooManyBytecodeSubsections,
123
    /// The transaction exceeded the size limit.
124
    TransactionSizeLimitExceeded,
125
    /// Max gas per tx exceeded
126
    TransactionMaxGasExceeded,
127
    TransactionWitnessLimitExceeded,
128
    TransactionPoliciesAreInvalid,
129
    TransactionNoGasPricePolicy,
130
    TransactionMaturity,
131
    TransactionMaxFeeNotSet,
132
    TransactionInputsMax,
133
    TransactionOutputsMax,
134
    TransactionWitnessesMax,
135
    TransactionOutputChangeAssetIdDuplicated(AssetId),
136
    TransactionOutputChangeAssetIdNotFound(AssetId),
137
    /// This error happens when a transaction attempts to create a coin output for an
138
    /// asset type that doesn't exist in the coin inputs.
139
    TransactionOutputCoinAssetIdNotFound(AssetId),
140
    /// The transaction doesn't provide enough input amount of the native chain asset to
141
    /// cover all potential execution fees
142
    #[display(
143
        fmt = "Insufficient fee amount: expected {}, provided {}",
144
        expected,
145
        provided
146
    )]
147
    InsufficientFeeAmount {
148
        /// The expected amount of fees required to cover the transaction
149
        expected: u64,
150
        /// The fee amount actually provided for spending
151
        provided: u64,
152
    },
153
    /// The transaction doesn't provide enough input amount of the given asset to cover
154
    /// the amounts used in the outputs.
155
    #[display(
156
        fmt = "Insufficient input amount: asset {}, expected {}, provided {}",
157
        asset,
158
        expected,
159
        provided
160
    )]
161
    InsufficientInputAmount {
162
        /// The asset id being spent
163
        asset: AssetId,
164
        /// The amount expected by a coin output
165
        expected: u64,
166
        /// The total amount provided by coin inputs
167
        provided: u64,
168
    },
169
    /// The given coins is too large
170
    BalanceOverflow,
171
    /// The given gas costs is are too large
172
    GasCostsCoinsOverflow,
173
    /// Serialized input length is too large.
174
    SerializedInputTooLarge {
175
        index: usize,
176
    },
177
    /// Serialized output length is too large.
178
    SerializedOutputTooLarge {
179
        index: usize,
180
    },
181
    /// Serialized witness length is too large.
182
    SerializedWitnessTooLarge {
183
        index: usize,
184
    },
185
    /// The `Create` transaction doesn't contain `Output::ContractCreated`.
186
    TransactionOutputDoesntContainContractCreated,
187
    /// Blob id of the transaction differs from the data.
188
    TransactionBlobIdVerificationFailed,
189
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/policies.rs
Line
Count
Source
1
use core::ops::Deref;
2
use fuel_types::{
3
    canonical::{
4
        Deserialize,
5
        Error,
6
        Input,
7
        Output,
8
        Serialize,
9
    },
10
    BlockHeight,
11
    Word,
12
};
13
14
#[cfg(feature = "random")]
15
use rand::{
16
    distributions::{
17
        Distribution,
18
        Standard,
19
    },
20
    Rng,
21
};
22
23
bitflags::bitflags! {
24
    /// See https://github.com/FuelLabs/fuel-specs/blob/master/src/tx-format/policy.md#policy
25
    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, Hash)]
26
0
    #[derive(serde::Serialize, serde::Deserialize)]
Unexecuted instantiation: _RNvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiess0_1__NtB7_12PoliciesBitsNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtB1k_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiess0_1__NtB8_12PoliciesBitsNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtB1l_7Visitor20visit_newtype_structpEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiess0_1__NtB8_12PoliciesBitsNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtB1l_7Visitor9visit_seqpEBc_
27
    pub struct PoliciesBits: u32 {
28
        /// If set, the gas price is present in the policies.
29
        const Tip = 1 << 0;
30
        /// If set, the witness limit is present in the policies.
31
        const WitnessLimit = 1 << 1;
32
        /// If set, the maturity is present in the policies.
33
        const Maturity = 1 << 2;
34
        /// If set, the max fee is present in the policies.
35
        const MaxFee = 1 << 3;
36
    }
37
}
38
39
#[cfg(feature = "da-compression")]
40
impl fuel_compression::Compressible for PoliciesBits {
41
    type Compressed = u32;
42
}
43
44
#[cfg(feature = "da-compression")]
45
impl<Ctx> fuel_compression::CompressibleBy<Ctx> for PoliciesBits
46
where
47
    Ctx: fuel_compression::ContextError,
48
{
49
    async fn compress_with(&self, _: &mut Ctx) -> Result<Self::Compressed, Ctx::Error> {
50
        Ok(self.bits())
51
    }
52
}
53
54
#[cfg(feature = "da-compression")]
55
impl<Ctx> fuel_compression::DecompressibleBy<Ctx> for PoliciesBits
56
where
57
    Ctx: fuel_compression::ContextError,
58
{
59
    async fn decompress_with(c: Self::Compressed, _: &Ctx) -> Result<Self, Ctx::Error> {
60
        Ok(Self::from_bits_truncate(c))
61
    }
62
}
63
64
/// The helper enum to make user-friendly API for [`Policies::set`] and [`Policies::get`]
65
/// methods.
66
#[derive(
67
    Clone,
68
    Copy,
69
    Debug,
70
    PartialEq,
71
    Eq,
72
    Hash,
73
    strum_macros::EnumCount,
74
39.4k
    strum_macros::EnumIter,
_RNvXsm_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiesNtB5_10PolicyTypeNtCs7SJq3lwJE1q_5strum16IntoEnumIterator4iterB9_
Line
Count
Source
74
4.38k
    strum_macros::EnumIter,
_RNvMsl_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiesNtB5_14PolicyTypeIter3getB9_
Line
Count
Source
74
17.5k
    strum_macros::EnumIter,
_RNvXsn_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiesNtB5_14PolicyTypeIterNtNtNtNtCsd3UI3IJrzMw_4core4iter6traits8iterator8Iterator4next
Line
Count
Source
74
21.9k
    strum_macros::EnumIter,
Unexecuted instantiation: _RNvXsn_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiesNtB5_14PolicyTypeIterNtNtNtNtCsd3UI3IJrzMw_4core4iter6traits8iterator8Iterator9size_hint
_RNvXsn_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiesNtB5_14PolicyTypeIterNtNtNtNtCsd3UI3IJrzMw_4core4iter6traits8iterator8Iterator3nth
Line
Count
Source
74
21.9k
    strum_macros::EnumIter,
Unexecuted instantiation: _RNvXso_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiesNtB5_14PolicyTypeIterNtNtNtNtCsd3UI3IJrzMw_4core4iter6traits10exact_size17ExactSizeIterator3len
Unexecuted instantiation: _RNvXsp_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiesNtB5_14PolicyTypeIterNtNtNtNtCsd3UI3IJrzMw_4core4iter6traits12double_ended19DoubleEndedIterator9next_back
Unexecuted instantiation: _RNvXsq_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiesNtB5_14PolicyTypeIterNtNtCsd3UI3IJrzMw_4core5clone5Clone5cloneB9_
75
    serde::Serialize,
76
0
    serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiess2_1__NtB7_10PolicyTypeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1i_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiess2_1__NtBa_10PolicyTypeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1l_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiess2_1__NtB8_10PolicyTypeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1j_7Visitor9visit_u64pEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiess2_1__NtB8_10PolicyTypeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1j_7Visitor9visit_strpEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiess2_1__NtB8_10PolicyTypeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1j_7Visitor11visit_bytespEBc_
Unexecuted instantiation: _RINvXs_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiess2_1__NtBa_10PolicyTypeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1j_11deserializepEBe_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiess2_1__NtBb_10PolicyTypeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1m_7Visitor10visit_enumpEBf_
77
)]
78
pub enum PolicyType {
79
    Tip,
80
    WitnessLimit,
81
    Maturity,
82
    MaxFee,
83
}
84
85
impl PolicyType {
86
138k
    pub const fn index(&self) -> usize {
87
138k
        match self {
88
0
            PolicyType::Tip => 0,
89
4.38k
            PolicyType::WitnessLimit => 1,
90
17.5k
            PolicyType::Maturity => 2,
91
116k
            PolicyType::MaxFee => 3,
92
        }
93
138k
    }
94
95
197k
    pub const fn bit(&self) -> PoliciesBits {
96
197k
        match self {
97
17.5k
            PolicyType::Tip => PoliciesBits::Tip,
98
39.4k
            PolicyType::WitnessLimit => PoliciesBits::WitnessLimit,
99
24.1k
            PolicyType::Maturity => PoliciesBits::Maturity,
100
116k
            PolicyType::MaxFee => PoliciesBits::MaxFee,
101
        }
102
197k
    }
_RNvMNtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiesNtB2_10PolicyType3bitCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
95
4.38k
    pub const fn bit(&self) -> PoliciesBits {
96
4.38k
        match self {
97
0
            PolicyType::Tip => PoliciesBits::Tip,
98
0
            PolicyType::WitnessLimit => PoliciesBits::WitnessLimit,
99
0
            PolicyType::Maturity => PoliciesBits::Maturity,
100
4.38k
            PolicyType::MaxFee => PoliciesBits::MaxFee,
101
        }
102
4.38k
    }
_RNvMNtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiesNtB2_10PolicyType3bitB6_
Line
Count
Source
95
192k
    pub const fn bit(&self) -> PoliciesBits {
96
192k
        match self {
97
17.5k
            PolicyType::Tip => PoliciesBits::Tip,
98
39.4k
            PolicyType::WitnessLimit => PoliciesBits::WitnessLimit,
99
24.1k
            PolicyType::Maturity => PoliciesBits::Maturity,
100
111k
            PolicyType::MaxFee => PoliciesBits::MaxFee,
101
        }
102
192k
    }
103
}
104
105
/// The total number of policies.
106
pub const POLICIES_NUMBER: usize = PoliciesBits::all().bits().count_ones() as usize;
107
108
/// Container for managing policies.
109
#[derive(
110
0
    Clone, Copy, Default, Debug, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiess4_1__NtB7_8PoliciesNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1f_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiess4_1__NtBa_8PoliciesNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1i_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiess4_1__NtB8_8PoliciesNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1g_7Visitor9visit_u64pEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiess4_1__NtB8_8PoliciesNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1g_7Visitor9visit_strpEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiess4_1__NtB8_8PoliciesNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1g_7Visitor11visit_bytespEBc_
Unexecuted instantiation: _RINvXs_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiess4_1__NtBa_8PoliciesNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1g_11deserializepEBe_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiess4_1__NtBb_8PoliciesNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1j_7Visitor9visit_seqpEBf_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiess4_1__NtBb_8PoliciesNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1j_7Visitor9visit_mappEBf_
111
)]
112
#[cfg_attr(
113
    feature = "da-compression",
114
    derive(fuel_compression::Compress, fuel_compression::Decompress)
115
)]
116
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
117
pub struct Policies {
118
    /// A bitmask that indicates what policies are set.
119
    bits: PoliciesBits,
120
    /// The array of policy values.
121
    values: [Word; POLICIES_NUMBER],
122
}
123
124
impl Policies {
125
    /// Creates an empty `Self`.
126
10.9k
    pub const fn new() -> Self {
127
10.9k
        Self {
128
10.9k
            bits: PoliciesBits::empty(),
129
10.9k
            values: [0; POLICIES_NUMBER],
130
10.9k
        }
131
10.9k
    }
_RNvMs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiesNtB4_8Policies3newCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
126
4.38k
    pub const fn new() -> Self {
127
4.38k
        Self {
128
4.38k
            bits: PoliciesBits::empty(),
129
4.38k
            values: [0; POLICIES_NUMBER],
130
4.38k
        }
131
4.38k
    }
_RNvMs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiesNtB4_8Policies3newB8_
Line
Count
Source
126
6.57k
    pub const fn new() -> Self {
127
6.57k
        Self {
128
6.57k
            bits: PoliciesBits::empty(),
129
6.57k
            values: [0; POLICIES_NUMBER],
130
6.57k
        }
131
6.57k
    }
132
133
    /// Returns `true` if no policies are set.
134
0
    pub fn is_empty(&self) -> bool {
135
0
        self.len() == 0
136
0
    }
137
138
    /// Returns the number of set policies.
139
0
    pub fn len(&self) -> usize {
140
0
        self.bits.bits().count_ones() as usize
141
0
    }
142
143
    /// Returns the bit mask of the policies.
144
433k
    pub fn bits(&self) -> u32 {
145
433k
        self.bits.bits()
146
433k
    }
_RNvMs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiesNtB4_8Policies4bitsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
144
433k
    pub fn bits(&self) -> u32 {
145
433k
        self.bits.bits()
146
433k
    }
Unexecuted instantiation: _RNvMs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiesNtB4_8Policies4bitsB8_
147
148
    /// Sets the `gas_price` policy.
149
0
    pub fn with_tip(mut self, tip: Word) -> Self {
150
0
        self.set(PolicyType::Tip, Some(tip));
151
0
        self
152
0
    }
153
154
    /// Sets the `witness_limit` policy.
155
4.38k
    pub fn with_witness_limit(mut self, witness_limit: Word) -> Self {
156
4.38k
        self.set(PolicyType::WitnessLimit, Some(witness_limit));
157
4.38k
        self
158
4.38k
    }
159
160
    /// Sets the `maturity` policy.
161
4.38k
    pub fn with_maturity(mut self, maturity: BlockHeight) -> Self {
162
4.38k
        self.set(PolicyType::Maturity, Some(*maturity.deref() as u64));
163
4.38k
        self
164
4.38k
    }
165
166
    /// Sets the `max_fee` policy.
167
6.57k
    pub fn with_max_fee(mut self, max_fee: Word) -> Self {
168
6.57k
        self.set(PolicyType::MaxFee, Some(max_fee));
169
6.57k
        self
170
6.57k
    }
171
172
    /// Returns a policy's value if the corresponding bit is set.
173
153k
    pub fn get(&self, policy_type: PolicyType) -> Option<Word> {
174
153k
        if self.bits.contains(policy_type.bit()) {
175
103k
            Some(self.values[policy_type.index()])
176
        } else {
177
50.4k
            None
178
        }
179
153k
    }
180
181
    /// Returns `true` if the policy is set.
182
4.38k
    pub fn is_set(&self, policy_type: PolicyType) -> bool {
183
4.38k
        self.bits.contains(policy_type.bit())
184
4.38k
    }
_RNvMs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiesNtB4_8Policies6is_setCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
182
4.38k
    pub fn is_set(&self, policy_type: PolicyType) -> bool {
183
4.38k
        self.bits.contains(policy_type.bit())
184
4.38k
    }
Unexecuted instantiation: _RNvMs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiesNtB4_8Policies6is_setB8_
185
186
    /// Returns a policy's type by the `index`.
187
0
    pub fn get_type_by_index(&self, index: usize) -> Option<u32> {
188
0
        self.bits.iter().nth(index).map(|bit| bit.bits())
189
0
    }
190
191
    /// Sets a policy's value if the `value` is `Some`, otherwise, unset it.
192
21.9k
    pub fn set(&mut self, policy_type: PolicyType, value: Option<Word>) {
193
21.9k
        if let Some(value) = value {
194
21.9k
            self.bits.insert(policy_type.bit());
195
21.9k
            self.values[policy_type.index()] = value;
196
21.9k
        } else {
197
0
            self.bits.remove(policy_type.bit());
198
0
            self.values[policy_type.index()] = 0;
199
0
        }
200
21.9k
    }
201
202
    /// Returns `true` if the `Self` follows all rules from the specification.
203
4.38k
    pub fn is_valid(&self) -> bool {
204
4.38k
        let expected_values = Self::values_for_bitmask(self.bits, self.values);
205
4.38k
206
4.38k
        if self.bits.bits() > PoliciesBits::all().bits() {
207
0
            return false;
208
4.38k
        }
209
4.38k
210
4.38k
        if self.values != expected_values {
211
0
            return false;
212
4.38k
        }
213
214
4.38k
        if let Some(maturity) = self.get(PolicyType::Maturity) {
215
2.19k
            if maturity > u32::MAX as u64 {
216
0
                return false;
217
2.19k
            }
218
2.19k
        }
219
220
4.38k
        true
221
4.38k
    }
222
223
    /// Helper function to generate values arrays based on the `PoliciesBits`.
224
4.38k
    fn values_for_bitmask(
225
4.38k
        bits: PoliciesBits,
226
4.38k
        default_values: [Word; POLICIES_NUMBER],
227
4.38k
    ) -> [Word; POLICIES_NUMBER] {
228
        use strum::IntoEnumIterator;
229
4.38k
        let mut values = [0; POLICIES_NUMBER];
230
21.9k
        for policy_type in PolicyType::iter() {
231
17.5k
            if bits.contains(policy_type.bit()) {
232
6.57k
                values[policy_type.index()] = default_values[policy_type.index()];
233
10.9k
            }
234
        }
235
4.38k
        values
236
4.38k
    }
237
}
238
239
impl Serialize for Policies {
240
118k
    fn size_static(&self) -> usize {
241
118k
        self.bits.bits().size_static()
242
118k
    }
243
244
    #[allow(clippy::arithmetic_side_effects)] // Bit count is not large enough to overflow.
245
171k
    fn size_dynamic(&self) -> usize {
246
171k
        self.bits.bits().count_ones() as usize * Word::MIN.size()
247
171k
    }
248
249
17.5k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
250
17.5k
        self.bits.bits().encode_static(buffer)
251
17.5k
    }
_RINvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiesNtB6_8PoliciesNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
249
8.77k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
250
8.77k
        self.bits.bits().encode_static(buffer)
251
8.77k
    }
_RINvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiesNtB6_8PoliciesNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBa_
Line
Count
Source
249
8.77k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
250
8.77k
        self.bits.bits().encode_static(buffer)
251
8.77k
    }
252
253
17.5k
    fn encode_dynamic<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
254
70.1k
        for (value, bit) in self.values.iter().zip(PoliciesBits::all().iter()) {
255
70.1k
            if self.bits.contains(bit) {
256
26.3k
                value.encode(buffer)?;
257
43.8k
            }
258
        }
259
17.5k
        Ok(())
260
17.5k
    }
_RINvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiesNtB6_8PoliciesNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
253
8.77k
    fn encode_dynamic<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
254
35.0k
        for (value, bit) in self.values.iter().zip(PoliciesBits::all().iter()) {
255
35.0k
            if self.bits.contains(bit) {
256
13.1k
                value.encode(buffer)?;
257
21.9k
            }
258
        }
259
8.77k
        Ok(())
260
8.77k
    }
_RINvXs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiesNtB6_8PoliciesNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBa_
Line
Count
Source
253
8.77k
    fn encode_dynamic<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
254
35.0k
        for (value, bit) in self.values.iter().zip(PoliciesBits::all().iter()) {
255
35.0k
            if self.bits.contains(bit) {
256
13.1k
                value.encode(buffer)?;
257
21.9k
            }
258
        }
259
8.77k
        Ok(())
260
8.77k
    }
261
}
262
263
impl Deserialize for Policies {
264
4.38k
    fn decode_static<I: Input + ?Sized>(buffer: &mut I) -> Result<Self, Error> {
265
4.38k
        let bits = u32::decode(buffer)?;
266
4.38k
        let bits = PoliciesBits::from_bits(bits)
267
4.38k
            .ok_or(Error::Unknown("Invalid policies bits"))?;
268
4.38k
        Ok(Self {
269
4.38k
            bits,
270
4.38k
            values: Default::default(),
271
4.38k
        })
272
4.38k
    }
_RINvXs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiesNtB6_8PoliciesNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
264
4.38k
    fn decode_static<I: Input + ?Sized>(buffer: &mut I) -> Result<Self, Error> {
265
4.38k
        let bits = u32::decode(buffer)?;
266
4.38k
        let bits = PoliciesBits::from_bits(bits)
267
4.38k
            .ok_or(Error::Unknown("Invalid policies bits"))?;
268
4.38k
        Ok(Self {
269
4.38k
            bits,
270
4.38k
            values: Default::default(),
271
4.38k
        })
272
4.38k
    }
Unexecuted instantiation: _RINvXs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiesNtB6_8PoliciesNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEBa_
273
274
4.38k
    fn decode_dynamic<I: Input + ?Sized>(&mut self, buffer: &mut I) -> Result<(), Error> {
275
17.5k
        for (index, bit) in PoliciesBits::all().iter().enumerate() {
276
17.5k
            if self.bits.contains(bit) {
277
6.57k
                self.values[index] = Word::decode(buffer)?;
278
10.9k
            }
279
        }
280
281
4.38k
        if let Some(maturity) = self.get(PolicyType::Maturity) {
282
2.19k
            if maturity > u32::MAX as u64 {
283
0
                return Err(Error::Unknown("The maturity in more than `u32::MAX`"));
284
2.19k
            }
285
2.19k
        }
286
287
4.38k
        Ok(())
288
4.38k
    }
_RINvXs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiesNtB6_8PoliciesNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
274
4.38k
    fn decode_dynamic<I: Input + ?Sized>(&mut self, buffer: &mut I) -> Result<(), Error> {
275
17.5k
        for (index, bit) in PoliciesBits::all().iter().enumerate() {
276
17.5k
            if self.bits.contains(bit) {
277
6.57k
                self.values[index] = Word::decode(buffer)?;
278
10.9k
            }
279
        }
280
281
4.38k
        if let Some(maturity) = self.get(PolicyType::Maturity) {
282
2.19k
            if maturity > u32::MAX as u64 {
283
0
                return Err(Error::Unknown("The maturity in more than `u32::MAX`"));
284
2.19k
            }
285
2.19k
        }
286
287
4.38k
        Ok(())
288
4.38k
    }
Unexecuted instantiation: _RINvXs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8policiesNtB6_8PoliciesNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBa_
289
}
290
291
#[cfg(feature = "random")]
292
impl Distribution<Policies> for Standard {
293
0
    fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Policies {
294
0
        let bits: u32 = rng.gen();
295
0
        let bits = bits & PoliciesBits::all().bits();
296
0
        let bits = PoliciesBits::from_bits(bits).expect("We checked that above");
297
0
        let values = rng.gen();
298
0
        let mut policies = Policies {
299
0
            bits,
300
0
            values: Policies::values_for_bitmask(bits, values),
301
0
        };
302
0
303
0
        if policies.get(PolicyType::Maturity).is_some() {
304
0
            let maturity: u32 = rng.gen();
305
0
            policies.set(PolicyType::Maturity, Some(maturity as u64));
306
0
        }
307
308
0
        policies
309
0
    }
310
}
311
312
#[cfg(feature = "typescript")]
313
pub mod typescript {
314
    use wasm_bindgen::prelude::*;
315
316
    use crate::transaction::Policies;
317
    use alloc::{
318
        format,
319
        string::String,
320
        vec::Vec,
321
    };
322
323
    #[wasm_bindgen]
324
    impl Policies {
325
        #[wasm_bindgen(constructor)]
326
        pub fn typescript_new() -> Policies {
327
            Policies::default()
328
        }
329
330
        #[wasm_bindgen(js_name = toJSON)]
331
        pub fn to_json(&self) -> String {
332
            serde_json::to_string(&self).expect("unable to json format")
333
        }
334
335
        #[wasm_bindgen(js_name = toString)]
336
        pub fn typescript_to_string(&self) -> String {
337
            format!("{:?}", self)
338
        }
339
340
        #[wasm_bindgen(js_name = to_bytes)]
341
        pub fn typescript_to_bytes(&self) -> Vec<u8> {
342
            use fuel_types::canonical::Serialize;
343
            <Self as Serialize>::to_bytes(self)
344
        }
345
346
        #[wasm_bindgen(js_name = from_bytes)]
347
        pub fn typescript_from_bytes(value: &[u8]) -> Result<Policies, js_sys::Error> {
348
            use fuel_types::canonical::Deserialize;
349
            <Self as Deserialize>::from_bytes(value)
350
                .map_err(|e| js_sys::Error::new(&format!("{:?}", e)))
351
        }
352
    }
353
}
354
355
#[test]
356
fn values_for_bitmask_produces_expected_values() {
357
    const MAX_BITMASK: u32 = 1 << POLICIES_NUMBER;
358
    const VALUES: [Word; POLICIES_NUMBER] = [0x1000001, 0x2000001, 0x3000001, 0x4000001];
359
360
    // Given
361
    let mut set = hashbrown::HashSet::new();
362
363
    // When
364
    for bitmask in 0..MAX_BITMASK {
365
        let bits =
366
            PoliciesBits::from_bits(bitmask).expect("Should construct a valid bits");
367
        set.insert(Policies::values_for_bitmask(bits, VALUES));
368
    }
369
370
    // Then
371
    assert_eq!(set.len(), MAX_BITMASK as usize);
372
}
373
374
#[test]
375
fn canonical_serialization_deserialization_for_any_combination_of_values_works() {
376
    const MAX_BITMASK: u32 = 1 << POLICIES_NUMBER;
377
    const VALUES: [Word; POLICIES_NUMBER] = [0x1000001, 0x2000001, 0x3000001, 0x4000001];
378
379
    for bitmask in 0..MAX_BITMASK {
380
        let bits =
381
            PoliciesBits::from_bits(bitmask).expect("Should construct a valid bits");
382
        let policies = Policies {
383
            bits,
384
            values: Policies::values_for_bitmask(bits, VALUES),
385
        };
386
387
        let size = policies.size();
388
        let mut buffer = vec![0u8; size];
389
        policies
390
            .encode(&mut buffer.as_mut_slice())
391
            .expect("Should encode without error");
392
393
        let new_policies = Policies::decode(&mut buffer.as_slice())
394
            .expect("Should decode without error");
395
396
        assert_eq!(policies, new_policies);
397
        assert_eq!(new_policies.bits.bits(), bitmask);
398
399
        for (index, bit) in PoliciesBits::all().iter().enumerate() {
400
            if policies.bits.contains(bit) {
401
                assert_eq!(VALUES[index], new_policies.values[index]);
402
            } else {
403
                assert_eq!(0, new_policies.values[index]);
404
            }
405
        }
406
407
        assert_eq!(new_policies.size(), size);
408
        // `bitmask.count_ones()` - the number of serialized values
409
        assert_eq!(
410
            size,
411
            (policies.bits.bits().size()
412
                + bitmask.count_ones() as usize * Word::MIN.size())
413
        );
414
    }
415
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/consensus_parameters/gas.rs
Line
Count
Source
1
//! Tools for gas instrumentalization
2
3
use core::ops::Deref;
4
5
#[cfg(feature = "alloc")]
6
use alloc::sync::Arc;
7
8
use fuel_asm::PanicReason;
9
use fuel_types::Word;
10
11
/// Default gas costs are generated from the
12
/// `fuel-core` repo using the `collect` bin
13
/// in the `fuel-core-benches` crate.
14
/// The git sha is included in the file to
15
/// show what version of `fuel-core` was used
16
/// to generate the costs.
17
#[allow(dead_code)]
18
mod default_gas_costs;
19
20
/// Gas costings for every op.
21
/// The inner values are wrapped in an [`Arc`]
22
/// so this is cheap to clone.
23
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
24
#[cfg(feature = "alloc")]
25
pub struct GasCosts(Arc<GasCostsValues>);
26
27
#[cfg(feature = "alloc")]
28
impl<'de> serde::Deserialize<'de> for GasCosts {
29
0
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
30
0
    where
31
0
        D: serde::Deserializer<'de>,
32
0
    {
33
0
        Ok(GasCosts(Arc::new(serde::Deserialize::deserialize(
34
0
            deserializer,
35
0
        )?)))
36
0
    }
37
}
38
39
#[cfg(feature = "alloc")]
40
impl serde::Serialize for GasCosts {
41
0
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
42
0
    where
43
0
        S: serde::Serializer,
44
0
    {
45
0
        serde::Serialize::serialize(self.0.as_ref(), serializer)
46
0
    }
47
}
48
49
#[cfg(feature = "alloc")]
50
impl GasCosts {
51
    /// Create new cost values wrapped in an [`Arc`].
52
0
    pub fn new(costs: GasCostsValues) -> Self {
53
0
        Self(Arc::new(costs))
54
0
    }
55
}
56
57
#[cfg(feature = "alloc")]
58
impl Default for GasCosts {
59
8.77k
    fn default() -> Self {
60
8.77k
        Self(Arc::new(GasCostsValues::default()))
61
8.77k
    }
62
}
63
64
impl Default for GasCostsValues {
65
8.77k
    fn default() -> Self {
66
8.77k
        // The default values for gas costs
67
8.77k
        // are generated from fuel-core-benches.
68
8.77k
        default_gas_costs::default_gas_costs()
69
8.77k
    }
70
}
71
72
/// The versioned gas costs for every op.
73
0
#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
Unexecuted instantiation: _RNvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass_1__NtB7_14GasCostsValuesNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1E_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass_1__NtB8_14GasCostsValuesNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1F_7Visitor9visit_u64NtNtCs1b0Bw0OchLA_8postcard5error5ErrorEBe_
Unexecuted instantiation: _RINvXs_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass_1__NtBa_14GasCostsValuesNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1F_11deserializeINtNtB1H_5value15U32DeserializerNtNtCs1b0Bw0OchLA_8postcard5error5ErrorEEBg_
Unexecuted instantiation: _RNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass_1__NtBa_14GasCostsValuesNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1H_7Visitor9expecting
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass_1__NtBb_14GasCostsValuesNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1I_7Visitor10visit_enumQINtNtNtCs1b0Bw0OchLA_8postcard2de12deserializer12DeserializerNtNtB3j_7flavors5SliceEEBh_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass_1__NtB8_14GasCostsValuesNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1F_7Visitor9visit_strpEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass_1__NtB8_14GasCostsValuesNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1F_7Visitor11visit_bytespEBe_
74
pub enum GasCostsValues {
75
    /// Version 1 of the gas costs.
76
    V1(GasCostsValuesV1),
77
    /// Version 2 of the gas costs.
78
    V2(GasCostsValuesV2),
79
    /// Version 3 of the gas costs.
80
    V3(GasCostsValuesV3),
81
    /// Version 4 of the gas costs.
82
    V4(GasCostsValuesV4),
83
}
84
85
/// Gas cost for this instruction is not defined for this version.
86
pub struct GasCostNotDefined;
87
88
impl From<GasCostNotDefined> for PanicReason {
89
0
    fn from(_: GasCostNotDefined) -> PanicReason {
90
0
        PanicReason::GasCostNotDefined
91
0
    }
Unexecuted instantiation: _RNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtNtCs6P3fQNJKMy0_8fuel_asm12panic_reason11PanicReasonINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_17GasCostNotDefinedE4fromCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtNtCs6P3fQNJKMy0_8fuel_asm12panic_reason11PanicReasonINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_17GasCostNotDefinedE4fromBb_
92
}
93
94
#[allow(missing_docs)]
95
impl GasCostsValues {
96
30.0M
    pub fn add(&self) -> Word {
97
30.0M
        match self {
98
0
            GasCostsValues::V1(v1) => v1.add,
99
0
            GasCostsValues::V2(v2) => v2.add,
100
0
            GasCostsValues::V3(v3) => v3.add,
101
30.0M
            GasCostsValues::V4(v4) => v4.add,
102
        }
103
30.0M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3addCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
96
30.0M
    pub fn add(&self) -> Word {
97
30.0M
        match self {
98
0
            GasCostsValues::V1(v1) => v1.add,
99
0
            GasCostsValues::V2(v2) => v2.add,
100
0
            GasCostsValues::V3(v3) => v3.add,
101
30.0M
            GasCostsValues::V4(v4) => v4.add,
102
        }
103
30.0M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3addBb_
104
105
34.9M
    pub fn addi(&self) -> Word {
106
34.9M
        match self {
107
0
            GasCostsValues::V1(v1) => v1.addi,
108
0
            GasCostsValues::V2(v2) => v2.addi,
109
0
            GasCostsValues::V3(v3) => v3.addi,
110
34.9M
            GasCostsValues::V4(v4) => v4.addi,
111
        }
112
34.9M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4addiCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
105
34.9M
    pub fn addi(&self) -> Word {
106
34.9M
        match self {
107
0
            GasCostsValues::V1(v1) => v1.addi,
108
0
            GasCostsValues::V2(v2) => v2.addi,
109
0
            GasCostsValues::V3(v3) => v3.addi,
110
34.9M
            GasCostsValues::V4(v4) => v4.addi,
111
        }
112
34.9M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4addiBb_
113
114
4.64M
    pub fn and(&self) -> Word {
115
4.64M
        match self {
116
0
            GasCostsValues::V1(v1) => v1.and,
117
0
            GasCostsValues::V2(v2) => v2.and,
118
0
            GasCostsValues::V3(v3) => v3.and,
119
4.64M
            GasCostsValues::V4(v4) => v4.and,
120
        }
121
4.64M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3andCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
114
4.64M
    pub fn and(&self) -> Word {
115
4.64M
        match self {
116
0
            GasCostsValues::V1(v1) => v1.and,
117
0
            GasCostsValues::V2(v2) => v2.and,
118
0
            GasCostsValues::V3(v3) => v3.and,
119
4.64M
            GasCostsValues::V4(v4) => v4.and,
120
        }
121
4.64M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3andBb_
122
123
3.18M
    pub fn andi(&self) -> Word {
124
3.18M
        match self {
125
0
            GasCostsValues::V1(v1) => v1.andi,
126
0
            GasCostsValues::V2(v2) => v2.andi,
127
0
            GasCostsValues::V3(v3) => v3.andi,
128
3.18M
            GasCostsValues::V4(v4) => v4.andi,
129
        }
130
3.18M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4andiCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
123
3.18M
    pub fn andi(&self) -> Word {
124
3.18M
        match self {
125
0
            GasCostsValues::V1(v1) => v1.andi,
126
0
            GasCostsValues::V2(v2) => v2.andi,
127
0
            GasCostsValues::V3(v3) => v3.andi,
128
3.18M
            GasCostsValues::V4(v4) => v4.andi,
129
        }
130
3.18M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4andiBb_
131
132
7
    pub fn bal(&self) -> Word {
133
7
        match self {
134
0
            GasCostsValues::V1(v1) => v1.bal,
135
0
            GasCostsValues::V2(v2) => v2.bal,
136
0
            GasCostsValues::V3(v3) => v3.bal,
137
7
            GasCostsValues::V4(v4) => v4.bal,
138
        }
139
7
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3balCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
132
7
    pub fn bal(&self) -> Word {
133
7
        match self {
134
0
            GasCostsValues::V1(v1) => v1.bal,
135
0
            GasCostsValues::V2(v2) => v2.bal,
136
0
            GasCostsValues::V3(v3) => v3.bal,
137
7
            GasCostsValues::V4(v4) => v4.bal,
138
        }
139
7
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3balBb_
140
141
174k
    pub fn bhei(&self) -> Word {
142
174k
        match self {
143
0
            GasCostsValues::V1(v1) => v1.bhei,
144
0
            GasCostsValues::V2(v2) => v2.bhei,
145
0
            GasCostsValues::V3(v3) => v3.bhei,
146
174k
            GasCostsValues::V4(v4) => v4.bhei,
147
        }
148
174k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4bheiCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
141
174k
    pub fn bhei(&self) -> Word {
142
174k
        match self {
143
0
            GasCostsValues::V1(v1) => v1.bhei,
144
0
            GasCostsValues::V2(v2) => v2.bhei,
145
0
            GasCostsValues::V3(v3) => v3.bhei,
146
174k
            GasCostsValues::V4(v4) => v4.bhei,
147
        }
148
174k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4bheiBb_
149
150
72.8k
    pub fn bhsh(&self) -> Word {
151
72.8k
        match self {
152
0
            GasCostsValues::V1(v1) => v1.bhsh,
153
0
            GasCostsValues::V2(v2) => v2.bhsh,
154
0
            GasCostsValues::V3(v3) => v3.bhsh,
155
72.8k
            GasCostsValues::V4(v4) => v4.bhsh,
156
        }
157
72.8k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4bhshCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
150
72.8k
    pub fn bhsh(&self) -> Word {
151
72.8k
        match self {
152
0
            GasCostsValues::V1(v1) => v1.bhsh,
153
0
            GasCostsValues::V2(v2) => v2.bhsh,
154
0
            GasCostsValues::V3(v3) => v3.bhsh,
155
72.8k
            GasCostsValues::V4(v4) => v4.bhsh,
156
        }
157
72.8k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4bhshBb_
158
159
117
    pub fn burn(&self) -> Word {
160
117
        match self {
161
0
            GasCostsValues::V1(v1) => v1.burn,
162
0
            GasCostsValues::V2(v2) => v2.burn,
163
0
            GasCostsValues::V3(v3) => v3.burn,
164
117
            GasCostsValues::V4(v4) => v4.burn,
165
        }
166
117
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4burnCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
159
117
    pub fn burn(&self) -> Word {
160
117
        match self {
161
0
            GasCostsValues::V1(v1) => v1.burn,
162
0
            GasCostsValues::V2(v2) => v2.burn,
163
0
            GasCostsValues::V3(v3) => v3.burn,
164
117
            GasCostsValues::V4(v4) => v4.burn,
165
        }
166
117
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4burnBb_
167
168
231k
    pub fn cb(&self) -> Word {
169
231k
        match self {
170
0
            GasCostsValues::V1(v1) => v1.cb,
171
0
            GasCostsValues::V2(v2) => v2.cb,
172
0
            GasCostsValues::V3(v3) => v3.cb,
173
231k
            GasCostsValues::V4(v4) => v4.cb,
174
        }
175
231k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues2cbCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
168
231k
    pub fn cb(&self) -> Word {
169
231k
        match self {
170
0
            GasCostsValues::V1(v1) => v1.cb,
171
0
            GasCostsValues::V2(v2) => v2.cb,
172
0
            GasCostsValues::V3(v3) => v3.cb,
173
231k
            GasCostsValues::V4(v4) => v4.cb,
174
        }
175
231k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues2cbBb_
176
177
2.16M
    pub fn cfsi(&self) -> Word {
178
2.16M
        match self {
179
0
            GasCostsValues::V1(v1) => v1.cfsi,
180
0
            GasCostsValues::V2(v2) => v2.cfsi,
181
0
            GasCostsValues::V3(v3) => v3.cfsi,
182
2.16M
            GasCostsValues::V4(v4) => v4.cfsi,
183
        }
184
2.16M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4cfsiCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
177
2.16M
    pub fn cfsi(&self) -> Word {
178
2.16M
        match self {
179
0
            GasCostsValues::V1(v1) => v1.cfsi,
180
0
            GasCostsValues::V2(v2) => v2.cfsi,
181
0
            GasCostsValues::V3(v3) => v3.cfsi,
182
2.16M
            GasCostsValues::V4(v4) => v4.cfsi,
183
        }
184
2.16M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4cfsiBb_
185
186
141k
    pub fn div(&self) -> Word {
187
141k
        match self {
188
0
            GasCostsValues::V1(v1) => v1.div,
189
0
            GasCostsValues::V2(v2) => v2.div,
190
0
            GasCostsValues::V3(v3) => v3.div,
191
141k
            GasCostsValues::V4(v4) => v4.div,
192
        }
193
141k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3divCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
186
141k
    pub fn div(&self) -> Word {
187
141k
        match self {
188
0
            GasCostsValues::V1(v1) => v1.div,
189
0
            GasCostsValues::V2(v2) => v2.div,
190
0
            GasCostsValues::V3(v3) => v3.div,
191
141k
            GasCostsValues::V4(v4) => v4.div,
192
        }
193
141k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3divBb_
194
195
5.48M
    pub fn divi(&self) -> Word {
196
5.48M
        match self {
197
0
            GasCostsValues::V1(v1) => v1.divi,
198
0
            GasCostsValues::V2(v2) => v2.divi,
199
0
            GasCostsValues::V3(v3) => v3.divi,
200
5.48M
            GasCostsValues::V4(v4) => v4.divi,
201
        }
202
5.48M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4diviCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
195
5.48M
    pub fn divi(&self) -> Word {
196
5.48M
        match self {
197
0
            GasCostsValues::V1(v1) => v1.divi,
198
0
            GasCostsValues::V2(v2) => v2.divi,
199
0
            GasCostsValues::V3(v3) => v3.divi,
200
5.48M
            GasCostsValues::V4(v4) => v4.divi,
201
        }
202
5.48M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4diviBb_
203
204
55.0k
    pub fn eck1(&self) -> Word {
205
55.0k
        match self {
206
0
            GasCostsValues::V1(v1) => v1.eck1,
207
0
            GasCostsValues::V2(v2) => v2.eck1,
208
0
            GasCostsValues::V3(v3) => v3.eck1,
209
55.0k
            GasCostsValues::V4(v4) => v4.eck1,
210
        }
211
55.0k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4eck1Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
204
55.0k
    pub fn eck1(&self) -> Word {
205
55.0k
        match self {
206
0
            GasCostsValues::V1(v1) => v1.eck1,
207
0
            GasCostsValues::V2(v2) => v2.eck1,
208
0
            GasCostsValues::V3(v3) => v3.eck1,
209
55.0k
            GasCostsValues::V4(v4) => v4.eck1,
210
        }
211
55.0k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4eck1Bb_
212
213
4.53k
    pub fn ecr1(&self) -> Word {
214
4.53k
        match self {
215
0
            GasCostsValues::V1(v1) => v1.ecr1,
216
0
            GasCostsValues::V2(v2) => v2.ecr1,
217
0
            GasCostsValues::V3(v3) => v3.ecr1,
218
4.53k
            GasCostsValues::V4(v4) => v4.ecr1,
219
        }
220
4.53k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4ecr1Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
213
4.53k
    pub fn ecr1(&self) -> Word {
214
4.53k
        match self {
215
0
            GasCostsValues::V1(v1) => v1.ecr1,
216
0
            GasCostsValues::V2(v2) => v2.ecr1,
217
0
            GasCostsValues::V3(v3) => v3.ecr1,
218
4.53k
            GasCostsValues::V4(v4) => v4.ecr1,
219
        }
220
4.53k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4ecr1Bb_
221
222
6.91M
    pub fn eq_(&self) -> Word {
223
6.91M
        match self {
224
0
            GasCostsValues::V1(v1) => v1.eq,
225
0
            GasCostsValues::V2(v2) => v2.eq,
226
0
            GasCostsValues::V3(v3) => v3.eq,
227
6.91M
            GasCostsValues::V4(v4) => v4.eq,
228
        }
229
6.91M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3eq_Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
222
6.91M
    pub fn eq_(&self) -> Word {
223
6.91M
        match self {
224
0
            GasCostsValues::V1(v1) => v1.eq,
225
0
            GasCostsValues::V2(v2) => v2.eq,
226
0
            GasCostsValues::V3(v3) => v3.eq,
227
6.91M
            GasCostsValues::V4(v4) => v4.eq,
228
        }
229
6.91M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3eq_Bb_
230
231
1.59M
    pub fn exp(&self) -> Word {
232
1.59M
        match self {
233
0
            GasCostsValues::V1(v1) => v1.exp,
234
0
            GasCostsValues::V2(v2) => v2.exp,
235
0
            GasCostsValues::V3(v3) => v3.exp,
236
1.59M
            GasCostsValues::V4(v4) => v4.exp,
237
        }
238
1.59M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3expCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
231
1.59M
    pub fn exp(&self) -> Word {
232
1.59M
        match self {
233
0
            GasCostsValues::V1(v1) => v1.exp,
234
0
            GasCostsValues::V2(v2) => v2.exp,
235
0
            GasCostsValues::V3(v3) => v3.exp,
236
1.59M
            GasCostsValues::V4(v4) => v4.exp,
237
        }
238
1.59M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3expBb_
239
240
1.74M
    pub fn expi(&self) -> Word {
241
1.74M
        match self {
242
0
            GasCostsValues::V1(v1) => v1.expi,
243
0
            GasCostsValues::V2(v2) => v2.expi,
244
0
            GasCostsValues::V3(v3) => v3.expi,
245
1.74M
            GasCostsValues::V4(v4) => v4.expi,
246
        }
247
1.74M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4expiCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
240
1.74M
    pub fn expi(&self) -> Word {
241
1.74M
        match self {
242
0
            GasCostsValues::V1(v1) => v1.expi,
243
0
            GasCostsValues::V2(v2) => v2.expi,
244
0
            GasCostsValues::V3(v3) => v3.expi,
245
1.74M
            GasCostsValues::V4(v4) => v4.expi,
246
        }
247
1.74M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4expiBb_
248
249
583k
    pub fn flag(&self) -> Word {
250
583k
        match self {
251
0
            GasCostsValues::V1(v1) => v1.flag,
252
0
            GasCostsValues::V2(v2) => v2.flag,
253
0
            GasCostsValues::V3(v3) => v3.flag,
254
583k
            GasCostsValues::V4(v4) => v4.flag,
255
        }
256
583k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4flagCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
249
583k
    pub fn flag(&self) -> Word {
250
583k
        match self {
251
0
            GasCostsValues::V1(v1) => v1.flag,
252
0
            GasCostsValues::V2(v2) => v2.flag,
253
0
            GasCostsValues::V3(v3) => v3.flag,
254
583k
            GasCostsValues::V4(v4) => v4.flag,
255
        }
256
583k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4flagBb_
257
258
1.61M
    pub fn gm(&self) -> Word {
259
1.61M
        match self {
260
0
            GasCostsValues::V1(v1) => v1.gm,
261
0
            GasCostsValues::V2(v2) => v2.gm,
262
0
            GasCostsValues::V3(v3) => v3.gm,
263
1.61M
            GasCostsValues::V4(v4) => v4.gm,
264
        }
265
1.61M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues2gmCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
258
1.61M
    pub fn gm(&self) -> Word {
259
1.61M
        match self {
260
0
            GasCostsValues::V1(v1) => v1.gm,
261
0
            GasCostsValues::V2(v2) => v2.gm,
262
0
            GasCostsValues::V3(v3) => v3.gm,
263
1.61M
            GasCostsValues::V4(v4) => v4.gm,
264
        }
265
1.61M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues2gmBb_
266
267
5.78M
    pub fn gt(&self) -> Word {
268
5.78M
        match self {
269
0
            GasCostsValues::V1(v1) => v1.gt,
270
0
            GasCostsValues::V2(v2) => v2.gt,
271
0
            GasCostsValues::V3(v3) => v3.gt,
272
5.78M
            GasCostsValues::V4(v4) => v4.gt,
273
        }
274
5.78M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues2gtCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
267
5.78M
    pub fn gt(&self) -> Word {
268
5.78M
        match self {
269
0
            GasCostsValues::V1(v1) => v1.gt,
270
0
            GasCostsValues::V2(v2) => v2.gt,
271
0
            GasCostsValues::V3(v3) => v3.gt,
272
5.78M
            GasCostsValues::V4(v4) => v4.gt,
273
        }
274
5.78M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues2gtBb_
275
276
10.4M
    pub fn gtf(&self) -> Word {
277
10.4M
        match self {
278
0
            GasCostsValues::V1(v1) => v1.gtf,
279
0
            GasCostsValues::V2(v2) => v2.gtf,
280
0
            GasCostsValues::V3(v3) => v3.gtf,
281
10.4M
            GasCostsValues::V4(v4) => v4.gtf,
282
        }
283
10.4M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3gtfCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
276
10.4M
    pub fn gtf(&self) -> Word {
277
10.4M
        match self {
278
0
            GasCostsValues::V1(v1) => v1.gtf,
279
0
            GasCostsValues::V2(v2) => v2.gtf,
280
0
            GasCostsValues::V3(v3) => v3.gtf,
281
10.4M
            GasCostsValues::V4(v4) => v4.gtf,
282
        }
283
10.4M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3gtfBb_
284
285
40.7M
    pub fn ji(&self) -> Word {
286
40.7M
        match self {
287
0
            GasCostsValues::V1(v1) => v1.ji,
288
0
            GasCostsValues::V2(v2) => v2.ji,
289
0
            GasCostsValues::V3(v3) => v3.ji,
290
40.7M
            GasCostsValues::V4(v4) => v4.ji,
291
        }
292
40.7M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues2jiCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
285
40.7M
    pub fn ji(&self) -> Word {
286
40.7M
        match self {
287
0
            GasCostsValues::V1(v1) => v1.ji,
288
0
            GasCostsValues::V2(v2) => v2.ji,
289
0
            GasCostsValues::V3(v3) => v3.ji,
290
40.7M
            GasCostsValues::V4(v4) => v4.ji,
291
        }
292
40.7M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues2jiBb_
293
294
3.45M
    pub fn jmp(&self) -> Word {
295
3.45M
        match self {
296
0
            GasCostsValues::V1(v1) => v1.jmp,
297
0
            GasCostsValues::V2(v2) => v2.jmp,
298
0
            GasCostsValues::V3(v3) => v3.jmp,
299
3.45M
            GasCostsValues::V4(v4) => v4.jmp,
300
        }
301
3.45M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3jmpCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
294
3.45M
    pub fn jmp(&self) -> Word {
295
3.45M
        match self {
296
0
            GasCostsValues::V1(v1) => v1.jmp,
297
0
            GasCostsValues::V2(v2) => v2.jmp,
298
0
            GasCostsValues::V3(v3) => v3.jmp,
299
3.45M
            GasCostsValues::V4(v4) => v4.jmp,
300
        }
301
3.45M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3jmpBb_
302
303
7.04M
    pub fn jne(&self) -> Word {
304
7.04M
        match self {
305
0
            GasCostsValues::V1(v1) => v1.jne,
306
0
            GasCostsValues::V2(v2) => v2.jne,
307
0
            GasCostsValues::V3(v3) => v3.jne,
308
7.04M
            GasCostsValues::V4(v4) => v4.jne,
309
        }
310
7.04M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3jneCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
303
7.04M
    pub fn jne(&self) -> Word {
304
7.04M
        match self {
305
0
            GasCostsValues::V1(v1) => v1.jne,
306
0
            GasCostsValues::V2(v2) => v2.jne,
307
0
            GasCostsValues::V3(v3) => v3.jne,
308
7.04M
            GasCostsValues::V4(v4) => v4.jne,
309
        }
310
7.04M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3jneBb_
311
312
4.19M
    pub fn jnei(&self) -> Word {
313
4.19M
        match self {
314
0
            GasCostsValues::V1(v1) => v1.jnei,
315
0
            GasCostsValues::V2(v2) => v2.jnei,
316
0
            GasCostsValues::V3(v3) => v3.jnei,
317
4.19M
            GasCostsValues::V4(v4) => v4.jnei,
318
        }
319
4.19M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4jneiCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
312
4.19M
    pub fn jnei(&self) -> Word {
313
4.19M
        match self {
314
0
            GasCostsValues::V1(v1) => v1.jnei,
315
0
            GasCostsValues::V2(v2) => v2.jnei,
316
0
            GasCostsValues::V3(v3) => v3.jnei,
317
4.19M
            GasCostsValues::V4(v4) => v4.jnei,
318
        }
319
4.19M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4jneiBb_
320
321
20.2M
    pub fn jnzi(&self) -> Word {
322
20.2M
        match self {
323
0
            GasCostsValues::V1(v1) => v1.jnzi,
324
0
            GasCostsValues::V2(v2) => v2.jnzi,
325
0
            GasCostsValues::V3(v3) => v3.jnzi,
326
20.2M
            GasCostsValues::V4(v4) => v4.jnzi,
327
        }
328
20.2M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4jnziCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
321
20.2M
    pub fn jnzi(&self) -> Word {
322
20.2M
        match self {
323
0
            GasCostsValues::V1(v1) => v1.jnzi,
324
0
            GasCostsValues::V2(v2) => v2.jnzi,
325
0
            GasCostsValues::V3(v3) => v3.jnzi,
326
20.2M
            GasCostsValues::V4(v4) => v4.jnzi,
327
        }
328
20.2M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4jnziBb_
329
330
464k
    pub fn jmpf(&self) -> Word {
331
464k
        match self {
332
0
            GasCostsValues::V1(v1) => v1.jmpf,
333
0
            GasCostsValues::V2(v2) => v2.jmpf,
334
0
            GasCostsValues::V3(v3) => v3.jmpf,
335
464k
            GasCostsValues::V4(v4) => v4.jmpf,
336
        }
337
464k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4jmpfCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
330
464k
    pub fn jmpf(&self) -> Word {
331
464k
        match self {
332
0
            GasCostsValues::V1(v1) => v1.jmpf,
333
0
            GasCostsValues::V2(v2) => v2.jmpf,
334
0
            GasCostsValues::V3(v3) => v3.jmpf,
335
464k
            GasCostsValues::V4(v4) => v4.jmpf,
336
        }
337
464k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4jmpfBb_
338
339
1.19M
    pub fn jmpb(&self) -> Word {
340
1.19M
        match self {
341
0
            GasCostsValues::V1(v1) => v1.jmpb,
342
0
            GasCostsValues::V2(v2) => v2.jmpb,
343
0
            GasCostsValues::V3(v3) => v3.jmpb,
344
1.19M
            GasCostsValues::V4(v4) => v4.jmpb,
345
        }
346
1.19M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4jmpbCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
339
1.19M
    pub fn jmpb(&self) -> Word {
340
1.19M
        match self {
341
0
            GasCostsValues::V1(v1) => v1.jmpb,
342
0
            GasCostsValues::V2(v2) => v2.jmpb,
343
0
            GasCostsValues::V3(v3) => v3.jmpb,
344
1.19M
            GasCostsValues::V4(v4) => v4.jmpb,
345
        }
346
1.19M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4jmpbBb_
347
348
2.12M
    pub fn jnzf(&self) -> Word {
349
2.12M
        match self {
350
0
            GasCostsValues::V1(v1) => v1.jnzf,
351
0
            GasCostsValues::V2(v2) => v2.jnzf,
352
0
            GasCostsValues::V3(v3) => v3.jnzf,
353
2.12M
            GasCostsValues::V4(v4) => v4.jnzf,
354
        }
355
2.12M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4jnzfCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
348
2.12M
    pub fn jnzf(&self) -> Word {
349
2.12M
        match self {
350
0
            GasCostsValues::V1(v1) => v1.jnzf,
351
0
            GasCostsValues::V2(v2) => v2.jnzf,
352
0
            GasCostsValues::V3(v3) => v3.jnzf,
353
2.12M
            GasCostsValues::V4(v4) => v4.jnzf,
354
        }
355
2.12M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4jnzfBb_
356
357
5.18M
    pub fn jnzb(&self) -> Word {
358
5.18M
        match self {
359
0
            GasCostsValues::V1(v1) => v1.jnzb,
360
0
            GasCostsValues::V2(v2) => v2.jnzb,
361
0
            GasCostsValues::V3(v3) => v3.jnzb,
362
5.18M
            GasCostsValues::V4(v4) => v4.jnzb,
363
        }
364
5.18M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4jnzbCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
357
5.18M
    pub fn jnzb(&self) -> Word {
358
5.18M
        match self {
359
0
            GasCostsValues::V1(v1) => v1.jnzb,
360
0
            GasCostsValues::V2(v2) => v2.jnzb,
361
0
            GasCostsValues::V3(v3) => v3.jnzb,
362
5.18M
            GasCostsValues::V4(v4) => v4.jnzb,
363
        }
364
5.18M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4jnzbBb_
365
366
792k
    pub fn jnef(&self) -> Word {
367
792k
        match self {
368
0
            GasCostsValues::V1(v1) => v1.jnef,
369
0
            GasCostsValues::V2(v2) => v2.jnef,
370
0
            GasCostsValues::V3(v3) => v3.jnef,
371
792k
            GasCostsValues::V4(v4) => v4.jnef,
372
        }
373
792k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4jnefCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
366
792k
    pub fn jnef(&self) -> Word {
367
792k
        match self {
368
0
            GasCostsValues::V1(v1) => v1.jnef,
369
0
            GasCostsValues::V2(v2) => v2.jnef,
370
0
            GasCostsValues::V3(v3) => v3.jnef,
371
792k
            GasCostsValues::V4(v4) => v4.jnef,
372
        }
373
792k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4jnefBb_
374
375
7.13M
    pub fn jneb(&self) -> Word {
376
7.13M
        match self {
377
0
            GasCostsValues::V1(v1) => v1.jneb,
378
0
            GasCostsValues::V2(v2) => v2.jneb,
379
0
            GasCostsValues::V3(v3) => v3.jneb,
380
7.13M
            GasCostsValues::V4(v4) => v4.jneb,
381
        }
382
7.13M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4jnebCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
375
7.13M
    pub fn jneb(&self) -> Word {
376
7.13M
        match self {
377
0
            GasCostsValues::V1(v1) => v1.jneb,
378
0
            GasCostsValues::V2(v2) => v2.jneb,
379
0
            GasCostsValues::V3(v3) => v3.jneb,
380
7.13M
            GasCostsValues::V4(v4) => v4.jneb,
381
        }
382
7.13M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4jnebBb_
383
384
735k
    pub fn lb(&self) -> Word {
385
735k
        match self {
386
0
            GasCostsValues::V1(v1) => v1.lb,
387
0
            GasCostsValues::V2(v2) => v2.lb,
388
0
            GasCostsValues::V3(v3) => v3.lb,
389
735k
            GasCostsValues::V4(v4) => v4.lb,
390
        }
391
735k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues2lbCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
384
735k
    pub fn lb(&self) -> Word {
385
735k
        match self {
386
0
            GasCostsValues::V1(v1) => v1.lb,
387
0
            GasCostsValues::V2(v2) => v2.lb,
388
0
            GasCostsValues::V3(v3) => v3.lb,
389
735k
            GasCostsValues::V4(v4) => v4.lb,
390
        }
391
735k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues2lbBb_
392
393
631k
    pub fn log(&self) -> Word {
394
631k
        match self {
395
0
            GasCostsValues::V1(v1) => v1.log,
396
0
            GasCostsValues::V2(v2) => v2.log,
397
0
            GasCostsValues::V3(v3) => v3.log,
398
631k
            GasCostsValues::V4(v4) => v4.log,
399
        }
400
631k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3logCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
393
631k
    pub fn log(&self) -> Word {
394
631k
        match self {
395
0
            GasCostsValues::V1(v1) => v1.log,
396
0
            GasCostsValues::V2(v2) => v2.log,
397
0
            GasCostsValues::V3(v3) => v3.log,
398
631k
            GasCostsValues::V4(v4) => v4.log,
399
        }
400
631k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3logBb_
401
402
2.39M
    pub fn lt(&self) -> Word {
403
2.39M
        match self {
404
0
            GasCostsValues::V1(v1) => v1.lt,
405
0
            GasCostsValues::V2(v2) => v2.lt,
406
0
            GasCostsValues::V3(v3) => v3.lt,
407
2.39M
            GasCostsValues::V4(v4) => v4.lt,
408
        }
409
2.39M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues2ltCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
402
2.39M
    pub fn lt(&self) -> Word {
403
2.39M
        match self {
404
0
            GasCostsValues::V1(v1) => v1.lt,
405
0
            GasCostsValues::V2(v2) => v2.lt,
406
0
            GasCostsValues::V3(v3) => v3.lt,
407
2.39M
            GasCostsValues::V4(v4) => v4.lt,
408
        }
409
2.39M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues2ltBb_
410
411
51.5M
    pub fn lw(&self) -> Word {
412
51.5M
        match self {
413
0
            GasCostsValues::V1(v1) => v1.lw,
414
0
            GasCostsValues::V2(v2) => v2.lw,
415
0
            GasCostsValues::V3(v3) => v3.lw,
416
51.5M
            GasCostsValues::V4(v4) => v4.lw,
417
        }
418
51.5M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues2lwCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
411
51.5M
    pub fn lw(&self) -> Word {
412
51.5M
        match self {
413
0
            GasCostsValues::V1(v1) => v1.lw,
414
0
            GasCostsValues::V2(v2) => v2.lw,
415
0
            GasCostsValues::V3(v3) => v3.lw,
416
51.5M
            GasCostsValues::V4(v4) => v4.lw,
417
        }
418
51.5M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues2lwBb_
419
420
48
    pub fn mint(&self) -> Word {
421
48
        match self {
422
0
            GasCostsValues::V1(v1) => v1.mint,
423
0
            GasCostsValues::V2(v2) => v2.mint,
424
0
            GasCostsValues::V3(v3) => v3.mint,
425
48
            GasCostsValues::V4(v4) => v4.mint,
426
        }
427
48
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4mintCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
420
48
    pub fn mint(&self) -> Word {
421
48
        match self {
422
0
            GasCostsValues::V1(v1) => v1.mint,
423
0
            GasCostsValues::V2(v2) => v2.mint,
424
0
            GasCostsValues::V3(v3) => v3.mint,
425
48
            GasCostsValues::V4(v4) => v4.mint,
426
        }
427
48
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4mintBb_
428
429
1.04M
    pub fn mlog(&self) -> Word {
430
1.04M
        match self {
431
0
            GasCostsValues::V1(v1) => v1.mlog,
432
0
            GasCostsValues::V2(v2) => v2.mlog,
433
0
            GasCostsValues::V3(v3) => v3.mlog,
434
1.04M
            GasCostsValues::V4(v4) => v4.mlog,
435
        }
436
1.04M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4mlogCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
429
1.04M
    pub fn mlog(&self) -> Word {
430
1.04M
        match self {
431
0
            GasCostsValues::V1(v1) => v1.mlog,
432
0
            GasCostsValues::V2(v2) => v2.mlog,
433
0
            GasCostsValues::V3(v3) => v3.mlog,
434
1.04M
            GasCostsValues::V4(v4) => v4.mlog,
435
        }
436
1.04M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4mlogBb_
437
438
1.63M
    pub fn mod_op(&self) -> Word {
439
1.63M
        match self {
440
0
            GasCostsValues::V1(v1) => v1.mod_op,
441
0
            GasCostsValues::V2(v2) => v2.mod_op,
442
0
            GasCostsValues::V3(v3) => v3.mod_op,
443
1.63M
            GasCostsValues::V4(v4) => v4.mod_op,
444
        }
445
1.63M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues6mod_opCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
438
1.63M
    pub fn mod_op(&self) -> Word {
439
1.63M
        match self {
440
0
            GasCostsValues::V1(v1) => v1.mod_op,
441
0
            GasCostsValues::V2(v2) => v2.mod_op,
442
0
            GasCostsValues::V3(v3) => v3.mod_op,
443
1.63M
            GasCostsValues::V4(v4) => v4.mod_op,
444
        }
445
1.63M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues6mod_opBb_
446
447
987k
    pub fn modi(&self) -> Word {
448
987k
        match self {
449
0
            GasCostsValues::V1(v1) => v1.modi,
450
0
            GasCostsValues::V2(v2) => v2.modi,
451
0
            GasCostsValues::V3(v3) => v3.modi,
452
987k
            GasCostsValues::V4(v4) => v4.modi,
453
        }
454
987k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4modiCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
447
987k
    pub fn modi(&self) -> Word {
448
987k
        match self {
449
0
            GasCostsValues::V1(v1) => v1.modi,
450
0
            GasCostsValues::V2(v2) => v2.modi,
451
0
            GasCostsValues::V3(v3) => v3.modi,
452
987k
            GasCostsValues::V4(v4) => v4.modi,
453
        }
454
987k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4modiBb_
455
456
25.3M
    pub fn move_op(&self) -> Word {
457
25.3M
        match self {
458
0
            GasCostsValues::V1(v1) => v1.move_op,
459
0
            GasCostsValues::V2(v2) => v2.move_op,
460
0
            GasCostsValues::V3(v3) => v3.move_op,
461
25.3M
            GasCostsValues::V4(v4) => v4.move_op,
462
        }
463
25.3M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues7move_opCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
456
25.3M
    pub fn move_op(&self) -> Word {
457
25.3M
        match self {
458
0
            GasCostsValues::V1(v1) => v1.move_op,
459
0
            GasCostsValues::V2(v2) => v2.move_op,
460
0
            GasCostsValues::V3(v3) => v3.move_op,
461
25.3M
            GasCostsValues::V4(v4) => v4.move_op,
462
        }
463
25.3M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues7move_opBb_
464
465
13.4M
    pub fn movi(&self) -> Word {
466
13.4M
        match self {
467
0
            GasCostsValues::V1(v1) => v1.movi,
468
0
            GasCostsValues::V2(v2) => v2.movi,
469
0
            GasCostsValues::V3(v3) => v3.movi,
470
13.4M
            GasCostsValues::V4(v4) => v4.movi,
471
        }
472
13.4M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4moviCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
465
13.4M
    pub fn movi(&self) -> Word {
466
13.4M
        match self {
467
0
            GasCostsValues::V1(v1) => v1.movi,
468
0
            GasCostsValues::V2(v2) => v2.movi,
469
0
            GasCostsValues::V3(v3) => v3.movi,
470
13.4M
            GasCostsValues::V4(v4) => v4.movi,
471
        }
472
13.4M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4moviBb_
473
474
1.48M
    pub fn mroo(&self) -> Word {
475
1.48M
        match self {
476
0
            GasCostsValues::V1(v1) => v1.mroo,
477
0
            GasCostsValues::V2(v2) => v2.mroo,
478
0
            GasCostsValues::V3(v3) => v3.mroo,
479
1.48M
            GasCostsValues::V4(v4) => v4.mroo,
480
        }
481
1.48M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4mrooCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
474
1.48M
    pub fn mroo(&self) -> Word {
475
1.48M
        match self {
476
0
            GasCostsValues::V1(v1) => v1.mroo,
477
0
            GasCostsValues::V2(v2) => v2.mroo,
478
0
            GasCostsValues::V3(v3) => v3.mroo,
479
1.48M
            GasCostsValues::V4(v4) => v4.mroo,
480
        }
481
1.48M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4mrooBb_
482
483
3.49M
    pub fn mul(&self) -> Word {
484
3.49M
        match self {
485
0
            GasCostsValues::V1(v1) => v1.mul,
486
0
            GasCostsValues::V2(v2) => v2.mul,
487
0
            GasCostsValues::V3(v3) => v3.mul,
488
3.49M
            GasCostsValues::V4(v4) => v4.mul,
489
        }
490
3.49M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3mulCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
483
3.49M
    pub fn mul(&self) -> Word {
484
3.49M
        match self {
485
0
            GasCostsValues::V1(v1) => v1.mul,
486
0
            GasCostsValues::V2(v2) => v2.mul,
487
0
            GasCostsValues::V3(v3) => v3.mul,
488
3.49M
            GasCostsValues::V4(v4) => v4.mul,
489
        }
490
3.49M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3mulBb_
491
492
1.87M
    pub fn muli(&self) -> Word {
493
1.87M
        match self {
494
0
            GasCostsValues::V1(v1) => v1.muli,
495
0
            GasCostsValues::V2(v2) => v2.muli,
496
0
            GasCostsValues::V3(v3) => v3.muli,
497
1.87M
            GasCostsValues::V4(v4) => v4.muli,
498
        }
499
1.87M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4muliCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
492
1.87M
    pub fn muli(&self) -> Word {
493
1.87M
        match self {
494
0
            GasCostsValues::V1(v1) => v1.muli,
495
0
            GasCostsValues::V2(v2) => v2.muli,
496
0
            GasCostsValues::V3(v3) => v3.muli,
497
1.87M
            GasCostsValues::V4(v4) => v4.muli,
498
        }
499
1.87M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4muliBb_
500
501
3.50M
    pub fn mldv(&self) -> Word {
502
3.50M
        match self {
503
0
            GasCostsValues::V1(v1) => v1.mldv,
504
0
            GasCostsValues::V2(v2) => v2.mldv,
505
0
            GasCostsValues::V3(v3) => v3.mldv,
506
3.50M
            GasCostsValues::V4(v4) => v4.mldv,
507
        }
508
3.50M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4mldvCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
501
3.50M
    pub fn mldv(&self) -> Word {
502
3.50M
        match self {
503
0
            GasCostsValues::V1(v1) => v1.mldv,
504
0
            GasCostsValues::V2(v2) => v2.mldv,
505
0
            GasCostsValues::V3(v3) => v3.mldv,
506
3.50M
            GasCostsValues::V4(v4) => v4.mldv,
507
        }
508
3.50M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4mldvBb_
509
510
448k
    pub fn noop(&self) -> Word {
511
448k
        match self {
512
0
            GasCostsValues::V1(v1) => v1.noop,
513
0
            GasCostsValues::V2(v2) => v2.noop,
514
0
            GasCostsValues::V3(v3) => v3.noop,
515
448k
            GasCostsValues::V4(v4) => v4.noop,
516
        }
517
448k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4noopCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
510
448k
    pub fn noop(&self) -> Word {
511
448k
        match self {
512
0
            GasCostsValues::V1(v1) => v1.noop,
513
0
            GasCostsValues::V2(v2) => v2.noop,
514
0
            GasCostsValues::V3(v3) => v3.noop,
515
448k
            GasCostsValues::V4(v4) => v4.noop,
516
        }
517
448k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4noopBb_
518
519
203k
    pub fn not(&self) -> Word {
520
203k
        match self {
521
0
            GasCostsValues::V1(v1) => v1.not,
522
0
            GasCostsValues::V2(v2) => v2.not,
523
0
            GasCostsValues::V3(v3) => v3.not,
524
203k
            GasCostsValues::V4(v4) => v4.not,
525
        }
526
203k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3notCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
519
203k
    pub fn not(&self) -> Word {
520
203k
        match self {
521
0
            GasCostsValues::V1(v1) => v1.not,
522
0
            GasCostsValues::V2(v2) => v2.not,
523
0
            GasCostsValues::V3(v3) => v3.not,
524
203k
            GasCostsValues::V4(v4) => v4.not,
525
        }
526
203k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3notBb_
527
528
466k
    pub fn or(&self) -> Word {
529
466k
        match self {
530
0
            GasCostsValues::V1(v1) => v1.or,
531
0
            GasCostsValues::V2(v2) => v2.or,
532
0
            GasCostsValues::V3(v3) => v3.or,
533
466k
            GasCostsValues::V4(v4) => v4.or,
534
        }
535
466k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues2orCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
528
466k
    pub fn or(&self) -> Word {
529
466k
        match self {
530
0
            GasCostsValues::V1(v1) => v1.or,
531
0
            GasCostsValues::V2(v2) => v2.or,
532
0
            GasCostsValues::V3(v3) => v3.or,
533
466k
            GasCostsValues::V4(v4) => v4.or,
534
        }
535
466k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues2orBb_
536
537
1.20M
    pub fn ori(&self) -> Word {
538
1.20M
        match self {
539
0
            GasCostsValues::V1(v1) => v1.ori,
540
0
            GasCostsValues::V2(v2) => v2.ori,
541
0
            GasCostsValues::V3(v3) => v3.ori,
542
1.20M
            GasCostsValues::V4(v4) => v4.ori,
543
        }
544
1.20M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3oriCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
537
1.20M
    pub fn ori(&self) -> Word {
538
1.20M
        match self {
539
0
            GasCostsValues::V1(v1) => v1.ori,
540
0
            GasCostsValues::V2(v2) => v2.ori,
541
0
            GasCostsValues::V3(v3) => v3.ori,
542
1.20M
            GasCostsValues::V4(v4) => v4.ori,
543
        }
544
1.20M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3oriBb_
545
546
159k
    pub fn poph(&self) -> Word {
547
159k
        match self {
548
0
            GasCostsValues::V1(v1) => v1.poph,
549
0
            GasCostsValues::V2(v2) => v2.poph,
550
0
            GasCostsValues::V3(v3) => v3.poph,
551
159k
            GasCostsValues::V4(v4) => v4.poph,
552
        }
553
159k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4pophCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
546
159k
    pub fn poph(&self) -> Word {
547
159k
        match self {
548
0
            GasCostsValues::V1(v1) => v1.poph,
549
0
            GasCostsValues::V2(v2) => v2.poph,
550
0
            GasCostsValues::V3(v3) => v3.poph,
551
159k
            GasCostsValues::V4(v4) => v4.poph,
552
        }
553
159k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4pophBb_
554
555
276k
    pub fn popl(&self) -> Word {
556
276k
        match self {
557
0
            GasCostsValues::V1(v1) => v1.popl,
558
0
            GasCostsValues::V2(v2) => v2.popl,
559
0
            GasCostsValues::V3(v3) => v3.popl,
560
276k
            GasCostsValues::V4(v4) => v4.popl,
561
        }
562
276k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4poplCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
555
276k
    pub fn popl(&self) -> Word {
556
276k
        match self {
557
0
            GasCostsValues::V1(v1) => v1.popl,
558
0
            GasCostsValues::V2(v2) => v2.popl,
559
0
            GasCostsValues::V3(v3) => v3.popl,
560
276k
            GasCostsValues::V4(v4) => v4.popl,
561
        }
562
276k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4poplBb_
563
564
3.66M
    pub fn pshh(&self) -> Word {
565
3.66M
        match self {
566
0
            GasCostsValues::V1(v1) => v1.pshh,
567
0
            GasCostsValues::V2(v2) => v2.pshh,
568
0
            GasCostsValues::V3(v3) => v3.pshh,
569
3.66M
            GasCostsValues::V4(v4) => v4.pshh,
570
        }
571
3.66M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4pshhCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
564
3.66M
    pub fn pshh(&self) -> Word {
565
3.66M
        match self {
566
0
            GasCostsValues::V1(v1) => v1.pshh,
567
0
            GasCostsValues::V2(v2) => v2.pshh,
568
0
            GasCostsValues::V3(v3) => v3.pshh,
569
3.66M
            GasCostsValues::V4(v4) => v4.pshh,
570
        }
571
3.66M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4pshhBb_
572
573
805k
    pub fn pshl(&self) -> Word {
574
805k
        match self {
575
0
            GasCostsValues::V1(v1) => v1.pshl,
576
0
            GasCostsValues::V2(v2) => v2.pshl,
577
0
            GasCostsValues::V3(v3) => v3.pshl,
578
805k
            GasCostsValues::V4(v4) => v4.pshl,
579
        }
580
805k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4pshlCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
573
805k
    pub fn pshl(&self) -> Word {
574
805k
        match self {
575
0
            GasCostsValues::V1(v1) => v1.pshl,
576
0
            GasCostsValues::V2(v2) => v2.pshl,
577
0
            GasCostsValues::V3(v3) => v3.pshl,
578
805k
            GasCostsValues::V4(v4) => v4.pshl,
579
        }
580
805k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4pshlBb_
581
582
23
    pub fn ret(&self) -> Word {
583
23
        match self {
584
0
            GasCostsValues::V1(v1) => v1.ret,
585
0
            GasCostsValues::V2(v2) => v2.ret,
586
0
            GasCostsValues::V3(v3) => v3.ret,
587
23
            GasCostsValues::V4(v4) => v4.ret,
588
        }
589
23
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3retCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
582
23
    pub fn ret(&self) -> Word {
583
23
        match self {
584
0
            GasCostsValues::V1(v1) => v1.ret,
585
0
            GasCostsValues::V2(v2) => v2.ret,
586
0
            GasCostsValues::V3(v3) => v3.ret,
587
23
            GasCostsValues::V4(v4) => v4.ret,
588
        }
589
23
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3retBb_
590
591
10
    pub fn rvrt(&self) -> Word {
592
10
        match self {
593
0
            GasCostsValues::V1(v1) => v1.rvrt,
594
0
            GasCostsValues::V2(v2) => v2.rvrt,
595
0
            GasCostsValues::V3(v3) => v3.rvrt,
596
10
            GasCostsValues::V4(v4) => v4.rvrt,
597
        }
598
10
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4rvrtCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
591
10
    pub fn rvrt(&self) -> Word {
592
10
        match self {
593
0
            GasCostsValues::V1(v1) => v1.rvrt,
594
0
            GasCostsValues::V2(v2) => v2.rvrt,
595
0
            GasCostsValues::V3(v3) => v3.rvrt,
596
10
            GasCostsValues::V4(v4) => v4.rvrt,
597
        }
598
10
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4rvrtBb_
599
600
164k
    pub fn sb(&self) -> Word {
601
164k
        match self {
602
0
            GasCostsValues::V1(v1) => v1.sb,
603
0
            GasCostsValues::V2(v2) => v2.sb,
604
0
            GasCostsValues::V3(v3) => v3.sb,
605
164k
            GasCostsValues::V4(v4) => v4.sb,
606
        }
607
164k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues2sbCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
600
164k
    pub fn sb(&self) -> Word {
601
164k
        match self {
602
0
            GasCostsValues::V1(v1) => v1.sb,
603
0
            GasCostsValues::V2(v2) => v2.sb,
604
0
            GasCostsValues::V3(v3) => v3.sb,
605
164k
            GasCostsValues::V4(v4) => v4.sb,
606
        }
607
164k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues2sbBb_
608
609
2.40M
    pub fn sll(&self) -> Word {
610
2.40M
        match self {
611
0
            GasCostsValues::V1(v1) => v1.sll,
612
0
            GasCostsValues::V2(v2) => v2.sll,
613
0
            GasCostsValues::V3(v3) => v3.sll,
614
2.40M
            GasCostsValues::V4(v4) => v4.sll,
615
        }
616
2.40M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3sllCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
609
2.40M
    pub fn sll(&self) -> Word {
610
2.40M
        match self {
611
0
            GasCostsValues::V1(v1) => v1.sll,
612
0
            GasCostsValues::V2(v2) => v2.sll,
613
0
            GasCostsValues::V3(v3) => v3.sll,
614
2.40M
            GasCostsValues::V4(v4) => v4.sll,
615
        }
616
2.40M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3sllBb_
617
618
738k
    pub fn slli(&self) -> Word {
619
738k
        match self {
620
0
            GasCostsValues::V1(v1) => v1.slli,
621
0
            GasCostsValues::V2(v2) => v2.slli,
622
0
            GasCostsValues::V3(v3) => v3.slli,
623
738k
            GasCostsValues::V4(v4) => v4.slli,
624
        }
625
738k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4slliCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
618
738k
    pub fn slli(&self) -> Word {
619
738k
        match self {
620
0
            GasCostsValues::V1(v1) => v1.slli,
621
0
            GasCostsValues::V2(v2) => v2.slli,
622
0
            GasCostsValues::V3(v3) => v3.slli,
623
738k
            GasCostsValues::V4(v4) => v4.slli,
624
        }
625
738k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4slliBb_
626
627
470k
    pub fn srl(&self) -> Word {
628
470k
        match self {
629
0
            GasCostsValues::V1(v1) => v1.srl,
630
0
            GasCostsValues::V2(v2) => v2.srl,
631
0
            GasCostsValues::V3(v3) => v3.srl,
632
470k
            GasCostsValues::V4(v4) => v4.srl,
633
        }
634
470k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3srlCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
627
470k
    pub fn srl(&self) -> Word {
628
470k
        match self {
629
0
            GasCostsValues::V1(v1) => v1.srl,
630
0
            GasCostsValues::V2(v2) => v2.srl,
631
0
            GasCostsValues::V3(v3) => v3.srl,
632
470k
            GasCostsValues::V4(v4) => v4.srl,
633
        }
634
470k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3srlBb_
635
636
1.09M
    pub fn srli(&self) -> Word {
637
1.09M
        match self {
638
0
            GasCostsValues::V1(v1) => v1.srli,
639
0
            GasCostsValues::V2(v2) => v2.srli,
640
0
            GasCostsValues::V3(v3) => v3.srli,
641
1.09M
            GasCostsValues::V4(v4) => v4.srli,
642
        }
643
1.09M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4srliCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
636
1.09M
    pub fn srli(&self) -> Word {
637
1.09M
        match self {
638
0
            GasCostsValues::V1(v1) => v1.srli,
639
0
            GasCostsValues::V2(v2) => v2.srli,
640
0
            GasCostsValues::V3(v3) => v3.srli,
641
1.09M
            GasCostsValues::V4(v4) => v4.srli,
642
        }
643
1.09M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4srliBb_
644
645
2.05k
    pub fn srw(&self) -> Word {
646
2.05k
        match self {
647
0
            GasCostsValues::V1(v1) => v1.srw,
648
0
            GasCostsValues::V2(v2) => v2.srw,
649
0
            GasCostsValues::V3(v3) => v3.srw,
650
2.05k
            GasCostsValues::V4(v4) => v4.srw,
651
        }
652
2.05k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3srwCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
645
2.05k
    pub fn srw(&self) -> Word {
646
2.05k
        match self {
647
0
            GasCostsValues::V1(v1) => v1.srw,
648
0
            GasCostsValues::V2(v2) => v2.srw,
649
0
            GasCostsValues::V3(v3) => v3.srw,
650
2.05k
            GasCostsValues::V4(v4) => v4.srw,
651
        }
652
2.05k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3srwBb_
653
654
750k
    pub fn sub(&self) -> Word {
655
750k
        match self {
656
0
            GasCostsValues::V1(v1) => v1.sub,
657
0
            GasCostsValues::V2(v2) => v2.sub,
658
0
            GasCostsValues::V3(v3) => v3.sub,
659
750k
            GasCostsValues::V4(v4) => v4.sub,
660
        }
661
750k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3subCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
654
750k
    pub fn sub(&self) -> Word {
655
750k
        match self {
656
0
            GasCostsValues::V1(v1) => v1.sub,
657
0
            GasCostsValues::V2(v2) => v2.sub,
658
0
            GasCostsValues::V3(v3) => v3.sub,
659
750k
            GasCostsValues::V4(v4) => v4.sub,
660
        }
661
750k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3subBb_
662
663
2.61M
    pub fn subi(&self) -> Word {
664
2.61M
        match self {
665
0
            GasCostsValues::V1(v1) => v1.subi,
666
0
            GasCostsValues::V2(v2) => v2.subi,
667
0
            GasCostsValues::V3(v3) => v3.subi,
668
2.61M
            GasCostsValues::V4(v4) => v4.subi,
669
        }
670
2.61M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4subiCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
663
2.61M
    pub fn subi(&self) -> Word {
664
2.61M
        match self {
665
0
            GasCostsValues::V1(v1) => v1.subi,
666
0
            GasCostsValues::V2(v2) => v2.subi,
667
0
            GasCostsValues::V3(v3) => v3.subi,
668
2.61M
            GasCostsValues::V4(v4) => v4.subi,
669
        }
670
2.61M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4subiBb_
671
672
12.9M
    pub fn sw(&self) -> Word {
673
12.9M
        match self {
674
0
            GasCostsValues::V1(v1) => v1.sw,
675
0
            GasCostsValues::V2(v2) => v2.sw,
676
0
            GasCostsValues::V3(v3) => v3.sw,
677
12.9M
            GasCostsValues::V4(v4) => v4.sw,
678
        }
679
12.9M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues2swCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
672
12.9M
    pub fn sw(&self) -> Word {
673
12.9M
        match self {
674
0
            GasCostsValues::V1(v1) => v1.sw,
675
0
            GasCostsValues::V2(v2) => v2.sw,
676
0
            GasCostsValues::V3(v3) => v3.sw,
677
12.9M
            GasCostsValues::V4(v4) => v4.sw,
678
        }
679
12.9M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues2swBb_
680
681
354
    pub fn sww(&self) -> Word {
682
354
        match self {
683
0
            GasCostsValues::V1(v1) => v1.sww,
684
0
            GasCostsValues::V2(v2) => v2.sww,
685
0
            GasCostsValues::V3(v3) => v3.sww,
686
354
            GasCostsValues::V4(v4) => v4.sww,
687
        }
688
354
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3swwCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
681
354
    pub fn sww(&self) -> Word {
682
354
        match self {
683
0
            GasCostsValues::V1(v1) => v1.sww,
684
0
            GasCostsValues::V2(v2) => v2.sww,
685
0
            GasCostsValues::V3(v3) => v3.sww,
686
354
            GasCostsValues::V4(v4) => v4.sww,
687
        }
688
354
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3swwBb_
689
690
326k
    pub fn time(&self) -> Word {
691
326k
        match self {
692
0
            GasCostsValues::V1(v1) => v1.time,
693
0
            GasCostsValues::V2(v2) => v2.time,
694
0
            GasCostsValues::V3(v3) => v3.time,
695
326k
            GasCostsValues::V4(v4) => v4.time,
696
        }
697
326k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4timeCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
690
326k
    pub fn time(&self) -> Word {
691
326k
        match self {
692
0
            GasCostsValues::V1(v1) => v1.time,
693
0
            GasCostsValues::V2(v2) => v2.time,
694
0
            GasCostsValues::V3(v3) => v3.time,
695
326k
            GasCostsValues::V4(v4) => v4.time,
696
        }
697
326k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4timeBb_
698
699
8
    pub fn tr(&self) -> Word {
700
8
        match self {
701
0
            GasCostsValues::V1(v1) => v1.tr,
702
0
            GasCostsValues::V2(v2) => v2.tr,
703
0
            GasCostsValues::V3(v3) => v3.tr,
704
8
            GasCostsValues::V4(v4) => v4.tr,
705
        }
706
8
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues2trCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
699
8
    pub fn tr(&self) -> Word {
700
8
        match self {
701
0
            GasCostsValues::V1(v1) => v1.tr,
702
0
            GasCostsValues::V2(v2) => v2.tr,
703
0
            GasCostsValues::V3(v3) => v3.tr,
704
8
            GasCostsValues::V4(v4) => v4.tr,
705
        }
706
8
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues2trBb_
707
708
13
    pub fn tro(&self) -> Word {
709
13
        match self {
710
0
            GasCostsValues::V1(v1) => v1.tro,
711
0
            GasCostsValues::V2(v2) => v2.tro,
712
0
            GasCostsValues::V3(v3) => v3.tro,
713
13
            GasCostsValues::V4(v4) => v4.tro,
714
        }
715
13
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3troCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
708
13
    pub fn tro(&self) -> Word {
709
13
        match self {
710
0
            GasCostsValues::V1(v1) => v1.tro,
711
0
            GasCostsValues::V2(v2) => v2.tro,
712
0
            GasCostsValues::V3(v3) => v3.tro,
713
13
            GasCostsValues::V4(v4) => v4.tro,
714
        }
715
13
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3troBb_
716
717
4.77M
    pub fn wdcm(&self) -> Word {
718
4.77M
        match self {
719
0
            GasCostsValues::V1(v1) => v1.wdcm,
720
0
            GasCostsValues::V2(v2) => v2.wdcm,
721
0
            GasCostsValues::V3(v3) => v3.wdcm,
722
4.77M
            GasCostsValues::V4(v4) => v4.wdcm,
723
        }
724
4.77M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wdcmCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
717
4.77M
    pub fn wdcm(&self) -> Word {
718
4.77M
        match self {
719
0
            GasCostsValues::V1(v1) => v1.wdcm,
720
0
            GasCostsValues::V2(v2) => v2.wdcm,
721
0
            GasCostsValues::V3(v3) => v3.wdcm,
722
4.77M
            GasCostsValues::V4(v4) => v4.wdcm,
723
        }
724
4.77M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wdcmBb_
725
726
5.48M
    pub fn wqcm(&self) -> Word {
727
5.48M
        match self {
728
0
            GasCostsValues::V1(v1) => v1.wqcm,
729
0
            GasCostsValues::V2(v2) => v2.wqcm,
730
0
            GasCostsValues::V3(v3) => v3.wqcm,
731
5.48M
            GasCostsValues::V4(v4) => v4.wqcm,
732
        }
733
5.48M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wqcmCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
726
5.48M
    pub fn wqcm(&self) -> Word {
727
5.48M
        match self {
728
0
            GasCostsValues::V1(v1) => v1.wqcm,
729
0
            GasCostsValues::V2(v2) => v2.wqcm,
730
0
            GasCostsValues::V3(v3) => v3.wqcm,
731
5.48M
            GasCostsValues::V4(v4) => v4.wqcm,
732
        }
733
5.48M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wqcmBb_
734
735
706k
    pub fn wdop(&self) -> Word {
736
706k
        match self {
737
0
            GasCostsValues::V1(v1) => v1.wdop,
738
0
            GasCostsValues::V2(v2) => v2.wdop,
739
0
            GasCostsValues::V3(v3) => v3.wdop,
740
706k
            GasCostsValues::V4(v4) => v4.wdop,
741
        }
742
706k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wdopCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
735
706k
    pub fn wdop(&self) -> Word {
736
706k
        match self {
737
0
            GasCostsValues::V1(v1) => v1.wdop,
738
0
            GasCostsValues::V2(v2) => v2.wdop,
739
0
            GasCostsValues::V3(v3) => v3.wdop,
740
706k
            GasCostsValues::V4(v4) => v4.wdop,
741
        }
742
706k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wdopBb_
743
744
1.55M
    pub fn wqop(&self) -> Word {
745
1.55M
        match self {
746
0
            GasCostsValues::V1(v1) => v1.wqop,
747
0
            GasCostsValues::V2(v2) => v2.wqop,
748
0
            GasCostsValues::V3(v3) => v3.wqop,
749
1.55M
            GasCostsValues::V4(v4) => v4.wqop,
750
        }
751
1.55M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wqopCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
744
1.55M
    pub fn wqop(&self) -> Word {
745
1.55M
        match self {
746
0
            GasCostsValues::V1(v1) => v1.wqop,
747
0
            GasCostsValues::V2(v2) => v2.wqop,
748
0
            GasCostsValues::V3(v3) => v3.wqop,
749
1.55M
            GasCostsValues::V4(v4) => v4.wqop,
750
        }
751
1.55M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wqopBb_
752
753
487k
    pub fn wdml(&self) -> Word {
754
487k
        match self {
755
0
            GasCostsValues::V1(v1) => v1.wdml,
756
0
            GasCostsValues::V2(v2) => v2.wdml,
757
0
            GasCostsValues::V3(v3) => v3.wdml,
758
487k
            GasCostsValues::V4(v4) => v4.wdml,
759
        }
760
487k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wdmlCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
753
487k
    pub fn wdml(&self) -> Word {
754
487k
        match self {
755
0
            GasCostsValues::V1(v1) => v1.wdml,
756
0
            GasCostsValues::V2(v2) => v2.wdml,
757
0
            GasCostsValues::V3(v3) => v3.wdml,
758
487k
            GasCostsValues::V4(v4) => v4.wdml,
759
        }
760
487k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wdmlBb_
761
762
1.08M
    pub fn wqml(&self) -> Word {
763
1.08M
        match self {
764
0
            GasCostsValues::V1(v1) => v1.wqml,
765
0
            GasCostsValues::V2(v2) => v2.wqml,
766
0
            GasCostsValues::V3(v3) => v3.wqml,
767
1.08M
            GasCostsValues::V4(v4) => v4.wqml,
768
        }
769
1.08M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wqmlCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
762
1.08M
    pub fn wqml(&self) -> Word {
763
1.08M
        match self {
764
0
            GasCostsValues::V1(v1) => v1.wqml,
765
0
            GasCostsValues::V2(v2) => v2.wqml,
766
0
            GasCostsValues::V3(v3) => v3.wqml,
767
1.08M
            GasCostsValues::V4(v4) => v4.wqml,
768
        }
769
1.08M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wqmlBb_
770
771
1.17M
    pub fn wddv(&self) -> Word {
772
1.17M
        match self {
773
0
            GasCostsValues::V1(v1) => v1.wddv,
774
0
            GasCostsValues::V2(v2) => v2.wddv,
775
0
            GasCostsValues::V3(v3) => v3.wddv,
776
1.17M
            GasCostsValues::V4(v4) => v4.wddv,
777
        }
778
1.17M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wddvCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
771
1.17M
    pub fn wddv(&self) -> Word {
772
1.17M
        match self {
773
0
            GasCostsValues::V1(v1) => v1.wddv,
774
0
            GasCostsValues::V2(v2) => v2.wddv,
775
0
            GasCostsValues::V3(v3) => v3.wddv,
776
1.17M
            GasCostsValues::V4(v4) => v4.wddv,
777
        }
778
1.17M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wddvBb_
779
780
615k
    pub fn wqdv(&self) -> Word {
781
615k
        match self {
782
0
            GasCostsValues::V1(v1) => v1.wqdv,
783
0
            GasCostsValues::V2(v2) => v2.wqdv,
784
0
            GasCostsValues::V3(v3) => v3.wqdv,
785
615k
            GasCostsValues::V4(v4) => v4.wqdv,
786
        }
787
615k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wqdvCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
780
615k
    pub fn wqdv(&self) -> Word {
781
615k
        match self {
782
0
            GasCostsValues::V1(v1) => v1.wqdv,
783
0
            GasCostsValues::V2(v2) => v2.wqdv,
784
0
            GasCostsValues::V3(v3) => v3.wqdv,
785
615k
            GasCostsValues::V4(v4) => v4.wqdv,
786
        }
787
615k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wqdvBb_
788
789
899k
    pub fn wdmd(&self) -> Word {
790
899k
        match self {
791
0
            GasCostsValues::V1(v1) => v1.wdmd,
792
0
            GasCostsValues::V2(v2) => v2.wdmd,
793
0
            GasCostsValues::V3(v3) => v3.wdmd,
794
899k
            GasCostsValues::V4(v4) => v4.wdmd,
795
        }
796
899k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wdmdCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
789
899k
    pub fn wdmd(&self) -> Word {
790
899k
        match self {
791
0
            GasCostsValues::V1(v1) => v1.wdmd,
792
0
            GasCostsValues::V2(v2) => v2.wdmd,
793
0
            GasCostsValues::V3(v3) => v3.wdmd,
794
899k
            GasCostsValues::V4(v4) => v4.wdmd,
795
        }
796
899k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wdmdBb_
797
798
1.66M
    pub fn wqmd(&self) -> Word {
799
1.66M
        match self {
800
0
            GasCostsValues::V1(v1) => v1.wqmd,
801
0
            GasCostsValues::V2(v2) => v2.wqmd,
802
0
            GasCostsValues::V3(v3) => v3.wqmd,
803
1.66M
            GasCostsValues::V4(v4) => v4.wqmd,
804
        }
805
1.66M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wqmdCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
798
1.66M
    pub fn wqmd(&self) -> Word {
799
1.66M
        match self {
800
0
            GasCostsValues::V1(v1) => v1.wqmd,
801
0
            GasCostsValues::V2(v2) => v2.wqmd,
802
0
            GasCostsValues::V3(v3) => v3.wqmd,
803
1.66M
            GasCostsValues::V4(v4) => v4.wqmd,
804
        }
805
1.66M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wqmdBb_
806
807
127k
    pub fn wdam(&self) -> Word {
808
127k
        match self {
809
0
            GasCostsValues::V1(v1) => v1.wdam,
810
0
            GasCostsValues::V2(v2) => v2.wdam,
811
0
            GasCostsValues::V3(v3) => v3.wdam,
812
127k
            GasCostsValues::V4(v4) => v4.wdam,
813
        }
814
127k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wdamCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
807
127k
    pub fn wdam(&self) -> Word {
808
127k
        match self {
809
0
            GasCostsValues::V1(v1) => v1.wdam,
810
0
            GasCostsValues::V2(v2) => v2.wdam,
811
0
            GasCostsValues::V3(v3) => v3.wdam,
812
127k
            GasCostsValues::V4(v4) => v4.wdam,
813
        }
814
127k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wdamBb_
815
816
1.22M
    pub fn wqam(&self) -> Word {
817
1.22M
        match self {
818
0
            GasCostsValues::V1(v1) => v1.wqam,
819
0
            GasCostsValues::V2(v2) => v2.wqam,
820
0
            GasCostsValues::V3(v3) => v3.wqam,
821
1.22M
            GasCostsValues::V4(v4) => v4.wqam,
822
        }
823
1.22M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wqamCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
816
1.22M
    pub fn wqam(&self) -> Word {
817
1.22M
        match self {
818
0
            GasCostsValues::V1(v1) => v1.wqam,
819
0
            GasCostsValues::V2(v2) => v2.wqam,
820
0
            GasCostsValues::V3(v3) => v3.wqam,
821
1.22M
            GasCostsValues::V4(v4) => v4.wqam,
822
        }
823
1.22M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wqamBb_
824
825
800k
    pub fn wdmm(&self) -> Word {
826
800k
        match self {
827
0
            GasCostsValues::V1(v1) => v1.wdmm,
828
0
            GasCostsValues::V2(v2) => v2.wdmm,
829
0
            GasCostsValues::V3(v3) => v3.wdmm,
830
800k
            GasCostsValues::V4(v4) => v4.wdmm,
831
        }
832
800k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wdmmCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
825
800k
    pub fn wdmm(&self) -> Word {
826
800k
        match self {
827
0
            GasCostsValues::V1(v1) => v1.wdmm,
828
0
            GasCostsValues::V2(v2) => v2.wdmm,
829
0
            GasCostsValues::V3(v3) => v3.wdmm,
830
800k
            GasCostsValues::V4(v4) => v4.wdmm,
831
        }
832
800k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wdmmBb_
833
834
252k
    pub fn wqmm(&self) -> Word {
835
252k
        match self {
836
0
            GasCostsValues::V1(v1) => v1.wqmm,
837
0
            GasCostsValues::V2(v2) => v2.wqmm,
838
0
            GasCostsValues::V3(v3) => v3.wqmm,
839
252k
            GasCostsValues::V4(v4) => v4.wqmm,
840
        }
841
252k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wqmmCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
834
252k
    pub fn wqmm(&self) -> Word {
835
252k
        match self {
836
0
            GasCostsValues::V1(v1) => v1.wqmm,
837
0
            GasCostsValues::V2(v2) => v2.wqmm,
838
0
            GasCostsValues::V3(v3) => v3.wqmm,
839
252k
            GasCostsValues::V4(v4) => v4.wqmm,
840
        }
841
252k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4wqmmBb_
842
843
893k
    pub fn xor(&self) -> Word {
844
893k
        match self {
845
0
            GasCostsValues::V1(v1) => v1.xor,
846
0
            GasCostsValues::V2(v2) => v2.xor,
847
0
            GasCostsValues::V3(v3) => v3.xor,
848
893k
            GasCostsValues::V4(v4) => v4.xor,
849
        }
850
893k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3xorCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
843
893k
    pub fn xor(&self) -> Word {
844
893k
        match self {
845
0
            GasCostsValues::V1(v1) => v1.xor,
846
0
            GasCostsValues::V2(v2) => v2.xor,
847
0
            GasCostsValues::V3(v3) => v3.xor,
848
893k
            GasCostsValues::V4(v4) => v4.xor,
849
        }
850
893k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3xorBb_
851
852
425k
    pub fn xori(&self) -> Word {
853
425k
        match self {
854
0
            GasCostsValues::V1(v1) => v1.xori,
855
0
            GasCostsValues::V2(v2) => v2.xori,
856
0
            GasCostsValues::V3(v3) => v3.xori,
857
425k
            GasCostsValues::V4(v4) => v4.xori,
858
        }
859
425k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4xoriCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
852
425k
    pub fn xori(&self) -> Word {
853
425k
        match self {
854
0
            GasCostsValues::V1(v1) => v1.xori,
855
0
            GasCostsValues::V2(v2) => v2.xori,
856
0
            GasCostsValues::V3(v3) => v3.xori,
857
425k
            GasCostsValues::V4(v4) => v4.xori,
858
        }
859
425k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4xoriBb_
860
861
898k
    pub fn aloc(&self) -> DependentCost {
862
898k
        match self {
863
0
            GasCostsValues::V1(v1) => DependentCost::HeavyOperation {
864
0
                base: v1.aloc,
865
0
                gas_per_unit: 0,
866
0
            },
867
0
            GasCostsValues::V2(v2) => v2.aloc,
868
0
            GasCostsValues::V3(v3) => v3.aloc,
869
898k
            GasCostsValues::V4(v4) => v4.aloc,
870
        }
871
898k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4alocCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
861
898k
    pub fn aloc(&self) -> DependentCost {
862
898k
        match self {
863
0
            GasCostsValues::V1(v1) => DependentCost::HeavyOperation {
864
0
                base: v1.aloc,
865
0
                gas_per_unit: 0,
866
0
            },
867
0
            GasCostsValues::V2(v2) => v2.aloc,
868
0
            GasCostsValues::V3(v3) => v3.aloc,
869
898k
            GasCostsValues::V4(v4) => v4.aloc,
870
        }
871
898k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4alocBb_
872
873
333k
    pub fn cfe(&self) -> DependentCost {
874
333k
        match self {
875
0
            GasCostsValues::V1(v1) => DependentCost::HeavyOperation {
876
0
                base: v1.cfei,
877
0
                gas_per_unit: 0,
878
0
            },
879
0
            GasCostsValues::V2(v2) => DependentCost::HeavyOperation {
880
0
                base: v2.cfei,
881
0
                gas_per_unit: 0,
882
0
            },
883
0
            GasCostsValues::V3(v3) => v3.cfe,
884
333k
            GasCostsValues::V4(v4) => v4.cfe,
885
        }
886
333k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3cfeCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
873
333k
    pub fn cfe(&self) -> DependentCost {
874
333k
        match self {
875
0
            GasCostsValues::V1(v1) => DependentCost::HeavyOperation {
876
0
                base: v1.cfei,
877
0
                gas_per_unit: 0,
878
0
            },
879
0
            GasCostsValues::V2(v2) => DependentCost::HeavyOperation {
880
0
                base: v2.cfei,
881
0
                gas_per_unit: 0,
882
0
            },
883
0
            GasCostsValues::V3(v3) => v3.cfe,
884
333k
            GasCostsValues::V4(v4) => v4.cfe,
885
        }
886
333k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3cfeBb_
887
888
14.9M
    pub fn cfei(&self) -> DependentCost {
889
14.9M
        match self {
890
0
            GasCostsValues::V1(v1) => DependentCost::HeavyOperation {
891
0
                base: v1.cfei,
892
0
                gas_per_unit: 0,
893
0
            },
894
0
            GasCostsValues::V2(v2) => DependentCost::HeavyOperation {
895
0
                base: v2.cfei,
896
0
                gas_per_unit: 0,
897
0
            },
898
0
            GasCostsValues::V3(v3) => v3.cfei,
899
14.9M
            GasCostsValues::V4(v4) => v4.cfei,
900
        }
901
14.9M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4cfeiCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
888
14.9M
    pub fn cfei(&self) -> DependentCost {
889
14.9M
        match self {
890
0
            GasCostsValues::V1(v1) => DependentCost::HeavyOperation {
891
0
                base: v1.cfei,
892
0
                gas_per_unit: 0,
893
0
            },
894
0
            GasCostsValues::V2(v2) => DependentCost::HeavyOperation {
895
0
                base: v2.cfei,
896
0
                gas_per_unit: 0,
897
0
            },
898
0
            GasCostsValues::V3(v3) => v3.cfei,
899
14.9M
            GasCostsValues::V4(v4) => v4.cfei,
900
        }
901
14.9M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4cfeiBb_
902
903
12.3k
    pub fn call(&self) -> DependentCost {
904
12.3k
        match self {
905
0
            GasCostsValues::V1(v1) => v1.call,
906
0
            GasCostsValues::V2(v2) => v2.call,
907
0
            GasCostsValues::V3(v3) => v3.call,
908
12.3k
            GasCostsValues::V4(v4) => v4.call,
909
        }
910
12.3k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4callCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
903
12.3k
    pub fn call(&self) -> DependentCost {
904
12.3k
        match self {
905
0
            GasCostsValues::V1(v1) => v1.call,
906
0
            GasCostsValues::V2(v2) => v2.call,
907
0
            GasCostsValues::V3(v3) => v3.call,
908
12.3k
            GasCostsValues::V4(v4) => v4.call,
909
        }
910
12.3k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4callBb_
911
912
14
    pub fn ccp(&self) -> DependentCost {
913
14
        match self {
914
0
            GasCostsValues::V1(v1) => v1.ccp,
915
0
            GasCostsValues::V2(v2) => v2.ccp,
916
0
            GasCostsValues::V3(v3) => v3.ccp,
917
14
            GasCostsValues::V4(v4) => v4.ccp,
918
        }
919
14
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3ccpCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
912
14
    pub fn ccp(&self) -> DependentCost {
913
14
        match self {
914
0
            GasCostsValues::V1(v1) => v1.ccp,
915
0
            GasCostsValues::V2(v2) => v2.ccp,
916
0
            GasCostsValues::V3(v3) => v3.ccp,
917
14
            GasCostsValues::V4(v4) => v4.ccp,
918
        }
919
14
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3ccpBb_
920
921
7
    pub fn croo(&self) -> DependentCost {
922
7
        match self {
923
0
            GasCostsValues::V1(v1) => v1.croo,
924
0
            GasCostsValues::V2(v2) => v2.croo,
925
0
            GasCostsValues::V3(v3) => v3.croo,
926
7
            GasCostsValues::V4(v4) => v4.croo,
927
        }
928
7
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4crooCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
921
7
    pub fn croo(&self) -> DependentCost {
922
7
        match self {
923
0
            GasCostsValues::V1(v1) => v1.croo,
924
0
            GasCostsValues::V2(v2) => v2.croo,
925
0
            GasCostsValues::V3(v3) => v3.croo,
926
7
            GasCostsValues::V4(v4) => v4.croo,
927
        }
928
7
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4crooBb_
929
930
4
    pub fn csiz(&self) -> DependentCost {
931
4
        match self {
932
0
            GasCostsValues::V1(v1) => v1.csiz,
933
0
            GasCostsValues::V2(v2) => v2.csiz,
934
0
            GasCostsValues::V3(v3) => v3.csiz,
935
4
            GasCostsValues::V4(v4) => v4.csiz,
936
        }
937
4
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4csizCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
930
4
    pub fn csiz(&self) -> DependentCost {
931
4
        match self {
932
0
            GasCostsValues::V1(v1) => v1.csiz,
933
0
            GasCostsValues::V2(v2) => v2.csiz,
934
0
            GasCostsValues::V3(v3) => v3.csiz,
935
4
            GasCostsValues::V4(v4) => v4.csiz,
936
        }
937
4
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4csizBb_
938
939
11.9k
    pub fn ed19(&self) -> DependentCost {
940
11.9k
        match self {
941
0
            GasCostsValues::V1(v1) => DependentCost::HeavyOperation {
942
0
                base: v1.ed19,
943
0
                gas_per_unit: 0,
944
0
            },
945
0
            GasCostsValues::V2(v2) => DependentCost::HeavyOperation {
946
0
                base: v2.ed19,
947
0
                gas_per_unit: 0,
948
0
            },
949
0
            GasCostsValues::V3(v3) => DependentCost::HeavyOperation {
950
0
                base: v3.ed19,
951
0
                gas_per_unit: 0,
952
0
            },
953
11.9k
            GasCostsValues::V4(v4) => v4.ed19,
954
        }
955
11.9k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4ed19Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
939
11.9k
    pub fn ed19(&self) -> DependentCost {
940
11.9k
        match self {
941
0
            GasCostsValues::V1(v1) => DependentCost::HeavyOperation {
942
0
                base: v1.ed19,
943
0
                gas_per_unit: 0,
944
0
            },
945
0
            GasCostsValues::V2(v2) => DependentCost::HeavyOperation {
946
0
                base: v2.ed19,
947
0
                gas_per_unit: 0,
948
0
            },
949
0
            GasCostsValues::V3(v3) => DependentCost::HeavyOperation {
950
0
                base: v3.ed19,
951
0
                gas_per_unit: 0,
952
0
            },
953
11.9k
            GasCostsValues::V4(v4) => v4.ed19,
954
        }
955
11.9k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4ed19Bb_
956
957
38.7k
    pub fn k256(&self) -> DependentCost {
958
38.7k
        match self {
959
0
            GasCostsValues::V1(v1) => v1.k256,
960
0
            GasCostsValues::V2(v2) => v2.k256,
961
0
            GasCostsValues::V3(v3) => v3.k256,
962
38.7k
            GasCostsValues::V4(v4) => v4.k256,
963
        }
964
38.7k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4k256Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
957
38.7k
    pub fn k256(&self) -> DependentCost {
958
38.7k
        match self {
959
0
            GasCostsValues::V1(v1) => v1.k256,
960
0
            GasCostsValues::V2(v2) => v2.k256,
961
0
            GasCostsValues::V3(v3) => v3.k256,
962
38.7k
            GasCostsValues::V4(v4) => v4.k256,
963
        }
964
38.7k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4k256Bb_
965
966
597k
    pub fn ldc(&self) -> DependentCost {
967
597k
        match self {
968
0
            GasCostsValues::V1(v1) => v1.ldc,
969
0
            GasCostsValues::V2(v2) => v2.ldc,
970
0
            GasCostsValues::V3(v3) => v3.ldc,
971
597k
            GasCostsValues::V4(v4) => v4.ldc,
972
        }
973
597k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3ldcCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
966
597k
    pub fn ldc(&self) -> DependentCost {
967
597k
        match self {
968
0
            GasCostsValues::V1(v1) => v1.ldc,
969
0
            GasCostsValues::V2(v2) => v2.ldc,
970
0
            GasCostsValues::V3(v3) => v3.ldc,
971
597k
            GasCostsValues::V4(v4) => v4.ldc,
972
        }
973
597k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3ldcBb_
974
975
176k
    pub fn logd(&self) -> DependentCost {
976
176k
        match self {
977
0
            GasCostsValues::V1(v1) => v1.logd,
978
0
            GasCostsValues::V2(v2) => v2.logd,
979
0
            GasCostsValues::V3(v3) => v3.logd,
980
176k
            GasCostsValues::V4(v4) => v4.logd,
981
        }
982
176k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4logdCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
975
176k
    pub fn logd(&self) -> DependentCost {
976
176k
        match self {
977
0
            GasCostsValues::V1(v1) => v1.logd,
978
0
            GasCostsValues::V2(v2) => v2.logd,
979
0
            GasCostsValues::V3(v3) => v3.logd,
980
176k
            GasCostsValues::V4(v4) => v4.logd,
981
        }
982
176k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4logdBb_
983
984
148k
    pub fn mcl(&self) -> DependentCost {
985
148k
        match self {
986
0
            GasCostsValues::V1(v1) => v1.mcl,
987
0
            GasCostsValues::V2(v2) => v2.mcl,
988
0
            GasCostsValues::V3(v3) => v3.mcl,
989
148k
            GasCostsValues::V4(v4) => v4.mcl,
990
        }
991
148k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3mclCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
984
148k
    pub fn mcl(&self) -> DependentCost {
985
148k
        match self {
986
0
            GasCostsValues::V1(v1) => v1.mcl,
987
0
            GasCostsValues::V2(v2) => v2.mcl,
988
0
            GasCostsValues::V3(v3) => v3.mcl,
989
148k
            GasCostsValues::V4(v4) => v4.mcl,
990
        }
991
148k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3mclBb_
992
993
114k
    pub fn mcli(&self) -> DependentCost {
994
114k
        match self {
995
0
            GasCostsValues::V1(v1) => v1.mcli,
996
0
            GasCostsValues::V2(v2) => v2.mcli,
997
0
            GasCostsValues::V3(v3) => v3.mcli,
998
114k
            GasCostsValues::V4(v4) => v4.mcli,
999
        }
1000
114k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4mcliCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
993
114k
    pub fn mcli(&self) -> DependentCost {
994
114k
        match self {
995
0
            GasCostsValues::V1(v1) => v1.mcli,
996
0
            GasCostsValues::V2(v2) => v2.mcli,
997
0
            GasCostsValues::V3(v3) => v3.mcli,
998
114k
            GasCostsValues::V4(v4) => v4.mcli,
999
        }
1000
114k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4mcliBb_
1001
1002
7.30M
    pub fn mcp(&self) -> DependentCost {
1003
7.30M
        match self {
1004
0
            GasCostsValues::V1(v1) => v1.mcp,
1005
0
            GasCostsValues::V2(v2) => v2.mcp,
1006
0
            GasCostsValues::V3(v3) => v3.mcp,
1007
7.30M
            GasCostsValues::V4(v4) => v4.mcp,
1008
        }
1009
7.30M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3mcpCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
1002
7.30M
    pub fn mcp(&self) -> DependentCost {
1003
7.30M
        match self {
1004
0
            GasCostsValues::V1(v1) => v1.mcp,
1005
0
            GasCostsValues::V2(v2) => v2.mcp,
1006
0
            GasCostsValues::V3(v3) => v3.mcp,
1007
7.30M
            GasCostsValues::V4(v4) => v4.mcp,
1008
        }
1009
7.30M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3mcpBb_
1010
1011
87.0k
    pub fn mcpi(&self) -> DependentCost {
1012
87.0k
        match self {
1013
0
            GasCostsValues::V1(v1) => v1.mcpi,
1014
0
            GasCostsValues::V2(v2) => v2.mcpi,
1015
0
            GasCostsValues::V3(v3) => v3.mcpi,
1016
87.0k
            GasCostsValues::V4(v4) => v4.mcpi,
1017
        }
1018
87.0k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4mcpiCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
1011
87.0k
    pub fn mcpi(&self) -> DependentCost {
1012
87.0k
        match self {
1013
0
            GasCostsValues::V1(v1) => v1.mcpi,
1014
0
            GasCostsValues::V2(v2) => v2.mcpi,
1015
0
            GasCostsValues::V3(v3) => v3.mcpi,
1016
87.0k
            GasCostsValues::V4(v4) => v4.mcpi,
1017
        }
1018
87.0k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4mcpiBb_
1019
1020
1.63M
    pub fn meq(&self) -> DependentCost {
1021
1.63M
        match self {
1022
0
            GasCostsValues::V1(v1) => v1.meq,
1023
0
            GasCostsValues::V2(v2) => v2.meq,
1024
0
            GasCostsValues::V3(v3) => v3.meq,
1025
1.63M
            GasCostsValues::V4(v4) => v4.meq,
1026
        }
1027
1.63M
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3meqCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
1020
1.63M
    pub fn meq(&self) -> DependentCost {
1021
1.63M
        match self {
1022
0
            GasCostsValues::V1(v1) => v1.meq,
1023
0
            GasCostsValues::V2(v2) => v2.meq,
1024
0
            GasCostsValues::V3(v3) => v3.meq,
1025
1.63M
            GasCostsValues::V4(v4) => v4.meq,
1026
        }
1027
1.63M
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3meqBb_
1028
1029
11.3k
    pub fn retd(&self) -> DependentCost {
1030
11.3k
        match self {
1031
0
            GasCostsValues::V1(v1) => v1.retd,
1032
0
            GasCostsValues::V2(v2) => v2.retd,
1033
0
            GasCostsValues::V3(v3) => v3.retd,
1034
11.3k
            GasCostsValues::V4(v4) => v4.retd,
1035
        }
1036
11.3k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4retdCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
1029
11.3k
    pub fn retd(&self) -> DependentCost {
1030
11.3k
        match self {
1031
0
            GasCostsValues::V1(v1) => v1.retd,
1032
0
            GasCostsValues::V2(v2) => v2.retd,
1033
0
            GasCostsValues::V3(v3) => v3.retd,
1034
11.3k
            GasCostsValues::V4(v4) => v4.retd,
1035
        }
1036
11.3k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4retdBb_
1037
1038
212k
    pub fn s256(&self) -> DependentCost {
1039
212k
        match self {
1040
0
            GasCostsValues::V1(v1) => v1.s256,
1041
0
            GasCostsValues::V2(v2) => v2.s256,
1042
0
            GasCostsValues::V3(v3) => v3.s256,
1043
212k
            GasCostsValues::V4(v4) => v4.s256,
1044
        }
1045
212k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4s256Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
1038
168k
    pub fn s256(&self) -> DependentCost {
1039
168k
        match self {
1040
0
            GasCostsValues::V1(v1) => v1.s256,
1041
0
            GasCostsValues::V2(v2) => v2.s256,
1042
0
            GasCostsValues::V3(v3) => v3.s256,
1043
168k
            GasCostsValues::V4(v4) => v4.s256,
1044
        }
1045
168k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4s256Bb_
Line
Count
Source
1038
43.8k
    pub fn s256(&self) -> DependentCost {
1039
43.8k
        match self {
1040
0
            GasCostsValues::V1(v1) => v1.s256,
1041
0
            GasCostsValues::V2(v2) => v2.s256,
1042
0
            GasCostsValues::V3(v3) => v3.s256,
1043
43.8k
            GasCostsValues::V4(v4) => v4.s256,
1044
        }
1045
43.8k
    }
1046
1047
5.19k
    pub fn scwq(&self) -> DependentCost {
1048
5.19k
        match self {
1049
0
            GasCostsValues::V1(v1) => v1.scwq,
1050
0
            GasCostsValues::V2(v2) => v2.scwq,
1051
0
            GasCostsValues::V3(v3) => v3.scwq,
1052
5.19k
            GasCostsValues::V4(v4) => v4.scwq,
1053
        }
1054
5.19k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4scwqCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
1047
5.19k
    pub fn scwq(&self) -> DependentCost {
1048
5.19k
        match self {
1049
0
            GasCostsValues::V1(v1) => v1.scwq,
1050
0
            GasCostsValues::V2(v2) => v2.scwq,
1051
0
            GasCostsValues::V3(v3) => v3.scwq,
1052
5.19k
            GasCostsValues::V4(v4) => v4.scwq,
1053
        }
1054
5.19k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4scwqBb_
1055
1056
88.9k
    pub fn smo(&self) -> DependentCost {
1057
88.9k
        match self {
1058
0
            GasCostsValues::V1(v1) => v1.smo,
1059
0
            GasCostsValues::V2(v2) => v2.smo,
1060
0
            GasCostsValues::V3(v3) => v3.smo,
1061
88.9k
            GasCostsValues::V4(v4) => v4.smo,
1062
        }
1063
88.9k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3smoCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
1056
88.9k
    pub fn smo(&self) -> DependentCost {
1057
88.9k
        match self {
1058
0
            GasCostsValues::V1(v1) => v1.smo,
1059
0
            GasCostsValues::V2(v2) => v2.smo,
1060
0
            GasCostsValues::V3(v3) => v3.smo,
1061
88.9k
            GasCostsValues::V4(v4) => v4.smo,
1062
        }
1063
88.9k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues3smoBb_
1064
1065
896
    pub fn srwq(&self) -> DependentCost {
1066
896
        match self {
1067
0
            GasCostsValues::V1(v1) => v1.srwq,
1068
0
            GasCostsValues::V2(v2) => v2.srwq,
1069
0
            GasCostsValues::V3(v3) => v3.srwq,
1070
896
            GasCostsValues::V4(v4) => v4.srwq,
1071
        }
1072
896
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4srwqCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
1065
896
    pub fn srwq(&self) -> DependentCost {
1066
896
        match self {
1067
0
            GasCostsValues::V1(v1) => v1.srwq,
1068
0
            GasCostsValues::V2(v2) => v2.srwq,
1069
0
            GasCostsValues::V3(v3) => v3.srwq,
1070
896
            GasCostsValues::V4(v4) => v4.srwq,
1071
        }
1072
896
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4srwqBb_
1073
1074
3.79k
    pub fn swwq(&self) -> DependentCost {
1075
3.79k
        match self {
1076
0
            GasCostsValues::V1(v1) => v1.swwq,
1077
0
            GasCostsValues::V2(v2) => v2.swwq,
1078
0
            GasCostsValues::V3(v3) => v3.swwq,
1079
3.79k
            GasCostsValues::V4(v4) => v4.swwq,
1080
        }
1081
3.79k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4swwqCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
1074
3.79k
    pub fn swwq(&self) -> DependentCost {
1075
3.79k
        match self {
1076
0
            GasCostsValues::V1(v1) => v1.swwq,
1077
0
            GasCostsValues::V2(v2) => v2.swwq,
1078
0
            GasCostsValues::V3(v3) => v3.swwq,
1079
3.79k
            GasCostsValues::V4(v4) => v4.swwq,
1080
        }
1081
3.79k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4swwqBb_
1082
1083
2
    pub fn bsiz(&self) -> Result<DependentCost, GasCostNotDefined> {
1084
2
        match self {
1085
0
            GasCostsValues::V1(_v1) => Err(GasCostNotDefined),
1086
0
            GasCostsValues::V2(_v2) => Err(GasCostNotDefined),
1087
0
            GasCostsValues::V3(_v3) => Err(GasCostNotDefined),
1088
2
            GasCostsValues::V4(v4) => Ok(v4.bsiz),
1089
        }
1090
2
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4bsizCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
1083
2
    pub fn bsiz(&self) -> Result<DependentCost, GasCostNotDefined> {
1084
2
        match self {
1085
0
            GasCostsValues::V1(_v1) => Err(GasCostNotDefined),
1086
0
            GasCostsValues::V2(_v2) => Err(GasCostNotDefined),
1087
0
            GasCostsValues::V3(_v3) => Err(GasCostNotDefined),
1088
2
            GasCostsValues::V4(v4) => Ok(v4.bsiz),
1089
        }
1090
2
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4bsizBb_
1091
1092
3
    pub fn bldd(&self) -> Result<DependentCost, GasCostNotDefined> {
1093
3
        match self {
1094
0
            GasCostsValues::V1(_v1) => Err(GasCostNotDefined),
1095
0
            GasCostsValues::V2(_v2) => Err(GasCostNotDefined),
1096
0
            GasCostsValues::V3(_v3) => Err(GasCostNotDefined),
1097
3
            GasCostsValues::V4(v4) => Ok(v4.bldd),
1098
        }
1099
3
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4blddCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
1092
3
    pub fn bldd(&self) -> Result<DependentCost, GasCostNotDefined> {
1093
3
        match self {
1094
0
            GasCostsValues::V1(_v1) => Err(GasCostNotDefined),
1095
0
            GasCostsValues::V2(_v2) => Err(GasCostNotDefined),
1096
0
            GasCostsValues::V3(_v3) => Err(GasCostNotDefined),
1097
3
            GasCostsValues::V4(v4) => Ok(v4.bldd),
1098
        }
1099
3
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues4blddBb_
1100
1101
21.9k
    pub fn contract_root(&self) -> DependentCost {
1102
21.9k
        match self {
1103
0
            GasCostsValues::V1(v1) => v1.contract_root,
1104
0
            GasCostsValues::V2(v2) => v2.contract_root,
1105
0
            GasCostsValues::V3(v3) => v3.contract_root,
1106
21.9k
            GasCostsValues::V4(v4) => v4.contract_root,
1107
        }
1108
21.9k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues13contract_rootCsg6P9hFxt0iW_7fuel_vm
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues13contract_rootBb_
Line
Count
Source
1101
21.9k
    pub fn contract_root(&self) -> DependentCost {
1102
21.9k
        match self {
1103
0
            GasCostsValues::V1(v1) => v1.contract_root,
1104
0
            GasCostsValues::V2(v2) => v2.contract_root,
1105
0
            GasCostsValues::V3(v3) => v3.contract_root,
1106
21.9k
            GasCostsValues::V4(v4) => v4.contract_root,
1107
        }
1108
21.9k
    }
1109
1110
21.9k
    pub fn state_root(&self) -> DependentCost {
1111
21.9k
        match self {
1112
0
            GasCostsValues::V1(v1) => v1.state_root,
1113
0
            GasCostsValues::V2(v2) => v2.state_root,
1114
0
            GasCostsValues::V3(v3) => v3.state_root,
1115
21.9k
            GasCostsValues::V4(v4) => v4.state_root,
1116
        }
1117
21.9k
    }
1118
1119
16.5k
    pub fn new_storage_per_byte(&self) -> Word {
1120
16.5k
        match self {
1121
0
            GasCostsValues::V1(v1) => v1.new_storage_per_byte,
1122
0
            GasCostsValues::V2(v2) => v2.new_storage_per_byte,
1123
0
            GasCostsValues::V3(v3) => v3.new_storage_per_byte,
1124
16.5k
            GasCostsValues::V4(v4) => v4.new_storage_per_byte,
1125
        }
1126
16.5k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues20new_storage_per_byteCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
1119
16.5k
    pub fn new_storage_per_byte(&self) -> Word {
1120
16.5k
        match self {
1121
0
            GasCostsValues::V1(v1) => v1.new_storage_per_byte,
1122
0
            GasCostsValues::V2(v2) => v2.new_storage_per_byte,
1123
0
            GasCostsValues::V3(v3) => v3.new_storage_per_byte,
1124
16.5k
            GasCostsValues::V4(v4) => v4.new_storage_per_byte,
1125
        }
1126
16.5k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues20new_storage_per_byteBb_
1127
1128
43.8k
    pub fn vm_initialization(&self) -> DependentCost {
1129
43.8k
        match self {
1130
0
            GasCostsValues::V1(v1) => v1.vm_initialization,
1131
0
            GasCostsValues::V2(v2) => v2.vm_initialization,
1132
0
            GasCostsValues::V3(v3) => v3.vm_initialization,
1133
43.8k
            GasCostsValues::V4(v4) => v4.vm_initialization,
1134
        }
1135
43.8k
    }
_RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues17vm_initializationCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
1128
43.8k
    pub fn vm_initialization(&self) -> DependentCost {
1129
43.8k
        match self {
1130
0
            GasCostsValues::V1(v1) => v1.vm_initialization,
1131
0
            GasCostsValues::V2(v2) => v2.vm_initialization,
1132
0
            GasCostsValues::V3(v3) => v3.vm_initialization,
1133
43.8k
            GasCostsValues::V4(v4) => v4.vm_initialization,
1134
        }
1135
43.8k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_14GasCostsValues17vm_initializationBb_
1136
}
1137
1138
/// Gas costs for every op.
1139
#[allow(missing_docs)]
1140
0
#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
Unexecuted instantiation: _RNvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass1_1__NtB7_16GasCostsValuesV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1H_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass1_1__NtBa_16GasCostsValuesV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1K_7Visitor9expecting
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass1_1__NtBb_16GasCostsValuesV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1L_7Visitor9visit_seqINtNtNtCs1b0Bw0OchLA_8postcard2de12deserializer9SeqAccessNtNtB3j_7flavors5SliceEEBh_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass1_1__NtB8_16GasCostsValuesV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1I_7Visitor9visit_u64pEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass1_1__NtB8_16GasCostsValuesV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1I_7Visitor9visit_strpEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass1_1__NtB8_16GasCostsValuesV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1I_7Visitor11visit_bytespEBe_
Unexecuted instantiation: _RINvXs_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass1_1__NtBa_16GasCostsValuesV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1I_11deserializepEBg_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass1_1__NtBb_16GasCostsValuesV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1L_7Visitor9visit_mappEBh_
1141
#[serde(default = "GasCostsValuesV1::unit")]
1142
pub struct GasCostsValuesV1 {
1143
    pub add: Word,
1144
    pub addi: Word,
1145
    pub aloc: Word,
1146
    pub and: Word,
1147
    pub andi: Word,
1148
    pub bal: Word,
1149
    pub bhei: Word,
1150
    pub bhsh: Word,
1151
    pub burn: Word,
1152
    pub cb: Word,
1153
    pub cfei: Word,
1154
    pub cfsi: Word,
1155
    pub div: Word,
1156
    pub divi: Word,
1157
    pub eck1: Word,
1158
    pub ecr1: Word,
1159
    pub ed19: Word,
1160
    pub eq: Word,
1161
    pub exp: Word,
1162
    pub expi: Word,
1163
    pub flag: Word,
1164
    pub gm: Word,
1165
    pub gt: Word,
1166
    pub gtf: Word,
1167
    pub ji: Word,
1168
    pub jmp: Word,
1169
    pub jne: Word,
1170
    pub jnei: Word,
1171
    pub jnzi: Word,
1172
    pub jmpf: Word,
1173
    pub jmpb: Word,
1174
    pub jnzf: Word,
1175
    pub jnzb: Word,
1176
    pub jnef: Word,
1177
    pub jneb: Word,
1178
    pub lb: Word,
1179
    pub log: Word,
1180
    pub lt: Word,
1181
    pub lw: Word,
1182
    pub mint: Word,
1183
    pub mlog: Word,
1184
    #[serde(rename = "mod")]
1185
    pub mod_op: Word,
1186
    pub modi: Word,
1187
    #[serde(rename = "move")]
1188
    pub move_op: Word,
1189
    pub movi: Word,
1190
    pub mroo: Word,
1191
    pub mul: Word,
1192
    pub muli: Word,
1193
    pub mldv: Word,
1194
    pub noop: Word,
1195
    pub not: Word,
1196
    pub or: Word,
1197
    pub ori: Word,
1198
    pub poph: Word,
1199
    pub popl: Word,
1200
    pub pshh: Word,
1201
    pub pshl: Word,
1202
    #[serde(rename = "ret_contract")]
1203
    pub ret: Word,
1204
    #[serde(rename = "rvrt_contract")]
1205
    pub rvrt: Word,
1206
    pub sb: Word,
1207
    pub sll: Word,
1208
    pub slli: Word,
1209
    pub srl: Word,
1210
    pub srli: Word,
1211
    pub srw: Word,
1212
    pub sub: Word,
1213
    pub subi: Word,
1214
    pub sw: Word,
1215
    pub sww: Word,
1216
    pub time: Word,
1217
    pub tr: Word,
1218
    pub tro: Word,
1219
    pub wdcm: Word,
1220
    pub wqcm: Word,
1221
    pub wdop: Word,
1222
    pub wqop: Word,
1223
    pub wdml: Word,
1224
    pub wqml: Word,
1225
    pub wddv: Word,
1226
    pub wqdv: Word,
1227
    pub wdmd: Word,
1228
    pub wqmd: Word,
1229
    pub wdam: Word,
1230
    pub wqam: Word,
1231
    pub wdmm: Word,
1232
    pub wqmm: Word,
1233
    pub xor: Word,
1234
    pub xori: Word,
1235
1236
    // Dependent
1237
    pub call: DependentCost,
1238
    pub ccp: DependentCost,
1239
    pub croo: DependentCost,
1240
    pub csiz: DependentCost,
1241
    pub k256: DependentCost,
1242
    pub ldc: DependentCost,
1243
    pub logd: DependentCost,
1244
    pub mcl: DependentCost,
1245
    pub mcli: DependentCost,
1246
    pub mcp: DependentCost,
1247
    pub mcpi: DependentCost,
1248
    pub meq: DependentCost,
1249
    #[serde(rename = "retd_contract")]
1250
    pub retd: DependentCost,
1251
    pub s256: DependentCost,
1252
    pub scwq: DependentCost,
1253
    pub smo: DependentCost,
1254
    pub srwq: DependentCost,
1255
    pub swwq: DependentCost,
1256
1257
    // Non-opcode costs
1258
    pub contract_root: DependentCost,
1259
    pub state_root: DependentCost,
1260
    pub new_storage_per_byte: Word,
1261
    pub vm_initialization: DependentCost,
1262
}
1263
1264
/// Gas costs for every op.
1265
/// The difference with [`GasCostsValuesV1`]:
1266
/// - `aloc` is a [`DependentCost`] instead of a [`Word`]
1267
#[allow(missing_docs)]
1268
0
#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
Unexecuted instantiation: _RNvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass3_1__NtB7_16GasCostsValuesV2NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1H_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass3_1__NtBa_16GasCostsValuesV2NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1K_7Visitor9expecting
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass3_1__NtBb_16GasCostsValuesV2NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1L_7Visitor9visit_seqINtNtNtCs1b0Bw0OchLA_8postcard2de12deserializer9SeqAccessNtNtB3j_7flavors5SliceEEBh_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass3_1__NtB8_16GasCostsValuesV2NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1I_7Visitor9visit_u64pEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass3_1__NtB8_16GasCostsValuesV2NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1I_7Visitor9visit_strpEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass3_1__NtB8_16GasCostsValuesV2NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1I_7Visitor11visit_bytespEBe_
Unexecuted instantiation: _RINvXs_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass3_1__NtBa_16GasCostsValuesV2NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1I_11deserializepEBg_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass3_1__NtBb_16GasCostsValuesV2NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1L_7Visitor9visit_mappEBh_
1269
#[serde(default = "GasCostsValuesV2::unit")]
1270
pub struct GasCostsValuesV2 {
1271
    pub add: Word,
1272
    pub addi: Word,
1273
    pub and: Word,
1274
    pub andi: Word,
1275
    pub bal: Word,
1276
    pub bhei: Word,
1277
    pub bhsh: Word,
1278
    pub burn: Word,
1279
    pub cb: Word,
1280
    pub cfei: Word,
1281
    pub cfsi: Word,
1282
    pub div: Word,
1283
    pub divi: Word,
1284
    pub eck1: Word,
1285
    pub ecr1: Word,
1286
    pub ed19: Word,
1287
    pub eq: Word,
1288
    pub exp: Word,
1289
    pub expi: Word,
1290
    pub flag: Word,
1291
    pub gm: Word,
1292
    pub gt: Word,
1293
    pub gtf: Word,
1294
    pub ji: Word,
1295
    pub jmp: Word,
1296
    pub jne: Word,
1297
    pub jnei: Word,
1298
    pub jnzi: Word,
1299
    pub jmpf: Word,
1300
    pub jmpb: Word,
1301
    pub jnzf: Word,
1302
    pub jnzb: Word,
1303
    pub jnef: Word,
1304
    pub jneb: Word,
1305
    pub lb: Word,
1306
    pub log: Word,
1307
    pub lt: Word,
1308
    pub lw: Word,
1309
    pub mint: Word,
1310
    pub mlog: Word,
1311
    #[serde(rename = "mod")]
1312
    pub mod_op: Word,
1313
    pub modi: Word,
1314
    #[serde(rename = "move")]
1315
    pub move_op: Word,
1316
    pub movi: Word,
1317
    pub mroo: Word,
1318
    pub mul: Word,
1319
    pub muli: Word,
1320
    pub mldv: Word,
1321
    pub noop: Word,
1322
    pub not: Word,
1323
    pub or: Word,
1324
    pub ori: Word,
1325
    pub poph: Word,
1326
    pub popl: Word,
1327
    pub pshh: Word,
1328
    pub pshl: Word,
1329
    #[serde(rename = "ret_contract")]
1330
    pub ret: Word,
1331
    #[serde(rename = "rvrt_contract")]
1332
    pub rvrt: Word,
1333
    pub sb: Word,
1334
    pub sll: Word,
1335
    pub slli: Word,
1336
    pub srl: Word,
1337
    pub srli: Word,
1338
    pub srw: Word,
1339
    pub sub: Word,
1340
    pub subi: Word,
1341
    pub sw: Word,
1342
    pub sww: Word,
1343
    pub time: Word,
1344
    pub tr: Word,
1345
    pub tro: Word,
1346
    pub wdcm: Word,
1347
    pub wqcm: Word,
1348
    pub wdop: Word,
1349
    pub wqop: Word,
1350
    pub wdml: Word,
1351
    pub wqml: Word,
1352
    pub wddv: Word,
1353
    pub wqdv: Word,
1354
    pub wdmd: Word,
1355
    pub wqmd: Word,
1356
    pub wdam: Word,
1357
    pub wqam: Word,
1358
    pub wdmm: Word,
1359
    pub wqmm: Word,
1360
    pub xor: Word,
1361
    pub xori: Word,
1362
1363
    // Dependent
1364
    pub aloc: DependentCost,
1365
    pub call: DependentCost,
1366
    pub ccp: DependentCost,
1367
    pub croo: DependentCost,
1368
    pub csiz: DependentCost,
1369
    pub k256: DependentCost,
1370
    pub ldc: DependentCost,
1371
    pub logd: DependentCost,
1372
    pub mcl: DependentCost,
1373
    pub mcli: DependentCost,
1374
    pub mcp: DependentCost,
1375
    pub mcpi: DependentCost,
1376
    pub meq: DependentCost,
1377
    #[serde(rename = "retd_contract")]
1378
    pub retd: DependentCost,
1379
    pub s256: DependentCost,
1380
    pub scwq: DependentCost,
1381
    pub smo: DependentCost,
1382
    pub srwq: DependentCost,
1383
    pub swwq: DependentCost,
1384
1385
    // Non-opcode costs
1386
    pub contract_root: DependentCost,
1387
    pub state_root: DependentCost,
1388
    pub new_storage_per_byte: Word,
1389
    pub vm_initialization: DependentCost,
1390
}
1391
1392
/// Gas costs for every op.
1393
/// The difference with [`GasCostsValuesV2`]:
1394
/// - Added `cfe` as a [`DependentCost`]
1395
/// - `cfei` is a [`DependentCost`] instead of a [`Word`]
1396
#[allow(missing_docs)]
1397
0
#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
Unexecuted instantiation: _RNvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass5_1__NtB7_16GasCostsValuesV3NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1H_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass5_1__NtBa_16GasCostsValuesV3NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1K_7Visitor9expecting
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass5_1__NtBb_16GasCostsValuesV3NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1L_7Visitor9visit_seqINtNtNtCs1b0Bw0OchLA_8postcard2de12deserializer9SeqAccessNtNtB3j_7flavors5SliceEEBh_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass5_1__NtB8_16GasCostsValuesV3NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1I_7Visitor9visit_u64pEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass5_1__NtB8_16GasCostsValuesV3NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1I_7Visitor9visit_strpEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass5_1__NtB8_16GasCostsValuesV3NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1I_7Visitor11visit_bytespEBe_
Unexecuted instantiation: _RINvXs_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass5_1__NtBa_16GasCostsValuesV3NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1I_11deserializepEBg_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass5_1__NtBb_16GasCostsValuesV3NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1L_7Visitor9visit_mappEBh_
1398
#[serde(default = "GasCostsValuesV3::unit")]
1399
pub struct GasCostsValuesV3 {
1400
    pub add: Word,
1401
    pub addi: Word,
1402
    pub and: Word,
1403
    pub andi: Word,
1404
    pub bal: Word,
1405
    pub bhei: Word,
1406
    pub bhsh: Word,
1407
    pub burn: Word,
1408
    pub cb: Word,
1409
    pub cfsi: Word,
1410
    pub div: Word,
1411
    pub divi: Word,
1412
    pub eck1: Word,
1413
    pub ecr1: Word,
1414
    pub ed19: Word,
1415
    pub eq: Word,
1416
    pub exp: Word,
1417
    pub expi: Word,
1418
    pub flag: Word,
1419
    pub gm: Word,
1420
    pub gt: Word,
1421
    pub gtf: Word,
1422
    pub ji: Word,
1423
    pub jmp: Word,
1424
    pub jne: Word,
1425
    pub jnei: Word,
1426
    pub jnzi: Word,
1427
    pub jmpf: Word,
1428
    pub jmpb: Word,
1429
    pub jnzf: Word,
1430
    pub jnzb: Word,
1431
    pub jnef: Word,
1432
    pub jneb: Word,
1433
    pub lb: Word,
1434
    pub log: Word,
1435
    pub lt: Word,
1436
    pub lw: Word,
1437
    pub mint: Word,
1438
    pub mlog: Word,
1439
    #[serde(rename = "mod")]
1440
    pub mod_op: Word,
1441
    pub modi: Word,
1442
    #[serde(rename = "move")]
1443
    pub move_op: Word,
1444
    pub movi: Word,
1445
    pub mroo: Word,
1446
    pub mul: Word,
1447
    pub muli: Word,
1448
    pub mldv: Word,
1449
    pub noop: Word,
1450
    pub not: Word,
1451
    pub or: Word,
1452
    pub ori: Word,
1453
    pub poph: Word,
1454
    pub popl: Word,
1455
    pub pshh: Word,
1456
    pub pshl: Word,
1457
    #[serde(rename = "ret_contract")]
1458
    pub ret: Word,
1459
    #[serde(rename = "rvrt_contract")]
1460
    pub rvrt: Word,
1461
    pub sb: Word,
1462
    pub sll: Word,
1463
    pub slli: Word,
1464
    pub srl: Word,
1465
    pub srli: Word,
1466
    pub srw: Word,
1467
    pub sub: Word,
1468
    pub subi: Word,
1469
    pub sw: Word,
1470
    pub sww: Word,
1471
    pub time: Word,
1472
    pub tr: Word,
1473
    pub tro: Word,
1474
    pub wdcm: Word,
1475
    pub wqcm: Word,
1476
    pub wdop: Word,
1477
    pub wqop: Word,
1478
    pub wdml: Word,
1479
    pub wqml: Word,
1480
    pub wddv: Word,
1481
    pub wqdv: Word,
1482
    pub wdmd: Word,
1483
    pub wqmd: Word,
1484
    pub wdam: Word,
1485
    pub wqam: Word,
1486
    pub wdmm: Word,
1487
    pub wqmm: Word,
1488
    pub xor: Word,
1489
    pub xori: Word,
1490
1491
    // Dependent
1492
    pub aloc: DependentCost,
1493
    pub cfe: DependentCost,
1494
    pub cfei: DependentCost,
1495
    pub call: DependentCost,
1496
    pub ccp: DependentCost,
1497
    pub croo: DependentCost,
1498
    pub csiz: DependentCost,
1499
    pub k256: DependentCost,
1500
    pub ldc: DependentCost,
1501
    pub logd: DependentCost,
1502
    pub mcl: DependentCost,
1503
    pub mcli: DependentCost,
1504
    pub mcp: DependentCost,
1505
    pub mcpi: DependentCost,
1506
    pub meq: DependentCost,
1507
    #[serde(rename = "retd_contract")]
1508
    pub retd: DependentCost,
1509
    pub s256: DependentCost,
1510
    pub scwq: DependentCost,
1511
    pub smo: DependentCost,
1512
    pub srwq: DependentCost,
1513
    pub swwq: DependentCost,
1514
1515
    // Non-opcode costs
1516
    pub contract_root: DependentCost,
1517
    pub state_root: DependentCost,
1518
    pub new_storage_per_byte: Word,
1519
    pub vm_initialization: DependentCost,
1520
}
1521
1522
/// Gas costs for every op.
1523
/// The difference with [`GasCostsValuesV3`]:
1524
/// - Added `bsiz`, `bldd` instructions
1525
/// - Changed `ed19` to be `DependentCost`
1526
#[allow(missing_docs)]
1527
0
#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
Unexecuted instantiation: _RNvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass7_1__NtB7_16GasCostsValuesV4NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1H_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass7_1__NtBa_16GasCostsValuesV4NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1K_7Visitor9expecting
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass7_1__NtBb_16GasCostsValuesV4NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1L_7Visitor9visit_seqINtNtNtCs1b0Bw0OchLA_8postcard2de12deserializer9SeqAccessNtNtB3j_7flavors5SliceEEBh_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass7_1__NtB8_16GasCostsValuesV4NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1I_7Visitor9visit_u64pEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass7_1__NtB8_16GasCostsValuesV4NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1I_7Visitor9visit_strpEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass7_1__NtB8_16GasCostsValuesV4NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1I_7Visitor11visit_bytespEBe_
Unexecuted instantiation: _RINvXs_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass7_1__NtBa_16GasCostsValuesV4NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1I_11deserializepEBg_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass7_1__NtBb_16GasCostsValuesV4NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1L_7Visitor9visit_mappEBh_
1528
#[serde(default = "GasCostsValuesV4::unit")]
1529
pub struct GasCostsValuesV4 {
1530
    pub add: Word,
1531
    pub addi: Word,
1532
    pub and: Word,
1533
    pub andi: Word,
1534
    pub bal: Word,
1535
    pub bhei: Word,
1536
    pub bhsh: Word,
1537
    pub burn: Word,
1538
    pub cb: Word,
1539
    pub cfsi: Word,
1540
    pub div: Word,
1541
    pub divi: Word,
1542
    pub eck1: Word,
1543
    pub ecr1: Word,
1544
    pub eq: Word,
1545
    pub exp: Word,
1546
    pub expi: Word,
1547
    pub flag: Word,
1548
    pub gm: Word,
1549
    pub gt: Word,
1550
    pub gtf: Word,
1551
    pub ji: Word,
1552
    pub jmp: Word,
1553
    pub jne: Word,
1554
    pub jnei: Word,
1555
    pub jnzi: Word,
1556
    pub jmpf: Word,
1557
    pub jmpb: Word,
1558
    pub jnzf: Word,
1559
    pub jnzb: Word,
1560
    pub jnef: Word,
1561
    pub jneb: Word,
1562
    pub lb: Word,
1563
    pub log: Word,
1564
    pub lt: Word,
1565
    pub lw: Word,
1566
    pub mint: Word,
1567
    pub mlog: Word,
1568
    #[serde(rename = "mod")]
1569
    pub mod_op: Word,
1570
    pub modi: Word,
1571
    #[serde(rename = "move")]
1572
    pub move_op: Word,
1573
    pub movi: Word,
1574
    pub mroo: Word,
1575
    pub mul: Word,
1576
    pub muli: Word,
1577
    pub mldv: Word,
1578
    pub noop: Word,
1579
    pub not: Word,
1580
    pub or: Word,
1581
    pub ori: Word,
1582
    pub poph: Word,
1583
    pub popl: Word,
1584
    pub pshh: Word,
1585
    pub pshl: Word,
1586
    #[serde(rename = "ret_contract")]
1587
    pub ret: Word,
1588
    #[serde(rename = "rvrt_contract")]
1589
    pub rvrt: Word,
1590
    pub sb: Word,
1591
    pub sll: Word,
1592
    pub slli: Word,
1593
    pub srl: Word,
1594
    pub srli: Word,
1595
    pub srw: Word,
1596
    pub sub: Word,
1597
    pub subi: Word,
1598
    pub sw: Word,
1599
    pub sww: Word,
1600
    pub time: Word,
1601
    pub tr: Word,
1602
    pub tro: Word,
1603
    pub wdcm: Word,
1604
    pub wqcm: Word,
1605
    pub wdop: Word,
1606
    pub wqop: Word,
1607
    pub wdml: Word,
1608
    pub wqml: Word,
1609
    pub wddv: Word,
1610
    pub wqdv: Word,
1611
    pub wdmd: Word,
1612
    pub wqmd: Word,
1613
    pub wdam: Word,
1614
    pub wqam: Word,
1615
    pub wdmm: Word,
1616
    pub wqmm: Word,
1617
    pub xor: Word,
1618
    pub xori: Word,
1619
1620
    // Dependent
1621
    pub aloc: DependentCost,
1622
    pub bsiz: DependentCost,
1623
    pub bldd: DependentCost,
1624
    pub cfe: DependentCost,
1625
    pub cfei: DependentCost,
1626
    pub call: DependentCost,
1627
    pub ccp: DependentCost,
1628
    pub croo: DependentCost,
1629
    pub csiz: DependentCost,
1630
    pub ed19: DependentCost,
1631
    pub k256: DependentCost,
1632
    pub ldc: DependentCost,
1633
    pub logd: DependentCost,
1634
    pub mcl: DependentCost,
1635
    pub mcli: DependentCost,
1636
    pub mcp: DependentCost,
1637
    pub mcpi: DependentCost,
1638
    pub meq: DependentCost,
1639
    #[serde(rename = "retd_contract")]
1640
    pub retd: DependentCost,
1641
    pub s256: DependentCost,
1642
    pub scwq: DependentCost,
1643
    pub smo: DependentCost,
1644
    pub srwq: DependentCost,
1645
    pub swwq: DependentCost,
1646
1647
    // Non-opcode costs
1648
    pub contract_root: DependentCost,
1649
    pub state_root: DependentCost,
1650
    pub new_storage_per_byte: Word,
1651
    pub vm_initialization: DependentCost,
1652
}
1653
1654
/// Dependent cost is a cost that depends on the number of units.
1655
#[derive(
1656
0
    Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass9_1__NtB7_13DependentCostNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1E_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass9_1__NtB8_13DependentCostNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1F_7Visitor9visit_u64NtNtCs1b0Bw0OchLA_8postcard5error5ErrorEBe_
Unexecuted instantiation: _RINvXs_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass9_1__NtBa_13DependentCostNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1F_11deserializeINtNtB1H_5value15U32DeserializerNtNtCs1b0Bw0OchLA_8postcard5error5ErrorEEBg_
Unexecuted instantiation: _RNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass9_1__NtBa_13DependentCostNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1H_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass9_1__NtBd_13DependentCostNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB8_9___VisitorNtB1K_7Visitor10visit_enumNtB2_14___FieldVisitorB2P_9expecting
Unexecuted instantiation: _RNvXs0_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass9_1__NtBg_13DependentCostNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1N_7Visitor10visit_enumNtB5_9___VisitorB2S_9expecting
Unexecuted instantiation: _RINvXs0_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass9_1__NtBh_13DependentCostNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1O_7Visitor10visit_enumNtB6_9___VisitorB2T_9visit_seqINtNtNtCs1b0Bw0OchLA_8postcard2de12deserializer9SeqAccessNtNtB3S_7flavors5SliceEEBn_
Unexecuted instantiation: _RNvXs1_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass9_1__NtBg_13DependentCostNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1N_7Visitor10visit_enumNtB5_s_14___FieldVisitorB2S_9expecting
Unexecuted instantiation: _RNvXs3_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass9_1__NtBg_13DependentCostNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1N_7Visitor10visit_enumNtB5_s_9___VisitorB2S_9expecting
Unexecuted instantiation: _RINvXs3_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass9_1__NtBh_13DependentCostNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1O_7Visitor10visit_enumNtB6_s_9___VisitorB2T_9visit_seqINtNtNtCs1b0Bw0OchLA_8postcard2de12deserializer9SeqAccessNtNtB3U_7flavors5SliceEEBn_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass9_1__NtB8_13DependentCostNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1F_7Visitor9visit_strpEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass9_1__NtB8_13DependentCostNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1F_7Visitor11visit_bytespEBe_
Unexecuted instantiation: _RINvXNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass9_1__NtBe_13DependentCostNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB9_9___VisitorNtB1L_7Visitor10visit_enumNtB3_14___FieldVisitorB2Q_9visit_u64pEBk_
Unexecuted instantiation: _RINvXNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass9_1__NtBe_13DependentCostNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB9_9___VisitorNtB1L_7Visitor10visit_enumNtB3_14___FieldVisitorB2Q_9visit_strpEBk_
Unexecuted instantiation: _RINvXNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass9_1__NtBe_13DependentCostNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB9_9___VisitorNtB1L_7Visitor10visit_enumNtB3_14___FieldVisitorB2Q_11visit_bytespEBk_
Unexecuted instantiation: _RINvXs_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass9_1__NtBg_13DependentCostNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1N_7Visitor10visit_enumNtB5_7___FieldB1L_11deserializepEBm_
Unexecuted instantiation: _RINvXs0_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass9_1__NtBh_13DependentCostNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1O_7Visitor10visit_enumNtB6_9___VisitorB2T_9visit_mappEBn_
Unexecuted instantiation: _RINvXs1_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass9_1__NtBh_13DependentCostNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1O_7Visitor10visit_enumNtB6_s_14___FieldVisitorB2T_9visit_u64pEBn_
Unexecuted instantiation: _RINvXs1_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass9_1__NtBh_13DependentCostNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1O_7Visitor10visit_enumNtB6_s_14___FieldVisitorB2T_9visit_strpEBn_
Unexecuted instantiation: _RINvXs1_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass9_1__NtBh_13DependentCostNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1O_7Visitor10visit_enumNtB6_s_14___FieldVisitorB2T_11visit_bytespEBn_
Unexecuted instantiation: _RINvXs2_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass9_1__NtBh_13DependentCostNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1O_7Visitor10visit_enumNtB6_s_7___FieldB1M_11deserializepEBn_
Unexecuted instantiation: _RINvXs3_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gass9_1__NtBh_13DependentCostNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1O_7Visitor10visit_enumNtB6_s_9___VisitorB2T_9visit_mappEBn_
1657
)]
1658
pub enum DependentCost {
1659
    /// When an operation is dependent on the magnitude of its inputs, and the
1660
    /// time per unit of input is less than a single no-op operation
1661
    LightOperation {
1662
        /// The minimum that this operation can cost.
1663
        base: Word,
1664
        /// How many elements can be processed with a single gas. The
1665
        /// higher the `units_per_gas`, the less additional cost you will incur
1666
        /// for a given number of units, because you need more units to increase
1667
        /// the total cost.
1668
        /// This must be nonzero.
1669
        units_per_gas: Word,
1670
    },
1671
1672
    /// When an operation is dependent on the magnitude of its inputs, and the
1673
    /// time per unit of input is greater than a single no-op operation
1674
    HeavyOperation {
1675
        /// The minimum that this operation can cost.
1676
        base: Word,
1677
        /// How much gas is required to process a single unit.
1678
        gas_per_unit: Word,
1679
    },
1680
}
1681
1682
#[cfg(feature = "alloc")]
1683
impl GasCosts {
1684
    /// Create costs that are all set to zero.
1685
0
    pub fn free() -> Self {
1686
0
        Self(Arc::new(GasCostsValues::free()))
1687
0
    }
1688
1689
    /// Create costs that are all set to one.
1690
0
    pub fn unit() -> Self {
1691
0
        Self(Arc::new(GasCostsValues::unit()))
1692
0
    }
1693
}
1694
1695
impl GasCostsValues {
1696
    /// Create costs that are all set to zero.
1697
0
    pub fn free() -> Self {
1698
0
        GasCostsValuesV4::free().into()
1699
0
    }
1700
1701
    /// Create costs that are all set to one.
1702
0
    pub fn unit() -> Self {
1703
0
        GasCostsValuesV4::unit().into()
1704
0
    }
1705
}
1706
1707
impl GasCostsValuesV1 {
1708
    /// Create costs that are all set to zero.
1709
0
    pub fn free() -> Self {
1710
0
        Self {
1711
0
            add: 0,
1712
0
            addi: 0,
1713
0
            aloc: 0,
1714
0
            and: 0,
1715
0
            andi: 0,
1716
0
            bal: 0,
1717
0
            bhei: 0,
1718
0
            bhsh: 0,
1719
0
            burn: 0,
1720
0
            cb: 0,
1721
0
            cfei: 0,
1722
0
            cfsi: 0,
1723
0
            div: 0,
1724
0
            divi: 0,
1725
0
            eck1: 0,
1726
0
            ecr1: 0,
1727
0
            ed19: 0,
1728
0
            eq: 0,
1729
0
            exp: 0,
1730
0
            expi: 0,
1731
0
            flag: 0,
1732
0
            gm: 0,
1733
0
            gt: 0,
1734
0
            gtf: 0,
1735
0
            ji: 0,
1736
0
            jmp: 0,
1737
0
            jne: 0,
1738
0
            jnei: 0,
1739
0
            jnzi: 0,
1740
0
            jmpf: 0,
1741
0
            jmpb: 0,
1742
0
            jnzf: 0,
1743
0
            jnzb: 0,
1744
0
            jnef: 0,
1745
0
            jneb: 0,
1746
0
            lb: 0,
1747
0
            log: 0,
1748
0
            lt: 0,
1749
0
            lw: 0,
1750
0
            mint: 0,
1751
0
            mlog: 0,
1752
0
            mod_op: 0,
1753
0
            modi: 0,
1754
0
            move_op: 0,
1755
0
            movi: 0,
1756
0
            mroo: 0,
1757
0
            mul: 0,
1758
0
            muli: 0,
1759
0
            mldv: 0,
1760
0
            noop: 0,
1761
0
            not: 0,
1762
0
            or: 0,
1763
0
            ori: 0,
1764
0
            poph: 0,
1765
0
            popl: 0,
1766
0
            pshh: 0,
1767
0
            pshl: 0,
1768
0
            ret: 0,
1769
0
            rvrt: 0,
1770
0
            sb: 0,
1771
0
            sll: 0,
1772
0
            slli: 0,
1773
0
            srl: 0,
1774
0
            srli: 0,
1775
0
            srw: 0,
1776
0
            sub: 0,
1777
0
            subi: 0,
1778
0
            sw: 0,
1779
0
            sww: 0,
1780
0
            time: 0,
1781
0
            tr: 0,
1782
0
            tro: 0,
1783
0
            wdcm: 0,
1784
0
            wqcm: 0,
1785
0
            wdop: 0,
1786
0
            wqop: 0,
1787
0
            wdml: 0,
1788
0
            wqml: 0,
1789
0
            wddv: 0,
1790
0
            wqdv: 0,
1791
0
            wdmd: 0,
1792
0
            wqmd: 0,
1793
0
            wdam: 0,
1794
0
            wqam: 0,
1795
0
            wdmm: 0,
1796
0
            wqmm: 0,
1797
0
            xor: 0,
1798
0
            xori: 0,
1799
0
            call: DependentCost::free(),
1800
0
            ccp: DependentCost::free(),
1801
0
            croo: DependentCost::free(),
1802
0
            csiz: DependentCost::free(),
1803
0
            k256: DependentCost::free(),
1804
0
            ldc: DependentCost::free(),
1805
0
            logd: DependentCost::free(),
1806
0
            mcl: DependentCost::free(),
1807
0
            mcli: DependentCost::free(),
1808
0
            mcp: DependentCost::free(),
1809
0
            mcpi: DependentCost::free(),
1810
0
            meq: DependentCost::free(),
1811
0
            retd: DependentCost::free(),
1812
0
            s256: DependentCost::free(),
1813
0
            scwq: DependentCost::free(),
1814
0
            smo: DependentCost::free(),
1815
0
            srwq: DependentCost::free(),
1816
0
            swwq: DependentCost::free(),
1817
0
1818
0
            // Non-opcode costs
1819
0
            contract_root: DependentCost::free(),
1820
0
            state_root: DependentCost::free(),
1821
0
            new_storage_per_byte: 0,
1822
0
            vm_initialization: DependentCost::free(),
1823
0
        }
1824
0
    }
1825
1826
    /// Create costs that are all set to one.
1827
0
    pub fn unit() -> Self {
1828
0
        Self {
1829
0
            add: 1,
1830
0
            addi: 1,
1831
0
            aloc: 1,
1832
0
            and: 1,
1833
0
            andi: 1,
1834
0
            bal: 1,
1835
0
            bhei: 1,
1836
0
            bhsh: 1,
1837
0
            burn: 1,
1838
0
            cb: 1,
1839
0
            cfei: 1,
1840
0
            cfsi: 1,
1841
0
            div: 1,
1842
0
            divi: 1,
1843
0
            eck1: 1,
1844
0
            ecr1: 1,
1845
0
            ed19: 1,
1846
0
            eq: 1,
1847
0
            exp: 1,
1848
0
            expi: 1,
1849
0
            flag: 1,
1850
0
            gm: 1,
1851
0
            gt: 1,
1852
0
            gtf: 1,
1853
0
            ji: 1,
1854
0
            jmp: 1,
1855
0
            jne: 1,
1856
0
            jnei: 1,
1857
0
            jnzi: 1,
1858
0
            jmpf: 1,
1859
0
            jmpb: 1,
1860
0
            jnzf: 1,
1861
0
            jnzb: 1,
1862
0
            jnef: 1,
1863
0
            jneb: 1,
1864
0
            lb: 1,
1865
0
            log: 1,
1866
0
            lt: 1,
1867
0
            lw: 1,
1868
0
            mint: 1,
1869
0
            mlog: 1,
1870
0
            mod_op: 1,
1871
0
            modi: 1,
1872
0
            move_op: 1,
1873
0
            movi: 1,
1874
0
            mroo: 1,
1875
0
            mul: 1,
1876
0
            muli: 1,
1877
0
            mldv: 1,
1878
0
            noop: 1,
1879
0
            not: 1,
1880
0
            or: 1,
1881
0
            ori: 1,
1882
0
            ret: 1,
1883
0
            poph: 1,
1884
0
            popl: 1,
1885
0
            pshh: 1,
1886
0
            pshl: 1,
1887
0
            rvrt: 1,
1888
0
            sb: 1,
1889
0
            sll: 1,
1890
0
            slli: 1,
1891
0
            srl: 1,
1892
0
            srli: 1,
1893
0
            srw: 1,
1894
0
            sub: 1,
1895
0
            subi: 1,
1896
0
            sw: 1,
1897
0
            sww: 1,
1898
0
            time: 1,
1899
0
            tr: 1,
1900
0
            tro: 1,
1901
0
            wdcm: 1,
1902
0
            wqcm: 1,
1903
0
            wdop: 1,
1904
0
            wqop: 1,
1905
0
            wdml: 1,
1906
0
            wqml: 1,
1907
0
            wddv: 1,
1908
0
            wqdv: 1,
1909
0
            wdmd: 1,
1910
0
            wqmd: 1,
1911
0
            wdam: 1,
1912
0
            wqam: 1,
1913
0
            wdmm: 1,
1914
0
            wqmm: 1,
1915
0
            xor: 1,
1916
0
            xori: 1,
1917
0
            call: DependentCost::unit(),
1918
0
            ccp: DependentCost::unit(),
1919
0
            croo: DependentCost::unit(),
1920
0
            csiz: DependentCost::unit(),
1921
0
            k256: DependentCost::unit(),
1922
0
            ldc: DependentCost::unit(),
1923
0
            logd: DependentCost::unit(),
1924
0
            mcl: DependentCost::unit(),
1925
0
            mcli: DependentCost::unit(),
1926
0
            mcp: DependentCost::unit(),
1927
0
            mcpi: DependentCost::unit(),
1928
0
            meq: DependentCost::unit(),
1929
0
            retd: DependentCost::unit(),
1930
0
            s256: DependentCost::unit(),
1931
0
            scwq: DependentCost::unit(),
1932
0
            smo: DependentCost::unit(),
1933
0
            srwq: DependentCost::unit(),
1934
0
            swwq: DependentCost::unit(),
1935
0
1936
0
            // Non-opcode costs
1937
0
            contract_root: DependentCost::unit(),
1938
0
            state_root: DependentCost::unit(),
1939
0
            new_storage_per_byte: 1,
1940
0
            vm_initialization: DependentCost::unit(),
1941
0
        }
1942
0
    }
1943
}
1944
1945
impl GasCostsValuesV2 {
1946
    /// Create costs that are all set to zero.
1947
0
    pub fn free() -> Self {
1948
0
        Self {
1949
0
            add: 0,
1950
0
            addi: 0,
1951
0
            and: 0,
1952
0
            andi: 0,
1953
0
            bal: 0,
1954
0
            bhei: 0,
1955
0
            bhsh: 0,
1956
0
            burn: 0,
1957
0
            cb: 0,
1958
0
            cfei: 0,
1959
0
            cfsi: 0,
1960
0
            div: 0,
1961
0
            divi: 0,
1962
0
            eck1: 0,
1963
0
            ecr1: 0,
1964
0
            ed19: 0,
1965
0
            eq: 0,
1966
0
            exp: 0,
1967
0
            expi: 0,
1968
0
            flag: 0,
1969
0
            gm: 0,
1970
0
            gt: 0,
1971
0
            gtf: 0,
1972
0
            ji: 0,
1973
0
            jmp: 0,
1974
0
            jne: 0,
1975
0
            jnei: 0,
1976
0
            jnzi: 0,
1977
0
            jmpf: 0,
1978
0
            jmpb: 0,
1979
0
            jnzf: 0,
1980
0
            jnzb: 0,
1981
0
            jnef: 0,
1982
0
            jneb: 0,
1983
0
            lb: 0,
1984
0
            log: 0,
1985
0
            lt: 0,
1986
0
            lw: 0,
1987
0
            mint: 0,
1988
0
            mlog: 0,
1989
0
            mod_op: 0,
1990
0
            modi: 0,
1991
0
            move_op: 0,
1992
0
            movi: 0,
1993
0
            mroo: 0,
1994
0
            mul: 0,
1995
0
            muli: 0,
1996
0
            mldv: 0,
1997
0
            noop: 0,
1998
0
            not: 0,
1999
0
            or: 0,
2000
0
            ori: 0,
2001
0
            poph: 0,
2002
0
            popl: 0,
2003
0
            pshh: 0,
2004
0
            pshl: 0,
2005
0
            ret: 0,
2006
0
            rvrt: 0,
2007
0
            sb: 0,
2008
0
            sll: 0,
2009
0
            slli: 0,
2010
0
            srl: 0,
2011
0
            srli: 0,
2012
0
            srw: 0,
2013
0
            sub: 0,
2014
0
            subi: 0,
2015
0
            sw: 0,
2016
0
            sww: 0,
2017
0
            time: 0,
2018
0
            tr: 0,
2019
0
            tro: 0,
2020
0
            wdcm: 0,
2021
0
            wqcm: 0,
2022
0
            wdop: 0,
2023
0
            wqop: 0,
2024
0
            wdml: 0,
2025
0
            wqml: 0,
2026
0
            wddv: 0,
2027
0
            wqdv: 0,
2028
0
            wdmd: 0,
2029
0
            wqmd: 0,
2030
0
            wdam: 0,
2031
0
            wqam: 0,
2032
0
            wdmm: 0,
2033
0
            wqmm: 0,
2034
0
            xor: 0,
2035
0
            xori: 0,
2036
0
            aloc: DependentCost::free(),
2037
0
            call: DependentCost::free(),
2038
0
            ccp: DependentCost::free(),
2039
0
            croo: DependentCost::free(),
2040
0
            csiz: DependentCost::free(),
2041
0
            k256: DependentCost::free(),
2042
0
            ldc: DependentCost::free(),
2043
0
            logd: DependentCost::free(),
2044
0
            mcl: DependentCost::free(),
2045
0
            mcli: DependentCost::free(),
2046
0
            mcp: DependentCost::free(),
2047
0
            mcpi: DependentCost::free(),
2048
0
            meq: DependentCost::free(),
2049
0
            retd: DependentCost::free(),
2050
0
            s256: DependentCost::free(),
2051
0
            scwq: DependentCost::free(),
2052
0
            smo: DependentCost::free(),
2053
0
            srwq: DependentCost::free(),
2054
0
            swwq: DependentCost::free(),
2055
0
2056
0
            // Non-opcode costs
2057
0
            contract_root: DependentCost::free(),
2058
0
            state_root: DependentCost::free(),
2059
0
            new_storage_per_byte: 0,
2060
0
            vm_initialization: DependentCost::free(),
2061
0
        }
2062
0
    }
2063
2064
    /// Create costs that are all set to one.
2065
0
    pub fn unit() -> Self {
2066
0
        Self {
2067
0
            add: 1,
2068
0
            addi: 1,
2069
0
            and: 1,
2070
0
            andi: 1,
2071
0
            bal: 1,
2072
0
            bhei: 1,
2073
0
            bhsh: 1,
2074
0
            burn: 1,
2075
0
            cb: 1,
2076
0
            cfei: 1,
2077
0
            cfsi: 1,
2078
0
            div: 1,
2079
0
            divi: 1,
2080
0
            eck1: 1,
2081
0
            ecr1: 1,
2082
0
            ed19: 1,
2083
0
            eq: 1,
2084
0
            exp: 1,
2085
0
            expi: 1,
2086
0
            flag: 1,
2087
0
            gm: 1,
2088
0
            gt: 1,
2089
0
            gtf: 1,
2090
0
            ji: 1,
2091
0
            jmp: 1,
2092
0
            jne: 1,
2093
0
            jnei: 1,
2094
0
            jnzi: 1,
2095
0
            jmpf: 1,
2096
0
            jmpb: 1,
2097
0
            jnzf: 1,
2098
0
            jnzb: 1,
2099
0
            jnef: 1,
2100
0
            jneb: 1,
2101
0
            lb: 1,
2102
0
            log: 1,
2103
0
            lt: 1,
2104
0
            lw: 1,
2105
0
            mint: 1,
2106
0
            mlog: 1,
2107
0
            mod_op: 1,
2108
0
            modi: 1,
2109
0
            move_op: 1,
2110
0
            movi: 1,
2111
0
            mroo: 1,
2112
0
            mul: 1,
2113
0
            muli: 1,
2114
0
            mldv: 1,
2115
0
            noop: 1,
2116
0
            not: 1,
2117
0
            or: 1,
2118
0
            ori: 1,
2119
0
            ret: 1,
2120
0
            poph: 1,
2121
0
            popl: 1,
2122
0
            pshh: 1,
2123
0
            pshl: 1,
2124
0
            rvrt: 1,
2125
0
            sb: 1,
2126
0
            sll: 1,
2127
0
            slli: 1,
2128
0
            srl: 1,
2129
0
            srli: 1,
2130
0
            srw: 1,
2131
0
            sub: 1,
2132
0
            subi: 1,
2133
0
            sw: 1,
2134
0
            sww: 1,
2135
0
            time: 1,
2136
0
            tr: 1,
2137
0
            tro: 1,
2138
0
            wdcm: 1,
2139
0
            wqcm: 1,
2140
0
            wdop: 1,
2141
0
            wqop: 1,
2142
0
            wdml: 1,
2143
0
            wqml: 1,
2144
0
            wddv: 1,
2145
0
            wqdv: 1,
2146
0
            wdmd: 1,
2147
0
            wqmd: 1,
2148
0
            wdam: 1,
2149
0
            wqam: 1,
2150
0
            wdmm: 1,
2151
0
            wqmm: 1,
2152
0
            xor: 1,
2153
0
            xori: 1,
2154
0
            aloc: DependentCost::unit(),
2155
0
            call: DependentCost::unit(),
2156
0
            ccp: DependentCost::unit(),
2157
0
            croo: DependentCost::unit(),
2158
0
            csiz: DependentCost::unit(),
2159
0
            k256: DependentCost::unit(),
2160
0
            ldc: DependentCost::unit(),
2161
0
            logd: DependentCost::unit(),
2162
0
            mcl: DependentCost::unit(),
2163
0
            mcli: DependentCost::unit(),
2164
0
            mcp: DependentCost::unit(),
2165
0
            mcpi: DependentCost::unit(),
2166
0
            meq: DependentCost::unit(),
2167
0
            retd: DependentCost::unit(),
2168
0
            s256: DependentCost::unit(),
2169
0
            scwq: DependentCost::unit(),
2170
0
            smo: DependentCost::unit(),
2171
0
            srwq: DependentCost::unit(),
2172
0
            swwq: DependentCost::unit(),
2173
0
2174
0
            // Non-opcode costs
2175
0
            contract_root: DependentCost::unit(),
2176
0
            state_root: DependentCost::unit(),
2177
0
            new_storage_per_byte: 1,
2178
0
            vm_initialization: DependentCost::unit(),
2179
0
        }
2180
0
    }
2181
}
2182
2183
impl GasCostsValuesV3 {
2184
    /// Create costs that are all set to zero.
2185
0
    pub fn free() -> Self {
2186
0
        Self {
2187
0
            add: 0,
2188
0
            addi: 0,
2189
0
            and: 0,
2190
0
            andi: 0,
2191
0
            bal: 0,
2192
0
            bhei: 0,
2193
0
            bhsh: 0,
2194
0
            burn: 0,
2195
0
            cb: 0,
2196
0
            cfsi: 0,
2197
0
            div: 0,
2198
0
            divi: 0,
2199
0
            eck1: 0,
2200
0
            ecr1: 0,
2201
0
            ed19: 0,
2202
0
            eq: 0,
2203
0
            exp: 0,
2204
0
            expi: 0,
2205
0
            flag: 0,
2206
0
            gm: 0,
2207
0
            gt: 0,
2208
0
            gtf: 0,
2209
0
            ji: 0,
2210
0
            jmp: 0,
2211
0
            jne: 0,
2212
0
            jnei: 0,
2213
0
            jnzi: 0,
2214
0
            jmpf: 0,
2215
0
            jmpb: 0,
2216
0
            jnzf: 0,
2217
0
            jnzb: 0,
2218
0
            jnef: 0,
2219
0
            jneb: 0,
2220
0
            lb: 0,
2221
0
            log: 0,
2222
0
            lt: 0,
2223
0
            lw: 0,
2224
0
            mint: 0,
2225
0
            mlog: 0,
2226
0
            mod_op: 0,
2227
0
            modi: 0,
2228
0
            move_op: 0,
2229
0
            movi: 0,
2230
0
            mroo: 0,
2231
0
            mul: 0,
2232
0
            muli: 0,
2233
0
            mldv: 0,
2234
0
            noop: 0,
2235
0
            not: 0,
2236
0
            or: 0,
2237
0
            ori: 0,
2238
0
            poph: 0,
2239
0
            popl: 0,
2240
0
            pshh: 0,
2241
0
            pshl: 0,
2242
0
            ret: 0,
2243
0
            rvrt: 0,
2244
0
            sb: 0,
2245
0
            sll: 0,
2246
0
            slli: 0,
2247
0
            srl: 0,
2248
0
            srli: 0,
2249
0
            srw: 0,
2250
0
            sub: 0,
2251
0
            subi: 0,
2252
0
            sw: 0,
2253
0
            sww: 0,
2254
0
            time: 0,
2255
0
            tr: 0,
2256
0
            tro: 0,
2257
0
            wdcm: 0,
2258
0
            wqcm: 0,
2259
0
            wdop: 0,
2260
0
            wqop: 0,
2261
0
            wdml: 0,
2262
0
            wqml: 0,
2263
0
            wddv: 0,
2264
0
            wqdv: 0,
2265
0
            wdmd: 0,
2266
0
            wqmd: 0,
2267
0
            wdam: 0,
2268
0
            wqam: 0,
2269
0
            wdmm: 0,
2270
0
            wqmm: 0,
2271
0
            xor: 0,
2272
0
            xori: 0,
2273
0
            aloc: DependentCost::free(),
2274
0
            cfe: DependentCost::free(),
2275
0
            cfei: DependentCost::free(),
2276
0
            call: DependentCost::free(),
2277
0
            ccp: DependentCost::free(),
2278
0
            croo: DependentCost::free(),
2279
0
            csiz: DependentCost::free(),
2280
0
            k256: DependentCost::free(),
2281
0
            ldc: DependentCost::free(),
2282
0
            logd: DependentCost::free(),
2283
0
            mcl: DependentCost::free(),
2284
0
            mcli: DependentCost::free(),
2285
0
            mcp: DependentCost::free(),
2286
0
            mcpi: DependentCost::free(),
2287
0
            meq: DependentCost::free(),
2288
0
            retd: DependentCost::free(),
2289
0
            s256: DependentCost::free(),
2290
0
            scwq: DependentCost::free(),
2291
0
            smo: DependentCost::free(),
2292
0
            srwq: DependentCost::free(),
2293
0
            swwq: DependentCost::free(),
2294
0
2295
0
            // Non-opcode costs
2296
0
            contract_root: DependentCost::free(),
2297
0
            state_root: DependentCost::free(),
2298
0
            new_storage_per_byte: 0,
2299
0
            vm_initialization: DependentCost::free(),
2300
0
        }
2301
0
    }
2302
2303
    /// Create costs that are all set to one.
2304
0
    pub fn unit() -> Self {
2305
0
        Self {
2306
0
            add: 1,
2307
0
            addi: 1,
2308
0
            and: 1,
2309
0
            andi: 1,
2310
0
            bal: 1,
2311
0
            bhei: 1,
2312
0
            bhsh: 1,
2313
0
            burn: 1,
2314
0
            cb: 1,
2315
0
            cfsi: 1,
2316
0
            div: 1,
2317
0
            divi: 1,
2318
0
            eck1: 1,
2319
0
            ecr1: 1,
2320
0
            ed19: 1,
2321
0
            eq: 1,
2322
0
            exp: 1,
2323
0
            expi: 1,
2324
0
            flag: 1,
2325
0
            gm: 1,
2326
0
            gt: 1,
2327
0
            gtf: 1,
2328
0
            ji: 1,
2329
0
            jmp: 1,
2330
0
            jne: 1,
2331
0
            jnei: 1,
2332
0
            jnzi: 1,
2333
0
            jmpf: 1,
2334
0
            jmpb: 1,
2335
0
            jnzf: 1,
2336
0
            jnzb: 1,
2337
0
            jnef: 1,
2338
0
            jneb: 1,
2339
0
            lb: 1,
2340
0
            log: 1,
2341
0
            lt: 1,
2342
0
            lw: 1,
2343
0
            mint: 1,
2344
0
            mlog: 1,
2345
0
            mod_op: 1,
2346
0
            modi: 1,
2347
0
            move_op: 1,
2348
0
            movi: 1,
2349
0
            mroo: 1,
2350
0
            mul: 1,
2351
0
            muli: 1,
2352
0
            mldv: 1,
2353
0
            noop: 1,
2354
0
            not: 1,
2355
0
            or: 1,
2356
0
            ori: 1,
2357
0
            ret: 1,
2358
0
            poph: 1,
2359
0
            popl: 1,
2360
0
            pshh: 1,
2361
0
            pshl: 1,
2362
0
            rvrt: 1,
2363
0
            sb: 1,
2364
0
            sll: 1,
2365
0
            slli: 1,
2366
0
            srl: 1,
2367
0
            srli: 1,
2368
0
            srw: 1,
2369
0
            sub: 1,
2370
0
            subi: 1,
2371
0
            sw: 1,
2372
0
            sww: 1,
2373
0
            time: 1,
2374
0
            tr: 1,
2375
0
            tro: 1,
2376
0
            wdcm: 1,
2377
0
            wqcm: 1,
2378
0
            wdop: 1,
2379
0
            wqop: 1,
2380
0
            wdml: 1,
2381
0
            wqml: 1,
2382
0
            wddv: 1,
2383
0
            wqdv: 1,
2384
0
            wdmd: 1,
2385
0
            wqmd: 1,
2386
0
            wdam: 1,
2387
0
            wqam: 1,
2388
0
            wdmm: 1,
2389
0
            wqmm: 1,
2390
0
            xor: 1,
2391
0
            xori: 1,
2392
0
            aloc: DependentCost::unit(),
2393
0
            cfe: DependentCost::unit(),
2394
0
            cfei: DependentCost::unit(),
2395
0
            call: DependentCost::unit(),
2396
0
            ccp: DependentCost::unit(),
2397
0
            croo: DependentCost::unit(),
2398
0
            csiz: DependentCost::unit(),
2399
0
            k256: DependentCost::unit(),
2400
0
            ldc: DependentCost::unit(),
2401
0
            logd: DependentCost::unit(),
2402
0
            mcl: DependentCost::unit(),
2403
0
            mcli: DependentCost::unit(),
2404
0
            mcp: DependentCost::unit(),
2405
0
            mcpi: DependentCost::unit(),
2406
0
            meq: DependentCost::unit(),
2407
0
            retd: DependentCost::unit(),
2408
0
            s256: DependentCost::unit(),
2409
0
            scwq: DependentCost::unit(),
2410
0
            smo: DependentCost::unit(),
2411
0
            srwq: DependentCost::unit(),
2412
0
            swwq: DependentCost::unit(),
2413
0
2414
0
            // Non-opcode costs
2415
0
            contract_root: DependentCost::unit(),
2416
0
            state_root: DependentCost::unit(),
2417
0
            new_storage_per_byte: 1,
2418
0
            vm_initialization: DependentCost::unit(),
2419
0
        }
2420
0
    }
2421
}
2422
2423
impl GasCostsValuesV4 {
2424
    /// Create costs that are all set to zero.
2425
0
    pub fn free() -> Self {
2426
0
        Self {
2427
0
            add: 0,
2428
0
            addi: 0,
2429
0
            and: 0,
2430
0
            andi: 0,
2431
0
            bal: 0,
2432
0
            bhei: 0,
2433
0
            bhsh: 0,
2434
0
            burn: 0,
2435
0
            cb: 0,
2436
0
            cfsi: 0,
2437
0
            div: 0,
2438
0
            divi: 0,
2439
0
            eck1: 0,
2440
0
            ecr1: 0,
2441
0
            eq: 0,
2442
0
            exp: 0,
2443
0
            expi: 0,
2444
0
            flag: 0,
2445
0
            gm: 0,
2446
0
            gt: 0,
2447
0
            gtf: 0,
2448
0
            ji: 0,
2449
0
            jmp: 0,
2450
0
            jne: 0,
2451
0
            jnei: 0,
2452
0
            jnzi: 0,
2453
0
            jmpf: 0,
2454
0
            jmpb: 0,
2455
0
            jnzf: 0,
2456
0
            jnzb: 0,
2457
0
            jnef: 0,
2458
0
            jneb: 0,
2459
0
            lb: 0,
2460
0
            log: 0,
2461
0
            lt: 0,
2462
0
            lw: 0,
2463
0
            mint: 0,
2464
0
            mlog: 0,
2465
0
            mod_op: 0,
2466
0
            modi: 0,
2467
0
            move_op: 0,
2468
0
            movi: 0,
2469
0
            mroo: 0,
2470
0
            mul: 0,
2471
0
            muli: 0,
2472
0
            mldv: 0,
2473
0
            noop: 0,
2474
0
            not: 0,
2475
0
            or: 0,
2476
0
            ori: 0,
2477
0
            poph: 0,
2478
0
            popl: 0,
2479
0
            pshh: 0,
2480
0
            pshl: 0,
2481
0
            ret: 0,
2482
0
            rvrt: 0,
2483
0
            sb: 0,
2484
0
            sll: 0,
2485
0
            slli: 0,
2486
0
            srl: 0,
2487
0
            srli: 0,
2488
0
            srw: 0,
2489
0
            sub: 0,
2490
0
            subi: 0,
2491
0
            sw: 0,
2492
0
            sww: 0,
2493
0
            time: 0,
2494
0
            tr: 0,
2495
0
            tro: 0,
2496
0
            wdcm: 0,
2497
0
            wqcm: 0,
2498
0
            wdop: 0,
2499
0
            wqop: 0,
2500
0
            wdml: 0,
2501
0
            wqml: 0,
2502
0
            wddv: 0,
2503
0
            wqdv: 0,
2504
0
            wdmd: 0,
2505
0
            wqmd: 0,
2506
0
            wdam: 0,
2507
0
            wqam: 0,
2508
0
            wdmm: 0,
2509
0
            wqmm: 0,
2510
0
            xor: 0,
2511
0
            xori: 0,
2512
0
            aloc: DependentCost::free(),
2513
0
            bsiz: DependentCost::free(),
2514
0
            bldd: DependentCost::free(),
2515
0
            cfe: DependentCost::free(),
2516
0
            cfei: DependentCost::free(),
2517
0
            call: DependentCost::free(),
2518
0
            ccp: DependentCost::free(),
2519
0
            croo: DependentCost::free(),
2520
0
            csiz: DependentCost::free(),
2521
0
            ed19: DependentCost::free(),
2522
0
            k256: DependentCost::free(),
2523
0
            ldc: DependentCost::free(),
2524
0
            logd: DependentCost::free(),
2525
0
            mcl: DependentCost::free(),
2526
0
            mcli: DependentCost::free(),
2527
0
            mcp: DependentCost::free(),
2528
0
            mcpi: DependentCost::free(),
2529
0
            meq: DependentCost::free(),
2530
0
            retd: DependentCost::free(),
2531
0
            s256: DependentCost::free(),
2532
0
            scwq: DependentCost::free(),
2533
0
            smo: DependentCost::free(),
2534
0
            srwq: DependentCost::free(),
2535
0
            swwq: DependentCost::free(),
2536
0
2537
0
            // Non-opcode costs
2538
0
            contract_root: DependentCost::free(),
2539
0
            state_root: DependentCost::free(),
2540
0
            new_storage_per_byte: 0,
2541
0
            vm_initialization: DependentCost::free(),
2542
0
        }
2543
0
    }
2544
2545
    /// Create costs that are all set to one.
2546
0
    pub fn unit() -> Self {
2547
0
        Self {
2548
0
            add: 1,
2549
0
            addi: 1,
2550
0
            and: 1,
2551
0
            andi: 1,
2552
0
            bal: 1,
2553
0
            bhei: 1,
2554
0
            bhsh: 1,
2555
0
            burn: 1,
2556
0
            cb: 1,
2557
0
            cfsi: 1,
2558
0
            div: 1,
2559
0
            divi: 1,
2560
0
            eck1: 1,
2561
0
            ecr1: 1,
2562
0
            eq: 1,
2563
0
            exp: 1,
2564
0
            expi: 1,
2565
0
            flag: 1,
2566
0
            gm: 1,
2567
0
            gt: 1,
2568
0
            gtf: 1,
2569
0
            ji: 1,
2570
0
            jmp: 1,
2571
0
            jne: 1,
2572
0
            jnei: 1,
2573
0
            jnzi: 1,
2574
0
            jmpf: 1,
2575
0
            jmpb: 1,
2576
0
            jnzf: 1,
2577
0
            jnzb: 1,
2578
0
            jnef: 1,
2579
0
            jneb: 1,
2580
0
            lb: 1,
2581
0
            log: 1,
2582
0
            lt: 1,
2583
0
            lw: 1,
2584
0
            mint: 1,
2585
0
            mlog: 1,
2586
0
            mod_op: 1,
2587
0
            modi: 1,
2588
0
            move_op: 1,
2589
0
            movi: 1,
2590
0
            mroo: 1,
2591
0
            mul: 1,
2592
0
            muli: 1,
2593
0
            mldv: 1,
2594
0
            noop: 1,
2595
0
            not: 1,
2596
0
            or: 1,
2597
0
            ori: 1,
2598
0
            ret: 1,
2599
0
            poph: 1,
2600
0
            popl: 1,
2601
0
            pshh: 1,
2602
0
            pshl: 1,
2603
0
            rvrt: 1,
2604
0
            sb: 1,
2605
0
            sll: 1,
2606
0
            slli: 1,
2607
0
            srl: 1,
2608
0
            srli: 1,
2609
0
            srw: 1,
2610
0
            sub: 1,
2611
0
            subi: 1,
2612
0
            sw: 1,
2613
0
            sww: 1,
2614
0
            time: 1,
2615
0
            tr: 1,
2616
0
            tro: 1,
2617
0
            wdcm: 1,
2618
0
            wqcm: 1,
2619
0
            wdop: 1,
2620
0
            wqop: 1,
2621
0
            wdml: 1,
2622
0
            wqml: 1,
2623
0
            wddv: 1,
2624
0
            wqdv: 1,
2625
0
            wdmd: 1,
2626
0
            wqmd: 1,
2627
0
            wdam: 1,
2628
0
            wqam: 1,
2629
0
            wdmm: 1,
2630
0
            wqmm: 1,
2631
0
            xor: 1,
2632
0
            xori: 1,
2633
0
            aloc: DependentCost::unit(),
2634
0
            bsiz: DependentCost::unit(),
2635
0
            bldd: DependentCost::unit(),
2636
0
            cfe: DependentCost::unit(),
2637
0
            cfei: DependentCost::unit(),
2638
0
            call: DependentCost::unit(),
2639
0
            ccp: DependentCost::unit(),
2640
0
            croo: DependentCost::unit(),
2641
0
            csiz: DependentCost::unit(),
2642
0
            ed19: DependentCost::unit(),
2643
0
            k256: DependentCost::unit(),
2644
0
            ldc: DependentCost::unit(),
2645
0
            logd: DependentCost::unit(),
2646
0
            mcl: DependentCost::unit(),
2647
0
            mcli: DependentCost::unit(),
2648
0
            mcp: DependentCost::unit(),
2649
0
            mcpi: DependentCost::unit(),
2650
0
            meq: DependentCost::unit(),
2651
0
            retd: DependentCost::unit(),
2652
0
            s256: DependentCost::unit(),
2653
0
            scwq: DependentCost::unit(),
2654
0
            smo: DependentCost::unit(),
2655
0
            srwq: DependentCost::unit(),
2656
0
            swwq: DependentCost::unit(),
2657
0
2658
0
            // Non-opcode costs
2659
0
            contract_root: DependentCost::unit(),
2660
0
            state_root: DependentCost::unit(),
2661
0
            new_storage_per_byte: 1,
2662
0
            vm_initialization: DependentCost::unit(),
2663
0
        }
2664
0
    }
2665
}
2666
2667
impl DependentCost {
2668
    /// Create costs that make operations free.
2669
0
    pub fn free() -> Self {
2670
0
        Self::HeavyOperation {
2671
0
            base: 0,
2672
0
            gas_per_unit: 0,
2673
0
        }
2674
0
    }
2675
2676
    /// Create costs that make operations cost `1`.
2677
0
    pub fn unit() -> Self {
2678
0
        Self::HeavyOperation {
2679
0
            base: 1,
2680
0
            gas_per_unit: 0,
2681
0
        }
2682
0
    }
2683
2684
0
    pub fn from_units_per_gas(base: Word, units_per_gas: Word) -> Self {
2685
0
        debug_assert!(
2686
0
            units_per_gas > 0,
2687
0
            "Cannot create dependent gas cost with per-0-gas ratio"
2688
        );
2689
0
        DependentCost::LightOperation {
2690
0
            base,
2691
0
            units_per_gas,
2692
0
        }
2693
0
    }
2694
2695
0
    pub fn from_gas_per_unit(base: Word, gas_per_unit: Word) -> Self {
2696
0
        DependentCost::HeavyOperation { base, gas_per_unit }
2697
0
    }
2698
2699
26.6M
    pub fn base(&self) -> Word {
2700
26.6M
        match self {
2701
26.6M
            DependentCost::LightOperation { base, .. } => *base,
2702
43.8k
            DependentCost::HeavyOperation { base, .. } => *base,
2703
        }
2704
26.6M
    }
_RNvMsb_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_13DependentCost4baseCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
2699
609k
    pub fn base(&self) -> Word {
2700
609k
        match self {
2701
609k
            DependentCost::LightOperation { base, .. } => *base,
2702
0
            DependentCost::HeavyOperation { base, .. } => *base,
2703
        }
2704
609k
    }
_RNvMsb_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_13DependentCost4baseBb_
Line
Count
Source
2699
26.0M
    pub fn base(&self) -> Word {
2700
26.0M
        match self {
2701
26.0M
            DependentCost::LightOperation { base, .. } => *base,
2702
43.8k
            DependentCost::HeavyOperation { base, .. } => *base,
2703
        }
2704
26.0M
    }
2705
2706
0
    pub fn set_base(&mut self, value: Word) {
2707
0
        match self {
2708
0
            DependentCost::LightOperation { base, .. } => *base = value,
2709
0
            DependentCost::HeavyOperation { base, .. } => *base = value,
2710
        };
2711
0
    }
2712
2713
26.0M
    pub fn resolve(&self, units: Word) -> Word {
2714
26.0M
        let base = self.base();
2715
26.0M
        let dependent_value = self.resolve_without_base(units);
2716
26.0M
        base.saturating_add(dependent_value)
2717
26.0M
    }
2718
2719
26.5M
    pub fn resolve_without_base(&self, units: Word) -> Word {
2720
26.5M
        match self {
2721
26.4M
            DependentCost::LightOperation { units_per_gas, .. } => {
2722
26.4M
                // Apply the linear transformation:
2723
26.4M
                //   f(x) = 1/m * x = x/m
2724
26.4M
                // where:
2725
26.4M
                //   x is the number of units
2726
26.4M
                //   1/m is the gas_per_unit
2727
26.4M
                units
2728
26.4M
                    .checked_div(*units_per_gas)
2729
26.4M
                    .expect("units_per_gas cannot be zero")
2730
            }
2731
43.8k
            DependentCost::HeavyOperation { gas_per_unit, .. } => {
2732
43.8k
                // Apply the linear transformation:
2733
43.8k
                //   f(x) = mx
2734
43.8k
                // where:
2735
43.8k
                //   x is the number of units
2736
43.8k
                //   m is the gas per unit
2737
43.8k
                units.saturating_mul(*gas_per_unit)
2738
            }
2739
        }
2740
26.5M
    }
2741
}
2742
2743
#[cfg(feature = "alloc")]
2744
impl Deref for GasCosts {
2745
    type Target = GasCostsValues;
2746
2747
388M
    fn deref(&self) -> &Self::Target {
2748
388M
        &(self.0)
2749
388M
    }
_RNvXsc_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_8GasCostsNtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
2747
387M
    fn deref(&self) -> &Self::Target {
2748
387M
        &(self.0)
2749
387M
    }
_RNvXsc_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters3gasNtB5_8GasCostsNtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefBb_
Line
Count
Source
2747
87.7k
    fn deref(&self) -> &Self::Target {
2748
87.7k
        &(self.0)
2749
87.7k
    }
2750
}
2751
2752
impl From<GasCostsValues> for GasCosts {
2753
0
    fn from(i: GasCostsValues) -> Self {
2754
0
        Self(Arc::new(i))
2755
0
    }
2756
}
2757
2758
impl From<GasCosts> for GasCostsValues {
2759
0
    fn from(i: GasCosts) -> Self {
2760
0
        (*i.0).clone()
2761
0
    }
2762
}
2763
2764
impl From<GasCostsValuesV1> for GasCostsValues {
2765
0
    fn from(i: GasCostsValuesV1) -> Self {
2766
0
        GasCostsValues::V1(i)
2767
0
    }
2768
}
2769
2770
impl From<GasCostsValuesV2> for GasCostsValues {
2771
0
    fn from(i: GasCostsValuesV2) -> Self {
2772
0
        GasCostsValues::V2(i)
2773
0
    }
2774
}
2775
2776
impl From<GasCostsValuesV3> for GasCostsValues {
2777
0
    fn from(i: GasCostsValuesV3) -> Self {
2778
0
        GasCostsValues::V3(i)
2779
0
    }
2780
}
2781
impl From<GasCostsValuesV4> for GasCostsValues {
2782
8.77k
    fn from(i: GasCostsValuesV4) -> Self {
2783
8.77k
        GasCostsValues::V4(i)
2784
8.77k
    }
2785
}
2786
2787
#[cfg(test)]
2788
mod tests {
2789
    use crate::DependentCost;
2790
2791
    #[test]
2792
    fn light_operation_gas_cost_resolves_correctly() {
2793
        // Create a linear gas cost function with a slope of 1/10
2794
        let cost = DependentCost::from_units_per_gas(0, 10);
2795
        let total = cost.resolve(0);
2796
        assert_eq!(total, 0);
2797
2798
        let total = cost.resolve(5);
2799
        assert_eq!(total, 0);
2800
2801
        let total = cost.resolve(10);
2802
        assert_eq!(total, 1);
2803
2804
        let total = cost.resolve(100);
2805
        assert_eq!(total, 10);
2806
2807
        let total = cost.resolve(721);
2808
        assert_eq!(total, 72);
2809
    }
2810
2811
    #[test]
2812
    fn heavy_operation_gas_cost_resolves_correctly() {
2813
        // Create a linear gas cost function with a slope of 10
2814
        let cost = DependentCost::from_gas_per_unit(0, 10);
2815
        let total = cost.resolve(0);
2816
        assert_eq!(total, 0);
2817
2818
        let total = cost.resolve(5);
2819
        assert_eq!(total, 50);
2820
2821
        let total = cost.resolve(10);
2822
        assert_eq!(total, 100);
2823
2824
        let total = cost.resolve(100);
2825
        assert_eq!(total, 1_000);
2826
2827
        let total = cost.resolve(721);
2828
        assert_eq!(total, 7_210);
2829
    }
2830
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/consensus_parameters/gas/default_gas_costs.rs
Line
Count
Source
1
use super::*;
2
/// File generated by fuel-core: benches/src/bin/collect.rs:440. With the following git
3
/// hash
4
pub const GIT: &str = "98341e564b75d1157e61d7d5f38612f6224a5b30";
5
/// Modified manually afterwards in https://github.com/FuelLabs/fuel-vm/pull/780
6
8.77k
pub fn default_gas_costs() -> GasCostsValues {
7
8.77k
    GasCostsValuesV4 {
8
8.77k
        add: 1,
9
8.77k
        addi: 1,
10
8.77k
        and: 1,
11
8.77k
        andi: 1,
12
8.77k
        bal: 13,
13
8.77k
        bhei: 1,
14
8.77k
        bhsh: 1,
15
8.77k
        burn: 132,
16
8.77k
        cb: 1,
17
8.77k
        cfsi: 1,
18
8.77k
        div: 1,
19
8.77k
        divi: 1,
20
8.77k
        eck1: 951,
21
8.77k
        ecr1: 3000,
22
8.77k
        eq: 1,
23
8.77k
        exp: 1,
24
8.77k
        expi: 1,
25
8.77k
        flag: 1,
26
8.77k
        gm: 1,
27
8.77k
        gt: 1,
28
8.77k
        gtf: 1,
29
8.77k
        ji: 1,
30
8.77k
        jmp: 1,
31
8.77k
        jne: 1,
32
8.77k
        jnei: 1,
33
8.77k
        jnzi: 1,
34
8.77k
        jmpf: 1,
35
8.77k
        jmpb: 1,
36
8.77k
        jnzf: 1,
37
8.77k
        jnzb: 1,
38
8.77k
        jnef: 1,
39
8.77k
        jneb: 1,
40
8.77k
        lb: 1,
41
8.77k
        log: 9,
42
8.77k
        lt: 1,
43
8.77k
        lw: 1,
44
8.77k
        mint: 135,
45
8.77k
        mlog: 1,
46
8.77k
        modi: 1,
47
8.77k
        mod_op: 1,
48
8.77k
        movi: 1,
49
8.77k
        mroo: 2,
50
8.77k
        mul: 1,
51
8.77k
        muli: 1,
52
8.77k
        mldv: 1,
53
8.77k
        noop: 1,
54
8.77k
        not: 1,
55
8.77k
        or: 1,
56
8.77k
        ori: 1,
57
8.77k
        poph: 2,
58
8.77k
        popl: 2,
59
8.77k
        pshh: 2,
60
8.77k
        pshl: 2,
61
8.77k
        move_op: 1,
62
8.77k
        ret: 13,
63
8.77k
        sb: 1,
64
8.77k
        sll: 1,
65
8.77k
        slli: 1,
66
8.77k
        srl: 1,
67
8.77k
        srli: 1,
68
8.77k
        srw: 12,
69
8.77k
        sub: 1,
70
8.77k
        subi: 1,
71
8.77k
        sw: 1,
72
8.77k
        sww: 67,
73
8.77k
        time: 1,
74
8.77k
        tr: 105,
75
8.77k
        tro: 60,
76
8.77k
        wdcm: 1,
77
8.77k
        wqcm: 1,
78
8.77k
        wdop: 1,
79
8.77k
        wqop: 1,
80
8.77k
        wdml: 1,
81
8.77k
        wqml: 1,
82
8.77k
        wddv: 1,
83
8.77k
        wqdv: 2,
84
8.77k
        wdmd: 3,
85
8.77k
        wqmd: 4,
86
8.77k
        wdam: 2,
87
8.77k
        wqam: 3,
88
8.77k
        wdmm: 3,
89
8.77k
        wqmm: 3,
90
8.77k
        xor: 1,
91
8.77k
        xori: 1,
92
8.77k
        aloc: DependentCost::LightOperation {
93
8.77k
            base: 2,
94
8.77k
            units_per_gas: 214,
95
8.77k
        },
96
8.77k
        cfe: DependentCost::LightOperation {
97
8.77k
            base: 2,
98
8.77k
            units_per_gas: 214,
99
8.77k
        },
100
8.77k
        cfei: DependentCost::LightOperation {
101
8.77k
            base: 2,
102
8.77k
            units_per_gas: 214,
103
8.77k
        },
104
8.77k
        ed19: DependentCost::LightOperation {
105
8.77k
            base: 3000,
106
8.77k
            units_per_gas: 214,
107
8.77k
        },
108
8.77k
        k256: DependentCost::LightOperation {
109
8.77k
            base: 11,
110
8.77k
            units_per_gas: 214,
111
8.77k
        },
112
8.77k
        s256: DependentCost::LightOperation {
113
8.77k
            base: 2,
114
8.77k
            units_per_gas: 214,
115
8.77k
        },
116
8.77k
        call: DependentCost::LightOperation {
117
8.77k
            base: 144,
118
8.77k
            units_per_gas: 214,
119
8.77k
        },
120
8.77k
        ccp: DependentCost::LightOperation {
121
8.77k
            base: 15,
122
8.77k
            units_per_gas: 103,
123
8.77k
        },
124
8.77k
        croo: DependentCost::LightOperation {
125
8.77k
            base: 1,
126
8.77k
            units_per_gas: 1,
127
8.77k
        },
128
8.77k
        csiz: DependentCost::LightOperation {
129
8.77k
            base: 17,
130
8.77k
            units_per_gas: 790,
131
8.77k
        },
132
8.77k
        ldc: DependentCost::LightOperation {
133
8.77k
            base: 15,
134
8.77k
            units_per_gas: 272,
135
8.77k
        },
136
8.77k
        logd: DependentCost::LightOperation {
137
8.77k
            base: 26,
138
8.77k
            units_per_gas: 64,
139
8.77k
        },
140
8.77k
        mcl: DependentCost::LightOperation {
141
8.77k
            base: 1,
142
8.77k
            units_per_gas: 3333,
143
8.77k
        },
144
8.77k
        mcli: DependentCost::LightOperation {
145
8.77k
            base: 1,
146
8.77k
            units_per_gas: 3333,
147
8.77k
        },
148
8.77k
        mcp: DependentCost::LightOperation {
149
8.77k
            base: 1,
150
8.77k
            units_per_gas: 2000,
151
8.77k
        },
152
8.77k
        mcpi: DependentCost::LightOperation {
153
8.77k
            base: 3,
154
8.77k
            units_per_gas: 2000,
155
8.77k
        },
156
8.77k
        meq: DependentCost::LightOperation {
157
8.77k
            base: 1,
158
8.77k
            units_per_gas: 2500,
159
8.77k
        },
160
8.77k
        rvrt: 13,
161
8.77k
        smo: DependentCost::LightOperation {
162
8.77k
            base: 209,
163
8.77k
            units_per_gas: 55,
164
8.77k
        },
165
8.77k
        retd: DependentCost::LightOperation {
166
8.77k
            base: 29,
167
8.77k
            units_per_gas: 62,
168
8.77k
        },
169
8.77k
        srwq: DependentCost::LightOperation {
170
8.77k
            base: 47,
171
8.77k
            units_per_gas: 5,
172
8.77k
        },
173
8.77k
        scwq: DependentCost::LightOperation {
174
8.77k
            base: 13,
175
8.77k
            units_per_gas: 5,
176
8.77k
        },
177
8.77k
        swwq: DependentCost::LightOperation {
178
8.77k
            base: 44,
179
8.77k
            units_per_gas: 5,
180
8.77k
        },
181
8.77k
        bsiz: DependentCost::LightOperation {
182
8.77k
            base: 17,
183
8.77k
            units_per_gas: 790,
184
8.77k
        },
185
8.77k
        bldd: DependentCost::LightOperation {
186
8.77k
            base: 15,
187
8.77k
            units_per_gas: 272,
188
8.77k
        },
189
8.77k
190
8.77k
        // Non-opcode costs
191
8.77k
        contract_root: DependentCost::LightOperation {
192
8.77k
            base: 75,
193
8.77k
            units_per_gas: 1,
194
8.77k
        },
195
8.77k
        state_root: DependentCost::LightOperation {
196
8.77k
            base: 412,
197
8.77k
            units_per_gas: 1,
198
8.77k
        },
199
8.77k
        new_storage_per_byte: 1,
200
8.77k
        vm_initialization: DependentCost::HeavyOperation {
201
8.77k
            base: 2000,
202
8.77k
            gas_per_unit: 0,
203
8.77k
        },
204
8.77k
    }
205
8.77k
    .into()
206
8.77k
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/fee.rs
Line
Count
Source
1
use crate::{
2
    field,
3
    field::{
4
        MaxFeeLimit,
5
        Tip,
6
        WitnessLimit,
7
    },
8
    input::{
9
        coin::{
10
            CoinPredicate,
11
            CoinSigned,
12
        },
13
        message::{
14
            MessageCoinPredicate,
15
            MessageCoinSigned,
16
            MessageDataPredicate,
17
            MessageDataSigned,
18
        },
19
    },
20
    policies::PolicyType,
21
    FeeParameters,
22
    GasCosts,
23
    Input,
24
};
25
use fuel_asm::Word;
26
use fuel_types::canonical::Serialize;
27
use hashbrown::HashSet;
28
29
#[derive(
30
    Debug,
31
    Default,
32
    Clone,
33
    Copy,
34
    PartialEq,
35
    Eq,
36
    PartialOrd,
37
    Ord,
38
    Hash,
39
    serde::Serialize,
40
0
    serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction3fees_1__NtB7_14TransactionFeeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1g_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction3fees_1__NtBa_14TransactionFeeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1j_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction3fees_1__NtB8_14TransactionFeeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1h_7Visitor9visit_u64pEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction3fees_1__NtB8_14TransactionFeeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1h_7Visitor9visit_strpEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction3fees_1__NtB8_14TransactionFeeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1h_7Visitor11visit_bytespEBc_
Unexecuted instantiation: _RINvXs_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction3fees_1__NtBa_14TransactionFeeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1h_11deserializepEBe_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction3fees_1__NtBb_14TransactionFeeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1k_7Visitor9visit_seqpEBf_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction3fees_1__NtBb_14TransactionFeeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1k_7Visitor9visit_mappEBf_
41
)]
42
pub struct TransactionFee {
43
    pub(crate) min_fee: Word,
44
    pub(crate) max_fee: Word,
45
    pub(crate) min_gas: Word,
46
    pub(crate) max_gas: Word,
47
}
48
49
impl From<TransactionFee> for Word {
50
0
    fn from(fee: TransactionFee) -> Word {
51
0
        fee.max_fee
52
0
    }
53
}
54
55
impl TransactionFee {
56
4.38k
    pub const fn new(min_fee: Word, max_fee: Word, min_gas: Word, max_gas: Word) -> Self {
57
4.38k
        Self {
58
4.38k
            min_fee,
59
4.38k
            max_fee,
60
4.38k
            min_gas,
61
4.38k
            max_gas,
62
4.38k
        }
63
4.38k
    }
_RNvMs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction3feeNtB4_14TransactionFee3newCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
56
4.38k
    pub const fn new(min_fee: Word, max_fee: Word, min_gas: Word, max_gas: Word) -> Self {
57
4.38k
        Self {
58
4.38k
            min_fee,
59
4.38k
            max_fee,
60
4.38k
            min_gas,
61
4.38k
            max_gas,
62
4.38k
        }
63
4.38k
    }
Unexecuted instantiation: _RNvMs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction3feeNtB4_14TransactionFee3newB8_
64
65
    /// Minimum fee value to pay for the base transaction without script execution.
66
0
    pub const fn min_fee(&self) -> Word {
67
0
        self.min_fee
68
0
    }
69
70
    /// Maximum fee value to pay for the transaction with script execution.
71
4.38k
    pub const fn max_fee(&self) -> Word {
72
4.38k
        self.max_fee
73
4.38k
    }
_RNvMs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction3feeNtB4_14TransactionFee7max_feeCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
71
4.38k
    pub const fn max_fee(&self) -> Word {
72
4.38k
        self.max_fee
73
4.38k
    }
Unexecuted instantiation: _RNvMs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction3feeNtB4_14TransactionFee7max_feeB8_
74
75
    /// The minimum amount of gas (not fee!) used by this tx
76
0
    pub const fn min_gas(&self) -> Word {
77
0
        self.min_gas
78
0
    }
79
80
    /// The max amount of gas (not fee!) usable by this tx
81
0
    pub const fn max_gas(&self) -> Word {
82
0
        self.max_gas
83
0
    }
84
85
    /// Convert into a tuple containing the inner min & total fee values
86
0
    pub const fn into_inner(self) -> (Word, Word) {
87
0
        (self.min_fee, self.max_fee)
88
0
    }
89
90
    /// Attempt to subtract the maximum fee value from a given balance
91
    ///
92
    /// Will return `None` if arithmetic overflow occurs.
93
0
    pub fn checked_deduct_total(&self, balance: Word) -> Option<Word> {
94
0
        let fee = self.max_fee();
95
0
96
0
        balance.checked_sub(fee)
97
0
    }
98
99
    /// Attempt to create a transaction fee from parameters and transaction internals
100
    ///
101
    /// Will return `None` if arithmetic overflow occurs.
102
4.38k
    pub fn checked_from_tx<T>(
103
4.38k
        gas_costs: &GasCosts,
104
4.38k
        params: &FeeParameters,
105
4.38k
        tx: &T,
106
4.38k
        gas_price: Word,
107
4.38k
    ) -> Option<Self>
108
4.38k
    where
109
4.38k
        T: Chargeable,
110
4.38k
    {
111
4.38k
        let min_gas = tx.min_gas(gas_costs, params);
112
4.38k
        let max_gas = tx.max_gas(gas_costs, params);
113
4.38k
        let min_fee = tx.min_fee(gas_costs, params, gas_price).try_into().ok()?;
114
4.38k
        let max_fee = tx.max_fee(gas_costs, params, gas_price).try_into().ok()?;
115
116
4.38k
        if min_fee > max_fee {
117
0
            return None;
118
4.38k
        }
119
4.38k
120
4.38k
        Some(Self::new(min_fee, max_fee, min_gas, max_gas))
121
4.38k
    }
Unexecuted instantiation: _RINvMs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction3feeNtB5_14TransactionFee15checked_from_txINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtB1t_4blob8BlobBodyNtB2r_12BlobMetadataEECsg6P9hFxt0iW_7fuel_vm
_RINvMs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction3feeNtB5_14TransactionFee15checked_from_txINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtB1t_6create10CreateBodyNtB2r_14CreateMetadataEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
102
2.19k
    pub fn checked_from_tx<T>(
103
2.19k
        gas_costs: &GasCosts,
104
2.19k
        params: &FeeParameters,
105
2.19k
        tx: &T,
106
2.19k
        gas_price: Word,
107
2.19k
    ) -> Option<Self>
108
2.19k
    where
109
2.19k
        T: Chargeable,
110
2.19k
    {
111
2.19k
        let min_gas = tx.min_gas(gas_costs, params);
112
2.19k
        let max_gas = tx.max_gas(gas_costs, params);
113
2.19k
        let min_fee = tx.min_fee(gas_costs, params, gas_price).try_into().ok()?;
114
2.19k
        let max_fee = tx.max_fee(gas_costs, params, gas_price).try_into().ok()?;
115
116
2.19k
        if min_fee > max_fee {
117
0
            return None;
118
2.19k
        }
119
2.19k
120
2.19k
        Some(Self::new(min_fee, max_fee, min_gas, max_gas))
121
2.19k
    }
_RINvMs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction3feeNtB5_14TransactionFee15checked_from_txINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtB1t_6script10ScriptBodyNtB2r_14ScriptMetadataEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
102
2.19k
    pub fn checked_from_tx<T>(
103
2.19k
        gas_costs: &GasCosts,
104
2.19k
        params: &FeeParameters,
105
2.19k
        tx: &T,
106
2.19k
        gas_price: Word,
107
2.19k
    ) -> Option<Self>
108
2.19k
    where
109
2.19k
        T: Chargeable,
110
2.19k
    {
111
2.19k
        let min_gas = tx.min_gas(gas_costs, params);
112
2.19k
        let max_gas = tx.max_gas(gas_costs, params);
113
2.19k
        let min_fee = tx.min_fee(gas_costs, params, gas_price).try_into().ok()?;
114
2.19k
        let max_fee = tx.max_fee(gas_costs, params, gas_price).try_into().ok()?;
115
116
2.19k
        if min_fee > max_fee {
117
0
            return None;
118
2.19k
        }
119
2.19k
120
2.19k
        Some(Self::new(min_fee, max_fee, min_gas, max_gas))
121
2.19k
    }
Unexecuted instantiation: _RINvMs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction3feeNtB5_14TransactionFee15checked_from_txpEB9_
122
}
123
124
13.1k
fn gas_to_fee(gas: Word, gas_price: Word, factor: Word) -> u128 {
125
13.1k
    let total_price = (gas as u128)
126
13.1k
        .checked_mul(gas_price as u128)
127
13.1k
        .expect("Impossible to overflow because multiplication of two `u64` <= `u128`");
128
13.1k
    total_price.div_ceil(factor as u128)
129
13.1k
}
130
131
/// Returns the minimum gas required to start execution of any transaction.
132
43.8k
pub fn min_gas<Tx>(tx: &Tx, gas_costs: &GasCosts, fee: &FeeParameters) -> Word
133
43.8k
where
134
43.8k
    Tx: Chargeable + ?Sized,
135
43.8k
{
136
43.8k
    let bytes_size = tx.metered_bytes_size();
137
43.8k
138
43.8k
    let vm_initialization_gas = gas_costs.vm_initialization().resolve(bytes_size as Word);
139
43.8k
140
43.8k
    // It's okay to saturate because we have the `max_gas_per_tx` rule for transaction
141
43.8k
    // validity. In the production, the value always will be lower than
142
43.8k
    // `u64::MAX`.
143
43.8k
    let bytes_gas = fee.gas_per_byte().saturating_mul(bytes_size as u64);
144
43.8k
    tx.gas_used_by_inputs(gas_costs)
145
43.8k
        .saturating_add(tx.gas_used_by_metadata(gas_costs))
146
43.8k
        .saturating_add(bytes_gas)
147
43.8k
        .saturating_add(vm_initialization_gas)
148
43.8k
}
_RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction3fee7min_gasINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtBW_6create10CreateBodyNtB1U_14CreateMetadataEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
132
21.9k
pub fn min_gas<Tx>(tx: &Tx, gas_costs: &GasCosts, fee: &FeeParameters) -> Word
133
21.9k
where
134
21.9k
    Tx: Chargeable + ?Sized,
135
21.9k
{
136
21.9k
    let bytes_size = tx.metered_bytes_size();
137
21.9k
138
21.9k
    let vm_initialization_gas = gas_costs.vm_initialization().resolve(bytes_size as Word);
139
21.9k
140
21.9k
    // It's okay to saturate because we have the `max_gas_per_tx` rule for transaction
141
21.9k
    // validity. In the production, the value always will be lower than
142
21.9k
    // `u64::MAX`.
143
21.9k
    let bytes_gas = fee.gas_per_byte().saturating_mul(bytes_size as u64);
144
21.9k
    tx.gas_used_by_inputs(gas_costs)
145
21.9k
        .saturating_add(tx.gas_used_by_metadata(gas_costs))
146
21.9k
        .saturating_add(bytes_gas)
147
21.9k
        .saturating_add(vm_initialization_gas)
148
21.9k
}
_RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction3fee7min_gasINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtBW_6script10ScriptBodyNtB1U_14ScriptMetadataEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
132
21.9k
pub fn min_gas<Tx>(tx: &Tx, gas_costs: &GasCosts, fee: &FeeParameters) -> Word
133
21.9k
where
134
21.9k
    Tx: Chargeable + ?Sized,
135
21.9k
{
136
21.9k
    let bytes_size = tx.metered_bytes_size();
137
21.9k
138
21.9k
    let vm_initialization_gas = gas_costs.vm_initialization().resolve(bytes_size as Word);
139
21.9k
140
21.9k
    // It's okay to saturate because we have the `max_gas_per_tx` rule for transaction
141
21.9k
    // validity. In the production, the value always will be lower than
142
21.9k
    // `u64::MAX`.
143
21.9k
    let bytes_gas = fee.gas_per_byte().saturating_mul(bytes_size as u64);
144
21.9k
    tx.gas_used_by_inputs(gas_costs)
145
21.9k
        .saturating_add(tx.gas_used_by_metadata(gas_costs))
146
21.9k
        .saturating_add(bytes_gas)
147
21.9k
        .saturating_add(vm_initialization_gas)
148
21.9k
}
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction3fee7min_gasINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtBW_7upgrade11UpgradeBodyNtB1U_15UpgradeMetadataEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction3fee7min_gasINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtBW_4blob8BlobBodyNtB1U_12BlobMetadataEEB6_
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction3fee7min_gasINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtBW_6create10CreateBodyNtB1U_14CreateMetadataEEB6_
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction3fee7min_gasINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtBW_6script10ScriptBodyNtB1U_14ScriptMetadataEEB6_
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction3fee7min_gasINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtBW_6upload10UploadBodyNtB1U_14UploadMetadataEEB6_
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction3fee7min_gasINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtBW_7upgrade11UpgradeBodyNtB1U_15UpgradeMetadataEEB6_
149
150
/// Means that the blockchain charges fee for the transaction.
151
pub trait Chargeable: field::Inputs + field::Witnesses + field::Policies {
152
    /// Returns the minimum gas required to start transaction execution.
153
43.8k
    fn min_gas(&self, gas_costs: &GasCosts, fee: &FeeParameters) -> Word {
154
43.8k
        min_gas(self, gas_costs, fee)
155
43.8k
    }
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtB9_3fee10Chargeable7min_gasCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
153
21.9k
    fn min_gas(&self, gas_costs: &GasCosts, fee: &FeeParameters) -> Word {
154
21.9k
        min_gas(self, gas_costs, fee)
155
21.9k
    }
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtB9_3fee10Chargeable7min_gasCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
153
21.9k
    fn min_gas(&self, gas_costs: &GasCosts, fee: &FeeParameters) -> Word {
154
21.9k
        min_gas(self, gas_costs, fee)
155
21.9k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtNtB9_3fee10Chargeable7min_gasCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtB9_3fee10Chargeable7min_gasBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtB9_3fee10Chargeable7min_gasBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtNtB9_3fee10Chargeable7min_gasBb_
156
157
    /// Returns the maximum possible gas after the end of transaction execution.
158
    ///
159
    /// The function guarantees that the value is not less than [Self::min_gas].
160
13.1k
    fn max_gas(&self, gas_costs: &GasCosts, fee: &FeeParameters) -> Word {
161
13.1k
        let remaining_allowed_witness_gas = self
162
13.1k
            .witness_limit()
163
13.1k
            .saturating_sub(self.witnesses().size_dynamic() as u64)
164
13.1k
            .saturating_mul(fee.gas_per_byte());
165
13.1k
166
13.1k
        self.min_gas(gas_costs, fee)
167
13.1k
            .saturating_add(remaining_allowed_witness_gas)
168
13.1k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtNtB9_3fee10Chargeable7max_gasCsg6P9hFxt0iW_7fuel_vm
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtB9_3fee10Chargeable7max_gasCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
160
13.1k
    fn max_gas(&self, gas_costs: &GasCosts, fee: &FeeParameters) -> Word {
161
13.1k
        let remaining_allowed_witness_gas = self
162
13.1k
            .witness_limit()
163
13.1k
            .saturating_sub(self.witnesses().size_dynamic() as u64)
164
13.1k
            .saturating_mul(fee.gas_per_byte());
165
13.1k
166
13.1k
        self.min_gas(gas_costs, fee)
167
13.1k
            .saturating_add(remaining_allowed_witness_gas)
168
13.1k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1D_14UploadMetadataENtNtB9_3fee10Chargeable7max_gasCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtNtB9_3fee10Chargeable7max_gasCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtNtB9_3fee10Chargeable7max_gasBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtB9_3fee10Chargeable7max_gasBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1D_14UploadMetadataENtNtB9_3fee10Chargeable7max_gasBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtNtB9_3fee10Chargeable7max_gasBb_
169
170
    /// Returns the minimum fee required to start transaction execution.
171
4.38k
    fn min_fee(
172
4.38k
        &self,
173
4.38k
        gas_costs: &GasCosts,
174
4.38k
        fee: &FeeParameters,
175
4.38k
        gas_price: Word,
176
4.38k
    ) -> u128 {
177
4.38k
        let tip = self.tip();
178
4.38k
        let gas_fee = gas_to_fee(
179
4.38k
            self.min_gas(gas_costs, fee),
180
4.38k
            gas_price,
181
4.38k
            fee.gas_price_factor(),
182
4.38k
        );
183
4.38k
        gas_fee.saturating_add(tip as u128)
184
4.38k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtNtB9_3fee10Chargeable7min_feeCsg6P9hFxt0iW_7fuel_vm
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtB9_3fee10Chargeable7min_feeCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
171
2.19k
    fn min_fee(
172
2.19k
        &self,
173
2.19k
        gas_costs: &GasCosts,
174
2.19k
        fee: &FeeParameters,
175
2.19k
        gas_price: Word,
176
2.19k
    ) -> u128 {
177
2.19k
        let tip = self.tip();
178
2.19k
        let gas_fee = gas_to_fee(
179
2.19k
            self.min_gas(gas_costs, fee),
180
2.19k
            gas_price,
181
2.19k
            fee.gas_price_factor(),
182
2.19k
        );
183
2.19k
        gas_fee.saturating_add(tip as u128)
184
2.19k
    }
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtB9_3fee10Chargeable7min_feeCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
171
2.19k
    fn min_fee(
172
2.19k
        &self,
173
2.19k
        gas_costs: &GasCosts,
174
2.19k
        fee: &FeeParameters,
175
2.19k
        gas_price: Word,
176
2.19k
    ) -> u128 {
177
2.19k
        let tip = self.tip();
178
2.19k
        let gas_fee = gas_to_fee(
179
2.19k
            self.min_gas(gas_costs, fee),
180
2.19k
            gas_price,
181
2.19k
            fee.gas_price_factor(),
182
2.19k
        );
183
2.19k
        gas_fee.saturating_add(tip as u128)
184
2.19k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtNtB9_3fee10Chargeable7min_feeBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtB9_3fee10Chargeable7min_feeBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtB9_3fee10Chargeable7min_feeBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1D_14UploadMetadataENtNtB9_3fee10Chargeable7min_feeBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtNtB9_3fee10Chargeable7min_feeBb_
185
186
    /// Returns the maximum possible fee after the end of transaction execution.
187
    ///
188
    /// The function guarantees that the value is not less than [Self::min_fee].
189
4.38k
    fn max_fee(
190
4.38k
        &self,
191
4.38k
        gas_costs: &GasCosts,
192
4.38k
        fee: &FeeParameters,
193
4.38k
        gas_price: Word,
194
4.38k
    ) -> u128 {
195
4.38k
        let tip = self.tip();
196
4.38k
        let gas_fee = gas_to_fee(
197
4.38k
            self.max_gas(gas_costs, fee),
198
4.38k
            gas_price,
199
4.38k
            fee.gas_price_factor(),
200
4.38k
        );
201
4.38k
        gas_fee.saturating_add(tip as u128)
202
4.38k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtNtB9_3fee10Chargeable7max_feeCsg6P9hFxt0iW_7fuel_vm
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtB9_3fee10Chargeable7max_feeCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
189
2.19k
    fn max_fee(
190
2.19k
        &self,
191
2.19k
        gas_costs: &GasCosts,
192
2.19k
        fee: &FeeParameters,
193
2.19k
        gas_price: Word,
194
2.19k
    ) -> u128 {
195
2.19k
        let tip = self.tip();
196
2.19k
        let gas_fee = gas_to_fee(
197
2.19k
            self.max_gas(gas_costs, fee),
198
2.19k
            gas_price,
199
2.19k
            fee.gas_price_factor(),
200
2.19k
        );
201
2.19k
        gas_fee.saturating_add(tip as u128)
202
2.19k
    }
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtB9_3fee10Chargeable7max_feeCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
189
2.19k
    fn max_fee(
190
2.19k
        &self,
191
2.19k
        gas_costs: &GasCosts,
192
2.19k
        fee: &FeeParameters,
193
2.19k
        gas_price: Word,
194
2.19k
    ) -> u128 {
195
2.19k
        let tip = self.tip();
196
2.19k
        let gas_fee = gas_to_fee(
197
2.19k
            self.max_gas(gas_costs, fee),
198
2.19k
            gas_price,
199
2.19k
            fee.gas_price_factor(),
200
2.19k
        );
201
2.19k
        gas_fee.saturating_add(tip as u128)
202
2.19k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtNtB9_3fee10Chargeable7max_feeBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtB9_3fee10Chargeable7max_feeBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtB9_3fee10Chargeable7max_feeBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1D_14UploadMetadataENtNtB9_3fee10Chargeable7max_feeBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtNtB9_3fee10Chargeable7max_feeBb_
203
204
    /// Returns the fee amount that can be refunded back based on the `used_gas` and
205
    /// current state of the transaction.
206
    ///
207
    /// Return `None` if overflow occurs.
208
4.38k
    fn refund_fee(
209
4.38k
        &self,
210
4.38k
        gas_costs: &GasCosts,
211
4.38k
        fee: &FeeParameters,
212
4.38k
        used_gas: Word,
213
4.38k
        gas_price: Word,
214
4.38k
    ) -> Option<Word> {
215
4.38k
        // We've already charged the user for witnesses as part of the minimal gas and all
216
4.38k
        // execution required to validate transaction validity rules.
217
4.38k
        let min_gas = self.min_gas(gas_costs, fee);
218
4.38k
219
4.38k
        let total_used_gas = min_gas.saturating_add(used_gas);
220
4.38k
        let tip = self.policies().get(PolicyType::Tip).unwrap_or(0);
221
4.38k
        let used_fee = gas_to_fee(total_used_gas, gas_price, fee.gas_price_factor())
222
4.38k
            .saturating_add(tip as u128);
223
224
        // It is okay to saturate everywhere above because it only can decrease the value
225
        // of `refund`. But here, because we need to return the amount we
226
        // want to refund, we need to handle the overflow caused by the price.
227
4.38k
        let used_fee: u64 = used_fee.try_into().ok()?;
228
4.38k
        self.max_fee_limit().checked_sub(used_fee)
229
4.38k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtNtB9_3fee10Chargeable10refund_feeCsg6P9hFxt0iW_7fuel_vm
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtB9_3fee10Chargeable10refund_feeCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
208
2.19k
    fn refund_fee(
209
2.19k
        &self,
210
2.19k
        gas_costs: &GasCosts,
211
2.19k
        fee: &FeeParameters,
212
2.19k
        used_gas: Word,
213
2.19k
        gas_price: Word,
214
2.19k
    ) -> Option<Word> {
215
2.19k
        // We've already charged the user for witnesses as part of the minimal gas and all
216
2.19k
        // execution required to validate transaction validity rules.
217
2.19k
        let min_gas = self.min_gas(gas_costs, fee);
218
2.19k
219
2.19k
        let total_used_gas = min_gas.saturating_add(used_gas);
220
2.19k
        let tip = self.policies().get(PolicyType::Tip).unwrap_or(0);
221
2.19k
        let used_fee = gas_to_fee(total_used_gas, gas_price, fee.gas_price_factor())
222
2.19k
            .saturating_add(tip as u128);
223
224
        // It is okay to saturate everywhere above because it only can decrease the value
225
        // of `refund`. But here, because we need to return the amount we
226
        // want to refund, we need to handle the overflow caused by the price.
227
2.19k
        let used_fee: u64 = used_fee.try_into().ok()?;
228
2.19k
        self.max_fee_limit().checked_sub(used_fee)
229
2.19k
    }
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtB9_3fee10Chargeable10refund_feeCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
208
2.19k
    fn refund_fee(
209
2.19k
        &self,
210
2.19k
        gas_costs: &GasCosts,
211
2.19k
        fee: &FeeParameters,
212
2.19k
        used_gas: Word,
213
2.19k
        gas_price: Word,
214
2.19k
    ) -> Option<Word> {
215
2.19k
        // We've already charged the user for witnesses as part of the minimal gas and all
216
2.19k
        // execution required to validate transaction validity rules.
217
2.19k
        let min_gas = self.min_gas(gas_costs, fee);
218
2.19k
219
2.19k
        let total_used_gas = min_gas.saturating_add(used_gas);
220
2.19k
        let tip = self.policies().get(PolicyType::Tip).unwrap_or(0);
221
2.19k
        let used_fee = gas_to_fee(total_used_gas, gas_price, fee.gas_price_factor())
222
2.19k
            .saturating_add(tip as u128);
223
224
        // It is okay to saturate everywhere above because it only can decrease the value
225
        // of `refund`. But here, because we need to return the amount we
226
        // want to refund, we need to handle the overflow caused by the price.
227
2.19k
        let used_fee: u64 = used_fee.try_into().ok()?;
228
2.19k
        self.max_fee_limit().checked_sub(used_fee)
229
2.19k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1D_14UploadMetadataENtNtB9_3fee10Chargeable10refund_feeCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtNtB9_3fee10Chargeable10refund_feeCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtNtB9_3fee10Chargeable10refund_feeBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtB9_3fee10Chargeable10refund_feeBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtB9_3fee10Chargeable10refund_feeBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1D_14UploadMetadataENtNtB9_3fee10Chargeable10refund_feeBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtNtB9_3fee10Chargeable10refund_feeBb_
230
231
    /// Used for accounting purposes when charging byte based fees.
232
    fn metered_bytes_size(&self) -> usize;
233
234
    /// Returns the gas used by the inputs.
235
43.8k
    fn gas_used_by_inputs(&self, gas_costs: &GasCosts) -> Word {
236
43.8k
        let mut witness_cache: HashSet<u16> = HashSet::new();
237
43.8k
        self.inputs()
238
43.8k
            .iter()
239
65.7k
            .filter(|input| match input {
240
43.8k
                // Include signed inputs of unique witness indices
241
43.8k
                Input::CoinSigned(CoinSigned { witness_index, .. })
242
0
                | Input::MessageCoinSigned(MessageCoinSigned { witness_index, .. })
243
0
                | Input::MessageDataSigned(MessageDataSigned { witness_index, .. })
244
43.8k
                    if !witness_cache.contains(witness_index) =>
245
                {
246
43.8k
                    witness_cache.insert(*witness_index);
247
43.8k
                    true
248
                }
249
                // Include all predicates
250
                Input::CoinPredicate(_)
251
                | Input::MessageCoinPredicate(_)
252
0
                | Input::MessageDataPredicate(_) => true,
253
                // Ignore all other inputs
254
21.9k
                _ => false,
255
65.7k
            })
_RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1F_14CreateMetadataENtNtBb_3fee10Chargeable18gas_used_by_inputs0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
239
21.9k
            .filter(|input| match input {
240
21.9k
                // Include signed inputs of unique witness indices
241
21.9k
                Input::CoinSigned(CoinSigned { witness_index, .. })
242
0
                | Input::MessageCoinSigned(MessageCoinSigned { witness_index, .. })
243
0
                | Input::MessageDataSigned(MessageDataSigned { witness_index, .. })
244
21.9k
                    if !witness_cache.contains(witness_index) =>
245
                {
246
21.9k
                    witness_cache.insert(*witness_index);
247
21.9k
                    true
248
                }
249
                // Include all predicates
250
                Input::CoinPredicate(_)
251
                | Input::MessageCoinPredicate(_)
252
0
                | Input::MessageDataPredicate(_) => true,
253
                // Ignore all other inputs
254
0
                _ => false,
255
21.9k
            })
_RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1F_14ScriptMetadataENtNtBb_3fee10Chargeable18gas_used_by_inputs0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
239
43.8k
            .filter(|input| match input {
240
21.9k
                // Include signed inputs of unique witness indices
241
21.9k
                Input::CoinSigned(CoinSigned { witness_index, .. })
242
0
                | Input::MessageCoinSigned(MessageCoinSigned { witness_index, .. })
243
0
                | Input::MessageDataSigned(MessageDataSigned { witness_index, .. })
244
21.9k
                    if !witness_cache.contains(witness_index) =>
245
                {
246
21.9k
                    witness_cache.insert(*witness_index);
247
21.9k
                    true
248
                }
249
                // Include all predicates
250
                Input::CoinPredicate(_)
251
                | Input::MessageCoinPredicate(_)
252
0
                | Input::MessageDataPredicate(_) => true,
253
                // Ignore all other inputs
254
21.9k
                _ => false,
255
43.8k
            })
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1F_15UpgradeMetadataENtNtBb_3fee10Chargeable18gas_used_by_inputs0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_4blob8BlobBodyNtB1F_12BlobMetadataENtNtBb_3fee10Chargeable18gas_used_by_inputs0Bd_
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1F_14CreateMetadataENtNtBb_3fee10Chargeable18gas_used_by_inputs0Bd_
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1F_14ScriptMetadataENtNtBb_3fee10Chargeable18gas_used_by_inputs0Bd_
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6upload10UploadBodyNtB1F_14UploadMetadataENtNtBb_3fee10Chargeable18gas_used_by_inputs0Bd_
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1F_15UpgradeMetadataENtNtBb_3fee10Chargeable18gas_used_by_inputs0Bd_
256
43.8k
            .map(|input| match input {
257
                // Charge EC recovery cost for signed inputs
258
                Input::CoinSigned(_)
259
                | Input::MessageCoinSigned(_)
260
43.8k
                | Input::MessageDataSigned(_) => gas_costs.eck1(),
261
                // Charge the cost of the contract root for predicate inputs
262
                Input::CoinPredicate(CoinPredicate {
263
0
                    predicate,
264
0
                    predicate_gas_used,
265
                    ..
266
                })
267
                | Input::MessageCoinPredicate(MessageCoinPredicate {
268
0
                    predicate,
269
0
                    predicate_gas_used,
270
                    ..
271
                })
272
                | Input::MessageDataPredicate(MessageDataPredicate {
273
0
                    predicate,
274
0
                    predicate_gas_used,
275
                    ..
276
                }) => {
277
0
                    let bytes_size = self.metered_bytes_size();
278
0
                    let vm_initialization_gas =
279
0
                        gas_costs.vm_initialization().resolve(bytes_size as Word);
280
0
                    gas_costs
281
0
                        .contract_root()
282
0
                        .resolve(predicate.len() as u64)
283
0
                        .saturating_add(*predicate_gas_used)
284
0
                        .saturating_add(vm_initialization_gas)
285
                }
286
                // Charge nothing for all other inputs
287
0
                _ => 0,
288
43.8k
            })
_RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1F_14CreateMetadataENtNtBb_3fee10Chargeable18gas_used_by_inputss_0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
256
21.9k
            .map(|input| match input {
257
                // Charge EC recovery cost for signed inputs
258
                Input::CoinSigned(_)
259
                | Input::MessageCoinSigned(_)
260
21.9k
                | Input::MessageDataSigned(_) => gas_costs.eck1(),
261
                // Charge the cost of the contract root for predicate inputs
262
                Input::CoinPredicate(CoinPredicate {
263
0
                    predicate,
264
0
                    predicate_gas_used,
265
                    ..
266
                })
267
                | Input::MessageCoinPredicate(MessageCoinPredicate {
268
0
                    predicate,
269
0
                    predicate_gas_used,
270
                    ..
271
                })
272
                | Input::MessageDataPredicate(MessageDataPredicate {
273
0
                    predicate,
274
0
                    predicate_gas_used,
275
                    ..
276
                }) => {
277
0
                    let bytes_size = self.metered_bytes_size();
278
0
                    let vm_initialization_gas =
279
0
                        gas_costs.vm_initialization().resolve(bytes_size as Word);
280
0
                    gas_costs
281
0
                        .contract_root()
282
0
                        .resolve(predicate.len() as u64)
283
0
                        .saturating_add(*predicate_gas_used)
284
0
                        .saturating_add(vm_initialization_gas)
285
                }
286
                // Charge nothing for all other inputs
287
0
                _ => 0,
288
21.9k
            })
_RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1F_14ScriptMetadataENtNtBb_3fee10Chargeable18gas_used_by_inputss_0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
256
21.9k
            .map(|input| match input {
257
                // Charge EC recovery cost for signed inputs
258
                Input::CoinSigned(_)
259
                | Input::MessageCoinSigned(_)
260
21.9k
                | Input::MessageDataSigned(_) => gas_costs.eck1(),
261
                // Charge the cost of the contract root for predicate inputs
262
                Input::CoinPredicate(CoinPredicate {
263
0
                    predicate,
264
0
                    predicate_gas_used,
265
                    ..
266
                })
267
                | Input::MessageCoinPredicate(MessageCoinPredicate {
268
0
                    predicate,
269
0
                    predicate_gas_used,
270
                    ..
271
                })
272
                | Input::MessageDataPredicate(MessageDataPredicate {
273
0
                    predicate,
274
0
                    predicate_gas_used,
275
                    ..
276
                }) => {
277
0
                    let bytes_size = self.metered_bytes_size();
278
0
                    let vm_initialization_gas =
279
0
                        gas_costs.vm_initialization().resolve(bytes_size as Word);
280
0
                    gas_costs
281
0
                        .contract_root()
282
0
                        .resolve(predicate.len() as u64)
283
0
                        .saturating_add(*predicate_gas_used)
284
0
                        .saturating_add(vm_initialization_gas)
285
                }
286
                // Charge nothing for all other inputs
287
0
                _ => 0,
288
21.9k
            })
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1F_15UpgradeMetadataENtNtBb_3fee10Chargeable18gas_used_by_inputss_0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_4blob8BlobBodyNtB1F_12BlobMetadataENtNtBb_3fee10Chargeable18gas_used_by_inputss_0Bd_
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1F_14CreateMetadataENtNtBb_3fee10Chargeable18gas_used_by_inputss_0Bd_
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1F_14ScriptMetadataENtNtBb_3fee10Chargeable18gas_used_by_inputss_0Bd_
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6upload10UploadBodyNtB1F_14UploadMetadataENtNtBb_3fee10Chargeable18gas_used_by_inputss_0Bd_
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1F_15UpgradeMetadataENtNtBb_3fee10Chargeable18gas_used_by_inputss_0Bd_
289
43.8k
            .fold(0, |acc, cost| acc.saturating_add(cost))
_RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1F_14CreateMetadataENtNtBb_3fee10Chargeable18gas_used_by_inputss0_0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
289
21.9k
            .fold(0, |acc, cost| acc.saturating_add(cost))
_RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1F_14ScriptMetadataENtNtBb_3fee10Chargeable18gas_used_by_inputss0_0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
289
21.9k
            .fold(0, |acc, cost| acc.saturating_add(cost))
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1F_15UpgradeMetadataENtNtBb_3fee10Chargeable18gas_used_by_inputss0_0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_4blob8BlobBodyNtB1F_12BlobMetadataENtNtBb_3fee10Chargeable18gas_used_by_inputss0_0Bd_
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1F_14CreateMetadataENtNtBb_3fee10Chargeable18gas_used_by_inputss0_0Bd_
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1F_14ScriptMetadataENtNtBb_3fee10Chargeable18gas_used_by_inputss0_0Bd_
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6upload10UploadBodyNtB1F_14UploadMetadataENtNtBb_3fee10Chargeable18gas_used_by_inputss0_0Bd_
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1F_15UpgradeMetadataENtNtBb_3fee10Chargeable18gas_used_by_inputss0_0Bd_
290
43.8k
    }
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtB9_3fee10Chargeable18gas_used_by_inputsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
235
21.9k
    fn gas_used_by_inputs(&self, gas_costs: &GasCosts) -> Word {
236
21.9k
        let mut witness_cache: HashSet<u16> = HashSet::new();
237
21.9k
        self.inputs()
238
21.9k
            .iter()
239
21.9k
            .filter(|input| match input {
240
                // Include signed inputs of unique witness indices
241
                Input::CoinSigned(CoinSigned { witness_index, .. })
242
                | Input::MessageCoinSigned(MessageCoinSigned { witness_index, .. })
243
                | Input::MessageDataSigned(MessageDataSigned { witness_index, .. })
244
                    if !witness_cache.contains(witness_index) =>
245
                {
246
                    witness_cache.insert(*witness_index);
247
                    true
248
                }
249
                // Include all predicates
250
                Input::CoinPredicate(_)
251
                | Input::MessageCoinPredicate(_)
252
                | Input::MessageDataPredicate(_) => true,
253
                // Ignore all other inputs
254
                _ => false,
255
21.9k
            })
256
21.9k
            .map(|input| match input {
257
                // Charge EC recovery cost for signed inputs
258
                Input::CoinSigned(_)
259
                | Input::MessageCoinSigned(_)
260
                | Input::MessageDataSigned(_) => gas_costs.eck1(),
261
                // Charge the cost of the contract root for predicate inputs
262
                Input::CoinPredicate(CoinPredicate {
263
                    predicate,
264
                    predicate_gas_used,
265
                    ..
266
                })
267
                | Input::MessageCoinPredicate(MessageCoinPredicate {
268
                    predicate,
269
                    predicate_gas_used,
270
                    ..
271
                })
272
                | Input::MessageDataPredicate(MessageDataPredicate {
273
                    predicate,
274
                    predicate_gas_used,
275
                    ..
276
                }) => {
277
                    let bytes_size = self.metered_bytes_size();
278
                    let vm_initialization_gas =
279
                        gas_costs.vm_initialization().resolve(bytes_size as Word);
280
                    gas_costs
281
                        .contract_root()
282
                        .resolve(predicate.len() as u64)
283
                        .saturating_add(*predicate_gas_used)
284
                        .saturating_add(vm_initialization_gas)
285
                }
286
                // Charge nothing for all other inputs
287
                _ => 0,
288
21.9k
            })
289
21.9k
            .fold(0, |acc, cost| acc.saturating_add(cost))
290
21.9k
    }
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtB9_3fee10Chargeable18gas_used_by_inputsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
235
21.9k
    fn gas_used_by_inputs(&self, gas_costs: &GasCosts) -> Word {
236
21.9k
        let mut witness_cache: HashSet<u16> = HashSet::new();
237
21.9k
        self.inputs()
238
21.9k
            .iter()
239
21.9k
            .filter(|input| match input {
240
                // Include signed inputs of unique witness indices
241
                Input::CoinSigned(CoinSigned { witness_index, .. })
242
                | Input::MessageCoinSigned(MessageCoinSigned { witness_index, .. })
243
                | Input::MessageDataSigned(MessageDataSigned { witness_index, .. })
244
                    if !witness_cache.contains(witness_index) =>
245
                {
246
                    witness_cache.insert(*witness_index);
247
                    true
248
                }
249
                // Include all predicates
250
                Input::CoinPredicate(_)
251
                | Input::MessageCoinPredicate(_)
252
                | Input::MessageDataPredicate(_) => true,
253
                // Ignore all other inputs
254
                _ => false,
255
21.9k
            })
256
21.9k
            .map(|input| match input {
257
                // Charge EC recovery cost for signed inputs
258
                Input::CoinSigned(_)
259
                | Input::MessageCoinSigned(_)
260
                | Input::MessageDataSigned(_) => gas_costs.eck1(),
261
                // Charge the cost of the contract root for predicate inputs
262
                Input::CoinPredicate(CoinPredicate {
263
                    predicate,
264
                    predicate_gas_used,
265
                    ..
266
                })
267
                | Input::MessageCoinPredicate(MessageCoinPredicate {
268
                    predicate,
269
                    predicate_gas_used,
270
                    ..
271
                })
272
                | Input::MessageDataPredicate(MessageDataPredicate {
273
                    predicate,
274
                    predicate_gas_used,
275
                    ..
276
                }) => {
277
                    let bytes_size = self.metered_bytes_size();
278
                    let vm_initialization_gas =
279
                        gas_costs.vm_initialization().resolve(bytes_size as Word);
280
                    gas_costs
281
                        .contract_root()
282
                        .resolve(predicate.len() as u64)
283
                        .saturating_add(*predicate_gas_used)
284
                        .saturating_add(vm_initialization_gas)
285
                }
286
                // Charge nothing for all other inputs
287
                _ => 0,
288
21.9k
            })
289
21.9k
            .fold(0, |acc, cost| acc.saturating_add(cost))
290
21.9k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtNtB9_3fee10Chargeable18gas_used_by_inputsCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtNtB9_3fee10Chargeable18gas_used_by_inputsBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtB9_3fee10Chargeable18gas_used_by_inputsBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtB9_3fee10Chargeable18gas_used_by_inputsBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1D_14UploadMetadataENtNtB9_3fee10Chargeable18gas_used_by_inputsBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtNtB9_3fee10Chargeable18gas_used_by_inputsBb_
291
292
    /// Used for accounting purposes when charging for metadata creation.
293
    fn gas_used_by_metadata(&self, gas_costs: &GasCosts) -> Word;
294
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/metadata.rs
Line
Count
Source
1
use alloc::vec::Vec;
2
use fuel_types::{
3
    canonical::Serialize,
4
    Bytes32,
5
    ChainId,
6
};
7
8
use crate::{
9
    field,
10
    UniqueIdentifier,
11
    ValidityError,
12
};
13
14
/// Entity support metadata computation to cache results.
15
pub trait Cacheable {
16
    /// The cache is already computed.
17
    ///
18
    /// # Note: `true` doesn't mean that the cache is actual.
19
    fn is_computed(&self) -> bool;
20
21
    /// Computes the cache for the entity.
22
    fn precompute(&mut self, chain_id: &ChainId) -> Result<(), ValidityError>;
23
}
24
25
impl Cacheable for super::Transaction {
26
0
    fn is_computed(&self) -> bool {
27
0
        match self {
28
0
            Self::Script(tx) => tx.is_computed(),
29
0
            Self::Create(tx) => tx.is_computed(),
30
0
            Self::Mint(tx) => tx.is_computed(),
31
0
            Self::Upgrade(tx) => tx.is_computed(),
32
0
            Self::Upload(tx) => tx.is_computed(),
33
0
            Self::Blob(tx) => tx.is_computed(),
34
        }
35
0
    }
36
37
0
    fn precompute(&mut self, chain_id: &ChainId) -> Result<(), ValidityError> {
38
0
        match self {
39
0
            Self::Script(tx) => tx.precompute(chain_id),
40
0
            Self::Create(tx) => tx.precompute(chain_id),
41
0
            Self::Mint(tx) => tx.precompute(chain_id),
42
0
            Self::Upgrade(tx) => tx.precompute(chain_id),
43
0
            Self::Upload(tx) => tx.precompute(chain_id),
44
0
            Self::Blob(tx) => tx.precompute(chain_id),
45
        }
46
0
    }
47
}
48
49
/// Common metadata for `Script` and `Create` transactions.
50
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
51
pub struct CommonMetadata {
52
    pub id: Bytes32,
53
    pub inputs_offset: usize,
54
    pub inputs_offset_at: Vec<usize>,
55
    pub inputs_predicate_offset_at: Vec<Option<(usize, usize)>>,
56
    pub outputs_offset: usize,
57
    pub outputs_offset_at: Vec<usize>,
58
    pub witnesses_offset: usize,
59
    pub witnesses_offset_at: Vec<usize>,
60
}
61
62
impl CommonMetadata {
63
    /// Computes the `Metadata` for the `tx` transaction.
64
    /// Returns `None` if the transaction is invalid.
65
8.77k
    pub fn compute<Tx>(tx: &Tx, chain_id: &ChainId) -> Result<Self, ValidityError>
66
8.77k
    where
67
8.77k
        Tx: UniqueIdentifier,
68
8.77k
        Tx: field::Inputs,
69
8.77k
        Tx: field::Outputs,
70
8.77k
        Tx: field::Witnesses,
71
8.77k
    {
72
        use itertools::Itertools;
73
74
8.77k
        let id = tx.id(chain_id);
75
8.77k
76
8.77k
        let inputs_predicate_offset_at = tx
77
8.77k
            .inputs()
78
8.77k
            .iter()
79
8.77k
            .enumerate()
80
13.1k
            .map(|(i, _)| tx.inputs_predicate_offset_at(i))
Unexecuted instantiation: _RNCINvMs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8metadataNtB7_14CommonMetadata7computeINtNtNtB9_5types22chargeable_transaction21ChargeableTransactionNtNtB1r_4blob8BlobBodyNtB2p_12BlobMetadataEE0Bb_
_RNCINvMs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8metadataNtB7_14CommonMetadata7computeINtNtNtB9_5types22chargeable_transaction21ChargeableTransactionNtNtB1r_6create10CreateBodyNtB2p_14CreateMetadataEE0Bb_
Line
Count
Source
80
4.38k
            .map(|(i, _)| tx.inputs_predicate_offset_at(i))
_RNCINvMs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8metadataNtB7_14CommonMetadata7computeINtNtNtB9_5types22chargeable_transaction21ChargeableTransactionNtNtB1r_6script10ScriptBodyNtB2p_14ScriptMetadataEE0Bb_
Line
Count
Source
80
8.77k
            .map(|(i, _)| tx.inputs_predicate_offset_at(i))
Unexecuted instantiation: _RNCINvMs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8metadataNtB7_14CommonMetadata7computeINtNtNtB9_5types22chargeable_transaction21ChargeableTransactionNtNtB1r_6upload10UploadBodyNtB2p_14UploadMetadataEE0Bb_
Unexecuted instantiation: _RNCINvMs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8metadataNtB7_14CommonMetadata7computeINtNtNtB9_5types22chargeable_transaction21ChargeableTransactionNtNtB1r_7upgrade11UpgradeBodyNtB2p_15UpgradeMetadataEE0Bb_
81
8.77k
            .collect_vec();
82
8.77k
83
8.77k
        let mut offset = tx.inputs_offset();
84
8.77k
        let mut inputs_offset_at = Vec::new();
85
13.1k
        for (index, input) in tx.inputs().iter().enumerate() {
86
13.1k
            let i = offset;
87
13.1k
            offset = offset
88
13.1k
                .checked_add(input.size())
89
13.1k
                .ok_or(ValidityError::SerializedInputTooLarge { index })?;
90
13.1k
            inputs_offset_at.push(i);
91
        }
92
93
8.77k
        let mut offset = tx.outputs_offset();
94
8.77k
        let mut outputs_offset_at = Vec::new();
95
13.1k
        for (index, output) in tx.outputs().iter().enumerate() {
96
13.1k
            let i = offset;
97
13.1k
            offset = offset
98
13.1k
                .checked_add(output.size())
99
13.1k
                .ok_or(ValidityError::SerializedOutputTooLarge { index })?;
100
13.1k
            outputs_offset_at.push(i);
101
        }
102
103
8.77k
        let mut offset = tx.witnesses_offset();
104
8.77k
        let mut witnesses_offset_at = Vec::new();
105
13.1k
        for (index, witnesses) in tx.witnesses().iter().enumerate() {
106
13.1k
            let i = offset;
107
13.1k
            offset = offset
108
13.1k
                .checked_add(witnesses.size())
109
13.1k
                .ok_or(ValidityError::SerializedWitnessTooLarge { index })?;
110
13.1k
            witnesses_offset_at.push(i);
111
        }
112
113
8.77k
        Ok(Self {
114
8.77k
            id,
115
8.77k
            inputs_offset: tx.inputs_offset(),
116
8.77k
            inputs_offset_at,
117
8.77k
            inputs_predicate_offset_at,
118
8.77k
            outputs_offset: tx.outputs_offset(),
119
8.77k
            outputs_offset_at,
120
8.77k
            witnesses_offset: tx.witnesses_offset(),
121
8.77k
            witnesses_offset_at,
122
8.77k
        })
123
8.77k
    }
Unexecuted instantiation: _RINvMs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8metadataNtB5_14CommonMetadata7computeINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtB1p_4blob8BlobBodyNtB2n_12BlobMetadataEEB9_
_RINvMs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8metadataNtB5_14CommonMetadata7computeINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtB1p_6create10CreateBodyNtB2n_14CreateMetadataEEB9_
Line
Count
Source
65
4.38k
    pub fn compute<Tx>(tx: &Tx, chain_id: &ChainId) -> Result<Self, ValidityError>
66
4.38k
    where
67
4.38k
        Tx: UniqueIdentifier,
68
4.38k
        Tx: field::Inputs,
69
4.38k
        Tx: field::Outputs,
70
4.38k
        Tx: field::Witnesses,
71
4.38k
    {
72
        use itertools::Itertools;
73
74
4.38k
        let id = tx.id(chain_id);
75
4.38k
76
4.38k
        let inputs_predicate_offset_at = tx
77
4.38k
            .inputs()
78
4.38k
            .iter()
79
4.38k
            .enumerate()
80
4.38k
            .map(|(i, _)| tx.inputs_predicate_offset_at(i))
81
4.38k
            .collect_vec();
82
4.38k
83
4.38k
        let mut offset = tx.inputs_offset();
84
4.38k
        let mut inputs_offset_at = Vec::new();
85
4.38k
        for (index, input) in tx.inputs().iter().enumerate() {
86
4.38k
            let i = offset;
87
4.38k
            offset = offset
88
4.38k
                .checked_add(input.size())
89
4.38k
                .ok_or(ValidityError::SerializedInputTooLarge { index })?;
90
4.38k
            inputs_offset_at.push(i);
91
        }
92
93
4.38k
        let mut offset = tx.outputs_offset();
94
4.38k
        let mut outputs_offset_at = Vec::new();
95
4.38k
        for (index, output) in tx.outputs().iter().enumerate() {
96
4.38k
            let i = offset;
97
4.38k
            offset = offset
98
4.38k
                .checked_add(output.size())
99
4.38k
                .ok_or(ValidityError::SerializedOutputTooLarge { index })?;
100
4.38k
            outputs_offset_at.push(i);
101
        }
102
103
4.38k
        let mut offset = tx.witnesses_offset();
104
4.38k
        let mut witnesses_offset_at = Vec::new();
105
8.77k
        for (index, witnesses) in tx.witnesses().iter().enumerate() {
106
8.77k
            let i = offset;
107
8.77k
            offset = offset
108
8.77k
                .checked_add(witnesses.size())
109
8.77k
                .ok_or(ValidityError::SerializedWitnessTooLarge { index })?;
110
8.77k
            witnesses_offset_at.push(i);
111
        }
112
113
4.38k
        Ok(Self {
114
4.38k
            id,
115
4.38k
            inputs_offset: tx.inputs_offset(),
116
4.38k
            inputs_offset_at,
117
4.38k
            inputs_predicate_offset_at,
118
4.38k
            outputs_offset: tx.outputs_offset(),
119
4.38k
            outputs_offset_at,
120
4.38k
            witnesses_offset: tx.witnesses_offset(),
121
4.38k
            witnesses_offset_at,
122
4.38k
        })
123
4.38k
    }
_RINvMs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8metadataNtB5_14CommonMetadata7computeINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtB1p_6script10ScriptBodyNtB2n_14ScriptMetadataEEB9_
Line
Count
Source
65
4.38k
    pub fn compute<Tx>(tx: &Tx, chain_id: &ChainId) -> Result<Self, ValidityError>
66
4.38k
    where
67
4.38k
        Tx: UniqueIdentifier,
68
4.38k
        Tx: field::Inputs,
69
4.38k
        Tx: field::Outputs,
70
4.38k
        Tx: field::Witnesses,
71
4.38k
    {
72
        use itertools::Itertools;
73
74
4.38k
        let id = tx.id(chain_id);
75
4.38k
76
4.38k
        let inputs_predicate_offset_at = tx
77
4.38k
            .inputs()
78
4.38k
            .iter()
79
4.38k
            .enumerate()
80
4.38k
            .map(|(i, _)| tx.inputs_predicate_offset_at(i))
81
4.38k
            .collect_vec();
82
4.38k
83
4.38k
        let mut offset = tx.inputs_offset();
84
4.38k
        let mut inputs_offset_at = Vec::new();
85
8.77k
        for (index, input) in tx.inputs().iter().enumerate() {
86
8.77k
            let i = offset;
87
8.77k
            offset = offset
88
8.77k
                .checked_add(input.size())
89
8.77k
                .ok_or(ValidityError::SerializedInputTooLarge { index })?;
90
8.77k
            inputs_offset_at.push(i);
91
        }
92
93
4.38k
        let mut offset = tx.outputs_offset();
94
4.38k
        let mut outputs_offset_at = Vec::new();
95
8.77k
        for (index, output) in tx.outputs().iter().enumerate() {
96
8.77k
            let i = offset;
97
8.77k
            offset = offset
98
8.77k
                .checked_add(output.size())
99
8.77k
                .ok_or(ValidityError::SerializedOutputTooLarge { index })?;
100
8.77k
            outputs_offset_at.push(i);
101
        }
102
103
4.38k
        let mut offset = tx.witnesses_offset();
104
4.38k
        let mut witnesses_offset_at = Vec::new();
105
4.38k
        for (index, witnesses) in tx.witnesses().iter().enumerate() {
106
4.38k
            let i = offset;
107
4.38k
            offset = offset
108
4.38k
                .checked_add(witnesses.size())
109
4.38k
                .ok_or(ValidityError::SerializedWitnessTooLarge { index })?;
110
4.38k
            witnesses_offset_at.push(i);
111
        }
112
113
4.38k
        Ok(Self {
114
4.38k
            id,
115
4.38k
            inputs_offset: tx.inputs_offset(),
116
4.38k
            inputs_offset_at,
117
4.38k
            inputs_predicate_offset_at,
118
4.38k
            outputs_offset: tx.outputs_offset(),
119
4.38k
            outputs_offset_at,
120
4.38k
            witnesses_offset: tx.witnesses_offset(),
121
4.38k
            witnesses_offset_at,
122
4.38k
        })
123
4.38k
    }
Unexecuted instantiation: _RINvMs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8metadataNtB5_14CommonMetadata7computeINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtB1p_6upload10UploadBodyNtB2n_14UploadMetadataEEB9_
Unexecuted instantiation: _RINvMs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8metadataNtB5_14CommonMetadata7computeINtNtNtB7_5types22chargeable_transaction21ChargeableTransactionNtNtB1p_7upgrade11UpgradeBodyNtB2n_15UpgradeMetadataEEB9_
124
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/repr.rs
Line
Count
Source
1
use crate::Transaction;
2
3
#[derive(
4
    Debug,
5
    Clone,
6
    PartialEq,
7
    Eq,
8
    Hash,
9
    serde::Serialize,
10
0
    serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction4reprs_1__NtB7_15TransactionReprNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1i_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction4reprs_1__NtBa_15TransactionReprNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1l_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction4reprs_1__NtB8_15TransactionReprNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1j_7Visitor9visit_u64pEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction4reprs_1__NtB8_15TransactionReprNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1j_7Visitor9visit_strpEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction4reprs_1__NtB8_15TransactionReprNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1j_7Visitor11visit_bytespEBc_
Unexecuted instantiation: _RINvXs_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction4reprs_1__NtBa_15TransactionReprNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1j_11deserializepEBe_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction4reprs_1__NtBb_15TransactionReprNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1m_7Visitor10visit_enumpEBf_
11
35.0k
    fuel_types::canonical::Serialize,
_RINvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction4reprs0_1__NtB5_15TransactionReprNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
11
8.77k
    fuel_types::canonical::Serialize,
_RINvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction4reprs0_1__NtB5_15TransactionReprNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
11
8.77k
    fuel_types::canonical::Serialize,
Unexecuted instantiation: _RNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction4reprs0_1__NtB4_15TransactionReprNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_static
Unexecuted instantiation: _RNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction4reprs0_1__NtB4_15TransactionReprNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamic
_RINvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction4reprs0_1__NtB5_15TransactionReprNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB9_
Line
Count
Source
11
8.77k
    fuel_types::canonical::Serialize,
_RINvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction4reprs0_1__NtB5_15TransactionReprNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB9_
Line
Count
Source
11
8.77k
    fuel_types::canonical::Serialize,
12
13.1k
    fuel_types::canonical::Deserialize,
_RINvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction4reprs1_1__NtB5_15TransactionReprNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
12
4.38k
    fuel_types::canonical::Deserialize,
Unexecuted instantiation: _RINvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction4reprs1_1__NtB5_15TransactionReprNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEB9_
_RINvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction4reprs1_1__NtB5_15TransactionReprNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
12
8.77k
    fuel_types::canonical::Deserialize,
Unexecuted instantiation: _RINvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction4reprs1_1__NtB5_15TransactionReprNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEB9_
13
)]
14
#[repr(u64)]
15
pub enum TransactionRepr {
16
    Script = 0x00,
17
    Create = 0x01,
18
    Mint = 0x02,
19
    Upgrade = 0x03,
20
    Upload = 0x04,
21
    Blob = 0x05,
22
}
23
24
impl From<&Transaction> for TransactionRepr {
25
0
    fn from(tx: &Transaction) -> Self {
26
0
        match tx {
27
0
            Transaction::Script { .. } => Self::Script,
28
0
            Transaction::Create { .. } => Self::Create,
29
0
            Transaction::Mint { .. } => Self::Mint,
30
0
            Transaction::Upgrade { .. } => Self::Upgrade,
31
0
            Transaction::Upload { .. } => Self::Upload,
32
0
            Transaction::Blob { .. } => Self::Blob,
33
        }
34
0
    }
35
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/types.rs
Line
Count
Source
1
mod blob;
2
mod chargeable_transaction;
3
mod create;
4
pub mod input;
5
mod mint;
6
pub mod output;
7
mod script;
8
mod storage;
9
mod upgrade;
10
mod upload;
11
mod utxo_id;
12
mod witness;
13
14
pub use blob::{
15
    Blob,
16
    BlobBody,
17
    BlobIdExt,
18
    BlobMetadata,
19
};
20
pub use chargeable_transaction::{
21
    ChargeableMetadata,
22
    ChargeableTransaction,
23
};
24
pub use create::{
25
    Create,
26
    CreateBody,
27
    CreateMetadata,
28
};
29
pub use mint::Mint;
30
pub use script::{
31
    Script,
32
    ScriptBody,
33
    ScriptCode,
34
};
35
pub use storage::StorageSlot;
36
pub use upgrade::{
37
    Upgrade,
38
    UpgradeBody,
39
    UpgradeMetadata,
40
    UpgradePurpose,
41
};
42
pub use upload::{
43
    Upload,
44
    UploadBody,
45
    UploadMetadata,
46
    UploadSubsection,
47
};
48
pub use utxo_id::UtxoId;
49
pub use witness::Witness;
50
51
#[cfg(feature = "da-compression")]
52
pub use self::{
53
    mint::CompressedMint,
54
    utxo_id::CompressedUtxoId,
55
};
56
57
13.1k
pub fn compute_transaction_id<T: fuel_types::canonical::Serialize>(
58
13.1k
    chain_id: &fuel_types::ChainId,
59
13.1k
    tx: &mut T,
60
13.1k
) -> crate::TxId {
61
13.1k
    let mut hasher = fuel_crypto::Hasher::default();
62
13.1k
    // chain ID
63
13.1k
    hasher.input(chain_id.to_be_bytes());
64
13.1k
    // transaction bytes
65
13.1k
    hasher.input(tx.to_bytes().as_slice());
66
13.1k
    hasher.finalize()
67
13.1k
}
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22compute_transaction_idINtNtB2_22chargeable_transaction21ChargeableTransactionNtNtB2_4blob8BlobBodyNtB24_12BlobMetadataEECsg6P9hFxt0iW_7fuel_vm
_RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22compute_transaction_idINtNtB2_22chargeable_transaction21ChargeableTransactionNtNtB2_6create10CreateBodyNtB24_14CreateMetadataEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
57
2.19k
pub fn compute_transaction_id<T: fuel_types::canonical::Serialize>(
58
2.19k
    chain_id: &fuel_types::ChainId,
59
2.19k
    tx: &mut T,
60
2.19k
) -> crate::TxId {
61
2.19k
    let mut hasher = fuel_crypto::Hasher::default();
62
2.19k
    // chain ID
63
2.19k
    hasher.input(chain_id.to_be_bytes());
64
2.19k
    // transaction bytes
65
2.19k
    hasher.input(tx.to_bytes().as_slice());
66
2.19k
    hasher.finalize()
67
2.19k
}
_RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22compute_transaction_idINtNtB2_22chargeable_transaction21ChargeableTransactionNtNtB2_6script10ScriptBodyNtB24_14ScriptMetadataEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
57
2.19k
pub fn compute_transaction_id<T: fuel_types::canonical::Serialize>(
58
2.19k
    chain_id: &fuel_types::ChainId,
59
2.19k
    tx: &mut T,
60
2.19k
) -> crate::TxId {
61
2.19k
    let mut hasher = fuel_crypto::Hasher::default();
62
2.19k
    // chain ID
63
2.19k
    hasher.input(chain_id.to_be_bytes());
64
2.19k
    // transaction bytes
65
2.19k
    hasher.input(tx.to_bytes().as_slice());
66
2.19k
    hasher.finalize()
67
2.19k
}
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22compute_transaction_idINtNtB2_22chargeable_transaction21ChargeableTransactionNtNtB2_6upload10UploadBodyNtB24_14UploadMetadataEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22compute_transaction_idINtNtB2_22chargeable_transaction21ChargeableTransactionNtNtB2_7upgrade11UpgradeBodyNtB24_15UpgradeMetadataEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22compute_transaction_idINtNtB2_22chargeable_transaction21ChargeableTransactionNtNtB2_4blob8BlobBodyNtB24_12BlobMetadataEEB6_
_RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22compute_transaction_idINtNtB2_22chargeable_transaction21ChargeableTransactionNtNtB2_6create10CreateBodyNtB24_14CreateMetadataEEB6_
Line
Count
Source
57
4.38k
pub fn compute_transaction_id<T: fuel_types::canonical::Serialize>(
58
4.38k
    chain_id: &fuel_types::ChainId,
59
4.38k
    tx: &mut T,
60
4.38k
) -> crate::TxId {
61
4.38k
    let mut hasher = fuel_crypto::Hasher::default();
62
4.38k
    // chain ID
63
4.38k
    hasher.input(chain_id.to_be_bytes());
64
4.38k
    // transaction bytes
65
4.38k
    hasher.input(tx.to_bytes().as_slice());
66
4.38k
    hasher.finalize()
67
4.38k
}
_RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22compute_transaction_idINtNtB2_22chargeable_transaction21ChargeableTransactionNtNtB2_6script10ScriptBodyNtB24_14ScriptMetadataEEB6_
Line
Count
Source
57
4.38k
pub fn compute_transaction_id<T: fuel_types::canonical::Serialize>(
58
4.38k
    chain_id: &fuel_types::ChainId,
59
4.38k
    tx: &mut T,
60
4.38k
) -> crate::TxId {
61
4.38k
    let mut hasher = fuel_crypto::Hasher::default();
62
4.38k
    // chain ID
63
4.38k
    hasher.input(chain_id.to_be_bytes());
64
4.38k
    // transaction bytes
65
4.38k
    hasher.input(tx.to_bytes().as_slice());
66
4.38k
    hasher.finalize()
67
4.38k
}
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22compute_transaction_idINtNtB2_22chargeable_transaction21ChargeableTransactionNtNtB2_6upload10UploadBodyNtB24_14UploadMetadataEEB6_
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22compute_transaction_idINtNtB2_22chargeable_transaction21ChargeableTransactionNtNtB2_7upgrade11UpgradeBodyNtB24_15UpgradeMetadataEEB6_
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22compute_transaction_idNtNtB2_4mint4MintEB6_
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/validity.rs
Line
Count
Source
1
use crate::{
2
    field::Maturity,
3
    input::{
4
        coin::{
5
            CoinPredicate,
6
            CoinSigned,
7
        },
8
        message::{
9
            MessageCoinPredicate,
10
            MessageCoinSigned,
11
            MessageDataPredicate,
12
            MessageDataSigned,
13
        },
14
    },
15
    output,
16
    policies::PolicyType,
17
    transaction::{
18
        consensus_parameters::{
19
            PredicateParameters,
20
            TxParameters,
21
        },
22
        field,
23
        Executable,
24
    },
25
    Chargeable,
26
    ConsensusParameters,
27
    Input,
28
    Output,
29
    Transaction,
30
    Witness,
31
};
32
use core::hash::Hash;
33
use fuel_types::{
34
    canonical,
35
    canonical::Serialize,
36
    Address,
37
    BlockHeight,
38
    Bytes32,
39
    ChainId,
40
};
41
use hashbrown::HashMap;
42
use itertools::Itertools;
43
44
mod error;
45
46
#[cfg(test)]
47
mod tests;
48
49
pub use error::ValidityError;
50
51
impl Input {
52
0
    pub fn check(
53
0
        &self,
54
0
        index: usize,
55
0
        txhash: &Bytes32,
56
0
        outputs: &[Output],
57
0
        witnesses: &[Witness],
58
0
        predicate_params: &PredicateParameters,
59
0
        recovery_cache: &mut Option<HashMap<u16, Address>>,
60
0
    ) -> Result<(), ValidityError> {
61
0
        self.check_without_signature(index, outputs, witnesses, predicate_params)?;
62
0
        self.check_signature(index, txhash, witnesses, recovery_cache)?;
63
64
0
        Ok(())
65
0
    }
66
67
6.57k
    pub fn check_signature(
68
6.57k
        &self,
69
6.57k
        index: usize,
70
6.57k
        txhash: &Bytes32,
71
6.57k
        witnesses: &[Witness],
72
6.57k
        recovery_cache: &mut Option<HashMap<u16, Address>>,
73
6.57k
    ) -> Result<(), ValidityError> {
74
0
        match self {
75
            Self::CoinSigned(CoinSigned {
76
4.38k
                witness_index,
77
4.38k
                owner,
78
                ..
79
            })
80
            | Self::MessageCoinSigned(MessageCoinSigned {
81
0
                witness_index,
82
0
                recipient: owner,
83
                ..
84
            })
85
            | Self::MessageDataSigned(MessageDataSigned {
86
0
                witness_index,
87
0
                recipient: owner,
88
                ..
89
            }) => {
90
                // Helper function for recovering the address from a witness
91
4.38k
                let recover_address = || -> Result<Address, ValidityError> {
92
4.38k
                    let witness = witnesses
93
4.38k
                        .get(*witness_index as usize)
94
4.38k
                        .ok_or(ValidityError::InputWitnessIndexBounds { index })?;
95
96
4.38k
                    witness.recover_witness(txhash, index)
97
4.38k
                };
98
99
                // recover the address associated with a witness, using the cache if
100
                // available
101
4.38k
                let recovered_address = if let Some(cache) = recovery_cache {
102
4.38k
                    if let Some(recovered_address) = cache.get(witness_index) {
103
0
                        *recovered_address
104
                    } else {
105
                        // if this witness hasn't been recovered before,
106
                        // cache ecrecover by witness index
107
4.38k
                        let recovered_address = recover_address()?;
108
4.38k
                        cache.insert(*witness_index, recovered_address);
109
4.38k
                        recovered_address
110
                    }
111
                } else {
112
0
                    recover_address()?
113
                };
114
115
4.38k
                if owner != &recovered_address {
116
0
                    return Err(ValidityError::InputInvalidSignature { index });
117
4.38k
                }
118
4.38k
119
4.38k
                Ok(())
120
            }
121
122
            Self::CoinPredicate(CoinPredicate {
123
0
                owner, predicate, ..
124
            })
125
            | Self::MessageCoinPredicate(MessageCoinPredicate {
126
0
                recipient: owner,
127
0
                predicate,
128
                ..
129
            })
130
            | Self::MessageDataPredicate(MessageDataPredicate {
131
0
                recipient: owner,
132
0
                predicate,
133
                ..
134
0
            }) if !Input::is_predicate_owner_valid(owner, &**predicate) => {
135
0
                Err(ValidityError::InputPredicateOwner { index })
136
            }
137
138
2.19k
            _ => Ok(()),
139
        }
140
6.57k
    }
141
142
6.57k
    pub fn check_without_signature(
143
6.57k
        &self,
144
6.57k
        index: usize,
145
6.57k
        outputs: &[Output],
146
6.57k
        witnesses: &[Witness],
147
6.57k
        predicate_params: &PredicateParameters,
148
6.57k
    ) -> Result<(), ValidityError> {
149
4.38k
        match self {
150
0
            Self::CoinPredicate(CoinPredicate { predicate, .. })
151
0
            | Self::MessageCoinPredicate(MessageCoinPredicate { predicate, .. })
152
0
            | Self::MessageDataPredicate(MessageDataPredicate { predicate, .. })
153
0
                if predicate.is_empty() =>
154
            {
155
0
                Err(ValidityError::InputPredicateEmpty { index })
156
            }
157
158
0
            Self::CoinPredicate(CoinPredicate { predicate, .. })
159
0
            | Self::MessageCoinPredicate(MessageCoinPredicate { predicate, .. })
160
0
            | Self::MessageDataPredicate(MessageDataPredicate { predicate, .. })
161
0
                if predicate.len() as u64 > predicate_params.max_predicate_length() =>
162
            {
163
0
                Err(ValidityError::InputPredicateLength { index })
164
            }
165
166
0
            Self::CoinPredicate(CoinPredicate { predicate_data, .. })
167
            | Self::MessageCoinPredicate(MessageCoinPredicate {
168
0
                predicate_data, ..
169
            })
170
            | Self::MessageDataPredicate(MessageDataPredicate {
171
0
                predicate_data, ..
172
0
            }) if predicate_data.len() as u64
173
0
                > predicate_params.max_predicate_data_length() =>
174
            {
175
0
                Err(ValidityError::InputPredicateDataLength { index })
176
            }
177
178
4.38k
            Self::CoinSigned(CoinSigned { witness_index, .. })
179
0
            | Self::MessageCoinSigned(MessageCoinSigned { witness_index, .. })
180
0
            | Self::MessageDataSigned(MessageDataSigned { witness_index, .. })
181
4.38k
                if *witness_index as usize >= witnesses.len() =>
182
            {
183
0
                Err(ValidityError::InputWitnessIndexBounds { index })
184
            }
185
186
            // ∀ inputContract ∃! outputContract : outputContract.inputIndex =
187
            // inputContract.index
188
            Self::Contract { .. }
189
2.19k
                if 1 != outputs
190
2.19k
                    .iter()
191
4.38k
                    .filter_map(|output| match output {
192
2.19k
                        Output::Contract(output::contract::Contract {
193
2.19k
                            input_index,
194
2.19k
                            ..
195
2.19k
                        }) if *input_index as usize == index => Some(()),
196
2.19k
                        _ => None,
197
4.38k
                    })
198
0
                    .count() =>
199
0
            {
200
0
                Err(ValidityError::InputContractAssociatedOutputContract { index })
201
            }
202
203
0
            Self::MessageDataSigned(MessageDataSigned { data, .. })
204
0
            | Self::MessageDataPredicate(MessageDataPredicate { data, .. })
205
0
                if data.is_empty()
206
0
                    || data.len() as u64 > predicate_params.max_message_data_length() =>
207
            {
208
0
                Err(ValidityError::InputMessageDataLength { index })
209
            }
210
211
            // TODO: If h is the block height the UTXO being spent was created,
212
            // transaction is  invalid if `blockheight() < h + maturity`.
213
6.57k
            _ => Ok(()),
214
        }
215
6.57k
    }
216
}
217
218
impl Output {
219
    /// Validate the output of the transaction.
220
    ///
221
    /// This function is stateful - meaning it might validate a transaction during VM
222
    /// initialization, but this transaction will no longer be valid in post-execution
223
    /// because the VM might mutate the message outputs, producing invalid
224
    /// transactions.
225
6.57k
    pub fn check(&self, index: usize, inputs: &[Input]) -> Result<(), ValidityError> {
226
6.57k
        match self {
227
2.19k
            Self::Contract(output::contract::Contract { input_index, .. }) => {
228
2.19k
                match inputs.get(*input_index as usize) {
229
2.19k
                    Some(Input::Contract { .. }) => Ok(()),
230
0
                    _ => Err(ValidityError::OutputContractInputIndex { index }),
231
                }
232
            }
233
234
4.38k
            _ => Ok(()),
235
        }
236
6.57k
    }
_RNvMs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8validityNtNtNtB6_5types6output6Output5checkCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
225
6.57k
    pub fn check(&self, index: usize, inputs: &[Input]) -> Result<(), ValidityError> {
226
6.57k
        match self {
227
2.19k
            Self::Contract(output::contract::Contract { input_index, .. }) => {
228
2.19k
                match inputs.get(*input_index as usize) {
229
2.19k
                    Some(Input::Contract { .. }) => Ok(()),
230
0
                    _ => Err(ValidityError::OutputContractInputIndex { index }),
231
                }
232
            }
233
234
4.38k
            _ => Ok(()),
235
        }
236
6.57k
    }
Unexecuted instantiation: _RNvMs_NtNtCseSMGV7FMBK4_7fuel_tx11transaction8validityNtNtNtB6_5types6output6Output5checkB8_
237
}
238
239
/// Contains logic for stateless validations that don't result in any reusable metadata
240
/// such as spendable input balances or remaining gas. Primarily involves validating that
241
/// transaction fields are correctly formatted and signed.
242
pub trait FormatValidityChecks {
243
    /// Performs all stateless transaction validity checks. This includes the validity
244
    /// of fields according to rules in the specification and validity of signatures.
245
0
    fn check(
246
0
        &self,
247
0
        block_height: BlockHeight,
248
0
        consensus_params: &ConsensusParameters,
249
0
    ) -> Result<(), ValidityError> {
250
0
        self.check_without_signatures(block_height, consensus_params)?;
251
0
        self.check_signatures(&consensus_params.chain_id())?;
252
253
0
        Ok(())
254
0
    }
Unexecuted instantiation: _RNvYNtNtCseSMGV7FMBK4_7fuel_tx11transaction11TransactionNtNtB4_8validity20FormatValidityChecks5checkB6_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mint4MintNtNtB8_8validity20FormatValidityChecks5checkBa_
255
256
    /// Validates that all required signatures are set in the transaction and that they
257
    /// are valid.
258
    fn check_signatures(&self, chain_id: &ChainId) -> Result<(), ValidityError>;
259
260
    /// Validates the transactions according to rules from the specification:
261
    /// <https://github.com/FuelLabs/fuel-specs/blob/master/src/tx-format/transaction.md>
262
    fn check_without_signatures(
263
        &self,
264
        block_height: BlockHeight,
265
        consensus_params: &ConsensusParameters,
266
    ) -> Result<(), ValidityError>;
267
}
268
269
impl FormatValidityChecks for Transaction {
270
0
    fn check_signatures(&self, chain_id: &ChainId) -> Result<(), ValidityError> {
271
0
        match self {
272
0
            Self::Script(tx) => tx.check_signatures(chain_id),
273
0
            Self::Create(tx) => tx.check_signatures(chain_id),
274
0
            Self::Mint(tx) => tx.check_signatures(chain_id),
275
0
            Self::Upgrade(tx) => tx.check_signatures(chain_id),
276
0
            Self::Upload(tx) => tx.check_signatures(chain_id),
277
0
            Self::Blob(tx) => tx.check_signatures(chain_id),
278
        }
279
0
    }
280
281
0
    fn check_without_signatures(
282
0
        &self,
283
0
        block_height: BlockHeight,
284
0
        consensus_params: &ConsensusParameters,
285
0
    ) -> Result<(), ValidityError> {
286
0
        match self {
287
0
            Self::Script(tx) => {
288
0
                tx.check_without_signatures(block_height, consensus_params)
289
            }
290
0
            Self::Create(tx) => {
291
0
                tx.check_without_signatures(block_height, consensus_params)
292
            }
293
0
            Self::Mint(tx) => tx.check_without_signatures(block_height, consensus_params),
294
0
            Self::Upgrade(tx) => {
295
0
                tx.check_without_signatures(block_height, consensus_params)
296
            }
297
0
            Self::Upload(tx) => {
298
0
                tx.check_without_signatures(block_height, consensus_params)
299
            }
300
0
            Self::Blob(tx) => tx.check_without_signatures(block_height, consensus_params),
301
        }
302
0
    }
303
}
304
305
/// Validates the size of the transaction in bytes. Transactions cannot exceed
306
/// the total size specified by the transaction parameters. The size of a
307
/// transaction is calculated as the sum of the sizes of its static and dynamic
308
/// parts.
309
4.38k
pub(crate) fn check_size<T>(tx: &T, tx_params: &TxParameters) -> Result<(), ValidityError>
310
4.38k
where
311
4.38k
    T: canonical::Serialize,
312
4.38k
{
313
4.38k
    if tx.size() as u64 > tx_params.max_size() {
314
0
        Err(ValidityError::TransactionSizeLimitExceeded)?;
315
4.38k
    }
316
317
4.38k
    Ok(())
318
4.38k
}
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity10check_sizeINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtB15_4blob8BlobBodyNtB23_12BlobMetadataEECsg6P9hFxt0iW_7fuel_vm
_RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity10check_sizeINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtB15_6create10CreateBodyNtB23_14CreateMetadataEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
309
2.19k
pub(crate) fn check_size<T>(tx: &T, tx_params: &TxParameters) -> Result<(), ValidityError>
310
2.19k
where
311
2.19k
    T: canonical::Serialize,
312
2.19k
{
313
2.19k
    if tx.size() as u64 > tx_params.max_size() {
314
0
        Err(ValidityError::TransactionSizeLimitExceeded)?;
315
2.19k
    }
316
317
2.19k
    Ok(())
318
2.19k
}
_RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity10check_sizeINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtB15_6script10ScriptBodyNtB23_14ScriptMetadataEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
309
2.19k
pub(crate) fn check_size<T>(tx: &T, tx_params: &TxParameters) -> Result<(), ValidityError>
310
2.19k
where
311
2.19k
    T: canonical::Serialize,
312
2.19k
{
313
2.19k
    if tx.size() as u64 > tx_params.max_size() {
314
0
        Err(ValidityError::TransactionSizeLimitExceeded)?;
315
2.19k
    }
316
317
2.19k
    Ok(())
318
2.19k
}
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity10check_sizeINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtB15_6upload10UploadBodyNtB23_14UploadMetadataEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity10check_sizeINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtB15_7upgrade11UpgradeBodyNtB23_15UpgradeMetadataEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity10check_sizeINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtB15_4blob8BlobBodyNtB23_12BlobMetadataEEB6_
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity10check_sizeINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtB15_6create10CreateBodyNtB23_14CreateMetadataEEB6_
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity10check_sizeINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtB15_6script10ScriptBodyNtB23_14ScriptMetadataEEB6_
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity10check_sizeINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtB15_6upload10UploadBodyNtB23_14UploadMetadataEEB6_
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity10check_sizeINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtB15_7upgrade11UpgradeBodyNtB23_15UpgradeMetadataEEB6_
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity10check_sizeNtNtNtB4_5types4mint4MintEB6_
319
320
4.38k
pub(crate) fn check_common_part<T>(
321
4.38k
    tx: &T,
322
4.38k
    block_height: BlockHeight,
323
4.38k
    consensus_params: &ConsensusParameters,
324
4.38k
) -> Result<(), ValidityError>
325
4.38k
where
326
4.38k
    T: canonical::Serialize + Chargeable + field::Outputs,
327
4.38k
{
328
4.38k
    let tx_params = consensus_params.tx_params();
329
4.38k
    let predicate_params = consensus_params.predicate_params();
330
4.38k
    let base_asset_id = consensus_params.base_asset_id();
331
4.38k
    let gas_costs = consensus_params.gas_costs();
332
4.38k
    let fee_params = consensus_params.fee_params();
333
4.38k
334
4.38k
    check_size(tx, tx_params)?;
335
336
4.38k
    if !tx.policies().is_valid() {
337
0
        Err(ValidityError::TransactionPoliciesAreInvalid)?
338
4.38k
    }
339
340
4.38k
    if let Some(witness_limit) = tx.policies().get(PolicyType::WitnessLimit) {
341
0
        let witness_size = tx.witnesses().size_dynamic();
342
0
        if witness_size as u64 > witness_limit {
343
0
            Err(ValidityError::TransactionWitnessLimitExceeded)?
344
0
        }
345
4.38k
    }
346
347
4.38k
    let max_gas = tx.max_gas(gas_costs, fee_params);
348
4.38k
    if max_gas > tx_params.max_gas_per_tx() {
349
0
        Err(ValidityError::TransactionMaxGasExceeded)?
350
4.38k
    }
351
352
4.38k
    if !tx.policies().is_set(PolicyType::MaxFee) {
353
0
        Err(ValidityError::TransactionMaxFeeNotSet)?
354
4.38k
    };
355
356
4.38k
    if tx.maturity() > block_height {
357
0
        Err(ValidityError::TransactionMaturity)?;
358
4.38k
    }
359
360
4.38k
    if tx.inputs().len() > tx_params.max_inputs() as usize {
361
0
        Err(ValidityError::TransactionInputsMax)?
362
4.38k
    }
363
364
4.38k
    if tx.outputs().len() > tx_params.max_outputs() as usize {
365
0
        Err(ValidityError::TransactionOutputsMax)?
366
4.38k
    }
367
368
4.38k
    if tx.witnesses().len() > tx_params.max_witnesses() as usize {
369
0
        Err(ValidityError::TransactionWitnessesMax)?
370
4.38k
    }
371
372
4.38k
    let any_spendable_input = tx.inputs().iter().find(|input| match input {
373
        Input::CoinSigned(_)
374
        | Input::CoinPredicate(_)
375
        | Input::MessageCoinSigned(_)
376
4.38k
        | Input::MessageCoinPredicate(_) => true,
377
        Input::MessageDataSigned(_)
378
        | Input::MessageDataPredicate(_)
379
0
        | Input::Contract(_) => false,
380
4.38k
    });
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2c_12BlobMetadataEE0Csg6P9hFxt0iW_7fuel_vm
_RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2c_14CreateMetadataEE0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
372
2.19k
    let any_spendable_input = tx.inputs().iter().find(|input| match input {
373
        Input::CoinSigned(_)
374
        | Input::CoinPredicate(_)
375
        | Input::MessageCoinSigned(_)
376
2.19k
        | Input::MessageCoinPredicate(_) => true,
377
        Input::MessageDataSigned(_)
378
        | Input::MessageDataPredicate(_)
379
0
        | Input::Contract(_) => false,
380
2.19k
    });
_RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2c_14ScriptMetadataEE0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
372
2.19k
    let any_spendable_input = tx.inputs().iter().find(|input| match input {
373
        Input::CoinSigned(_)
374
        | Input::CoinPredicate(_)
375
        | Input::MessageCoinSigned(_)
376
2.19k
        | Input::MessageCoinPredicate(_) => true,
377
        Input::MessageDataSigned(_)
378
        | Input::MessageDataPredicate(_)
379
0
        | Input::Contract(_) => false,
380
2.19k
    });
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2c_14UploadMetadataEE0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2c_15UpgradeMetadataEE0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2c_12BlobMetadataEE0B8_
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2c_14CreateMetadataEE0B8_
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2c_14ScriptMetadataEE0B8_
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2c_14UploadMetadataEE0B8_
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2c_15UpgradeMetadataEE0B8_
381
4.38k
382
4.38k
    if any_spendable_input.is_none() {
383
0
        Err(ValidityError::NoSpendableInput)?
384
4.38k
    }
385
386
4.38k
    tx.input_asset_ids_unique(base_asset_id)
387
4.38k
        .try_for_each(|input_asset_id| {
388
4.38k
            // check for duplicate change outputs
389
4.38k
            if tx
390
4.38k
                .outputs()
391
4.38k
                .iter()
392
6.57k
                .filter_map(|output| match output {
393
2.19k
                    Output::Change { asset_id, .. } if input_asset_id == asset_id => {
394
2.19k
                        Some(())
395
                    }
396
4.38k
                    _ => None,
397
6.57k
                })
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_4blob8BlobBodyNtB2e_12BlobMetadataEEs_00Csg6P9hFxt0iW_7fuel_vm
_RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_6create10CreateBodyNtB2e_14CreateMetadataEEs_00Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
392
2.19k
                .filter_map(|output| match output {
393
0
                    Output::Change { asset_id, .. } if input_asset_id == asset_id => {
394
0
                        Some(())
395
                    }
396
2.19k
                    _ => None,
397
2.19k
                })
_RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_6script10ScriptBodyNtB2e_14ScriptMetadataEEs_00Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
392
4.38k
                .filter_map(|output| match output {
393
2.19k
                    Output::Change { asset_id, .. } if input_asset_id == asset_id => {
394
2.19k
                        Some(())
395
                    }
396
2.19k
                    _ => None,
397
4.38k
                })
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_6upload10UploadBodyNtB2e_14UploadMetadataEEs_00Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_7upgrade11UpgradeBodyNtB2e_15UpgradeMetadataEEs_00Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_4blob8BlobBodyNtB2e_12BlobMetadataEEs_00Ba_
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_6create10CreateBodyNtB2e_14CreateMetadataEEs_00Ba_
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_6script10ScriptBodyNtB2e_14ScriptMetadataEEs_00Ba_
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_6upload10UploadBodyNtB2e_14UploadMetadataEEs_00Ba_
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_7upgrade11UpgradeBodyNtB2e_15UpgradeMetadataEEs_00Ba_
398
4.38k
                .count()
399
4.38k
                > 1
400
            {
401
0
                return Err(ValidityError::TransactionOutputChangeAssetIdDuplicated(
402
0
                    *input_asset_id,
403
0
                ));
404
4.38k
            }
405
4.38k
406
4.38k
            Ok(())
407
4.38k
        })?;
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2c_12BlobMetadataEEs_0Csg6P9hFxt0iW_7fuel_vm
_RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2c_14CreateMetadataEEs_0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
387
2.19k
        .try_for_each(|input_asset_id| {
388
2.19k
            // check for duplicate change outputs
389
2.19k
            if tx
390
2.19k
                .outputs()
391
2.19k
                .iter()
392
2.19k
                .filter_map(|output| match output {
393
                    Output::Change { asset_id, .. } if input_asset_id == asset_id => {
394
                        Some(())
395
                    }
396
                    _ => None,
397
2.19k
                })
398
2.19k
                .count()
399
2.19k
                > 1
400
            {
401
0
                return Err(ValidityError::TransactionOutputChangeAssetIdDuplicated(
402
0
                    *input_asset_id,
403
0
                ));
404
2.19k
            }
405
2.19k
406
2.19k
            Ok(())
407
2.19k
        })?;
_RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2c_14ScriptMetadataEEs_0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
387
2.19k
        .try_for_each(|input_asset_id| {
388
2.19k
            // check for duplicate change outputs
389
2.19k
            if tx
390
2.19k
                .outputs()
391
2.19k
                .iter()
392
2.19k
                .filter_map(|output| match output {
393
                    Output::Change { asset_id, .. } if input_asset_id == asset_id => {
394
                        Some(())
395
                    }
396
                    _ => None,
397
2.19k
                })
398
2.19k
                .count()
399
2.19k
                > 1
400
            {
401
0
                return Err(ValidityError::TransactionOutputChangeAssetIdDuplicated(
402
0
                    *input_asset_id,
403
0
                ));
404
2.19k
            }
405
2.19k
406
2.19k
            Ok(())
407
2.19k
        })?;
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2c_14UploadMetadataEEs_0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2c_15UpgradeMetadataEEs_0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2c_12BlobMetadataEEs_0B8_
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2c_14CreateMetadataEEs_0B8_
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2c_14ScriptMetadataEEs_0B8_
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2c_14UploadMetadataEEs_0B8_
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2c_15UpgradeMetadataEEs_0B8_
408
409
    // Check for duplicated input utxo id
410
4.38k
    let duplicated_utxo_id = tx
411
4.38k
        .inputs()
412
4.38k
        .iter()
413
6.57k
        .filter_map(|i| i.is_coin().then(|| i.utxo_id()).flatten());
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2c_12BlobMetadataEEs0_0Csg6P9hFxt0iW_7fuel_vm
_RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2c_14CreateMetadataEEs0_0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
413
2.19k
        .filter_map(|i| i.is_coin().then(|| i.utxo_id()).flatten());
_RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2c_14ScriptMetadataEEs0_0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
413
4.38k
        .filter_map(|i| i.is_coin().then(|| i.utxo_id()).flatten());
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2c_14UploadMetadataEEs0_0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2c_15UpgradeMetadataEEs0_0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2c_12BlobMetadataEEs0_0B8_
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2c_14CreateMetadataEEs0_0B8_
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2c_14ScriptMetadataEEs0_0B8_
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2c_14UploadMetadataEEs0_0B8_
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2c_15UpgradeMetadataEEs0_0B8_
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_4blob8BlobBodyNtB2e_12BlobMetadataEEs0_00Csg6P9hFxt0iW_7fuel_vm
_RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_6create10CreateBodyNtB2e_14CreateMetadataEEs0_00Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
413
2.19k
        .filter_map(|i| i.is_coin().then(|| i.utxo_id()).flatten());
_RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_6script10ScriptBodyNtB2e_14ScriptMetadataEEs0_00Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
413
2.19k
        .filter_map(|i| i.is_coin().then(|| i.utxo_id()).flatten());
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_6upload10UploadBodyNtB2e_14UploadMetadataEEs0_00Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_7upgrade11UpgradeBodyNtB2e_15UpgradeMetadataEEs0_00Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_4blob8BlobBodyNtB2e_12BlobMetadataEEs0_00Ba_
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_6create10CreateBodyNtB2e_14CreateMetadataEEs0_00Ba_
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_6script10ScriptBodyNtB2e_14ScriptMetadataEEs0_00Ba_
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_6upload10UploadBodyNtB2e_14UploadMetadataEEs0_00Ba_
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_7upgrade11UpgradeBodyNtB2e_15UpgradeMetadataEEs0_00Ba_
414
415
4.38k
    if let Some(utxo_id) = next_duplicate(duplicated_utxo_id).copied() {
416
0
        return Err(ValidityError::DuplicateInputUtxoId { utxo_id });
417
4.38k
    }
418
4.38k
419
4.38k
    // Check for duplicated input contract id
420
4.38k
    let duplicated_contract_id = tx.inputs().iter().filter_map(Input::contract_id);
421
422
4.38k
    if let Some(contract_id) = next_duplicate(duplicated_contract_id).copied() {
423
0
        return Err(ValidityError::DuplicateInputContractId { contract_id });
424
4.38k
    }
425
4.38k
426
4.38k
    // Check for duplicated input message id
427
4.38k
    let duplicated_message_id = tx.inputs().iter().filter_map(Input::message_id);
428
4.38k
    if let Some(message_id) = next_duplicate(duplicated_message_id) {
429
0
        return Err(ValidityError::DuplicateMessageInputId { message_id });
430
4.38k
    }
431
4.38k
432
4.38k
    // Validate the inputs without checking signature
433
4.38k
    tx.inputs()
434
4.38k
        .iter()
435
4.38k
        .enumerate()
436
6.57k
        .try_for_each(|(index, input)| {
437
6.57k
            input.check_without_signature(
438
6.57k
                index,
439
6.57k
                tx.outputs(),
440
6.57k
                tx.witnesses(),
441
6.57k
                predicate_params,
442
6.57k
            )
443
6.57k
        })?;
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2c_12BlobMetadataEEs1_0Csg6P9hFxt0iW_7fuel_vm
_RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2c_14CreateMetadataEEs1_0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
436
2.19k
        .try_for_each(|(index, input)| {
437
2.19k
            input.check_without_signature(
438
2.19k
                index,
439
2.19k
                tx.outputs(),
440
2.19k
                tx.witnesses(),
441
2.19k
                predicate_params,
442
2.19k
            )
443
2.19k
        })?;
_RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2c_14ScriptMetadataEEs1_0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
436
4.38k
        .try_for_each(|(index, input)| {
437
4.38k
            input.check_without_signature(
438
4.38k
                index,
439
4.38k
                tx.outputs(),
440
4.38k
                tx.witnesses(),
441
4.38k
                predicate_params,
442
4.38k
            )
443
4.38k
        })?;
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2c_14UploadMetadataEEs1_0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2c_15UpgradeMetadataEEs1_0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2c_12BlobMetadataEEs1_0B8_
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2c_14CreateMetadataEEs1_0B8_
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2c_14ScriptMetadataEEs1_0B8_
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2c_14UploadMetadataEEs1_0B8_
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2c_15UpgradeMetadataEEs1_0B8_
444
445
4.38k
    tx.outputs()
446
4.38k
        .iter()
447
4.38k
        .enumerate()
448
6.57k
        .try_for_each(|(index, output)| {
449
6.57k
            output.check(index, tx.inputs())?;
450
451
6.57k
            if let Output::Change { asset_id, .. } = output {
452
2.19k
                if !tx
453
2.19k
                    .input_asset_ids(base_asset_id)
454
2.19k
                    .any(|input_asset_id| input_asset_id == asset_id)
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_4blob8BlobBodyNtB2e_12BlobMetadataEEs2_00Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_6create10CreateBodyNtB2e_14CreateMetadataEEs2_00Csg6P9hFxt0iW_7fuel_vm
_RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_6script10ScriptBodyNtB2e_14ScriptMetadataEEs2_00Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
454
2.19k
                    .any(|input_asset_id| input_asset_id == asset_id)
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_6upload10UploadBodyNtB2e_14UploadMetadataEEs2_00Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_7upgrade11UpgradeBodyNtB2e_15UpgradeMetadataEEs2_00Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_4blob8BlobBodyNtB2e_12BlobMetadataEEs2_00Ba_
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_6create10CreateBodyNtB2e_14CreateMetadataEEs2_00Ba_
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_6script10ScriptBodyNtB2e_14ScriptMetadataEEs2_00Ba_
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_6upload10UploadBodyNtB2e_14UploadMetadataEEs2_00Ba_
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_7upgrade11UpgradeBodyNtB2e_15UpgradeMetadataEEs2_00Ba_
455
                {
456
0
                    return Err(ValidityError::TransactionOutputChangeAssetIdNotFound(
457
0
                        *asset_id,
458
0
                    ));
459
2.19k
                }
460
4.38k
            }
461
462
6.57k
            if let Output::Coin { asset_id, .. } = output {
463
0
                if !tx
464
0
                    .input_asset_ids(base_asset_id)
465
0
                    .any(|input_asset_id| input_asset_id == asset_id)
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_4blob8BlobBodyNtB2e_12BlobMetadataEEs2_0s_0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_6create10CreateBodyNtB2e_14CreateMetadataEEs2_0s_0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_6script10ScriptBodyNtB2e_14ScriptMetadataEEs2_0s_0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_6upload10UploadBodyNtB2e_14UploadMetadataEEs2_0s_0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_7upgrade11UpgradeBodyNtB2e_15UpgradeMetadataEEs2_0s_0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_4blob8BlobBodyNtB2e_12BlobMetadataEEs2_0s_0Ba_
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_6create10CreateBodyNtB2e_14CreateMetadataEEs2_0s_0Ba_
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_6script10ScriptBodyNtB2e_14ScriptMetadataEEs2_0s_0Ba_
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_6upload10UploadBodyNtB2e_14UploadMetadataEEs2_0s_0Ba_
Unexecuted instantiation: _RNCNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB8_5types22chargeable_transaction21ChargeableTransactionNtNtB1g_7upgrade11UpgradeBodyNtB2e_15UpgradeMetadataEEs2_0s_0Ba_
466
                {
467
0
                    return Err(ValidityError::TransactionOutputCoinAssetIdNotFound(
468
0
                        *asset_id,
469
0
                    ));
470
0
                }
471
6.57k
            }
472
473
6.57k
            Ok(())
474
6.57k
        })?;
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2c_12BlobMetadataEEs2_0Csg6P9hFxt0iW_7fuel_vm
_RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2c_14CreateMetadataEEs2_0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
448
2.19k
        .try_for_each(|(index, output)| {
449
2.19k
            output.check(index, tx.inputs())?;
450
451
2.19k
            if let Output::Change { asset_id, .. } = output {
452
0
                if !tx
453
0
                    .input_asset_ids(base_asset_id)
454
0
                    .any(|input_asset_id| input_asset_id == asset_id)
455
                {
456
0
                    return Err(ValidityError::TransactionOutputChangeAssetIdNotFound(
457
0
                        *asset_id,
458
0
                    ));
459
0
                }
460
2.19k
            }
461
462
2.19k
            if let Output::Coin { asset_id, .. } = output {
463
0
                if !tx
464
0
                    .input_asset_ids(base_asset_id)
465
0
                    .any(|input_asset_id| input_asset_id == asset_id)
466
                {
467
0
                    return Err(ValidityError::TransactionOutputCoinAssetIdNotFound(
468
0
                        *asset_id,
469
0
                    ));
470
0
                }
471
2.19k
            }
472
473
2.19k
            Ok(())
474
2.19k
        })?;
_RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2c_14ScriptMetadataEEs2_0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
448
4.38k
        .try_for_each(|(index, output)| {
449
4.38k
            output.check(index, tx.inputs())?;
450
451
4.38k
            if let Output::Change { asset_id, .. } = output {
452
2.19k
                if !tx
453
2.19k
                    .input_asset_ids(base_asset_id)
454
2.19k
                    .any(|input_asset_id| input_asset_id == asset_id)
455
                {
456
0
                    return Err(ValidityError::TransactionOutputChangeAssetIdNotFound(
457
0
                        *asset_id,
458
0
                    ));
459
2.19k
                }
460
2.19k
            }
461
462
4.38k
            if let Output::Coin { asset_id, .. } = output {
463
0
                if !tx
464
0
                    .input_asset_ids(base_asset_id)
465
0
                    .any(|input_asset_id| input_asset_id == asset_id)
466
                {
467
0
                    return Err(ValidityError::TransactionOutputCoinAssetIdNotFound(
468
0
                        *asset_id,
469
0
                    ));
470
0
                }
471
4.38k
            }
472
473
4.38k
            Ok(())
474
4.38k
        })?;
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2c_14UploadMetadataEEs2_0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2c_15UpgradeMetadataEEs2_0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2c_12BlobMetadataEEs2_0B8_
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2c_14CreateMetadataEEs2_0B8_
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2c_14ScriptMetadataEEs2_0B8_
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2c_14UploadMetadataEEs2_0B8_
Unexecuted instantiation: _RNCINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB6_5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2c_15UpgradeMetadataEEs2_0B8_
475
476
4.38k
    Ok(())
477
4.38k
}
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2a_12BlobMetadataEECsg6P9hFxt0iW_7fuel_vm
_RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2a_14CreateMetadataEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
320
2.19k
pub(crate) fn check_common_part<T>(
321
2.19k
    tx: &T,
322
2.19k
    block_height: BlockHeight,
323
2.19k
    consensus_params: &ConsensusParameters,
324
2.19k
) -> Result<(), ValidityError>
325
2.19k
where
326
2.19k
    T: canonical::Serialize + Chargeable + field::Outputs,
327
2.19k
{
328
2.19k
    let tx_params = consensus_params.tx_params();
329
2.19k
    let predicate_params = consensus_params.predicate_params();
330
2.19k
    let base_asset_id = consensus_params.base_asset_id();
331
2.19k
    let gas_costs = consensus_params.gas_costs();
332
2.19k
    let fee_params = consensus_params.fee_params();
333
2.19k
334
2.19k
    check_size(tx, tx_params)?;
335
336
2.19k
    if !tx.policies().is_valid() {
337
0
        Err(ValidityError::TransactionPoliciesAreInvalid)?
338
2.19k
    }
339
340
2.19k
    if let Some(witness_limit) = tx.policies().get(PolicyType::WitnessLimit) {
341
0
        let witness_size = tx.witnesses().size_dynamic();
342
0
        if witness_size as u64 > witness_limit {
343
0
            Err(ValidityError::TransactionWitnessLimitExceeded)?
344
0
        }
345
2.19k
    }
346
347
2.19k
    let max_gas = tx.max_gas(gas_costs, fee_params);
348
2.19k
    if max_gas > tx_params.max_gas_per_tx() {
349
0
        Err(ValidityError::TransactionMaxGasExceeded)?
350
2.19k
    }
351
352
2.19k
    if !tx.policies().is_set(PolicyType::MaxFee) {
353
0
        Err(ValidityError::TransactionMaxFeeNotSet)?
354
2.19k
    };
355
356
2.19k
    if tx.maturity() > block_height {
357
0
        Err(ValidityError::TransactionMaturity)?;
358
2.19k
    }
359
360
2.19k
    if tx.inputs().len() > tx_params.max_inputs() as usize {
361
0
        Err(ValidityError::TransactionInputsMax)?
362
2.19k
    }
363
364
2.19k
    if tx.outputs().len() > tx_params.max_outputs() as usize {
365
0
        Err(ValidityError::TransactionOutputsMax)?
366
2.19k
    }
367
368
2.19k
    if tx.witnesses().len() > tx_params.max_witnesses() as usize {
369
0
        Err(ValidityError::TransactionWitnessesMax)?
370
2.19k
    }
371
372
2.19k
    let any_spendable_input = tx.inputs().iter().find(|input| match input {
373
        Input::CoinSigned(_)
374
        | Input::CoinPredicate(_)
375
        | Input::MessageCoinSigned(_)
376
        | Input::MessageCoinPredicate(_) => true,
377
        Input::MessageDataSigned(_)
378
        | Input::MessageDataPredicate(_)
379
        | Input::Contract(_) => false,
380
2.19k
    });
381
2.19k
382
2.19k
    if any_spendable_input.is_none() {
383
0
        Err(ValidityError::NoSpendableInput)?
384
2.19k
    }
385
386
2.19k
    tx.input_asset_ids_unique(base_asset_id)
387
2.19k
        .try_for_each(|input_asset_id| {
388
            // check for duplicate change outputs
389
            if tx
390
                .outputs()
391
                .iter()
392
                .filter_map(|output| match output {
393
                    Output::Change { asset_id, .. } if input_asset_id == asset_id => {
394
                        Some(())
395
                    }
396
                    _ => None,
397
                })
398
                .count()
399
                > 1
400
            {
401
                return Err(ValidityError::TransactionOutputChangeAssetIdDuplicated(
402
                    *input_asset_id,
403
                ));
404
            }
405
406
            Ok(())
407
2.19k
        })?;
408
409
    // Check for duplicated input utxo id
410
2.19k
    let duplicated_utxo_id = tx
411
2.19k
        .inputs()
412
2.19k
        .iter()
413
2.19k
        .filter_map(|i| i.is_coin().then(|| i.utxo_id()).flatten());
414
415
2.19k
    if let Some(utxo_id) = next_duplicate(duplicated_utxo_id).copied() {
416
0
        return Err(ValidityError::DuplicateInputUtxoId { utxo_id });
417
2.19k
    }
418
2.19k
419
2.19k
    // Check for duplicated input contract id
420
2.19k
    let duplicated_contract_id = tx.inputs().iter().filter_map(Input::contract_id);
421
422
2.19k
    if let Some(contract_id) = next_duplicate(duplicated_contract_id).copied() {
423
0
        return Err(ValidityError::DuplicateInputContractId { contract_id });
424
2.19k
    }
425
2.19k
426
2.19k
    // Check for duplicated input message id
427
2.19k
    let duplicated_message_id = tx.inputs().iter().filter_map(Input::message_id);
428
2.19k
    if let Some(message_id) = next_duplicate(duplicated_message_id) {
429
0
        return Err(ValidityError::DuplicateMessageInputId { message_id });
430
2.19k
    }
431
2.19k
432
2.19k
    // Validate the inputs without checking signature
433
2.19k
    tx.inputs()
434
2.19k
        .iter()
435
2.19k
        .enumerate()
436
2.19k
        .try_for_each(|(index, input)| {
437
            input.check_without_signature(
438
                index,
439
                tx.outputs(),
440
                tx.witnesses(),
441
                predicate_params,
442
            )
443
2.19k
        })?;
444
445
2.19k
    tx.outputs()
446
2.19k
        .iter()
447
2.19k
        .enumerate()
448
2.19k
        .try_for_each(|(index, output)| {
449
            output.check(index, tx.inputs())?;
450
451
            if let Output::Change { asset_id, .. } = output {
452
                if !tx
453
                    .input_asset_ids(base_asset_id)
454
                    .any(|input_asset_id| input_asset_id == asset_id)
455
                {
456
                    return Err(ValidityError::TransactionOutputChangeAssetIdNotFound(
457
                        *asset_id,
458
                    ));
459
                }
460
            }
461
462
            if let Output::Coin { asset_id, .. } = output {
463
                if !tx
464
                    .input_asset_ids(base_asset_id)
465
                    .any(|input_asset_id| input_asset_id == asset_id)
466
                {
467
                    return Err(ValidityError::TransactionOutputCoinAssetIdNotFound(
468
                        *asset_id,
469
                    ));
470
                }
471
            }
472
473
            Ok(())
474
2.19k
        })?;
475
476
2.19k
    Ok(())
477
2.19k
}
_RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2a_14ScriptMetadataEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
320
2.19k
pub(crate) fn check_common_part<T>(
321
2.19k
    tx: &T,
322
2.19k
    block_height: BlockHeight,
323
2.19k
    consensus_params: &ConsensusParameters,
324
2.19k
) -> Result<(), ValidityError>
325
2.19k
where
326
2.19k
    T: canonical::Serialize + Chargeable + field::Outputs,
327
2.19k
{
328
2.19k
    let tx_params = consensus_params.tx_params();
329
2.19k
    let predicate_params = consensus_params.predicate_params();
330
2.19k
    let base_asset_id = consensus_params.base_asset_id();
331
2.19k
    let gas_costs = consensus_params.gas_costs();
332
2.19k
    let fee_params = consensus_params.fee_params();
333
2.19k
334
2.19k
    check_size(tx, tx_params)?;
335
336
2.19k
    if !tx.policies().is_valid() {
337
0
        Err(ValidityError::TransactionPoliciesAreInvalid)?
338
2.19k
    }
339
340
2.19k
    if let Some(witness_limit) = tx.policies().get(PolicyType::WitnessLimit) {
341
0
        let witness_size = tx.witnesses().size_dynamic();
342
0
        if witness_size as u64 > witness_limit {
343
0
            Err(ValidityError::TransactionWitnessLimitExceeded)?
344
0
        }
345
2.19k
    }
346
347
2.19k
    let max_gas = tx.max_gas(gas_costs, fee_params);
348
2.19k
    if max_gas > tx_params.max_gas_per_tx() {
349
0
        Err(ValidityError::TransactionMaxGasExceeded)?
350
2.19k
    }
351
352
2.19k
    if !tx.policies().is_set(PolicyType::MaxFee) {
353
0
        Err(ValidityError::TransactionMaxFeeNotSet)?
354
2.19k
    };
355
356
2.19k
    if tx.maturity() > block_height {
357
0
        Err(ValidityError::TransactionMaturity)?;
358
2.19k
    }
359
360
2.19k
    if tx.inputs().len() > tx_params.max_inputs() as usize {
361
0
        Err(ValidityError::TransactionInputsMax)?
362
2.19k
    }
363
364
2.19k
    if tx.outputs().len() > tx_params.max_outputs() as usize {
365
0
        Err(ValidityError::TransactionOutputsMax)?
366
2.19k
    }
367
368
2.19k
    if tx.witnesses().len() > tx_params.max_witnesses() as usize {
369
0
        Err(ValidityError::TransactionWitnessesMax)?
370
2.19k
    }
371
372
2.19k
    let any_spendable_input = tx.inputs().iter().find(|input| match input {
373
        Input::CoinSigned(_)
374
        | Input::CoinPredicate(_)
375
        | Input::MessageCoinSigned(_)
376
        | Input::MessageCoinPredicate(_) => true,
377
        Input::MessageDataSigned(_)
378
        | Input::MessageDataPredicate(_)
379
        | Input::Contract(_) => false,
380
2.19k
    });
381
2.19k
382
2.19k
    if any_spendable_input.is_none() {
383
0
        Err(ValidityError::NoSpendableInput)?
384
2.19k
    }
385
386
2.19k
    tx.input_asset_ids_unique(base_asset_id)
387
2.19k
        .try_for_each(|input_asset_id| {
388
            // check for duplicate change outputs
389
            if tx
390
                .outputs()
391
                .iter()
392
                .filter_map(|output| match output {
393
                    Output::Change { asset_id, .. } if input_asset_id == asset_id => {
394
                        Some(())
395
                    }
396
                    _ => None,
397
                })
398
                .count()
399
                > 1
400
            {
401
                return Err(ValidityError::TransactionOutputChangeAssetIdDuplicated(
402
                    *input_asset_id,
403
                ));
404
            }
405
406
            Ok(())
407
2.19k
        })?;
408
409
    // Check for duplicated input utxo id
410
2.19k
    let duplicated_utxo_id = tx
411
2.19k
        .inputs()
412
2.19k
        .iter()
413
2.19k
        .filter_map(|i| i.is_coin().then(|| i.utxo_id()).flatten());
414
415
2.19k
    if let Some(utxo_id) = next_duplicate(duplicated_utxo_id).copied() {
416
0
        return Err(ValidityError::DuplicateInputUtxoId { utxo_id });
417
2.19k
    }
418
2.19k
419
2.19k
    // Check for duplicated input contract id
420
2.19k
    let duplicated_contract_id = tx.inputs().iter().filter_map(Input::contract_id);
421
422
2.19k
    if let Some(contract_id) = next_duplicate(duplicated_contract_id).copied() {
423
0
        return Err(ValidityError::DuplicateInputContractId { contract_id });
424
2.19k
    }
425
2.19k
426
2.19k
    // Check for duplicated input message id
427
2.19k
    let duplicated_message_id = tx.inputs().iter().filter_map(Input::message_id);
428
2.19k
    if let Some(message_id) = next_duplicate(duplicated_message_id) {
429
0
        return Err(ValidityError::DuplicateMessageInputId { message_id });
430
2.19k
    }
431
2.19k
432
2.19k
    // Validate the inputs without checking signature
433
2.19k
    tx.inputs()
434
2.19k
        .iter()
435
2.19k
        .enumerate()
436
2.19k
        .try_for_each(|(index, input)| {
437
            input.check_without_signature(
438
                index,
439
                tx.outputs(),
440
                tx.witnesses(),
441
                predicate_params,
442
            )
443
2.19k
        })?;
444
445
2.19k
    tx.outputs()
446
2.19k
        .iter()
447
2.19k
        .enumerate()
448
2.19k
        .try_for_each(|(index, output)| {
449
            output.check(index, tx.inputs())?;
450
451
            if let Output::Change { asset_id, .. } = output {
452
                if !tx
453
                    .input_asset_ids(base_asset_id)
454
                    .any(|input_asset_id| input_asset_id == asset_id)
455
                {
456
                    return Err(ValidityError::TransactionOutputChangeAssetIdNotFound(
457
                        *asset_id,
458
                    ));
459
                }
460
            }
461
462
            if let Output::Coin { asset_id, .. } = output {
463
                if !tx
464
                    .input_asset_ids(base_asset_id)
465
                    .any(|input_asset_id| input_asset_id == asset_id)
466
                {
467
                    return Err(ValidityError::TransactionOutputCoinAssetIdNotFound(
468
                        *asset_id,
469
                    ));
470
                }
471
            }
472
473
            Ok(())
474
2.19k
        })?;
475
476
2.19k
    Ok(())
477
2.19k
}
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2a_14UploadMetadataEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2a_15UpgradeMetadataEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2a_12BlobMetadataEEB6_
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2a_14CreateMetadataEEB6_
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2a_14ScriptMetadataEEB6_
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2a_14UploadMetadataEEB6_
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity17check_common_partINtNtNtB4_5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2a_15UpgradeMetadataEEB6_
478
479
// TODO https://github.com/FuelLabs/fuel-tx/issues/148
480
13.1k
pub(crate) fn next_duplicate<U>(iter: impl Iterator<Item = U>) -> Option<U>
481
13.1k
where
482
13.1k
    U: PartialEq + Ord + Copy + Hash,
483
13.1k
{
484
13.1k
    #[cfg(not(feature = "std"))]
485
13.1k
    {
486
13.1k
        iter.sorted()
487
13.1k
            .as_slice()
488
13.1k
            .windows(2)
489
13.1k
            .filter_map(|u| (u[0] == u[1]).then(|| u[0]))
490
13.1k
            .next()
491
13.1k
    }
492
13.1k
493
13.1k
    #[cfg(feature = "std")]
494
13.1k
    {
495
13.1k
        iter.duplicates().next()
496
13.1k
    }
497
13.1k
}
_RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity14next_duplicateNtNtCsklA9joyWMfk_10fuel_types11array_types9MessageIdINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters10filter_map9FilterMapINtNtNtB24_5slice4iter4IterNtNtNtB4_5types5input5InputENvMsf_B3q_B3o_10message_idEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
480
4.38k
pub(crate) fn next_duplicate<U>(iter: impl Iterator<Item = U>) -> Option<U>
481
4.38k
where
482
4.38k
    U: PartialEq + Ord + Copy + Hash,
483
4.38k
{
484
4.38k
    #[cfg(not(feature = "std"))]
485
4.38k
    {
486
4.38k
        iter.sorted()
487
4.38k
            .as_slice()
488
4.38k
            .windows(2)
489
4.38k
            .filter_map(|u| (u[0] == u[1]).then(|| u[0]))
490
4.38k
            .next()
491
4.38k
    }
492
4.38k
493
4.38k
    #[cfg(feature = "std")]
494
4.38k
    {
495
4.38k
        iter.duplicates().next()
496
4.38k
    }
497
4.38k
}
_RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity14next_duplicateRNtNtCsklA9joyWMfk_10fuel_types11array_types10ContractIdINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters10filter_map9FilterMapINtNtNtB27_5slice4iter4IterNtNtNtB4_5types5input5InputENvMsf_B3t_B3r_11contract_idEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
480
4.38k
pub(crate) fn next_duplicate<U>(iter: impl Iterator<Item = U>) -> Option<U>
481
4.38k
where
482
4.38k
    U: PartialEq + Ord + Copy + Hash,
483
4.38k
{
484
4.38k
    #[cfg(not(feature = "std"))]
485
4.38k
    {
486
4.38k
        iter.sorted()
487
4.38k
            .as_slice()
488
4.38k
            .windows(2)
489
4.38k
            .filter_map(|u| (u[0] == u[1]).then(|| u[0]))
490
4.38k
            .next()
491
4.38k
    }
492
4.38k
493
4.38k
    #[cfg(feature = "std")]
494
4.38k
    {
495
4.38k
        iter.duplicates().next()
496
4.38k
    }
497
4.38k
}
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity14next_duplicateRNtNtNtB4_5types7utxo_id6UtxoIdINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters10filter_map9FilterMapINtNtNtB1I_5slice4iter4IterNtNtB19_5input5InputENCINvB2_17check_common_partINtNtB19_22chargeable_transaction21ChargeableTransactionNtNtB19_4blob8BlobBodyNtB4K_12BlobMetadataEEs0_0EECsg6P9hFxt0iW_7fuel_vm
_RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity14next_duplicateRNtNtNtB4_5types7utxo_id6UtxoIdINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters10filter_map9FilterMapINtNtNtB1I_5slice4iter4IterNtNtB19_5input5InputENCINvB2_17check_common_partINtNtB19_22chargeable_transaction21ChargeableTransactionNtNtB19_6create10CreateBodyNtB4K_14CreateMetadataEEs0_0EECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
480
2.19k
pub(crate) fn next_duplicate<U>(iter: impl Iterator<Item = U>) -> Option<U>
481
2.19k
where
482
2.19k
    U: PartialEq + Ord + Copy + Hash,
483
2.19k
{
484
2.19k
    #[cfg(not(feature = "std"))]
485
2.19k
    {
486
2.19k
        iter.sorted()
487
2.19k
            .as_slice()
488
2.19k
            .windows(2)
489
2.19k
            .filter_map(|u| (u[0] == u[1]).then(|| u[0]))
490
2.19k
            .next()
491
2.19k
    }
492
2.19k
493
2.19k
    #[cfg(feature = "std")]
494
2.19k
    {
495
2.19k
        iter.duplicates().next()
496
2.19k
    }
497
2.19k
}
_RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity14next_duplicateRNtNtNtB4_5types7utxo_id6UtxoIdINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters10filter_map9FilterMapINtNtNtB1I_5slice4iter4IterNtNtB19_5input5InputENCINvB2_17check_common_partINtNtB19_22chargeable_transaction21ChargeableTransactionNtNtB19_6script10ScriptBodyNtB4K_14ScriptMetadataEEs0_0EECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
480
2.19k
pub(crate) fn next_duplicate<U>(iter: impl Iterator<Item = U>) -> Option<U>
481
2.19k
where
482
2.19k
    U: PartialEq + Ord + Copy + Hash,
483
2.19k
{
484
2.19k
    #[cfg(not(feature = "std"))]
485
2.19k
    {
486
2.19k
        iter.sorted()
487
2.19k
            .as_slice()
488
2.19k
            .windows(2)
489
2.19k
            .filter_map(|u| (u[0] == u[1]).then(|| u[0]))
490
2.19k
            .next()
491
2.19k
    }
492
2.19k
493
2.19k
    #[cfg(feature = "std")]
494
2.19k
    {
495
2.19k
        iter.duplicates().next()
496
2.19k
    }
497
2.19k
}
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity14next_duplicateRNtNtNtB4_5types7utxo_id6UtxoIdINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters10filter_map9FilterMapINtNtNtB1I_5slice4iter4IterNtNtB19_5input5InputENCINvB2_17check_common_partINtNtB19_22chargeable_transaction21ChargeableTransactionNtNtB19_6upload10UploadBodyNtB4K_14UploadMetadataEEs0_0EECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity14next_duplicateRNtNtNtB4_5types7utxo_id6UtxoIdINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters10filter_map9FilterMapINtNtNtB1I_5slice4iter4IterNtNtB19_5input5InputENCINvB2_17check_common_partINtNtB19_22chargeable_transaction21ChargeableTransactionNtNtB19_7upgrade11UpgradeBodyNtB4K_15UpgradeMetadataEEs0_0EECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity14next_duplicateNtNtCsklA9joyWMfk_10fuel_types11array_types9MessageIdINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters10filter_map9FilterMapINtNtNtB24_5slice4iter4IterNtNtNtB4_5types5input5InputENvMsf_B3q_B3o_10message_idEEB6_
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity14next_duplicateRNtNtCsklA9joyWMfk_10fuel_types11array_types10ContractIdINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters10filter_map9FilterMapINtNtNtB27_5slice4iter4IterNtNtNtB4_5types5input5InputENvMsf_B3t_B3r_11contract_idEEB6_
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity14next_duplicateRNtNtNtB4_5types7utxo_id6UtxoIdINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters10filter_map9FilterMapINtNtNtB1I_5slice4iter4IterNtNtB19_5input5InputENCINvB2_17check_common_partINtNtB19_22chargeable_transaction21ChargeableTransactionNtNtB19_4blob8BlobBodyNtB4K_12BlobMetadataEEs0_0EEB6_
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity14next_duplicateRNtNtNtB4_5types7utxo_id6UtxoIdINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters10filter_map9FilterMapINtNtNtB1I_5slice4iter4IterNtNtB19_5input5InputENCINvB2_17check_common_partINtNtB19_22chargeable_transaction21ChargeableTransactionNtNtB19_6create10CreateBodyNtB4K_14CreateMetadataEEs0_0EEB6_
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity14next_duplicateRNtNtNtB4_5types7utxo_id6UtxoIdINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters10filter_map9FilterMapINtNtNtB1I_5slice4iter4IterNtNtB19_5input5InputENCINvB2_17check_common_partINtNtB19_22chargeable_transaction21ChargeableTransactionNtNtB19_6script10ScriptBodyNtB4K_14ScriptMetadataEEs0_0EEB6_
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity14next_duplicateRNtNtNtB4_5types7utxo_id6UtxoIdINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters10filter_map9FilterMapINtNtNtB1I_5slice4iter4IterNtNtB19_5input5InputENCINvB2_17check_common_partINtNtB19_22chargeable_transaction21ChargeableTransactionNtNtB19_6upload10UploadBodyNtB4K_14UploadMetadataEEs0_0EEB6_
Unexecuted instantiation: _RINvNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity14next_duplicateRNtNtNtB4_5types7utxo_id6UtxoIdINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters10filter_map9FilterMapINtNtNtB1I_5slice4iter4IterNtNtB19_5input5InputENCINvB2_17check_common_partINtNtB19_22chargeable_transaction21ChargeableTransactionNtNtB19_7upgrade11UpgradeBodyNtB4K_15UpgradeMetadataEEs0_0EEB6_
498
499
#[cfg(feature = "typescript")]
500
mod typescript {
501
    use crate::{
502
        transaction::consensus_parameters::typescript::PredicateParameters,
503
        Witness,
504
    };
505
    use fuel_types::Bytes32;
506
    use wasm_bindgen::JsValue;
507
508
    use alloc::{
509
        format,
510
        vec::Vec,
511
    };
512
513
    use crate::transaction::{
514
        input_ts::Input,
515
        output_ts::Output,
516
    };
517
518
    #[wasm_bindgen::prelude::wasm_bindgen]
519
    pub fn check_input(
520
        input: &Input,
521
        index: usize,
522
        txhash: &Bytes32,
523
        outputs: Vec<JsValue>,
524
        witnesses: Vec<JsValue>,
525
        predicate_params: &PredicateParameters,
526
    ) -> Result<(), js_sys::Error> {
527
        let outputs: Vec<crate::Output> = outputs
528
            .into_iter()
529
            .map(|v| serde_wasm_bindgen::from_value::<Output>(v).map(|v| *v.0))
530
            .collect::<Result<Vec<_>, _>>()
531
            .map_err(|e| js_sys::Error::new(&format!("{:?}", e)))?;
532
533
        let witnesses: Vec<Witness> = witnesses
534
            .into_iter()
535
            .map(serde_wasm_bindgen::from_value::<Witness>)
536
            .collect::<Result<Vec<_>, _>>()
537
            .map_err(|e| js_sys::Error::new(&format!("{:?}", e)))?;
538
539
        input
540
            .0
541
            .check(
542
                index,
543
                txhash,
544
                &outputs,
545
                &witnesses,
546
                predicate_params.as_ref(),
547
                &mut None,
548
            )
549
            .map_err(|e| js_sys::Error::new(&format!("{:?}", e)))
550
    }
551
552
    #[wasm_bindgen::prelude::wasm_bindgen]
553
    pub fn check_output(
554
        output: &Output,
555
        index: usize,
556
        inputs: Vec<JsValue>,
557
    ) -> Result<(), js_sys::Error> {
558
        let inputs: Vec<crate::Input> = inputs
559
            .into_iter()
560
            .map(|v| serde_wasm_bindgen::from_value::<Input>(v).map(|v| *v.0))
561
            .collect::<Result<Vec<_>, _>>()
562
            .map_err(|e| js_sys::Error::new(&format!("{:?}", e)))?;
563
564
        output
565
            .0
566
            .check(index, &inputs)
567
            .map_err(|e| js_sys::Error::new(&format!("{:?}", e)))
568
    }
569
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/types/script.rs
Line
Count
Source
1
use core::ops::{
2
    Deref,
3
    DerefMut,
4
};
5
6
use crate::{
7
    field::WitnessLimit,
8
    transaction::{
9
        field::{
10
            ReceiptsRoot,
11
            Script as ScriptField,
12
            ScriptData,
13
            ScriptGasLimit,
14
            Witnesses,
15
        },
16
        id::PrepareSign,
17
        metadata::CommonMetadata,
18
        types::chargeable_transaction::{
19
            ChargeableMetadata,
20
            ChargeableTransaction,
21
            UniqueFormatValidityChecks,
22
        },
23
        Chargeable,
24
    },
25
    ConsensusParameters,
26
    FeeParameters,
27
    GasCosts,
28
    Output,
29
    TransactionRepr,
30
    ValidityError,
31
};
32
use derivative::Derivative;
33
use fuel_types::{
34
    bytes,
35
    bytes::WORD_SIZE,
36
    canonical::Serialize,
37
    fmt_truncated_hex,
38
    Bytes32,
39
    ChainId,
40
    Word,
41
};
42
43
#[cfg(feature = "alloc")]
44
use alloc::vec::Vec;
45
46
pub type Script = ChargeableTransaction<ScriptBody, ScriptMetadata>;
47
48
#[derive(Default, Debug, Clone, PartialEq, Eq, Hash)]
49
pub struct ScriptMetadata {
50
    pub script_data_offset: usize,
51
}
52
53
2.19k
#[derive(Clone, Default, Derivative, serde::Serialize, serde::Deserialize)]
_RNvXsl_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scriptNtB5_10ScriptCodeNtNtCsd3UI3IJrzMw_4core3cmp9PartialEq2eq
Line
Count
Source
53
2.19k
#[derive(Clone, Default, Derivative, serde::Serialize, serde::Deserialize)]
Unexecuted instantiation: _RINvXsk_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scriptNtB6_10ScriptCodeNtNtCsd3UI3IJrzMw_4core4hash4Hash4hashpEBc_
54
0
#[serde(transparent)]
55
17.5k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts0_1__NtB5_10ScriptCodeNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
55
2.19k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts0_1__NtB5_10ScriptCodeNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
55
2.19k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts0_1__NtB5_10ScriptCodeNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts0_1__NtB5_10ScriptCodeNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBb_
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts1_1__NtB5_10ScriptCodeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
55
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts1_1__NtB5_10ScriptCodeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
55
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts1_1__NtB4_10ScriptCodeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_static
Line
Count
Source
55
59.2k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts1_1__NtB4_10ScriptCodeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamic
Line
Count
Source
55
59.2k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts1_1__NtB5_10ScriptCodeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Line
Count
Source
55
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts1_1__NtB5_10ScriptCodeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Line
Count
Source
55
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
56
0
#[derivative(Eq, PartialEq, Hash, Debug)]
57
0
pub struct ScriptCode {
58
0
    #[derivative(Debug(format_with = "fmt_truncated_hex::<16>"))]
59
    pub bytes: Vec<u8>,
60
0
}
61
62
impl From<Vec<u8>> for ScriptCode {
63
6.57k
    fn from(bytes: Vec<u8>) -> Self {
64
6.57k
        Self { bytes }
65
6.57k
    }
66
}
67
68
impl From<&[u8]> for ScriptCode {
69
0
    fn from(bytes: &[u8]) -> Self {
70
0
        Self {
71
0
            bytes: bytes.to_vec(),
72
0
        }
73
0
    }
74
}
75
76
impl AsRef<[u8]> for ScriptCode {
77
0
    fn as_ref(&self) -> &[u8] {
78
0
        &self.bytes
79
0
    }
80
}
81
82
impl AsMut<[u8]> for ScriptCode {
83
0
    fn as_mut(&mut self) -> &mut [u8] {
84
0
        &mut self.bytes
85
0
    }
86
}
87
88
impl Deref for ScriptCode {
89
    type Target = Vec<u8>;
90
91
118k
    fn deref(&self) -> &Self::Target {
92
118k
        &self.bytes
93
118k
    }
_RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scriptNtB5_10ScriptCodeNtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
91
85.5k
    fn deref(&self) -> &Self::Target {
92
85.5k
        &self.bytes
93
85.5k
    }
_RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scriptNtB5_10ScriptCodeNtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefBb_
Line
Count
Source
91
32.8k
    fn deref(&self) -> &Self::Target {
92
32.8k
        &self.bytes
93
32.8k
    }
94
}
95
96
impl DerefMut for ScriptCode {
97
0
    fn deref_mut(&mut self) -> &mut Self::Target {
98
0
        &mut self.bytes
99
0
    }
100
}
101
102
#[cfg(feature = "da-compression")]
103
impl fuel_compression::Compressible for ScriptCode {
104
    type Compressed = fuel_compression::RegistryKey;
105
}
106
107
#[derive(
108
    Clone,
109
2.19k
    Derivative,
_RNvXsq_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scriptNtB5_10ScriptBodyNtNtCsd3UI3IJrzMw_4core3cmp9PartialEq2eq
Line
Count
Source
109
2.19k
    Derivative,
Unexecuted instantiation: _RINvXsp_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scriptNtB6_10ScriptBodyNtNtCsd3UI3IJrzMw_4core4hash4Hash4hashpEBc_
110
    serde::Serialize,
111
0
    serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts3_1__NtB7_10ScriptBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1o_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts3_1__NtBa_10ScriptBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1r_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts3_1__NtB8_10ScriptBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1p_7Visitor9visit_u64pEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts3_1__NtB8_10ScriptBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1p_7Visitor9visit_strpEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts3_1__NtB8_10ScriptBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1p_7Visitor11visit_bytespEBe_
Unexecuted instantiation: _RINvXs_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts3_1__NtBa_10ScriptBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1p_11deserializepEBg_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts3_1__NtBb_10ScriptBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1s_7Visitor9visit_seqpEBh_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts3_1__NtBb_10ScriptBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1s_7Visitor9visit_mappEBh_
112
4.38k
    fuel_types::canonical::Deserialize,
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts4_1__NtB5_10ScriptBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
112
2.19k
    fuel_types::canonical::Deserialize,
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts4_1__NtB5_10ScriptBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
112
2.19k
    fuel_types::canonical::Deserialize,
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts4_1__NtB5_10ScriptBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts4_1__NtB5_10ScriptBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBb_
113
17.5k
    fuel_types::canonical::Serialize,
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts5_1__NtB5_10ScriptBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
113
4.38k
    fuel_types::canonical::Serialize,
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts5_1__NtB5_10ScriptBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
113
4.38k
    fuel_types::canonical::Serialize,
_RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts5_1__NtB4_10ScriptBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_static
Line
Count
Source
113
59.2k
    fuel_types::canonical::Serialize,
_RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts5_1__NtB4_10ScriptBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamic
Line
Count
Source
113
59.2k
    fuel_types::canonical::Serialize,
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts5_1__NtB5_10ScriptBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Line
Count
Source
113
4.38k
    fuel_types::canonical::Serialize,
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6scripts5_1__NtB5_10ScriptBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Line
Count
Source
113
4.38k
    fuel_types::canonical::Serialize,
114
)]
115
#[cfg_attr(
116
    feature = "da-compression",
117
    derive(fuel_compression::Compress, fuel_compression::Decompress)
118
)]
119
0
#[canonical(prefix = TransactionRepr::Script)]
120
0
#[derivative(Eq, PartialEq, Hash, Debug)]
121
0
pub struct ScriptBody {
122
    pub(crate) script_gas_limit: Word,
123
    #[cfg_attr(feature = "da-compression", compress(skip))]
124
    pub(crate) receipts_root: Bytes32,
125
    pub(crate) script: ScriptCode,
126
0
    #[derivative(Debug(format_with = "fmt_truncated_hex::<16>"))]
127
    pub(crate) script_data: Vec<u8>,
128
0
}
129
130
impl Default for ScriptBody {
131
2.19k
    fn default() -> Self {
132
2.19k
        // Create a valid transaction with a single return instruction
133
2.19k
        //
134
2.19k
        // The Return op is mandatory for the execution of any context
135
2.19k
        let script = fuel_asm::op::ret(0x10).to_bytes().to_vec();
136
2.19k
137
2.19k
        Self {
138
2.19k
            script_gas_limit: Default::default(),
139
2.19k
            receipts_root: Default::default(),
140
2.19k
            script: script.into(),
141
2.19k
            script_data: Default::default(),
142
2.19k
        }
143
2.19k
    }
144
}
145
146
impl PrepareSign for ScriptBody {
147
8.77k
    fn prepare_sign(&mut self) {
148
8.77k
        // Prepare script for execution by clearing malleable fields.
149
8.77k
        self.receipts_root = Default::default();
150
8.77k
    }
151
}
152
153
impl Chargeable for Script {
154
    #[inline(always)]
155
13.1k
    fn max_gas(&self, gas_costs: &GasCosts, fee: &FeeParameters) -> fuel_asm::Word {
156
13.1k
        // The basic implementation of the `max_gas` + `gas_limit`.
157
13.1k
        let remaining_allowed_witness = self
158
13.1k
            .witness_limit()
159
13.1k
            .saturating_sub(self.witnesses().size_dynamic() as u64)
160
13.1k
            .saturating_mul(fee.gas_per_byte());
161
13.1k
162
13.1k
        self.min_gas(gas_costs, fee)
163
13.1k
            .saturating_add(remaining_allowed_witness)
164
13.1k
            .saturating_add(self.body.script_gas_limit)
165
13.1k
    }
166
167
    #[inline(always)]
168
21.9k
    fn metered_bytes_size(&self) -> usize {
169
21.9k
        Serialize::size(self)
170
21.9k
    }
171
172
    #[inline(always)]
173
21.9k
    fn gas_used_by_metadata(&self, gas_cost: &GasCosts) -> Word {
174
21.9k
        let bytes = Serialize::size(self);
175
21.9k
        // Gas required to calculate the `tx_id`.
176
21.9k
        gas_cost.s256().resolve(bytes as u64)
177
21.9k
    }
178
}
179
180
impl UniqueFormatValidityChecks for Script {
181
2.19k
    fn check_unique_rules(
182
2.19k
        &self,
183
2.19k
        consensus_params: &ConsensusParameters,
184
2.19k
    ) -> Result<(), ValidityError> {
185
2.19k
        let script_params = consensus_params.script_params();
186
2.19k
        if self.body.script.len() as u64 > script_params.max_script_length() {
187
0
            Err(ValidityError::TransactionScriptLength)?;
188
2.19k
        }
189
190
2.19k
        if self.body.script_data.len() as u64 > script_params.max_script_data_length() {
191
0
            Err(ValidityError::TransactionScriptDataLength)?;
192
2.19k
        }
193
194
2.19k
        self.outputs
195
2.19k
            .iter()
196
2.19k
            .enumerate()
197
4.38k
            .try_for_each(|(index, output)| match output {
198
                Output::ContractCreated { .. } => {
199
0
                    Err(ValidityError::TransactionOutputContainsContractCreated { index })
200
                }
201
4.38k
                _ => Ok(()),
202
4.38k
            })?;
203
204
2.19k
        Ok(())
205
2.19k
    }
206
}
207
208
impl crate::Cacheable for Script {
209
0
    fn is_computed(&self) -> bool {
210
0
        self.metadata.is_some()
211
0
    }
212
213
4.38k
    fn precompute(&mut self, chain_id: &ChainId) -> Result<(), ValidityError> {
214
4.38k
        self.metadata = None;
215
4.38k
        self.metadata = Some(ChargeableMetadata {
216
4.38k
            common: CommonMetadata::compute(self, chain_id)?,
217
4.38k
            body: ScriptMetadata {
218
4.38k
                script_data_offset: self.script_data_offset(),
219
4.38k
            },
220
4.38k
        });
221
4.38k
        Ok(())
222
4.38k
    }
223
}
224
225
mod field {
226
    use super::*;
227
    use crate::field::ChargeableBody;
228
229
    impl ScriptGasLimit for Script {
230
        #[inline(always)]
231
198k
        fn script_gas_limit(&self) -> &Word {
232
198k
            &self.body.script_gas_limit
233
198k
        }
234
235
        #[inline(always)]
236
4.38k
        fn script_gas_limit_mut(&mut self) -> &mut Word {
237
4.38k
            &mut self.body.script_gas_limit
238
4.38k
        }
239
240
        #[inline(always)]
241
419k
        fn script_gas_limit_offset_static() -> usize {
242
419k
            WORD_SIZE // `Transaction` enum discriminant
243
419k
        }
244
    }
245
246
    impl ReceiptsRoot for Script {
247
        #[inline(always)]
248
        fn receipts_root(&self) -> &Bytes32 {
249
            &self.body.receipts_root
250
        }
251
252
        #[inline(always)]
253
4.38k
        fn receipts_root_mut(&mut self) -> &mut Bytes32 {
254
4.38k
            &mut self.body.receipts_root
255
4.38k
        }
256
257
        #[inline(always)]
258
419k
        fn receipts_root_offset_static() -> usize {
259
419k
            Self::script_gas_limit_offset_static().saturating_add(WORD_SIZE)
260
419k
        }
261
    }
262
263
    impl ScriptField for Script {
264
        #[inline(always)]
265
85.5k
        fn script(&self) -> &Vec<u8> {
266
85.5k
            &self.body.script
267
85.5k
        }
268
269
        #[inline(always)]
270
        fn script_mut(&mut self) -> &mut Vec<u8> {
271
            &mut self.body.script
272
        }
273
274
        #[inline(always)]
275
419k
        fn script_offset_static() -> usize {
276
419k
            Self::receipts_root_offset_static().saturating_add(
277
419k
                Bytes32::LEN // Receipts root
278
419k
                + WORD_SIZE // Script size
279
419k
                + WORD_SIZE // Script data size
280
419k
                + WORD_SIZE // Policies size
281
419k
                + WORD_SIZE // Inputs size
282
419k
                + WORD_SIZE // Outputs size
283
419k
                + WORD_SIZE, // Witnesses size
284
419k
            )
285
419k
        }
286
    }
287
288
    impl ScriptData for Script {
289
        #[inline(always)]
290
261k
        fn script_data(&self) -> &Vec<u8> {
291
261k
            &self.body.script_data
292
261k
        }
293
294
        #[inline(always)]
295
        fn script_data_mut(&mut self) -> &mut Vec<u8> {
296
            &mut self.body.script_data
297
        }
298
299
        #[inline(always)]
300
379k
        fn script_data_offset(&self) -> usize {
301
379k
            if let Some(ChargeableMetadata { body, .. }) = &self.metadata {
302
348k
                return body.script_data_offset;
303
30.7k
            }
304
30.7k
305
30.7k
            self.script_offset().saturating_add(
306
30.7k
                bytes::padded_len(self.body.script.as_slice()).unwrap_or(usize::MAX),
307
30.7k
            )
308
379k
        }
309
    }
310
311
    impl ChargeableBody<ScriptBody> for Script {
312
0
        fn body(&self) -> &ScriptBody {
313
0
            &self.body
314
0
        }
315
316
0
        fn body_mut(&mut self) -> &mut ScriptBody {
317
0
            &mut self.body
318
0
        }
319
320
26.3k
        fn body_offset_end(&self) -> usize {
321
26.3k
            self.script_data_offset().saturating_add(
322
26.3k
                bytes::padded_len(self.body.script_data.as_slice()).unwrap_or(usize::MAX),
323
26.3k
            )
324
26.3k
        }
325
    }
326
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/types/create.rs
Line
Count
Source
1
use crate::{
2
    transaction::{
3
        field::{
4
            BytecodeWitnessIndex,
5
            Salt as SaltField,
6
            StorageSlots,
7
        },
8
        metadata::CommonMetadata,
9
        types::chargeable_transaction::{
10
            ChargeableMetadata,
11
            ChargeableTransaction,
12
            UniqueFormatValidityChecks,
13
        },
14
    },
15
    Chargeable,
16
    ConsensusParameters,
17
    Contract,
18
    GasCosts,
19
    Input,
20
    Output,
21
    PrepareSign,
22
    StorageSlot,
23
    TransactionRepr,
24
    ValidityError,
25
};
26
use derivative::Derivative;
27
use fuel_types::{
28
    bytes::WORD_SIZE,
29
    canonical,
30
    Bytes32,
31
    Bytes4,
32
    ChainId,
33
    ContractId,
34
    Salt,
35
    Word,
36
};
37
38
#[cfg(feature = "alloc")]
39
use alloc::vec::Vec;
40
41
#[cfg(all(test, feature = "std"))]
42
mod ser_de_tests;
43
44
pub type Create = ChargeableTransaction<CreateBody, CreateMetadata>;
45
46
0
#[derive(Default, Debug, Clone, Derivative)]
Unexecuted instantiation: _RNvXs9_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6createNtB5_14CreateMetadataNtNtCsd3UI3IJrzMw_4core3cmp9PartialEq2eq
Unexecuted instantiation: _RINvXs8_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6createNtB6_14CreateMetadataNtNtCsd3UI3IJrzMw_4core4hash4Hash4hashpEBc_
47
#[derivative(Eq, PartialEq, Hash)]
48
pub struct CreateMetadata {
49
    pub contract_id: ContractId,
50
    pub contract_root: Bytes32,
51
    pub state_root: Bytes32,
52
}
53
54
impl CreateMetadata {
55
    /// Computes the `Metadata` for the `tx` transaction.
56
6.57k
    pub fn compute(tx: &Create) -> Result<Self, ValidityError> {
57
6.57k
        let salt = tx.salt();
58
6.57k
        let storage_slots = tx.storage_slots();
59
6.57k
        let contract = Contract::try_from(tx)?;
60
6.57k
        let contract_root = contract.root();
61
6.57k
        let state_root = Contract::initial_state_root(storage_slots.iter());
62
6.57k
        let contract_id = contract.id(salt, &contract_root, &state_root);
63
6.57k
64
6.57k
        Ok(Self {
65
6.57k
            contract_id,
66
6.57k
            contract_root,
67
6.57k
            state_root,
68
6.57k
        })
69
6.57k
    }
70
}
71
72
2.19k
#[derive(Default, Debug, Clone, Derivative, serde::Serialize, serde::Deserialize)]
_RNvXsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6createNtB5_10CreateBodyNtNtCsd3UI3IJrzMw_4core3cmp9PartialEq2eq
Line
Count
Source
72
2.19k
#[derive(Default, Debug, Clone, Derivative, serde::Serialize, serde::Deserialize)]
Unexecuted instantiation: _RINvXse_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6createNtB6_10CreateBodyNtNtCsd3UI3IJrzMw_4core4hash4Hash4hashpEBc_
Unexecuted instantiation: _RNvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6creates_1__NtB7_10CreateBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1n_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6creates_1__NtBa_10CreateBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1q_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6creates_1__NtB8_10CreateBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1o_7Visitor9visit_u64pEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6creates_1__NtB8_10CreateBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1o_7Visitor9visit_strpEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6creates_1__NtB8_10CreateBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1o_7Visitor11visit_bytespEBe_
Unexecuted instantiation: _RINvXs_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6creates_1__NtBa_10CreateBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1o_11deserializepEBg_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6creates_1__NtBb_10CreateBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1r_7Visitor9visit_seqpEBh_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6creates_1__NtBb_10CreateBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1r_7Visitor9visit_mappEBh_
73
#[cfg_attr(
74
    feature = "da-compression",
75
    derive(fuel_compression::Compress, fuel_compression::Decompress)
76
)]
77
17.5k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6creates0_1__NtB5_10CreateBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
77
2.19k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6creates0_1__NtB5_10CreateBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
77
2.19k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6creates0_1__NtB5_10CreateBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6creates0_1__NtB5_10CreateBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBb_
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6creates1_1__NtB5_10CreateBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
77
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6creates1_1__NtB5_10CreateBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
77
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6creates1_1__NtB4_10CreateBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_static
Line
Count
Source
77
59.2k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6creates1_1__NtB4_10CreateBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamic
Line
Count
Source
77
59.2k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6creates1_1__NtB5_10CreateBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Line
Count
Source
77
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6creates1_1__NtB5_10CreateBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Line
Count
Source
77
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
78
#[canonical(prefix = TransactionRepr::Create)]
79
#[derivative(Eq, PartialEq, Hash)]
80
pub struct CreateBody {
81
    pub(crate) bytecode_witness_index: u16,
82
    pub(crate) salt: Salt,
83
    pub(crate) storage_slots: Vec<StorageSlot>,
84
}
85
86
impl PrepareSign for CreateBody {
87
8.77k
    fn prepare_sign(&mut self) {}
_RNvXs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6createNtB4_10CreateBodyNtNtB8_2id11PrepareSign12prepare_signCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
87
4.38k
    fn prepare_sign(&mut self) {}
_RNvXs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6createNtB4_10CreateBodyNtNtB8_2id11PrepareSign12prepare_signBa_
Line
Count
Source
87
4.38k
    fn prepare_sign(&mut self) {}
88
}
89
90
impl Chargeable for Create {
91
    #[inline(always)]
92
21.9k
    fn metered_bytes_size(&self) -> usize {
93
21.9k
        canonical::Serialize::size(self)
94
21.9k
    }
95
96
21.9k
    fn gas_used_by_metadata(&self, gas_costs: &GasCosts) -> Word {
97
21.9k
        let Create {
98
21.9k
            body:
99
21.9k
                CreateBody {
100
21.9k
                    bytecode_witness_index,
101
21.9k
                    storage_slots,
102
21.9k
                    ..
103
21.9k
                },
104
21.9k
            witnesses,
105
21.9k
            ..
106
21.9k
        } = self;
107
21.9k
108
21.9k
        let contract_len = witnesses
109
21.9k
            .get(*bytecode_witness_index as usize)
110
21.9k
            .map(|c| c.as_ref().len())
111
21.9k
            .unwrap_or(0);
112
21.9k
113
21.9k
        let contract_root_gas = gas_costs.contract_root().resolve(contract_len as Word);
114
21.9k
        let state_root_length = storage_slots.len() as Word;
115
21.9k
        let state_root_gas = gas_costs.state_root().resolve(state_root_length);
116
21.9k
117
21.9k
        // See https://github.com/FuelLabs/fuel-specs/blob/master/src/identifiers/contract-id.md
118
21.9k
        let contract_id_input_length =
119
21.9k
            Bytes4::LEN + Salt::LEN + Bytes32::LEN + Bytes32::LEN;
120
21.9k
        let contract_id_gas = gas_costs.s256().resolve(contract_id_input_length as Word);
121
21.9k
        let bytes = canonical::Serialize::size(self);
122
21.9k
        // Gas required to calculate the `tx_id`.
123
21.9k
        let tx_id_gas = gas_costs.s256().resolve(bytes as u64);
124
21.9k
125
21.9k
        contract_root_gas
126
21.9k
            .saturating_add(state_root_gas)
127
21.9k
            .saturating_add(contract_id_gas)
128
21.9k
            .saturating_add(tx_id_gas)
129
21.9k
    }
130
}
131
132
impl UniqueFormatValidityChecks for Create {
133
2.19k
    fn check_unique_rules(
134
2.19k
        &self,
135
2.19k
        consensus_params: &ConsensusParameters,
136
2.19k
    ) -> Result<(), ValidityError> {
137
2.19k
        let contract_params = consensus_params.contract_params();
138
2.19k
        let base_asset_id = consensus_params.base_asset_id();
139
140
2.19k
        let bytecode_witness_len = self
141
2.19k
            .witnesses
142
2.19k
            .get(self.body.bytecode_witness_index as usize)
143
2.19k
            .map(|w| w.as_ref().len() as Word)
144
2.19k
            .ok_or(ValidityError::TransactionCreateBytecodeWitnessIndex)?;
145
146
2.19k
        if bytecode_witness_len > contract_params.contract_max_size() {
147
0
            return Err(ValidityError::TransactionCreateBytecodeLen);
148
2.19k
        }
149
2.19k
150
2.19k
        // Restrict to subset of u16::MAX, allowing this to be increased in the future
151
2.19k
        // in a non-breaking way.
152
2.19k
        if self.body.storage_slots.len() as u64 > contract_params.max_storage_slots() {
153
0
            return Err(ValidityError::TransactionCreateStorageSlotMax);
154
2.19k
        }
155
2.19k
156
2.19k
        // Verify storage slots are sorted
157
2.19k
        if !self
158
2.19k
            .body
159
2.19k
            .storage_slots
160
2.19k
            .as_slice()
161
2.19k
            .windows(2)
162
2.19k
            .all(|s| s[0] < s[1])
163
        {
164
0
            return Err(ValidityError::TransactionCreateStorageSlotOrder);
165
2.19k
        }
166
2.19k
167
2.19k
        self.inputs
168
2.19k
            .iter()
169
2.19k
            .enumerate()
170
2.19k
            .try_for_each(|(index, input)| {
171
2.19k
                if let Some(asset_id) = input.asset_id(consensus_params.base_asset_id()) {
172
2.19k
                    if asset_id != consensus_params.base_asset_id() {
173
0
                        return Err(
174
0
                            ValidityError::TransactionInputContainsNonBaseAssetId {
175
0
                                index,
176
0
                            },
177
0
                        );
178
2.19k
                    }
179
0
                }
180
181
2.19k
                match input {
182
                    Input::Contract(_) => {
183
0
                        Err(ValidityError::TransactionInputContainsContract { index })
184
                    }
185
                    Input::MessageDataSigned(_) | Input::MessageDataPredicate(_) => {
186
0
                        Err(ValidityError::TransactionInputContainsMessageData { index })
187
                    }
188
2.19k
                    _ => Ok(()),
189
                }
190
2.19k
            })?;
191
192
2.19k
        debug_assert!(
193
2.19k
            self.metadata.is_some(),
194
0
            "`check_without_signatures` is called without cached metadata"
195
        );
196
2.19k
        let (state_root_calculated, contract_id_calculated) =
197
2.19k
            if let Some(metadata) = &self.metadata {
198
2.19k
                (metadata.body.state_root, metadata.body.contract_id)
199
            } else {
200
0
                let metadata = CreateMetadata::compute(self)?;
201
0
                (metadata.state_root, metadata.contract_id)
202
            };
203
204
2.19k
        let mut contract_created = false;
205
2.19k
        self.outputs
206
2.19k
            .iter()
207
2.19k
            .enumerate()
208
2.19k
            .try_for_each(|(index, output)| match output {
209
                Output::Contract(_) => {
210
0
                    Err(ValidityError::TransactionOutputContainsContract { index })
211
                }
212
213
                Output::Variable { .. } => {
214
0
                    Err(ValidityError::TransactionOutputContainsVariable { index })
215
                }
216
217
0
                Output::Change { asset_id, .. } if asset_id != base_asset_id => {
218
0
                    Err(ValidityError::TransactionChangeChangeUsesNotBaseAsset { index })
219
                }
220
221
                Output::ContractCreated {
222
2.19k
                    contract_id,
223
2.19k
                    state_root,
224
2.19k
                } if contract_id != &contract_id_calculated
225
2.19k
                    || state_root != &state_root_calculated =>
226
0
                    {
227
0
                        Err(
228
0
                            ValidityError::TransactionCreateOutputContractCreatedDoesntMatch {
229
0
                                index,
230
0
                            },
231
0
                        )
232
                    }
233
234
                // TODO: Output::ContractCreated { contract_id, state_root } if
235
                // contract_id == &id && state_root == &storage_root
236
                //  maybe move from `fuel-vm` to here
237
0
                Output::ContractCreated { .. } if contract_created => {
238
0
                    Err(ValidityError::TransactionCreateOutputContractCreatedMultiple {
239
0
                        index,
240
0
                    })
241
                }
242
243
                Output::ContractCreated { .. } => {
244
2.19k
                    contract_created = true;
245
2.19k
246
2.19k
                    Ok(())
247
                }
248
249
0
                _ => Ok(()),
250
2.19k
            })?;
251
252
2.19k
        if !contract_created {
253
0
            return Err(ValidityError::TransactionOutputDoesntContainContractCreated);
254
2.19k
        }
255
2.19k
256
2.19k
        Ok(())
257
2.19k
    }
258
}
259
260
impl crate::Cacheable for Create {
261
0
    fn is_computed(&self) -> bool {
262
0
        self.metadata.is_some()
263
0
    }
264
265
4.38k
    fn precompute(&mut self, chain_id: &ChainId) -> Result<(), ValidityError> {
266
4.38k
        self.metadata = None;
267
4.38k
        self.metadata = Some(ChargeableMetadata {
268
4.38k
            common: CommonMetadata::compute(self, chain_id)?,
269
4.38k
            body: CreateMetadata::compute(self)?,
270
        });
271
4.38k
        Ok(())
272
4.38k
    }
273
}
274
275
mod field {
276
    use super::*;
277
    use crate::field::{
278
        ChargeableBody,
279
        StorageSlotRef,
280
    };
281
282
    impl BytecodeWitnessIndex for Create {
283
        #[inline(always)]
284
0
        fn bytecode_witness_index(&self) -> &u16 {
285
0
            &self.body.bytecode_witness_index
286
0
        }
287
288
        #[inline(always)]
289
2.19k
        fn bytecode_witness_index_mut(&mut self) -> &mut u16 {
290
2.19k
            &mut self.body.bytecode_witness_index
291
2.19k
        }
292
293
        #[inline(always)]
294
26.3k
        fn bytecode_witness_index_offset_static() -> usize {
295
26.3k
            WORD_SIZE // `Transaction` enum discriminant
296
26.3k
        }
297
    }
298
299
    impl SaltField for Create {
300
        #[inline(always)]
301
8.77k
        fn salt(&self) -> &Salt {
302
8.77k
            &self.body.salt
303
8.77k
        }
304
305
        #[inline(always)]
306
        fn salt_mut(&mut self) -> &mut Salt {
307
            &mut self.body.salt
308
        }
309
310
        #[inline(always)]
311
26.3k
        fn salt_offset_static() -> usize {
312
26.3k
            Self::bytecode_witness_index_offset_static().saturating_add(WORD_SIZE)
313
26.3k
        }
314
    }
315
316
    impl StorageSlots for Create {
317
        #[inline(always)]
318
8.77k
        fn storage_slots(&self) -> &Vec<StorageSlot> {
319
8.77k
            &self.body.storage_slots
320
8.77k
        }
321
322
        #[inline(always)]
323
        fn storage_slots_mut(&mut self) -> StorageSlotRef {
324
            StorageSlotRef {
325
                storage_slots: &mut self.body.storage_slots,
326
            }
327
        }
328
329
        #[inline(always)]
330
26.3k
        fn storage_slots_offset_static() -> usize {
331
26.3k
            Self::salt_offset_static().saturating_add(
332
26.3k
                Salt::LEN
333
26.3k
                + WORD_SIZE // Storage slots size
334
26.3k
                + WORD_SIZE // Policies size
335
26.3k
                + WORD_SIZE // Inputs size
336
26.3k
                + WORD_SIZE // Outputs size
337
26.3k
                + WORD_SIZE, // Witnesses size
338
26.3k
            )
339
26.3k
        }
340
341
0
        fn storage_slots_offset_at(&self, idx: usize) -> Option<usize> {
342
0
            if idx < self.body.storage_slots.len() {
343
                Some(
344
0
                    Self::storage_slots_offset_static()
345
0
                        .checked_add(idx.checked_mul(StorageSlot::SLOT_SIZE)?)?,
346
                )
347
            } else {
348
0
                None
349
            }
350
0
        }
351
    }
352
353
    impl ChargeableBody<CreateBody> for Create {
354
0
        fn body(&self) -> &CreateBody {
355
0
            &self.body
356
0
        }
357
358
0
        fn body_mut(&mut self) -> &mut CreateBody {
359
0
            &mut self.body
360
0
        }
361
362
26.3k
        fn body_offset_end(&self) -> usize {
363
26.3k
            Self::storage_slots_offset_static().saturating_add(
364
26.3k
                self.body
365
26.3k
                    .storage_slots
366
26.3k
                    .len()
367
26.3k
                    .saturating_mul(StorageSlot::SLOT_SIZE),
368
26.3k
            )
369
26.3k
        }
370
    }
371
}
372
373
impl TryFrom<&Create> for Contract {
374
    type Error = ValidityError;
375
376
8.77k
    fn try_from(tx: &Create) -> Result<Self, Self::Error> {
377
8.77k
        let Create {
378
8.77k
            body:
379
8.77k
                CreateBody {
380
8.77k
                    bytecode_witness_index,
381
8.77k
                    ..
382
8.77k
                },
383
8.77k
            witnesses,
384
8.77k
            ..
385
8.77k
        } = tx;
386
8.77k
387
8.77k
        witnesses
388
8.77k
            .get(*bytecode_witness_index as usize)
389
8.77k
            .map(|c| c.as_ref().into())
390
8.77k
            .ok_or(ValidityError::TransactionCreateBytecodeWitnessIndex)
391
8.77k
    }
392
}
393
394
#[cfg(test)]
395
mod tests {
396
    use super::*;
397
    use crate::{
398
        builder::Finalizable,
399
        transaction::validity::FormatValidityChecks,
400
    };
401
    use fuel_types::Bytes32;
402
403
    #[test]
404
    fn storage_slots_sorting() {
405
        // Test that storage slots must be sorted correctly
406
        let mut slot_data = [0u8; 64];
407
408
        let storage_slots = (0..10u64)
409
            .map(|i| {
410
                slot_data[..8].copy_from_slice(&i.to_be_bytes());
411
                StorageSlot::from(&slot_data.into())
412
            })
413
            .collect::<Vec<StorageSlot>>();
414
415
        let mut tx = crate::TransactionBuilder::create(
416
            vec![].into(),
417
            Salt::zeroed(),
418
            storage_slots,
419
        )
420
        .add_fee_input()
421
        .finalize();
422
        tx.body.storage_slots.reverse();
423
424
        let err = tx
425
            .check(0.into(), &ConsensusParameters::standard())
426
            .expect_err("Expected erroneous transaction");
427
428
        assert_eq!(ValidityError::TransactionCreateStorageSlotOrder, err);
429
    }
430
431
    #[test]
432
    fn storage_slots_no_duplicates() {
433
        let storage_slots = vec![
434
            StorageSlot::new(Bytes32::zeroed(), Bytes32::zeroed()),
435
            StorageSlot::new(Bytes32::zeroed(), Bytes32::zeroed()),
436
        ];
437
438
        let err = crate::TransactionBuilder::create(
439
            vec![].into(),
440
            Salt::zeroed(),
441
            storage_slots,
442
        )
443
        .add_fee_input()
444
        .finalize()
445
        .check(0.into(), &ConsensusParameters::standard())
446
        .expect_err("Expected erroneous transaction");
447
448
        assert_eq!(ValidityError::TransactionCreateStorageSlotOrder, err);
449
    }
450
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/types/input.rs
Line
Count
Source
1
use crate::{
2
    TxPointer,
3
    UtxoId,
4
};
5
use alloc::{
6
    string::ToString,
7
    vec::Vec,
8
};
9
use coin::*;
10
use consts::*;
11
use contract::*;
12
use core::fmt::{
13
    self,
14
    Formatter,
15
};
16
use fuel_crypto::{
17
    Hasher,
18
    PublicKey,
19
};
20
use fuel_types::{
21
    bytes,
22
    canonical,
23
    canonical::{
24
        Deserialize,
25
        Error,
26
        Output,
27
        Serialize,
28
    },
29
    fmt_truncated_hex,
30
    Address,
31
    AssetId,
32
    Bytes32,
33
    ContractId,
34
    MessageId,
35
    Nonce,
36
    Word,
37
};
38
use message::*;
39
40
pub mod coin;
41
mod consts;
42
pub mod contract;
43
pub mod message;
44
mod predicate;
45
mod repr;
46
47
pub use predicate::PredicateCode;
48
pub use repr::InputRepr;
49
50
#[cfg(all(test, feature = "std"))]
51
mod ser_de_tests;
52
53
pub trait AsField<Type>: AsFieldFmt {
54
    fn as_field(&self) -> Option<&Type>;
55
56
    fn as_mut_field(&mut self) -> Option<&mut Type>;
57
}
58
59
pub trait AsFieldFmt {
60
    fn fmt_as_field(&self, f: &mut Formatter) -> fmt::Result;
61
}
62
63
0
pub fn fmt_as_field<T>(field: &T, f: &mut Formatter) -> fmt::Result
64
0
where
65
0
    T: AsFieldFmt,
66
0
{
67
0
    field.fmt_as_field(f)
68
0
}
Unexecuted instantiation: _RINvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input12fmt_as_fieldtECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input12fmt_as_fieldINtB2_5EmptytEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input12fmt_as_fieldINtB2_5EmptyINtNtCs5vansr6XbJU_5alloc3vec3VechEEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input12fmt_as_fieldINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input12fmt_as_fieldINtB2_5EmptyNtNtB2_9predicate13PredicateCodeEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input12fmt_as_fieldNtNtB2_9predicate13PredicateCodeECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input12fmt_as_fieldINtB2_5EmptyyEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input12fmt_as_fieldyECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input12fmt_as_fieldtEB8_
Unexecuted instantiation: _RINvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input12fmt_as_fieldINtB2_5EmptytEEB8_
Unexecuted instantiation: _RINvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input12fmt_as_fieldINtB2_5EmptyyEEB8_
Unexecuted instantiation: _RINvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input12fmt_as_fieldyEB8_
Unexecuted instantiation: _RINvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input12fmt_as_fieldINtB2_5EmptyNtNtB2_9predicate13PredicateCodeEEB8_
Unexecuted instantiation: _RINvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input12fmt_as_fieldNtNtB2_9predicate13PredicateCodeEB8_
Unexecuted instantiation: _RINvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input12fmt_as_fieldINtB2_5EmptyINtNtCs5vansr6XbJU_5alloc3vec3VechEEEB8_
Unexecuted instantiation: _RINvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input12fmt_as_fieldINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
69
70
/// The empty field used by sub-types of the specification.
71
0
#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
Unexecuted instantiation: _RNvXININvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputs_1__INtBa_5EmptypENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserialize0pEINtB5_9___VisitorpENtB1m_7Visitor9expectingBg_
Unexecuted instantiation: _RINvXININvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputs_1__INtBb_5EmptypENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserialize0pEINtB6_9___VisitorpENtB1n_7Visitor20visit_newtype_structpEBh_
Unexecuted instantiation: _RINvXININvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputs_1__INtBb_5EmptypENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserialize0pEINtB6_9___VisitorpENtB1n_7Visitor9visit_seqpEBh_
72
#[cfg_attr(
73
    feature = "da-compression",
74
    derive(fuel_compression::Compress, fuel_compression::Decompress)
75
)]
76
#[cfg_attr(feature = "da-compression", compress(discard(Type)))]
77
pub struct Empty<Type>(
78
    #[cfg_attr(feature = "da-compression", compress(skip))]
79
    ::core::marker::PhantomData<Type>,
80
);
81
82
impl<Type> Empty<Type> {
83
    /// Creates `Self`.
84
26.3k
    pub const fn new() -> Self {
85
26.3k
        Self(::core::marker::PhantomData {})
86
26.3k
    }
_RNvMNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB2_5EmptyyE3newCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
84
4.38k
    pub const fn new() -> Self {
85
4.38k
        Self(::core::marker::PhantomData {})
86
4.38k
    }
_RNvMNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB2_5EmptyNtNtB2_9predicate13PredicateCodeE3newCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
84
4.38k
    pub const fn new() -> Self {
85
4.38k
        Self(::core::marker::PhantomData {})
86
4.38k
    }
_RNvMNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB2_5EmptyINtNtCs5vansr6XbJU_5alloc3vec3VechEE3newCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
84
4.38k
    pub const fn new() -> Self {
85
4.38k
        Self(::core::marker::PhantomData {})
86
4.38k
    }
_RNvMNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB2_5EmptyINtNtCs5vansr6XbJU_5alloc3vec3VechEE3newB8_
Line
Count
Source
84
4.38k
    pub const fn new() -> Self {
85
4.38k
        Self(::core::marker::PhantomData {})
86
4.38k
    }
_RNvMNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB2_5EmptyNtNtB2_9predicate13PredicateCodeE3newB8_
Line
Count
Source
84
4.38k
    pub const fn new() -> Self {
85
4.38k
        Self(::core::marker::PhantomData {})
86
4.38k
    }
Unexecuted instantiation: _RNvMNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB2_5EmptytE3newB8_
_RNvMNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB2_5EmptyyE3newB8_
Line
Count
Source
84
4.38k
    pub const fn new() -> Self {
85
4.38k
        Self(::core::marker::PhantomData {})
86
4.38k
    }
87
}
88
89
impl<Type> Default for Empty<Type> {
90
13.1k
    fn default() -> Self {
91
13.1k
        Self::new()
92
13.1k
    }
_RNvXs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB4_5EmptyINtNtCs5vansr6XbJU_5alloc3vec3VechEENtNtCsd3UI3IJrzMw_4core7default7Default7defaultBa_
Line
Count
Source
90
4.38k
    fn default() -> Self {
91
4.38k
        Self::new()
92
4.38k
    }
_RNvXs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB4_5EmptyNtNtB4_9predicate13PredicateCodeENtNtCsd3UI3IJrzMw_4core7default7Default7defaultBa_
Line
Count
Source
90
4.38k
    fn default() -> Self {
91
4.38k
        Self::new()
92
4.38k
    }
Unexecuted instantiation: _RNvXs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB4_5EmptytENtNtCsd3UI3IJrzMw_4core7default7Default7defaultBa_
_RNvXs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB4_5EmptyyENtNtCsd3UI3IJrzMw_4core7default7Default7defaultBa_
Line
Count
Source
90
4.38k
    fn default() -> Self {
91
4.38k
        Self::new()
92
4.38k
    }
93
}
94
95
impl<Type: Serialize + Default> Serialize for Empty<Type> {
96
    #[inline(always)]
97
486k
    fn size_static(&self) -> usize {
98
486k
        Type::default().size_static()
99
486k
    }
_RNvXs0_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB5_5EmptyINtNtCs5vansr6XbJU_5alloc3vec3VechEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_staticBb_
Line
Count
Source
97
162k
    fn size_static(&self) -> usize {
98
162k
        Type::default().size_static()
99
162k
    }
_RNvXs0_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB5_5EmptyNtNtB5_9predicate13PredicateCodeENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_staticBb_
Line
Count
Source
97
162k
    fn size_static(&self) -> usize {
98
162k
        Type::default().size_static()
99
162k
    }
Unexecuted instantiation: _RNvXs0_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB5_5EmptytENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_staticBb_
_RNvXs0_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB5_5EmptyyENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_staticBb_
Line
Count
Source
97
162k
    fn size_static(&self) -> usize {
98
162k
        Type::default().size_static()
99
162k
    }
100
101
    #[inline(always)]
102
486k
    fn size_dynamic(&self) -> usize {
103
486k
        0
104
486k
    }
_RNvXs0_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB5_5EmptyINtNtCs5vansr6XbJU_5alloc3vec3VechEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamicBb_
Line
Count
Source
102
162k
    fn size_dynamic(&self) -> usize {
103
162k
        0
104
162k
    }
_RNvXs0_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB5_5EmptyNtNtB5_9predicate13PredicateCodeENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamicBb_
Line
Count
Source
102
162k
    fn size_dynamic(&self) -> usize {
103
162k
        0
104
162k
    }
Unexecuted instantiation: _RNvXs0_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB5_5EmptytENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamicBb_
_RNvXs0_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB5_5EmptyyENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamicBb_
Line
Count
Source
102
162k
    fn size_dynamic(&self) -> usize {
103
162k
        0
104
162k
    }
105
106
    #[inline(always)]
107
52.6k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
108
52.6k
        Type::default().encode_static(buffer)
109
52.6k
    }
_RINvXs0_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB6_5EmptyINtNtCs5vansr6XbJU_5alloc3vec3VechEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticB19_ECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
107
8.77k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
108
8.77k
        Type::default().encode_static(buffer)
109
8.77k
    }
_RINvXs0_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB6_5EmptyNtNtB6_9predicate13PredicateCodeENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
107
8.77k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
108
8.77k
        Type::default().encode_static(buffer)
109
8.77k
    }
Unexecuted instantiation: _RINvXs0_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB6_5EmptytENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
_RINvXs0_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB6_5EmptyyENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
107
8.77k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
108
8.77k
        Type::default().encode_static(buffer)
109
8.77k
    }
_RINvXs0_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB6_5EmptyINtNtCs5vansr6XbJU_5alloc3vec3VechEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticB19_EBc_
Line
Count
Source
107
8.77k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
108
8.77k
        Type::default().encode_static(buffer)
109
8.77k
    }
_RINvXs0_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB6_5EmptyNtNtB6_9predicate13PredicateCodeENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBc_
Line
Count
Source
107
8.77k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
108
8.77k
        Type::default().encode_static(buffer)
109
8.77k
    }
Unexecuted instantiation: _RINvXs0_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB6_5EmptytENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBc_
_RINvXs0_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB6_5EmptyyENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBc_
Line
Count
Source
107
8.77k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
108
8.77k
        Type::default().encode_static(buffer)
109
8.77k
    }
110
}
111
112
impl<Type: Deserialize> Deserialize for Empty<Type> {
113
    #[inline(always)]
114
0
    fn decode_static<I: canonical::Input + ?Sized>(
115
0
        buffer: &mut I,
116
0
    ) -> Result<Self, Error> {
117
0
        Type::decode_static(buffer)?;
118
0
        Ok(Default::default())
119
0
    }
120
}
121
122
impl<Type> AsFieldFmt for Empty<Type> {
123
0
    fn fmt_as_field(&self, f: &mut Formatter) -> fmt::Result {
124
0
        f.write_str("Empty")
125
0
    }
Unexecuted instantiation: _RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB5_5EmptyINtNtCs5vansr6XbJU_5alloc3vec3VechEENtB5_10AsFieldFmt12fmt_as_fieldCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB5_5EmptyNtNtB5_9predicate13PredicateCodeENtB5_10AsFieldFmt12fmt_as_fieldCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB5_5EmptytENtB5_10AsFieldFmt12fmt_as_fieldCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB5_5EmptyyENtB5_10AsFieldFmt12fmt_as_fieldCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB5_5EmptyINtNtCs5vansr6XbJU_5alloc3vec3VechEENtB5_10AsFieldFmt12fmt_as_fieldBb_
Unexecuted instantiation: _RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB5_5EmptyNtNtB5_9predicate13PredicateCodeENtB5_10AsFieldFmt12fmt_as_fieldBb_
Unexecuted instantiation: _RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB5_5EmptytENtB5_10AsFieldFmt12fmt_as_fieldBb_
Unexecuted instantiation: _RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputINtB5_5EmptyyENtB5_10AsFieldFmt12fmt_as_fieldBb_
126
}
127
128
impl<Type> AsField<Type> for Empty<Type> {
129
    #[inline(always)]
130
0
    fn as_field(&self) -> Option<&Type> {
131
0
        None
132
0
    }
133
134
17.5k
    fn as_mut_field(&mut self) -> Option<&mut Type> {
135
17.5k
        None
136
17.5k
    }
137
}
138
139
impl AsField<u8> for u8 {
140
    #[inline(always)]
141
    fn as_field(&self) -> Option<&u8> {
142
        Some(self)
143
    }
144
145
0
    fn as_mut_field(&mut self) -> Option<&mut u8> {
146
0
        Some(self)
147
0
    }
148
}
149
150
impl AsFieldFmt for u8 {
151
0
    fn fmt_as_field(&self, f: &mut Formatter) -> fmt::Result {
152
0
        f.write_str(self.to_string().as_str())
153
0
    }
154
}
155
156
impl AsField<u16> for u16 {
157
    #[inline(always)]
158
    fn as_field(&self) -> Option<&u16> {
159
        Some(self)
160
    }
161
162
0
    fn as_mut_field(&mut self) -> Option<&mut u16> {
163
0
        Some(self)
164
0
    }
165
}
166
167
impl AsFieldFmt for u16 {
168
0
    fn fmt_as_field(&self, f: &mut Formatter) -> fmt::Result {
169
0
        f.write_str(self.to_string().as_str())
170
0
    }
171
}
172
173
impl AsField<u64> for u64 {
174
    #[inline(always)]
175
    fn as_field(&self) -> Option<&u64> {
176
        Some(self)
177
    }
178
179
0
    fn as_mut_field(&mut self) -> Option<&mut u64> {
180
0
        Some(self)
181
0
    }
182
}
183
184
impl AsFieldFmt for u64 {
185
0
    fn fmt_as_field(&self, f: &mut Formatter) -> fmt::Result {
186
0
        f.write_str(self.to_string().as_str())
187
0
    }
188
}
189
190
impl AsField<Vec<u8>> for Vec<u8> {
191
    #[inline(always)]
192
0
    fn as_field(&self) -> Option<&Vec<u8>> {
193
0
        Some(self)
194
0
    }
195
196
0
    fn as_mut_field(&mut self) -> Option<&mut Vec<u8>> {
197
0
        Some(self)
198
0
    }
199
}
200
201
impl AsFieldFmt for Vec<u8> {
202
0
    fn fmt_as_field(&self, f: &mut Formatter) -> fmt::Result {
203
0
        fmt_truncated_hex::<16>(self, f)
204
0
    }
205
}
206
207
impl AsField<PredicateCode> for PredicateCode {
208
    #[inline(always)]
209
    fn as_field(&self) -> Option<&PredicateCode> {
210
        Some(self)
211
    }
212
213
0
    fn as_mut_field(&mut self) -> Option<&mut PredicateCode> {
214
0
        Some(self)
215
0
    }
216
}
217
218
impl AsFieldFmt for PredicateCode {
219
0
    fn fmt_as_field(&self, f: &mut Formatter) -> fmt::Result {
220
0
        fmt_truncated_hex::<16>(self, f)
221
0
    }
222
}
223
224
#[derive(
225
    Debug,
226
    Clone,
227
    PartialEq,
228
    Eq,
229
    Hash,
230
    strum_macros::EnumCount,
231
    serde::Serialize,
232
0
    serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputs1_1__NtB7_5InputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1h_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputs1_1__NtBa_5InputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1k_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputs1_1__NtB8_5InputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1i_7Visitor9visit_u64pEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputs1_1__NtB8_5InputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1i_7Visitor9visit_strpEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputs1_1__NtB8_5InputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1i_7Visitor11visit_bytespEBe_
Unexecuted instantiation: _RINvXs_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputs1_1__NtBa_5InputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1i_11deserializepEBg_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputs1_1__NtBb_5InputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1l_7Visitor10visit_enumpEBh_
233
)]
234
#[cfg_attr(
235
    feature = "da-compression",
236
    derive(fuel_compression::Compress, fuel_compression::Decompress)
237
)]
238
pub enum Input {
239
    CoinSigned(CoinSigned),
240
    CoinPredicate(CoinPredicate),
241
    Contract(Contract),
242
    MessageCoinSigned(MessageCoinSigned),
243
    MessageCoinPredicate(MessageCoinPredicate),
244
    MessageDataSigned(MessageDataSigned),
245
    MessageDataPredicate(MessageDataPredicate),
246
}
247
248
impl Default for Input {
249
0
    fn default() -> Self {
250
0
        Self::contract(
251
0
            Default::default(),
252
0
            Default::default(),
253
0
            Default::default(),
254
0
            Default::default(),
255
0
            Default::default(),
256
0
        )
257
0
    }
258
}
259
260
impl Input {
261
2.45M
    pub const fn repr(&self) -> InputRepr {
262
2.45M
        InputRepr::from_input(self)
263
2.45M
    }
_RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input4reprCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
261
2.45M
    pub const fn repr(&self) -> InputRepr {
262
2.45M
        InputRepr::from_input(self)
263
2.45M
    }
Unexecuted instantiation: _RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input4reprBb_
264
265
13.1k
    pub fn owner(pk: &PublicKey) -> Address {
266
13.1k
        let owner: [u8; Address::LEN] = pk.hash().into();
267
13.1k
268
13.1k
        owner.into()
269
13.1k
    }
270
271
0
    pub const fn coin_predicate(
272
0
        utxo_id: UtxoId,
273
0
        owner: Address,
274
0
        amount: Word,
275
0
        asset_id: AssetId,
276
0
        tx_pointer: TxPointer,
277
0
        predicate_gas_used: Word,
278
0
        predicate: Vec<u8>,
279
0
        predicate_data: Vec<u8>,
280
0
    ) -> Self {
281
0
        Self::CoinPredicate(CoinPredicate {
282
0
            utxo_id,
283
0
            owner,
284
0
            amount,
285
0
            asset_id,
286
0
            tx_pointer,
287
0
            witness_index: Empty::new(),
288
0
            predicate_gas_used,
289
0
            predicate: PredicateCode { bytes: predicate },
290
0
            predicate_data,
291
0
        })
292
0
    }
293
294
4.38k
    pub const fn coin_signed(
295
4.38k
        utxo_id: UtxoId,
296
4.38k
        owner: Address,
297
4.38k
        amount: Word,
298
4.38k
        asset_id: AssetId,
299
4.38k
        tx_pointer: TxPointer,
300
4.38k
        witness_index: u16,
301
4.38k
    ) -> Self {
302
4.38k
        Self::CoinSigned(CoinSigned {
303
4.38k
            utxo_id,
304
4.38k
            owner,
305
4.38k
            amount,
306
4.38k
            asset_id,
307
4.38k
            tx_pointer,
308
4.38k
            witness_index,
309
4.38k
            predicate_gas_used: Empty::new(),
310
4.38k
            predicate: Empty::new(),
311
4.38k
            predicate_data: Empty::new(),
312
4.38k
        })
313
4.38k
    }
_RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input11coin_signedCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
294
4.38k
    pub const fn coin_signed(
295
4.38k
        utxo_id: UtxoId,
296
4.38k
        owner: Address,
297
4.38k
        amount: Word,
298
4.38k
        asset_id: AssetId,
299
4.38k
        tx_pointer: TxPointer,
300
4.38k
        witness_index: u16,
301
4.38k
    ) -> Self {
302
4.38k
        Self::CoinSigned(CoinSigned {
303
4.38k
            utxo_id,
304
4.38k
            owner,
305
4.38k
            amount,
306
4.38k
            asset_id,
307
4.38k
            tx_pointer,
308
4.38k
            witness_index,
309
4.38k
            predicate_gas_used: Empty::new(),
310
4.38k
            predicate: Empty::new(),
311
4.38k
            predicate_data: Empty::new(),
312
4.38k
        })
313
4.38k
    }
Unexecuted instantiation: _RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input11coin_signedBb_
314
315
2.19k
    pub const fn contract(
316
2.19k
        utxo_id: UtxoId,
317
2.19k
        balance_root: Bytes32,
318
2.19k
        state_root: Bytes32,
319
2.19k
        tx_pointer: TxPointer,
320
2.19k
        contract_id: ContractId,
321
2.19k
    ) -> Self {
322
2.19k
        Self::Contract(Contract {
323
2.19k
            utxo_id,
324
2.19k
            balance_root,
325
2.19k
            state_root,
326
2.19k
            tx_pointer,
327
2.19k
            contract_id,
328
2.19k
        })
329
2.19k
    }
_RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input8contractCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
315
2.19k
    pub const fn contract(
316
2.19k
        utxo_id: UtxoId,
317
2.19k
        balance_root: Bytes32,
318
2.19k
        state_root: Bytes32,
319
2.19k
        tx_pointer: TxPointer,
320
2.19k
        contract_id: ContractId,
321
2.19k
    ) -> Self {
322
2.19k
        Self::Contract(Contract {
323
2.19k
            utxo_id,
324
2.19k
            balance_root,
325
2.19k
            state_root,
326
2.19k
            tx_pointer,
327
2.19k
            contract_id,
328
2.19k
        })
329
2.19k
    }
Unexecuted instantiation: _RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input8contractBb_
330
331
0
    pub const fn message_coin_signed(
332
0
        sender: Address,
333
0
        recipient: Address,
334
0
        amount: Word,
335
0
        nonce: Nonce,
336
0
        witness_index: u16,
337
0
    ) -> Self {
338
0
        Self::MessageCoinSigned(MessageCoinSigned {
339
0
            sender,
340
0
            recipient,
341
0
            amount,
342
0
            nonce,
343
0
            witness_index,
344
0
            predicate_gas_used: Empty::new(),
345
0
            data: Empty::new(),
346
0
            predicate: Empty::new(),
347
0
            predicate_data: Empty::new(),
348
0
        })
349
0
    }
350
351
0
    pub const fn message_coin_predicate(
352
0
        sender: Address,
353
0
        recipient: Address,
354
0
        amount: Word,
355
0
        nonce: Nonce,
356
0
        predicate_gas_used: Word,
357
0
        predicate: Vec<u8>,
358
0
        predicate_data: Vec<u8>,
359
0
    ) -> Self {
360
0
        Self::MessageCoinPredicate(MessageCoinPredicate {
361
0
            sender,
362
0
            recipient,
363
0
            amount,
364
0
            nonce,
365
0
            witness_index: Empty::new(),
366
0
            predicate_gas_used,
367
0
            data: Empty::new(),
368
0
            predicate: PredicateCode { bytes: predicate },
369
0
            predicate_data,
370
0
        })
371
0
    }
372
373
0
    pub const fn message_data_signed(
374
0
        sender: Address,
375
0
        recipient: Address,
376
0
        amount: Word,
377
0
        nonce: Nonce,
378
0
        witness_index: u16,
379
0
        data: Vec<u8>,
380
0
    ) -> Self {
381
0
        Self::MessageDataSigned(MessageDataSigned {
382
0
            sender,
383
0
            recipient,
384
0
            amount,
385
0
            nonce,
386
0
            witness_index,
387
0
            data,
388
0
            predicate: Empty::new(),
389
0
            predicate_data: Empty::new(),
390
0
            predicate_gas_used: Empty::new(),
391
0
        })
392
0
    }
393
394
0
    pub const fn message_data_predicate(
395
0
        sender: Address,
396
0
        recipient: Address,
397
0
        amount: Word,
398
0
        nonce: Nonce,
399
0
        predicate_gas_used: Word,
400
0
        data: Vec<u8>,
401
0
        predicate: Vec<u8>,
402
0
        predicate_data: Vec<u8>,
403
0
    ) -> Self {
404
0
        Self::MessageDataPredicate(MessageDataPredicate {
405
0
            sender,
406
0
            recipient,
407
0
            amount,
408
0
            nonce,
409
0
            witness_index: Empty::new(),
410
0
            predicate_gas_used,
411
0
            data,
412
0
            predicate: PredicateCode { bytes: predicate },
413
0
            predicate_data,
414
0
        })
415
0
    }
416
417
254k
    pub const fn utxo_id(&self) -> Option<&UtxoId> {
418
254k
        match self {
419
254k
            Self::CoinSigned(CoinSigned { utxo_id, .. })
420
0
            | Self::CoinPredicate(CoinPredicate { utxo_id, .. })
421
254k
            | Self::Contract(Contract { utxo_id, .. }) => Some(utxo_id),
422
0
            Self::MessageCoinSigned(_) => None,
423
0
            Self::MessageCoinPredicate(_) => None,
424
0
            Self::MessageDataSigned(_) => None,
425
0
            Self::MessageDataPredicate(_) => None,
426
        }
427
254k
    }
_RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input7utxo_idCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
417
254k
    pub const fn utxo_id(&self) -> Option<&UtxoId> {
418
254k
        match self {
419
254k
            Self::CoinSigned(CoinSigned { utxo_id, .. })
420
0
            | Self::CoinPredicate(CoinPredicate { utxo_id, .. })
421
254k
            | Self::Contract(Contract { utxo_id, .. }) => Some(utxo_id),
422
0
            Self::MessageCoinSigned(_) => None,
423
0
            Self::MessageCoinPredicate(_) => None,
424
0
            Self::MessageDataSigned(_) => None,
425
0
            Self::MessageDataPredicate(_) => None,
426
        }
427
254k
    }
Unexecuted instantiation: _RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input7utxo_idBb_
428
429
0
    pub const fn input_owner(&self) -> Option<&Address> {
430
0
        match self {
431
0
            Self::CoinSigned(CoinSigned { owner, .. })
432
0
            | Self::CoinPredicate(CoinPredicate { owner, .. }) => Some(owner),
433
0
            Self::MessageCoinSigned(MessageCoinSigned { recipient, .. })
434
0
            | Self::MessageCoinPredicate(MessageCoinPredicate { recipient, .. })
435
0
            | Self::MessageDataSigned(MessageDataSigned { recipient, .. })
436
0
            | Self::MessageDataPredicate(MessageDataPredicate { recipient, .. }) => {
437
0
                Some(recipient)
438
            }
439
0
            Self::Contract(_) => None,
440
        }
441
0
    }
442
443
2.19k
    pub const fn asset_id<'a>(
444
2.19k
        &'a self,
445
2.19k
        base_asset_id: &'a AssetId,
446
2.19k
    ) -> Option<&'a AssetId> {
447
2.19k
        match self {
448
2.19k
            Input::CoinSigned(CoinSigned { asset_id, .. })
449
2.19k
            | Input::CoinPredicate(CoinPredicate { asset_id, .. }) => Some(asset_id),
450
            Input::MessageCoinSigned(_)
451
            | Input::MessageCoinPredicate(_)
452
            | Input::MessageDataSigned(_)
453
0
            | Input::MessageDataPredicate(_) => Some(base_asset_id),
454
0
            Input::Contract(_) => None,
455
        }
456
2.19k
    }
457
458
6.57k
    pub const fn contract_id(&self) -> Option<&ContractId> {
459
6.57k
        match self {
460
2.19k
            Self::Contract(Contract { contract_id, .. }) => Some(contract_id),
461
4.38k
            _ => None,
462
        }
463
6.57k
    }
_RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input11contract_idCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
458
6.57k
    pub const fn contract_id(&self) -> Option<&ContractId> {
459
6.57k
        match self {
460
2.19k
            Self::Contract(Contract { contract_id, .. }) => Some(contract_id),
461
4.38k
            _ => None,
462
        }
463
6.57k
    }
Unexecuted instantiation: _RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input11contract_idBb_
464
465
211k
    pub const fn amount(&self) -> Option<Word> {
466
211k
        match self {
467
211k
            Input::CoinSigned(CoinSigned { amount, .. })
468
0
            | Input::CoinPredicate(CoinPredicate { amount, .. })
469
0
            | Input::MessageCoinSigned(MessageCoinSigned { amount, .. })
470
0
            | Input::MessageCoinPredicate(MessageCoinPredicate { amount, .. })
471
0
            | Input::MessageDataSigned(MessageDataSigned { amount, .. })
472
0
            | Input::MessageDataPredicate(MessageDataPredicate { amount, .. }) => {
473
211k
                Some(*amount)
474
            }
475
0
            Input::Contract(_) => None,
476
        }
477
211k
    }
_RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input6amountCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
465
211k
    pub const fn amount(&self) -> Option<Word> {
466
211k
        match self {
467
211k
            Input::CoinSigned(CoinSigned { amount, .. })
468
0
            | Input::CoinPredicate(CoinPredicate { amount, .. })
469
0
            | Input::MessageCoinSigned(MessageCoinSigned { amount, .. })
470
0
            | Input::MessageCoinPredicate(MessageCoinPredicate { amount, .. })
471
0
            | Input::MessageDataSigned(MessageDataSigned { amount, .. })
472
0
            | Input::MessageDataPredicate(MessageDataPredicate { amount, .. }) => {
473
211k
                Some(*amount)
474
            }
475
0
            Input::Contract(_) => None,
476
        }
477
211k
    }
Unexecuted instantiation: _RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input6amountBb_
478
479
208k
    pub const fn witness_index(&self) -> Option<u16> {
480
208k
        match self {
481
208k
            Input::CoinSigned(CoinSigned { witness_index, .. })
482
0
            | Input::MessageCoinSigned(MessageCoinSigned { witness_index, .. })
483
0
            | Input::MessageDataSigned(MessageDataSigned { witness_index, .. }) => {
484
208k
                Some(*witness_index)
485
            }
486
            Input::CoinPredicate(_)
487
            | Input::Contract(_)
488
            | Input::MessageCoinPredicate(_)
489
0
            | Input::MessageDataPredicate(_) => None,
490
        }
491
208k
    }
_RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input13witness_indexCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
479
208k
    pub const fn witness_index(&self) -> Option<u16> {
480
208k
        match self {
481
208k
            Input::CoinSigned(CoinSigned { witness_index, .. })
482
0
            | Input::MessageCoinSigned(MessageCoinSigned { witness_index, .. })
483
0
            | Input::MessageDataSigned(MessageDataSigned { witness_index, .. }) => {
484
208k
                Some(*witness_index)
485
            }
486
            Input::CoinPredicate(_)
487
            | Input::Contract(_)
488
            | Input::MessageCoinPredicate(_)
489
0
            | Input::MessageDataPredicate(_) => None,
490
        }
491
208k
    }
Unexecuted instantiation: _RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input13witness_indexBb_
492
493
13.1k
    pub fn predicate_offset(&self) -> Option<usize> {
494
13.1k
        match self {
495
0
            Input::CoinPredicate(_) => InputRepr::Coin.coin_predicate_offset(),
496
0
            Input::MessageCoinPredicate(_) => InputRepr::Message.data_offset(),
497
0
            Input::MessageDataPredicate(MessageDataPredicate { data, .. }) => {
498
0
                InputRepr::Message.data_offset().map(|o| {
499
0
                    o.saturating_add(bytes::padded_len(data).unwrap_or(usize::MAX))
500
0
                })
501
            }
502
            Input::CoinSigned(_)
503
            | Input::Contract(_)
504
            | Input::MessageCoinSigned(_)
505
13.1k
            | Input::MessageDataSigned(_) => None,
506
        }
507
13.1k
    }
508
509
1
    pub fn predicate_data_offset(&self) -> Option<usize> {
510
1
        match self {
511
0
            Input::CoinPredicate(CoinPredicate { predicate, .. })
512
0
            | Input::MessageCoinPredicate(MessageCoinPredicate { predicate, .. })
513
0
            | Input::MessageDataPredicate(MessageDataPredicate { predicate, .. }) => {
514
0
                self.predicate_offset().map(|o| {
515
0
                    o.saturating_add(bytes::padded_len(predicate).unwrap_or(usize::MAX))
516
0
                })
517
            }
518
            Input::CoinSigned(_)
519
            | Input::Contract(_)
520
            | Input::MessageCoinSigned(_)
521
1
            | Input::MessageDataSigned(_) => None,
522
        }
523
1
    }
524
525
96.4k
    pub fn predicate_len(&self) -> Option<usize> {
526
96.4k
        match self {
527
0
            Input::CoinPredicate(CoinPredicate { predicate, .. })
528
0
            | Input::MessageCoinPredicate(MessageCoinPredicate { predicate, .. })
529
0
            | Input::MessageDataPredicate(MessageDataPredicate { predicate, .. }) => {
530
0
                Some(predicate.len())
531
            }
532
            Input::CoinSigned(_)
533
            | Input::MessageCoinSigned(_)
534
92.1k
            | Input::MessageDataSigned(_) => Some(0),
535
4.38k
            Input::Contract(_) => None,
536
        }
537
96.4k
    }
_RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input13predicate_lenCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
525
83.3k
    pub fn predicate_len(&self) -> Option<usize> {
526
83.3k
        match self {
527
0
            Input::CoinPredicate(CoinPredicate { predicate, .. })
528
0
            | Input::MessageCoinPredicate(MessageCoinPredicate { predicate, .. })
529
0
            | Input::MessageDataPredicate(MessageDataPredicate { predicate, .. }) => {
530
0
                Some(predicate.len())
531
            }
532
            Input::CoinSigned(_)
533
            | Input::MessageCoinSigned(_)
534
83.3k
            | Input::MessageDataSigned(_) => Some(0),
535
0
            Input::Contract(_) => None,
536
        }
537
83.3k
    }
_RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input13predicate_lenBb_
Line
Count
Source
525
13.1k
    pub fn predicate_len(&self) -> Option<usize> {
526
13.1k
        match self {
527
0
            Input::CoinPredicate(CoinPredicate { predicate, .. })
528
0
            | Input::MessageCoinPredicate(MessageCoinPredicate { predicate, .. })
529
0
            | Input::MessageDataPredicate(MessageDataPredicate { predicate, .. }) => {
530
0
                Some(predicate.len())
531
            }
532
            Input::CoinSigned(_)
533
            | Input::MessageCoinSigned(_)
534
8.77k
            | Input::MessageDataSigned(_) => Some(0),
535
4.38k
            Input::Contract(_) => None,
536
        }
537
13.1k
    }
538
539
83.3k
    pub fn predicate_data_len(&self) -> Option<usize> {
540
83.3k
        match self {
541
0
            Input::CoinPredicate(CoinPredicate { predicate_data, .. })
542
            | Input::MessageCoinPredicate(MessageCoinPredicate {
543
0
                predicate_data, ..
544
            })
545
            | Input::MessageDataPredicate(MessageDataPredicate {
546
0
                predicate_data, ..
547
0
            }) => Some(predicate_data.len()),
548
            Input::CoinSigned(_)
549
            | Input::MessageCoinSigned(_)
550
83.3k
            | Input::MessageDataSigned(_) => Some(0),
551
0
            Input::Contract(_) => None,
552
        }
553
83.3k
    }
_RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input18predicate_data_lenCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
539
83.3k
    pub fn predicate_data_len(&self) -> Option<usize> {
540
83.3k
        match self {
541
0
            Input::CoinPredicate(CoinPredicate { predicate_data, .. })
542
            | Input::MessageCoinPredicate(MessageCoinPredicate {
543
0
                predicate_data, ..
544
            })
545
            | Input::MessageDataPredicate(MessageDataPredicate {
546
0
                predicate_data, ..
547
0
            }) => Some(predicate_data.len()),
548
            Input::CoinSigned(_)
549
            | Input::MessageCoinSigned(_)
550
83.3k
            | Input::MessageDataSigned(_) => Some(0),
551
0
            Input::Contract(_) => None,
552
        }
553
83.3k
    }
Unexecuted instantiation: _RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input18predicate_data_lenBb_
554
555
1
    pub fn predicate_gas_used(&self) -> Option<Word> {
556
1
        match self {
557
            Input::CoinPredicate(CoinPredicate {
558
0
                predicate_gas_used, ..
559
            })
560
            | Input::MessageCoinPredicate(MessageCoinPredicate {
561
0
                predicate_gas_used,
562
                ..
563
            })
564
            | Input::MessageDataPredicate(MessageDataPredicate {
565
0
                predicate_gas_used,
566
                ..
567
0
            }) => Some(*predicate_gas_used),
568
            Input::CoinSigned(_)
569
            | Input::MessageCoinSigned(_)
570
            | Input::MessageDataSigned(_)
571
1
            | Input::Contract(_) => None,
572
        }
573
1
    }
_RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input18predicate_gas_usedCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
555
1
    pub fn predicate_gas_used(&self) -> Option<Word> {
556
1
        match self {
557
            Input::CoinPredicate(CoinPredicate {
558
0
                predicate_gas_used, ..
559
            })
560
            | Input::MessageCoinPredicate(MessageCoinPredicate {
561
0
                predicate_gas_used,
562
                ..
563
            })
564
            | Input::MessageDataPredicate(MessageDataPredicate {
565
0
                predicate_gas_used,
566
                ..
567
0
            }) => Some(*predicate_gas_used),
568
            Input::CoinSigned(_)
569
            | Input::MessageCoinSigned(_)
570
            | Input::MessageDataSigned(_)
571
1
            | Input::Contract(_) => None,
572
        }
573
1
    }
Unexecuted instantiation: _RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input18predicate_gas_usedBb_
574
575
0
    pub fn set_predicate_gas_used(&mut self, gas: Word) {
576
0
        match self {
577
            Input::CoinPredicate(CoinPredicate {
578
0
                predicate_gas_used, ..
579
            })
580
            | Input::MessageCoinPredicate(MessageCoinPredicate {
581
0
                predicate_gas_used,
582
                ..
583
            })
584
            | Input::MessageDataPredicate(MessageDataPredicate {
585
0
                predicate_gas_used,
586
                ..
587
0
            }) => *predicate_gas_used = gas,
588
            Input::CoinSigned(_)
589
            | Input::MessageCoinSigned(_)
590
            | Input::MessageDataSigned(_)
591
0
            | Input::Contract(_) => {}
592
        }
593
0
    }
594
595
6.57k
    pub fn message_id(&self) -> Option<MessageId> {
596
6.57k
        match self {
597
0
            Self::MessageCoinSigned(message) => Some(message.message_id()),
598
0
            Self::MessageCoinPredicate(message) => Some(message.message_id()),
599
0
            Self::MessageDataPredicate(message) => Some(message.message_id()),
600
0
            Self::MessageDataSigned(message) => Some(message.message_id()),
601
6.57k
            _ => None,
602
        }
603
6.57k
    }
604
605
0
    pub const fn tx_pointer(&self) -> Option<&TxPointer> {
606
0
        match self {
607
0
            Input::CoinSigned(CoinSigned { tx_pointer, .. })
608
0
            | Input::CoinPredicate(CoinPredicate { tx_pointer, .. })
609
0
            | Input::Contract(Contract { tx_pointer, .. }) => Some(tx_pointer),
610
0
            _ => None,
611
        }
612
0
    }
613
614
0
    pub fn input_data(&self) -> Option<&[u8]> {
615
0
        match self {
616
0
            Input::MessageDataSigned(MessageDataSigned { data, .. })
617
0
            | Input::MessageDataPredicate(MessageDataPredicate { data, .. }) => {
618
0
                Some(data)
619
            }
620
0
            _ => None,
621
        }
622
0
    }
623
624
0
    pub fn input_data_len(&self) -> Option<usize> {
625
0
        match self {
626
0
            Input::MessageDataSigned(MessageDataSigned { data, .. })
627
0
            | Input::MessageDataPredicate(MessageDataPredicate { data, .. }) => {
628
0
                Some(data.len())
629
            }
630
0
            Input::MessageCoinSigned(_) | Input::MessageCoinPredicate(_) => Some(0),
631
0
            _ => None,
632
        }
633
0
    }
Unexecuted instantiation: _RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input14input_data_lenCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input14input_data_lenBb_
634
635
0
    pub fn input_predicate(&self) -> Option<&[u8]> {
636
0
        match self {
637
0
            Input::CoinPredicate(CoinPredicate { predicate, .. })
638
0
            | Input::MessageCoinPredicate(MessageCoinPredicate { predicate, .. })
639
0
            | Input::MessageDataPredicate(MessageDataPredicate { predicate, .. }) => {
640
0
                Some(predicate)
641
            }
642
643
0
            _ => None,
644
        }
645
0
    }
646
647
0
    pub fn input_predicate_data(&self) -> Option<&[u8]> {
648
0
        match self {
649
0
            Input::CoinPredicate(CoinPredicate { predicate_data, .. })
650
            | Input::MessageCoinPredicate(MessageCoinPredicate {
651
0
                predicate_data, ..
652
            })
653
            | Input::MessageDataPredicate(MessageDataPredicate {
654
0
                predicate_data, ..
655
0
            }) => Some(predicate_data),
656
657
0
            _ => None,
658
        }
659
0
    }
660
661
    /// Return a tuple containing the predicate, its data and used gas if the input is of
662
    /// type `CoinPredicate` or `MessageCoinPredicate` or `MessageDataPredicate`
663
0
    pub fn predicate(&self) -> Option<(&[u8], &[u8], &Word)> {
664
0
        match self {
665
            Input::CoinPredicate(CoinPredicate {
666
0
                predicate,
667
0
                predicate_data,
668
0
                predicate_gas_used,
669
                ..
670
            })
671
            | Input::MessageCoinPredicate(MessageCoinPredicate {
672
0
                predicate,
673
0
                predicate_data,
674
0
                predicate_gas_used,
675
                ..
676
            })
677
            | Input::MessageDataPredicate(MessageDataPredicate {
678
0
                predicate,
679
0
                predicate_data,
680
0
                predicate_gas_used,
681
                ..
682
0
            }) => Some((
683
0
                predicate.as_slice(),
684
0
                predicate_data.as_slice(),
685
0
                predicate_gas_used,
686
0
            )),
687
688
0
            _ => None,
689
        }
690
0
    }
691
692
2.85M
    pub const fn is_coin(&self) -> bool {
693
2.85M
        self.is_coin_signed() | self.is_coin_predicate()
694
2.85M
    }
_RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input7is_coinCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
692
2.85M
    pub const fn is_coin(&self) -> bool {
693
2.85M
        self.is_coin_signed() | self.is_coin_predicate()
694
2.85M
    }
Unexecuted instantiation: _RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input7is_coinBb_
695
696
2.85M
    pub const fn is_coin_signed(&self) -> bool {
697
2.85M
        matches!(self, Input::CoinSigned(_))
698
2.85M
    }
_RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input14is_coin_signedCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
696
2.85M
    pub const fn is_coin_signed(&self) -> bool {
697
2.85M
        matches!(self, Input::CoinSigned(_))
698
2.85M
    }
Unexecuted instantiation: _RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input14is_coin_signedBb_
699
700
2.85M
    pub const fn is_coin_predicate(&self) -> bool {
701
2.85M
        matches!(self, Input::CoinPredicate(_))
702
2.85M
    }
_RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input17is_coin_predicateCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
700
2.85M
    pub const fn is_coin_predicate(&self) -> bool {
701
2.85M
        matches!(self, Input::CoinPredicate(_))
702
2.85M
    }
Unexecuted instantiation: _RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input17is_coin_predicateBb_
703
704
21
    pub const fn is_message(&self) -> bool {
705
21
        self.is_message_coin_signed()
706
21
            | self.is_message_coin_predicate()
707
21
            | self.is_message_data_signed()
708
21
            | self.is_message_data_predicate()
709
21
    }
_RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input10is_messageCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
704
21
    pub const fn is_message(&self) -> bool {
705
21
        self.is_message_coin_signed()
706
21
            | self.is_message_coin_predicate()
707
21
            | self.is_message_data_signed()
708
21
            | self.is_message_data_predicate()
709
21
    }
Unexecuted instantiation: _RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input10is_messageBb_
710
711
21
    pub const fn is_message_coin_signed(&self) -> bool {
712
21
        matches!(self, Input::MessageCoinSigned(_))
713
21
    }
_RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input22is_message_coin_signedCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
711
21
    pub const fn is_message_coin_signed(&self) -> bool {
712
21
        matches!(self, Input::MessageCoinSigned(_))
713
21
    }
Unexecuted instantiation: _RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input22is_message_coin_signedBb_
714
715
21
    pub const fn is_message_coin_predicate(&self) -> bool {
716
21
        matches!(self, Input::MessageCoinPredicate(_))
717
21
    }
_RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input25is_message_coin_predicateCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
715
21
    pub const fn is_message_coin_predicate(&self) -> bool {
716
21
        matches!(self, Input::MessageCoinPredicate(_))
717
21
    }
Unexecuted instantiation: _RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input25is_message_coin_predicateBb_
718
719
21
    pub const fn is_message_data_signed(&self) -> bool {
720
21
        matches!(self, Input::MessageDataSigned(_))
721
21
    }
_RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input22is_message_data_signedCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
719
21
    pub const fn is_message_data_signed(&self) -> bool {
720
21
        matches!(self, Input::MessageDataSigned(_))
721
21
    }
Unexecuted instantiation: _RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input22is_message_data_signedBb_
722
723
21
    pub const fn is_message_data_predicate(&self) -> bool {
724
21
        matches!(self, Input::MessageDataPredicate(_))
725
21
    }
_RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input25is_message_data_predicateCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
723
21
    pub const fn is_message_data_predicate(&self) -> bool {
724
21
        matches!(self, Input::MessageDataPredicate(_))
725
21
    }
Unexecuted instantiation: _RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input25is_message_data_predicateBb_
726
727
450k
    pub const fn is_contract(&self) -> bool {
728
450k
        matches!(self, Input::Contract(_))
729
450k
    }
_RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input11is_contractCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
727
450k
    pub const fn is_contract(&self) -> bool {
728
450k
        matches!(self, Input::Contract(_))
729
450k
    }
Unexecuted instantiation: _RNvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB5_5Input11is_contractBb_
730
731
0
    pub const fn coin_predicate_offset() -> usize {
732
0
        INPUT_COIN_FIXED_SIZE
733
0
    }
734
735
0
    pub const fn message_data_offset() -> usize {
736
0
        INPUT_MESSAGE_FIXED_SIZE
737
0
    }
738
739
0
    pub const fn balance_root(&self) -> Option<&Bytes32> {
740
0
        match self {
741
0
            Input::Contract(Contract { balance_root, .. }) => Some(balance_root),
742
0
            _ => None,
743
        }
744
0
    }
745
746
0
    pub const fn state_root(&self) -> Option<&Bytes32> {
747
0
        match self {
748
0
            Input::Contract(Contract { state_root, .. }) => Some(state_root),
749
0
            _ => None,
750
        }
751
0
    }
752
753
0
    pub const fn sender(&self) -> Option<&Address> {
754
0
        match self {
755
0
            Input::MessageCoinSigned(MessageCoinSigned { sender, .. })
756
0
            | Input::MessageCoinPredicate(MessageCoinPredicate { sender, .. })
757
0
            | Input::MessageDataSigned(MessageDataSigned { sender, .. })
758
0
            | Input::MessageDataPredicate(MessageDataPredicate { sender, .. }) => {
759
0
                Some(sender)
760
            }
761
0
            _ => None,
762
        }
763
0
    }
764
765
0
    pub const fn recipient(&self) -> Option<&Address> {
766
0
        match self {
767
0
            Input::MessageCoinSigned(MessageCoinSigned { recipient, .. })
768
0
            | Input::MessageCoinPredicate(MessageCoinPredicate { recipient, .. })
769
0
            | Input::MessageDataSigned(MessageDataSigned { recipient, .. })
770
0
            | Input::MessageDataPredicate(MessageDataPredicate { recipient, .. }) => {
771
0
                Some(recipient)
772
            }
773
0
            _ => None,
774
        }
775
0
    }
776
777
0
    pub const fn nonce(&self) -> Option<&Nonce> {
778
0
        match self {
779
0
            Input::MessageCoinSigned(MessageCoinSigned { nonce, .. })
780
0
            | Input::MessageCoinPredicate(MessageCoinPredicate { nonce, .. })
781
0
            | Input::MessageDataSigned(MessageDataSigned { nonce, .. })
782
0
            | Input::MessageDataPredicate(MessageDataPredicate { nonce, .. }) => {
783
0
                Some(nonce)
784
            }
785
0
            _ => None,
786
        }
787
0
    }
788
789
    /// Empties fields that should be zero during the signing.
790
26.3k
    pub fn prepare_sign(&mut self) {
791
26.3k
        match self {
792
17.5k
            Input::CoinSigned(coin) => coin.prepare_sign(),
793
0
            Input::CoinPredicate(coin) => coin.prepare_sign(),
794
8.77k
            Input::Contract(contract) => contract.prepare_sign(),
795
0
            Input::MessageCoinSigned(message) => message.prepare_sign(),
796
0
            Input::MessageCoinPredicate(message) => message.prepare_sign(),
797
0
            Input::MessageDataSigned(message) => message.prepare_sign(),
798
0
            Input::MessageDataPredicate(message) => message.prepare_sign(),
799
        }
800
26.3k
    }
801
802
0
    pub fn compute_message_id(
803
0
        sender: &Address,
804
0
        recipient: &Address,
805
0
        nonce: &Nonce,
806
0
        amount: Word,
807
0
        data: &[u8],
808
0
    ) -> MessageId {
809
0
        compute_message_id(sender, recipient, nonce, amount, data)
810
0
    }
811
812
0
    pub fn predicate_owner<P>(predicate: P) -> Address
813
0
    where
814
0
        P: AsRef<[u8]>,
815
0
    {
816
        use crate::Contract;
817
818
0
        let root = Contract::root_from_code(predicate);
819
0
820
0
        let mut hasher = Hasher::default();
821
0
822
0
        hasher.input(ContractId::SEED);
823
0
        hasher.input(root);
824
0
825
0
        (*hasher.digest()).into()
826
0
    }
Unexecuted instantiation: _RINvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB6_5Input15predicate_ownerRINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB6_5Input15predicate_ownerRINtNtCs5vansr6XbJU_5alloc3vec3VechEEBc_
827
828
0
    pub fn is_predicate_owner_valid<P>(owner: &Address, predicate: P) -> bool
829
0
    where
830
0
        P: AsRef<[u8]>,
831
0
    {
832
0
        owner == &Self::predicate_owner(predicate)
833
0
    }
Unexecuted instantiation: _RINvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB6_5Input24is_predicate_owner_validRINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvMsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB6_5Input24is_predicate_owner_validRINtNtCs5vansr6XbJU_5alloc3vec3VechEEBc_
834
}
835
836
impl Serialize for Input {
837
243k
    fn size_static(&self) -> usize {
838
243k
        (match self {
839
162k
            Input::CoinSigned(coin) => coin.size_static(),
840
0
            Input::CoinPredicate(coin) => coin.size_static(),
841
81.1k
            Input::Contract(contract) => contract.size_static(),
842
0
            Input::MessageCoinSigned(message) => message.size_static(),
843
0
            Input::MessageCoinPredicate(message) => message.size_static(),
844
0
            Input::MessageDataSigned(message) => message.size_static(),
845
0
            Input::MessageDataPredicate(message) => message.size_static(),
846
        })
847
243k
        .saturating_add(8) // Discriminant
848
243k
    }
849
850
243k
    fn size_dynamic(&self) -> usize {
851
243k
        match self {
852
162k
            Input::CoinSigned(coin) => coin.size_dynamic(),
853
0
            Input::CoinPredicate(coin) => coin.size_dynamic(),
854
81.1k
            Input::Contract(contract) => contract.size_dynamic(),
855
0
            Input::MessageCoinSigned(message) => message.size_dynamic(),
856
0
            Input::MessageCoinPredicate(message) => message.size_dynamic(),
857
0
            Input::MessageDataSigned(message) => message.size_dynamic(),
858
0
            Input::MessageDataPredicate(message) => message.size_dynamic(),
859
        }
860
243k
    }
861
862
26.3k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
863
26.3k
        let discr = InputRepr::from(self);
864
26.3k
        discr.encode_static(buffer)?;
865
26.3k
        match self {
866
17.5k
            Input::CoinSigned(coin) => coin.encode_static(buffer),
867
0
            Input::CoinPredicate(coin) => coin.encode_static(buffer),
868
8.77k
            Input::Contract(contract) => contract.encode_static(buffer),
869
0
            Input::MessageCoinSigned(message) => message.encode_static(buffer),
870
0
            Input::MessageCoinPredicate(message) => message.encode_static(buffer),
871
0
            Input::MessageDataSigned(message) => message.encode_static(buffer),
872
0
            Input::MessageDataPredicate(message) => message.encode_static(buffer),
873
        }
874
26.3k
    }
_RINvXsg_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB6_5InputNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
862
13.1k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
863
13.1k
        let discr = InputRepr::from(self);
864
13.1k
        discr.encode_static(buffer)?;
865
13.1k
        match self {
866
8.77k
            Input::CoinSigned(coin) => coin.encode_static(buffer),
867
0
            Input::CoinPredicate(coin) => coin.encode_static(buffer),
868
4.38k
            Input::Contract(contract) => contract.encode_static(buffer),
869
0
            Input::MessageCoinSigned(message) => message.encode_static(buffer),
870
0
            Input::MessageCoinPredicate(message) => message.encode_static(buffer),
871
0
            Input::MessageDataSigned(message) => message.encode_static(buffer),
872
0
            Input::MessageDataPredicate(message) => message.encode_static(buffer),
873
        }
874
13.1k
    }
_RINvXsg_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB6_5InputNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBc_
Line
Count
Source
862
13.1k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
863
13.1k
        let discr = InputRepr::from(self);
864
13.1k
        discr.encode_static(buffer)?;
865
13.1k
        match self {
866
8.77k
            Input::CoinSigned(coin) => coin.encode_static(buffer),
867
0
            Input::CoinPredicate(coin) => coin.encode_static(buffer),
868
4.38k
            Input::Contract(contract) => contract.encode_static(buffer),
869
0
            Input::MessageCoinSigned(message) => message.encode_static(buffer),
870
0
            Input::MessageCoinPredicate(message) => message.encode_static(buffer),
871
0
            Input::MessageDataSigned(message) => message.encode_static(buffer),
872
0
            Input::MessageDataPredicate(message) => message.encode_static(buffer),
873
        }
874
13.1k
    }
875
876
26.3k
    fn encode_dynamic<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
877
26.3k
        let discr = InputRepr::from(self);
878
26.3k
        discr.encode_dynamic(buffer)?;
879
26.3k
        match self {
880
17.5k
            Input::CoinSigned(coin) => coin.encode_dynamic(buffer),
881
0
            Input::CoinPredicate(coin) => coin.encode_dynamic(buffer),
882
8.77k
            Input::Contract(contract) => contract.encode_dynamic(buffer),
883
0
            Input::MessageCoinSigned(message) => message.encode_dynamic(buffer),
884
0
            Input::MessageCoinPredicate(message) => message.encode_dynamic(buffer),
885
0
            Input::MessageDataSigned(message) => message.encode_dynamic(buffer),
886
0
            Input::MessageDataPredicate(message) => message.encode_dynamic(buffer),
887
        }
888
26.3k
    }
_RINvXsg_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB6_5InputNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
876
13.1k
    fn encode_dynamic<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
877
13.1k
        let discr = InputRepr::from(self);
878
13.1k
        discr.encode_dynamic(buffer)?;
879
13.1k
        match self {
880
8.77k
            Input::CoinSigned(coin) => coin.encode_dynamic(buffer),
881
0
            Input::CoinPredicate(coin) => coin.encode_dynamic(buffer),
882
4.38k
            Input::Contract(contract) => contract.encode_dynamic(buffer),
883
0
            Input::MessageCoinSigned(message) => message.encode_dynamic(buffer),
884
0
            Input::MessageCoinPredicate(message) => message.encode_dynamic(buffer),
885
0
            Input::MessageDataSigned(message) => message.encode_dynamic(buffer),
886
0
            Input::MessageDataPredicate(message) => message.encode_dynamic(buffer),
887
        }
888
13.1k
    }
_RINvXsg_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB6_5InputNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBc_
Line
Count
Source
876
13.1k
    fn encode_dynamic<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
877
13.1k
        let discr = InputRepr::from(self);
878
13.1k
        discr.encode_dynamic(buffer)?;
879
13.1k
        match self {
880
8.77k
            Input::CoinSigned(coin) => coin.encode_dynamic(buffer),
881
0
            Input::CoinPredicate(coin) => coin.encode_dynamic(buffer),
882
4.38k
            Input::Contract(contract) => contract.encode_dynamic(buffer),
883
0
            Input::MessageCoinSigned(message) => message.encode_dynamic(buffer),
884
0
            Input::MessageCoinPredicate(message) => message.encode_dynamic(buffer),
885
0
            Input::MessageDataSigned(message) => message.encode_dynamic(buffer),
886
0
            Input::MessageDataPredicate(message) => message.encode_dynamic(buffer),
887
        }
888
13.1k
    }
889
}
890
891
impl Deserialize for Input {
892
6.57k
    fn decode_static<I: canonical::Input + ?Sized>(
893
6.57k
        buffer: &mut I,
894
6.57k
    ) -> Result<Self, Error> {
895
6.57k
        Ok(
896
6.57k
            match <InputRepr as Deserialize>::decode(buffer)
897
6.57k
                .map_err(|_| Error::UnknownDiscriminant)?
Unexecuted instantiation: _RNCINvXsh_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB8_5InputNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShE0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCINvXsh_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB8_5InputNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShE0Be_
898
            {
899
                InputRepr::Coin => {
900
4.38k
                    let coin = CoinFull::decode_static(buffer)?;
901
4.38k
                    if coin.predicate.capacity() == 0 {
902
4.38k
                        Input::CoinSigned(coin.into_signed())
903
                    } else {
904
0
                        Input::CoinPredicate(coin.into_predicate())
905
                    }
906
                }
907
                InputRepr::Contract => {
908
2.19k
                    let contract = Contract::decode_static(buffer)?;
909
2.19k
                    Input::Contract(contract)
910
                }
911
                InputRepr::Message => {
912
0
                    let message = FullMessage::decode_static(buffer)?;
913
0
                    match (
914
0
                        message.data.capacity() == 0,
915
0
                        message.predicate.capacity() == 0,
916
0
                    ) {
917
                        (true, true) => {
918
0
                            Input::MessageCoinSigned(message.into_coin_signed())
919
                        }
920
                        (true, false) => {
921
0
                            Input::MessageCoinPredicate(message.into_coin_predicate())
922
                        }
923
                        (false, true) => {
924
0
                            Input::MessageDataSigned(message.into_message_data_signed())
925
                        }
926
0
                        (false, false) => Input::MessageDataPredicate(
927
0
                            message.into_message_data_predicate(),
928
0
                        ),
929
                    }
930
                }
931
            },
932
        )
933
6.57k
    }
_RINvXsh_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB6_5InputNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
892
6.57k
    fn decode_static<I: canonical::Input + ?Sized>(
893
6.57k
        buffer: &mut I,
894
6.57k
    ) -> Result<Self, Error> {
895
6.57k
        Ok(
896
6.57k
            match <InputRepr as Deserialize>::decode(buffer)
897
6.57k
                .map_err(|_| Error::UnknownDiscriminant)?
898
            {
899
                InputRepr::Coin => {
900
4.38k
                    let coin = CoinFull::decode_static(buffer)?;
901
4.38k
                    if coin.predicate.capacity() == 0 {
902
4.38k
                        Input::CoinSigned(coin.into_signed())
903
                    } else {
904
0
                        Input::CoinPredicate(coin.into_predicate())
905
                    }
906
                }
907
                InputRepr::Contract => {
908
2.19k
                    let contract = Contract::decode_static(buffer)?;
909
2.19k
                    Input::Contract(contract)
910
                }
911
                InputRepr::Message => {
912
0
                    let message = FullMessage::decode_static(buffer)?;
913
0
                    match (
914
0
                        message.data.capacity() == 0,
915
0
                        message.predicate.capacity() == 0,
916
0
                    ) {
917
                        (true, true) => {
918
0
                            Input::MessageCoinSigned(message.into_coin_signed())
919
                        }
920
                        (true, false) => {
921
0
                            Input::MessageCoinPredicate(message.into_coin_predicate())
922
                        }
923
                        (false, true) => {
924
0
                            Input::MessageDataSigned(message.into_message_data_signed())
925
                        }
926
0
                        (false, false) => Input::MessageDataPredicate(
927
0
                            message.into_message_data_predicate(),
928
0
                        ),
929
                    }
930
                }
931
            },
932
        )
933
6.57k
    }
Unexecuted instantiation: _RINvXsh_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB6_5InputNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEBc_
934
935
6.57k
    fn decode_dynamic<I: canonical::Input + ?Sized>(
936
6.57k
        &mut self,
937
6.57k
        buffer: &mut I,
938
6.57k
    ) -> Result<(), Error> {
939
6.57k
        match self {
940
4.38k
            Input::CoinSigned(coin) => coin.decode_dynamic(buffer),
941
0
            Input::CoinPredicate(coin) => coin.decode_dynamic(buffer),
942
2.19k
            Input::Contract(contract) => contract.decode_dynamic(buffer),
943
0
            Input::MessageCoinSigned(message) => message.decode_dynamic(buffer),
944
0
            Input::MessageCoinPredicate(message) => message.decode_dynamic(buffer),
945
0
            Input::MessageDataSigned(message) => message.decode_dynamic(buffer),
946
0
            Input::MessageDataPredicate(message) => message.decode_dynamic(buffer),
947
        }
948
6.57k
    }
_RINvXsh_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB6_5InputNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
935
6.57k
    fn decode_dynamic<I: canonical::Input + ?Sized>(
936
6.57k
        &mut self,
937
6.57k
        buffer: &mut I,
938
6.57k
    ) -> Result<(), Error> {
939
6.57k
        match self {
940
4.38k
            Input::CoinSigned(coin) => coin.decode_dynamic(buffer),
941
0
            Input::CoinPredicate(coin) => coin.decode_dynamic(buffer),
942
2.19k
            Input::Contract(contract) => contract.decode_dynamic(buffer),
943
0
            Input::MessageCoinSigned(message) => message.decode_dynamic(buffer),
944
0
            Input::MessageCoinPredicate(message) => message.decode_dynamic(buffer),
945
0
            Input::MessageDataSigned(message) => message.decode_dynamic(buffer),
946
0
            Input::MessageDataPredicate(message) => message.decode_dynamic(buffer),
947
        }
948
6.57k
    }
Unexecuted instantiation: _RINvXsh_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5inputNtB6_5InputNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBc_
949
}
950
951
#[cfg(all(test, feature = "std"))]
952
mod snapshot_tests;
953
954
#[cfg(feature = "typescript")]
955
pub mod typescript {
956
    use wasm_bindgen::prelude::*;
957
958
    use super::*;
959
960
    use crate::{
961
        TxPointer,
962
        UtxoId,
963
    };
964
    use fuel_types::{
965
        Address,
966
        AssetId,
967
        Bytes32,
968
        Word,
969
    };
970
971
    use alloc::{
972
        boxed::Box,
973
        format,
974
        string::String,
975
        vec::Vec,
976
    };
977
978
    #[derive(Clone, Eq, Hash, PartialEq, serde::Serialize, serde::Deserialize)]
979
    #[wasm_bindgen]
980
    pub struct Input(#[wasm_bindgen(skip)] pub Box<crate::Input>);
981
982
    #[wasm_bindgen]
983
    impl Input {
984
        #[wasm_bindgen(js_name = toJSON)]
985
        pub fn to_json(&self) -> String {
986
            serde_json::to_string(&self.0).expect("unable to json format")
987
        }
988
989
        #[wasm_bindgen(js_name = toString)]
990
        pub fn typescript_to_string(&self) -> String {
991
            format!("{:?}", self.0)
992
        }
993
994
        #[wasm_bindgen(js_name = to_bytes)]
995
        pub fn typescript_to_bytes(&self) -> Vec<u8> {
996
            use fuel_types::canonical::Serialize;
997
            self.0.to_bytes()
998
        }
999
1000
        #[wasm_bindgen(js_name = from_bytes)]
1001
        pub fn typescript_from_bytes(value: &[u8]) -> Result<Input, js_sys::Error> {
1002
            use fuel_types::canonical::Deserialize;
1003
            crate::Input::from_bytes(value)
1004
                .map(|v| Input(Box::new(v)))
1005
                .map_err(|e| js_sys::Error::new(&format!("{:?}", e)))
1006
        }
1007
1008
        #[wasm_bindgen]
1009
        pub fn coin_predicate(
1010
            utxo_id: UtxoId,
1011
            owner: Address,
1012
            amount: Word,
1013
            asset_id: AssetId,
1014
            tx_pointer: TxPointer,
1015
            predicate_gas_used: Word,
1016
            predicate: Vec<u8>,
1017
            predicate_data: Vec<u8>,
1018
        ) -> Input {
1019
            Input(Box::new(crate::Input::CoinPredicate(CoinPredicate {
1020
                utxo_id,
1021
                owner,
1022
                amount,
1023
                asset_id,
1024
                tx_pointer,
1025
                witness_index: Empty::new(),
1026
                predicate_gas_used,
1027
                predicate: PredicateCode { bytes: predicate },
1028
                predicate_data,
1029
            })))
1030
        }
1031
1032
        #[wasm_bindgen]
1033
        pub fn coin_signed(
1034
            utxo_id: UtxoId,
1035
            owner: Address,
1036
            amount: Word,
1037
            asset_id: AssetId,
1038
            tx_pointer: TxPointer,
1039
            witness_index: u16,
1040
        ) -> Input {
1041
            Input(Box::new(crate::Input::CoinSigned(CoinSigned {
1042
                utxo_id,
1043
                owner,
1044
                amount,
1045
                asset_id,
1046
                tx_pointer,
1047
                witness_index,
1048
                predicate_gas_used: Empty::new(),
1049
                predicate: Empty::new(),
1050
                predicate_data: Empty::new(),
1051
            })))
1052
        }
1053
1054
        #[wasm_bindgen]
1055
        pub fn contract(
1056
            utxo_id: UtxoId,
1057
            balance_root: Bytes32,
1058
            state_root: Bytes32,
1059
            tx_pointer: TxPointer,
1060
            contract_id: ContractId,
1061
        ) -> Input {
1062
            Input(Box::new(crate::Input::Contract(Contract {
1063
                utxo_id,
1064
                balance_root,
1065
                state_root,
1066
                tx_pointer,
1067
                contract_id,
1068
            })))
1069
        }
1070
1071
        #[wasm_bindgen]
1072
        pub fn message_coin_signed(
1073
            sender: Address,
1074
            recipient: Address,
1075
            amount: Word,
1076
            nonce: Nonce,
1077
            witness_index: u16,
1078
        ) -> Input {
1079
            Input(Box::new(crate::Input::MessageCoinSigned(
1080
                MessageCoinSigned {
1081
                    sender,
1082
                    recipient,
1083
                    amount,
1084
                    nonce,
1085
                    witness_index,
1086
                    predicate_gas_used: Empty::new(),
1087
                    data: Empty::new(),
1088
                    predicate: Empty::new(),
1089
                    predicate_data: Empty::new(),
1090
                },
1091
            )))
1092
        }
1093
1094
        #[wasm_bindgen]
1095
        pub fn message_coin_predicate(
1096
            sender: Address,
1097
            recipient: Address,
1098
            amount: Word,
1099
            nonce: Nonce,
1100
            predicate_gas_used: Word,
1101
            predicate: Vec<u8>,
1102
            predicate_data: Vec<u8>,
1103
        ) -> Input {
1104
            Input(Box::new(crate::Input::MessageCoinPredicate(
1105
                MessageCoinPredicate {
1106
                    sender,
1107
                    recipient,
1108
                    amount,
1109
                    nonce,
1110
                    witness_index: Empty::new(),
1111
                    predicate_gas_used,
1112
                    data: Empty::new(),
1113
                    predicate: PredicateCode { bytes: predicate },
1114
                    predicate_data,
1115
                },
1116
            )))
1117
        }
1118
1119
        #[wasm_bindgen]
1120
        pub fn message_data_signed(
1121
            sender: Address,
1122
            recipient: Address,
1123
            amount: Word,
1124
            nonce: Nonce,
1125
            witness_index: u16,
1126
            data: Vec<u8>,
1127
        ) -> Input {
1128
            Input(Box::new(crate::Input::MessageDataSigned(
1129
                MessageDataSigned {
1130
                    sender,
1131
                    recipient,
1132
                    amount,
1133
                    nonce,
1134
                    witness_index,
1135
                    data,
1136
                    predicate: Empty::new(),
1137
                    predicate_data: Empty::new(),
1138
                    predicate_gas_used: Empty::new(),
1139
                },
1140
            )))
1141
        }
1142
1143
        #[wasm_bindgen]
1144
        pub fn message_data_predicate(
1145
            sender: Address,
1146
            recipient: Address,
1147
            amount: Word,
1148
            nonce: Nonce,
1149
            predicate_gas_used: Word,
1150
            data: Vec<u8>,
1151
            predicate: Vec<u8>,
1152
            predicate_data: Vec<u8>,
1153
        ) -> Input {
1154
            Input(Box::new(crate::Input::MessageDataPredicate(
1155
                MessageDataPredicate {
1156
                    sender,
1157
                    recipient,
1158
                    amount,
1159
                    nonce,
1160
                    witness_index: Empty::new(),
1161
                    predicate_gas_used,
1162
                    data,
1163
                    predicate: PredicateCode { bytes: predicate },
1164
                    predicate_data,
1165
                },
1166
            )))
1167
        }
1168
    }
1169
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/types/storage.rs
Line
Count
Source
1
use fuel_types::{
2
    canonical::{
3
        Deserialize,
4
        Serialize,
5
    },
6
    Bytes32,
7
    Bytes64,
8
};
9
#[cfg(feature = "random")]
10
use rand::{
11
    distributions::{
12
        Distribution,
13
        Standard,
14
    },
15
    Rng,
16
};
17
18
use core::cmp::Ordering;
19
20
#[derive(
21
0
    Debug, Default, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storages_1__NtB7_11StorageSlotNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1p_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storages_1__NtBa_11StorageSlotNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1s_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storages_1__NtB8_11StorageSlotNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1q_7Visitor9visit_u64pEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storages_1__NtB8_11StorageSlotNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1q_7Visitor9visit_strpEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storages_1__NtB8_11StorageSlotNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1q_7Visitor11visit_bytespEBe_
Unexecuted instantiation: _RINvXs_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storages_1__NtBa_11StorageSlotNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1q_11deserializepEBg_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storages_1__NtBb_11StorageSlotNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1t_7Visitor9visit_seqpEBh_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storages_1__NtBb_11StorageSlotNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1t_7Visitor9visit_mappEBh_
22
)]
23
#[cfg_attr(
24
    feature = "da-compression",
25
    derive(fuel_compression::Compress, fuel_compression::Decompress)
26
)]
27
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
28
0
#[derive(Deserialize, Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storages0_1__NtB5_11StorageSlotNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storages0_1__NtB5_11StorageSlotNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storages0_1__NtB5_11StorageSlotNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storages0_1__NtB5_11StorageSlotNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storages1_1__NtB5_11StorageSlotNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storages1_1__NtB5_11StorageSlotNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storages1_1__NtB4_11StorageSlotNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_static
Unexecuted instantiation: _RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storages1_1__NtB4_11StorageSlotNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamic
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storages1_1__NtB5_11StorageSlotNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storages1_1__NtB5_11StorageSlotNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
29
pub struct StorageSlot {
30
    key: Bytes32,
31
    value: Bytes32,
32
}
33
34
impl StorageSlot {
35
    pub const SLOT_SIZE: usize = Bytes32::LEN + Bytes32::LEN;
36
37
0
    pub const fn new(key: Bytes32, value: Bytes32) -> Self {
38
0
        StorageSlot { key, value }
39
0
    }
40
41
0
    pub const fn key(&self) -> &Bytes32 {
42
0
        &self.key
43
0
    }
Unexecuted instantiation: _RNvMNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storageNtB2_11StorageSlot3keyCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storageNtB2_11StorageSlot3keyB8_
44
45
0
    pub const fn value(&self) -> &Bytes32 {
46
0
        &self.value
47
0
    }
Unexecuted instantiation: _RNvMNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storageNtB2_11StorageSlot5valueCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storageNtB2_11StorageSlot5valueB8_
48
}
49
50
impl From<&StorageSlot> for Bytes64 {
51
0
    fn from(s: &StorageSlot) -> Self {
52
0
        let mut buf = [0u8; StorageSlot::SLOT_SIZE];
53
0
54
0
        buf[..Bytes32::LEN].copy_from_slice(s.key.as_ref());
55
0
        buf[Bytes32::LEN..].copy_from_slice(s.value.as_ref());
56
0
57
0
        buf.into()
58
0
    }
59
}
60
61
impl From<&Bytes64> for StorageSlot {
62
0
    fn from(b: &Bytes64) -> Self {
63
0
        let key = <Bytes32 as Deserialize>::from_bytes(&b[..Bytes32::LEN])
64
0
            .expect("Infallible deserialization");
65
0
        let value = <Bytes32 as Deserialize>::from_bytes(&b[Bytes32::LEN..])
66
0
            .expect("Infallible deserialization");
67
0
        Self::new(key, value)
68
0
    }
69
}
70
71
#[cfg(feature = "random")]
72
impl Distribution<StorageSlot> for Standard {
73
0
    fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> StorageSlot {
74
0
        StorageSlot {
75
0
            key: rng.gen(),
76
0
            value: rng.gen(),
77
0
        }
78
0
    }
79
}
80
81
impl PartialOrd for StorageSlot {
82
0
    fn partial_cmp(&self, other: &StorageSlot) -> Option<Ordering> {
83
0
        Some(self.key.cmp(&other.key))
84
0
    }
85
}
86
87
impl Ord for StorageSlot {
88
0
    fn cmp(&self, other: &Self) -> Ordering {
89
0
        self.key.cmp(&other.key)
90
0
    }
91
}
92
93
#[cfg(test)]
94
mod tests {
95
    use super::*;
96
    use rand::SeedableRng;
97
    use std::{
98
        fs::File,
99
        path::PathBuf,
100
    };
101
102
    const FILE_PATH: &str = "storage-slots.json";
103
104
    #[test]
105
    fn test_storage_slot_serialization() {
106
        let rng = &mut rand::rngs::StdRng::seed_from_u64(8586);
107
        let key: Bytes32 = rng.gen();
108
        let value: Bytes32 = rng.gen();
109
110
        let slot = StorageSlot::new(key, value);
111
        let slots = vec![slot.clone()];
112
113
        // `from_str` works
114
        let slot_str = serde_json::to_string(&slots).expect("to string");
115
        let storage_slots: Vec<StorageSlot> =
116
            serde_json::from_str(&slot_str).expect("read from string");
117
        assert_eq!(storage_slots.len(), 1);
118
119
        let path = std::env::temp_dir().join(PathBuf::from(FILE_PATH));
120
121
        // writes to file works
122
        let storage_slots_file = File::create(&path).expect("create file");
123
        serde_json::to_writer(&storage_slots_file, &slots).expect("write file");
124
125
        // `from_reader` works
126
        let storage_slots_file = File::open(&path).expect("open file");
127
        let storage_slots: Vec<StorageSlot> =
128
            serde_json::from_reader(storage_slots_file).expect("read file");
129
        assert_eq!(storage_slots.len(), 1);
130
    }
131
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/types/mint.rs
Line
Count
Source
1
use crate::{
2
    input,
3
    output,
4
    transaction::{
5
        field::TxPointer as TxPointerField,
6
        validity::{
7
            check_size,
8
            FormatValidityChecks,
9
        },
10
    },
11
    ConsensusParameters,
12
    TransactionRepr,
13
    TxPointer,
14
    ValidityError,
15
};
16
use derivative::Derivative;
17
use fuel_asm::Word;
18
use fuel_types::{
19
    bytes::WORD_SIZE,
20
    AssetId,
21
    BlockHeight,
22
    Bytes32,
23
};
24
25
use fuel_types::ChainId;
26
27
use fuel_types::canonical::Serialize;
28
29
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
30
pub(crate) struct MintMetadata {
31
    pub id: Bytes32,
32
}
33
34
impl MintMetadata {
35
0
    fn compute<Tx>(tx: &Tx, chain_id: &ChainId) -> Self
36
0
    where
37
0
        Tx: crate::UniqueIdentifier,
38
0
    {
39
0
        let id = tx.id(chain_id);
40
0
41
0
        Self { id }
42
0
    }
43
}
44
45
/// The definition of the `Mint` transaction from the specification:
46
/// <https://github.com/FuelLabs/fuel-specs/blob/master/src/tx-format/transaction.md#transactionmint>
47
///
48
/// This transaction can be created by the block producer and included in the block only
49
/// by it.
50
0
#[derive(Default, Debug, Clone, Derivative, serde::Serialize, serde::Deserialize)]
Unexecuted instantiation: _RNvXse_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mintNtB5_4MintNtNtCsd3UI3IJrzMw_4core3cmp9PartialEq2eq
Unexecuted instantiation: _RINvXsd_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mintNtB6_4MintNtNtCsd3UI3IJrzMw_4core4hash4Hash4hashpEBc_
Unexecuted instantiation: _RNvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mints_1__NtB7_4MintNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1e_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mints_1__NtBa_4MintNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1h_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mints_1__NtB8_4MintNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1f_7Visitor9visit_u64pEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mints_1__NtB8_4MintNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1f_7Visitor9visit_strpEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mints_1__NtB8_4MintNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1f_7Visitor11visit_bytespEBe_
Unexecuted instantiation: _RINvXs_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mints_1__NtBa_4MintNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1f_11deserializepEBg_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mints_1__NtBb_4MintNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1i_7Visitor9visit_seqpEBh_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mints_1__NtBb_4MintNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1i_7Visitor9visit_mappEBh_
51
#[cfg_attr(feature = "da-compression", derive(fuel_compression::Compress))]
52
0
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mints0_1__NtB5_4MintNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mints0_1__NtB5_4MintNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mints0_1__NtB5_4MintNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mints0_1__NtB5_4MintNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBb_
Unexecuted instantiation: _RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mints1_1__NtB4_4MintNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_static
Unexecuted instantiation: _RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mints1_1__NtB4_4MintNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamic
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mints1_1__NtB5_4MintNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mints1_1__NtB5_4MintNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
53
#[canonical(prefix = TransactionRepr::Mint)]
54
#[derivative(Eq, PartialEq, Hash)]
55
pub struct Mint {
56
    /// The location of the transaction in the block.
57
    #[cfg_attr(feature = "da-compression", compress(skip))]
58
    pub(crate) tx_pointer: TxPointer,
59
    /// The `Input::Contract` that assets are minted to.
60
    pub(crate) input_contract: input::contract::Contract,
61
    /// The `Output::Contract` that assets are being minted to.
62
    pub(crate) output_contract: output::contract::Contract,
63
    /// The amount of funds minted.
64
    pub(crate) mint_amount: Word,
65
    /// The asset IDs corresponding to the minted amount.
66
    pub(crate) mint_asset_id: AssetId,
67
    /// Gas Price used for current block
68
    pub(crate) gas_price: Word,
69
    #[serde(skip)]
70
    #[derivative(PartialEq = "ignore", Hash = "ignore")]
71
    #[canonical(skip)]
72
    #[cfg_attr(feature = "da-compression", compress(skip))]
73
    pub(crate) metadata: Option<MintMetadata>,
74
}
75
76
impl crate::UniqueIdentifier for Mint {
77
0
    fn id(&self, chain_id: &ChainId) -> Bytes32 {
78
0
        if let Some(id) = self.cached_id() {
79
0
            return id;
80
0
        }
81
0
82
0
        let mut clone = self.clone();
83
0
        clone.input_contract.prepare_sign();
84
0
        clone.output_contract.prepare_sign();
85
0
86
0
        crate::transaction::compute_transaction_id(chain_id, &mut clone)
87
0
    }
88
89
0
    fn cached_id(&self) -> Option<Bytes32> {
90
0
        self.metadata.as_ref().map(|m| m.id)
91
0
    }
92
}
93
94
impl FormatValidityChecks for Mint {
95
0
    fn check_signatures(&self, _: &ChainId) -> Result<(), ValidityError> {
96
0
        Ok(())
97
0
    }
Unexecuted instantiation: _RNvXs0_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mintNtB5_4MintNtNtB9_8validity20FormatValidityChecks16check_signaturesCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs0_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mintNtB5_4MintNtNtB9_8validity20FormatValidityChecks16check_signaturesBb_
98
99
0
    fn check_without_signatures(
100
0
        &self,
101
0
        block_height: BlockHeight,
102
0
        consensus_params: &ConsensusParameters,
103
0
    ) -> Result<(), ValidityError> {
104
0
        check_size(self, consensus_params.tx_params())?;
105
106
0
        if self.tx_pointer().block_height() != block_height {
107
0
            return Err(ValidityError::TransactionMintIncorrectBlockHeight);
108
0
        }
109
0
110
0
        if self.output_contract.input_index != 0 {
111
0
            return Err(ValidityError::TransactionMintIncorrectOutputIndex);
112
0
        }
113
0
114
0
        // It is temporary check until https://github.com/FuelLabs/fuel-core/issues/1205
115
0
        if &self.mint_asset_id != consensus_params.base_asset_id() {
116
0
            return Err(ValidityError::TransactionMintNonBaseAsset);
117
0
        }
118
0
119
0
        Ok(())
120
0
    }
121
}
122
123
impl crate::Cacheable for Mint {
124
0
    fn is_computed(&self) -> bool {
125
0
        self.metadata.is_some()
126
0
    }
127
128
0
    fn precompute(&mut self, chain_id: &ChainId) -> Result<(), ValidityError> {
129
0
        self.metadata = None;
130
0
        self.metadata = Some(MintMetadata::compute(self, chain_id));
131
0
        Ok(())
132
0
    }
133
}
134
135
#[cfg(any(test, feature = "test-helpers"))]
136
impl Mint {
137
    // This is a function to clear malleable fields just like it
138
    // does on other transactions types. Mint never needs this,
139
    // but we use it for some tests.
140
0
    pub fn prepare_sign(&mut self) {
141
0
        self.input_contract.prepare_sign();
142
0
        self.output_contract.prepare_sign();
143
0
    }
144
}
145
146
mod field {
147
    use super::*;
148
    use crate::field::{
149
        InputContract,
150
        MintAmount,
151
        MintAssetId,
152
        MintGasPrice,
153
        OutputContract,
154
    };
155
156
    impl TxPointerField for Mint {
157
        #[inline(always)]
158
0
        fn tx_pointer(&self) -> &TxPointer {
159
0
            &self.tx_pointer
160
0
        }
161
162
        #[inline(always)]
163
        fn tx_pointer_mut(&mut self) -> &mut TxPointer {
164
            &mut self.tx_pointer
165
        }
166
167
        #[inline(always)]
168
0
        fn tx_pointer_static() -> usize {
169
0
            WORD_SIZE // `Transaction` enum discriminant
170
0
        }
171
    }
172
173
    impl InputContract for Mint {
174
        #[inline(always)]
175
        fn input_contract(&self) -> &input::contract::Contract {
176
            &self.input_contract
177
        }
178
179
        #[inline(always)]
180
        fn input_contract_mut(&mut self) -> &mut input::contract::Contract {
181
            &mut self.input_contract
182
        }
183
184
        #[inline(always)]
185
        fn input_contract_offset(&self) -> usize {
186
            Self::tx_pointer_static().saturating_add(TxPointer::LEN)
187
        }
188
    }
189
190
    impl OutputContract for Mint {
191
        #[inline(always)]
192
        fn output_contract(&self) -> &output::contract::Contract {
193
            &self.output_contract
194
        }
195
196
        #[inline(always)]
197
        fn output_contract_mut(&mut self) -> &mut output::contract::Contract {
198
            &mut self.output_contract
199
        }
200
201
        #[inline(always)]
202
        fn output_contract_offset(&self) -> usize {
203
            self.input_contract_offset()
204
                .saturating_add(self.input_contract.size())
205
        }
206
    }
207
208
    impl MintAmount for Mint {
209
        #[inline(always)]
210
        fn mint_amount(&self) -> &fuel_types::Word {
211
            &self.mint_amount
212
        }
213
214
        #[inline(always)]
215
        fn mint_amount_mut(&mut self) -> &mut fuel_types::Word {
216
            &mut self.mint_amount
217
        }
218
219
        #[inline(always)]
220
        fn mint_amount_offset(&self) -> usize {
221
            self.output_contract_offset()
222
                .saturating_add(self.output_contract.size())
223
        }
224
    }
225
226
    impl MintAssetId for Mint {
227
        #[inline(always)]
228
        fn mint_asset_id(&self) -> &AssetId {
229
            &self.mint_asset_id
230
        }
231
232
        #[inline(always)]
233
        fn mint_asset_id_mut(&mut self) -> &mut AssetId {
234
            &mut self.mint_asset_id
235
        }
236
237
        #[inline(always)]
238
        fn mint_asset_id_offset(&self) -> usize {
239
            self.mint_amount_offset().saturating_add(WORD_SIZE)
240
        }
241
    }
242
243
    impl MintGasPrice for Mint {
244
        #[inline(always)]
245
        fn gas_price(&self) -> &Word {
246
            &self.gas_price
247
        }
248
249
        #[inline(always)]
250
        fn gas_price_mut(&mut self) -> &mut Word {
251
            &mut self.gas_price
252
        }
253
254
        #[inline(always)]
255
        fn gas_price_offset(&self) -> usize {
256
            self.mint_asset_id_offset().saturating_add(AssetId::LEN)
257
        }
258
    }
259
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/types/input/coin.rs
Line
Count
Source
1
use core::default::Default;
2
3
use crate::{
4
    input::{
5
        fmt_as_field,
6
        Empty,
7
    },
8
    transaction::types::input::AsField,
9
    TxPointer,
10
    UtxoId,
11
};
12
use alloc::vec::Vec;
13
use derivative::Derivative;
14
#[cfg(feature = "da-compression")]
15
use fuel_compression::Compressible;
16
use fuel_types::{
17
    Address,
18
    AssetId,
19
    Word,
20
};
21
22
use super::PredicateCode;
23
24
pub type CoinFull = Coin<Full>;
25
pub type CoinSigned = Coin<Signed>;
26
pub type CoinPredicate = Coin<Predicate>;
27
28
mod private {
29
    pub trait Seal {}
30
31
    impl Seal for super::Full {}
32
    impl Seal for super::Signed {}
33
    impl Seal for super::Predicate {}
34
}
35
36
/// Specifies the coin based on the usage context. See [`Coin`].
37
#[cfg(feature = "da-compression")]
38
pub trait CoinSpecification: private::Seal {
39
    type Witness: AsField<u16>
40
        + for<'a> Compressible<
41
            Compressed: core::fmt::Debug
42
                            + PartialEq
43
                            + Clone
44
                            + serde::Serialize
45
                            + serde::Deserialize<'a>,
46
        >;
47
    type Predicate: AsField<PredicateCode>
48
        + for<'a> Compressible<
49
            Compressed: core::fmt::Debug
50
                            + PartialEq
51
                            + Clone
52
                            + serde::Serialize
53
                            + serde::Deserialize<'a>,
54
        >;
55
    type PredicateData: AsField<Vec<u8>>
56
        + for<'a> Compressible<
57
            Compressed: core::fmt::Debug
58
                            + PartialEq
59
                            + Clone
60
                            + serde::Serialize
61
                            + serde::Deserialize<'a>,
62
        >;
63
    type PredicateGasUsed: AsField<Word>
64
        + for<'a> Compressible<
65
            Compressed: core::fmt::Debug
66
                            + PartialEq
67
                            + Clone
68
                            + serde::Serialize
69
                            + serde::Deserialize<'a>,
70
        >;
71
}
72
#[cfg(not(feature = "da-compression"))]
73
pub trait CoinSpecification: private::Seal {
74
    type Witness: AsField<u16>;
75
    type Predicate: AsField<PredicateCode>;
76
    type PredicateData: AsField<Vec<u8>>;
77
    type PredicateGasUsed: AsField<Word>;
78
}
79
80
#[derive(
81
0
    Default, Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins_1__NtB7_6SignedNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtB1o_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins_1__NtB8_6SignedNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtB1p_7Visitor10visit_unitpEBg_
82
)]
83
#[cfg_attr(
84
    feature = "da-compression",
85
    derive(fuel_compression::Compress, fuel_compression::Decompress)
86
)]
87
pub struct Signed;
88
89
impl CoinSpecification for Signed {
90
    type Predicate = Empty<PredicateCode>;
91
    type PredicateData = Empty<Vec<u8>>;
92
    type PredicateGasUsed = Empty<Word>;
93
    type Witness = u16;
94
}
95
96
#[derive(
97
0
    Default, Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins1_1__NtB7_9PredicateNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtB1s_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins1_1__NtB8_9PredicateNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtB1t_7Visitor10visit_unitpEBg_
98
)]
99
#[cfg_attr(
100
    feature = "da-compression",
101
    derive(fuel_compression::Compress, fuel_compression::Decompress)
102
)]
103
pub struct Predicate;
104
105
impl CoinSpecification for Predicate {
106
    type Predicate = PredicateCode;
107
    type PredicateData = Vec<u8>;
108
    type PredicateGasUsed = Word;
109
    type Witness = Empty<u16>;
110
}
111
112
#[derive(
113
0
    Default, Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins3_1__NtB7_4FullNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtB1n_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins3_1__NtB8_4FullNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtB1o_7Visitor10visit_unitpEBg_
114
)]
115
pub struct Full;
116
117
impl CoinSpecification for Full {
118
    type Predicate = PredicateCode;
119
    type PredicateData = Vec<u8>;
120
    type PredicateGasUsed = Word;
121
    type Witness = u16;
122
}
123
124
0
/// It is a full representation of the coin from the specification:
125
0
/// <https://github.com/FuelLabs/fuel-specs/blob/master/src/tx-format/input.md#inputcoin>.
126
0
///
127
0
/// The specification defines the layout of the [`Coin`] in the serialized form for the
128
0
/// `fuel-vm`. But on the business logic level, we don't use all fields at the same time.
129
0
/// It is why in the [`super::Input`] the coin is represented by several forms based on
130
0
/// the usage context. Leaving some fields empty reduces the memory consumption by the
131
0
/// structure and erases the empty useless fields.
132
0
///
133
0
/// The [`CoinSpecification`] trait specifies the sub-coin for the corresponding usage
134
0
/// context. It allows us to write the common logic of all sub-coins without the overhead
135
0
/// and duplication.
136
0
///
137
0
/// Sub-coin:
138
0
/// - [`Signed`] - means that the coin should be signed by the `owner`, and the
139
0
///   signature(witness) should be stored under the `witness_index` index in the
140
0
///   `witnesses` vector of the [`crate::Transaction`].
141
0
/// - [`Predicate`] - means that the coin is not signed, and the `owner` is a `predicate`
142
0
///   bytecode. The merkle root from the `predicate` should be equal to the `owner`.
143
0
/// - [`Full`] - is used during the deserialization of the coin. It should be transformed
144
0
///   into [`Signed`] or [`Predicate`] sub-coin. If the `predicate` is empty, it is
145
0
///   [`Signed`], else [`Predicate`].
146
0
#[derive(Default, Derivative, Clone, PartialEq, Eq, Hash)]
147
0
#[derivative(Debug)]
148
0
#[derive(serde::Serialize, serde::Deserialize)]
Unexecuted instantiation: _RNvXNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins5_1__INtB7_4CoinpENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1q_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins5_1__INtB8_4CoinpENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1r_7Visitor9visit_u64pEBg_
Unexecuted instantiation: _RINvXNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins5_1__INtB8_4CoinpENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1r_7Visitor9visit_strpEBg_
Unexecuted instantiation: _RINvXNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins5_1__INtB8_4CoinpENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1r_7Visitor11visit_bytespEBg_
Unexecuted instantiation: _RINvXs_NvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins5_1__INtBa_4CoinpENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1r_11deserializepEBi_
Unexecuted instantiation: _RNvXININvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins5_1__INtBa_4CoinpENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializes0_0pEINtB5_9___VisitorpENtB1t_7Visitor9expectingBi_
Unexecuted instantiation: _RINvXININvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins5_1__INtBb_4CoinpENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializes0_0pEINtB6_9___VisitorpENtB1u_7Visitor9visit_seqpEBj_
Unexecuted instantiation: _RINvXININvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins5_1__INtBb_4CoinpENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializes0_0pEINtB6_9___VisitorpENtB1u_7Visitor9visit_mappEBj_
149
0
#[cfg_attr(feature = "da-compression", derive(fuel_compression::Compress))]
150
35.0k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins6_1__INtB5_4CoinNtB5_4FullENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
150
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins6_1__INtB5_4CoinNtB5_6SignedENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
150
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins6_1__INtB5_4CoinNtB5_9PredicateENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins6_1__INtB5_4CoinNtB5_4FullENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEBd_
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins6_1__INtB5_4CoinNtB5_6SignedENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBd_
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins6_1__INtB5_4CoinNtB5_9PredicateENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBd_
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins7_1__INtB5_4CoinNtB5_6SignedENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
150
8.77k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins7_1__INtB5_4CoinNtB5_6SignedENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
150
8.77k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins7_1__INtB5_4CoinNtB5_9PredicateENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins7_1__INtB5_4CoinNtB5_9PredicateENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
_RNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins7_1__INtB4_4CoinNtB4_6SignedENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_staticBc_
Line
Count
Source
150
162k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins7_1__INtB4_4CoinNtB4_9PredicateENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_staticBc_
_RNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins7_1__INtB4_4CoinNtB4_6SignedENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamicBc_
Line
Count
Source
150
162k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins7_1__INtB4_4CoinNtB4_9PredicateENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamicBc_
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins7_1__INtB5_4CoinNtB5_6SignedENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBd_
Line
Count
Source
150
8.77k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins7_1__INtB5_4CoinNtB5_9PredicateENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBd_
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins7_1__INtB5_4CoinNtB5_6SignedENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBd_
Line
Count
Source
150
8.77k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coins7_1__INtB5_4CoinNtB5_9PredicateENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBd_
151
0
pub struct Coin<Specification>
152
0
where
153
0
    Specification: CoinSpecification,
154
0
{
155
0
    pub utxo_id: UtxoId,
156
0
    #[cfg_attr(feature = "da-compression", compress(skip))]
157
0
    pub owner: Address,
158
0
    #[cfg_attr(feature = "da-compression", compress(skip))]
159
0
    pub amount: Word,
160
0
    #[cfg_attr(feature = "da-compression", compress(skip))]
161
0
    pub asset_id: AssetId,
162
0
    #[cfg_attr(feature = "da-compression", compress(skip))]
163
0
    pub tx_pointer: TxPointer,
164
0
    #[derivative(Debug(format_with = "fmt_as_field"))]
Unexecuted instantiation: _RNvXNvXsr_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coinINtB8_4CoinpENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB2_5DummyNtB8_6SignedEB1j_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNvXsr_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coinINtB8_4CoinpENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB2_5DummyNtB8_9PredicateEB1j_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNvXsr_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coinINtB8_4CoinpENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB2_5DummyNtB8_6SignedEB1j_3fmtBg_
Unexecuted instantiation: _RNvXNvXsr_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coinINtB8_4CoinpENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB2_5DummyNtB8_9PredicateEB1j_3fmtBg_
165
0
    pub witness_index: Specification::Witness,
166
0
    /// Exact amount of gas used by the predicate.
167
0
    /// If the predicate consumes different amount of gas,
168
0
    /// it's considered to be false.
169
0
    #[derivative(Debug(format_with = "fmt_as_field"))]
Unexecuted instantiation: _RNvXs_NvXsr_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coinINtBa_4CoinpENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB4_s_5DummyNtBa_6SignedEB1l_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NvXsr_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coinINtBa_4CoinpENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB4_s_5DummyNtBa_9PredicateEB1l_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NvXsr_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coinINtBa_4CoinpENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB4_s_5DummyNtBa_6SignedEB1l_3fmtBi_
Unexecuted instantiation: _RNvXs_NvXsr_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coinINtBa_4CoinpENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB4_s_5DummyNtBa_9PredicateEB1l_3fmtBi_
170
0
    pub predicate_gas_used: Specification::PredicateGasUsed,
171
0
    #[derivative(Debug(format_with = "fmt_as_field"))]
Unexecuted instantiation: _RNvXs0_NvXsr_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coinINtBb_4CoinpENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s0_5DummyNtBb_6SignedEB1m_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs0_NvXsr_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coinINtBb_4CoinpENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s0_5DummyNtBb_9PredicateEB1m_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs0_NvXsr_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coinINtBb_4CoinpENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s0_5DummyNtBb_6SignedEB1m_3fmtBj_
Unexecuted instantiation: _RNvXs0_NvXsr_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coinINtBb_4CoinpENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s0_5DummyNtBb_9PredicateEB1m_3fmtBj_
172
0
    pub predicate: Specification::Predicate,
173
0
    #[derivative(Debug(format_with = "fmt_as_field"))]
Unexecuted instantiation: _RNvXs1_NvXsr_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coinINtBb_4CoinpENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s1_5DummyNtBb_6SignedEB1m_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs1_NvXsr_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coinINtBb_4CoinpENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s1_5DummyNtBb_9PredicateEB1m_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs1_NvXsr_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coinINtBb_4CoinpENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s1_5DummyNtBb_6SignedEB1m_3fmtBj_
Unexecuted instantiation: _RNvXs1_NvXsr_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coinINtBb_4CoinpENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s1_5DummyNtBb_9PredicateEB1m_3fmtBj_
174
0
    pub predicate_data: Specification::PredicateData,
175
0
}
Unexecuted instantiation: _RNvXsr_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coinINtB5_4CoinNtB5_6SignedENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXsr_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coinINtB5_4CoinNtB5_9PredicateENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXsr_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coinINtB5_4CoinNtB5_6SignedENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtBd_
Unexecuted instantiation: _RNvXsr_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coinINtB5_4CoinNtB5_9PredicateENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtBd_
176
177
impl<Specification> Coin<Specification>
178
where
179
    Specification: CoinSpecification,
180
{
181
    /// The "Note" section from the specification:
182
    /// <https://github.com/FuelLabs/fuel-specs/blob/master/src/tx-format/input.md#inputcoin>.
183
17.5k
    pub fn prepare_sign(&mut self) {
184
17.5k
        self.tx_pointer = Default::default();
185
17.5k
        if let Some(predicate_gas_used_field) = self.predicate_gas_used.as_mut_field() {
186
0
            *predicate_gas_used_field = Default::default();
187
17.5k
        }
188
17.5k
    }
_RNvMs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coinINtB5_4CoinNtB5_6SignedE12prepare_signBd_
Line
Count
Source
183
17.5k
    pub fn prepare_sign(&mut self) {
184
17.5k
        self.tx_pointer = Default::default();
185
17.5k
        if let Some(predicate_gas_used_field) = self.predicate_gas_used.as_mut_field() {
186
0
            *predicate_gas_used_field = Default::default();
187
17.5k
        }
188
17.5k
    }
Unexecuted instantiation: _RNvMs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4coinINtB5_4CoinNtB5_9PredicateE12prepare_signBd_
189
}
190
191
impl Coin<Full> {
192
4.38k
    pub fn into_signed(self) -> Coin<Signed> {
193
4.38k
        let Self {
194
4.38k
            utxo_id,
195
4.38k
            owner,
196
4.38k
            amount,
197
4.38k
            asset_id,
198
4.38k
            tx_pointer,
199
4.38k
            witness_index,
200
4.38k
            ..
201
4.38k
        } = self;
202
4.38k
203
4.38k
        Coin {
204
4.38k
            utxo_id,
205
4.38k
            owner,
206
4.38k
            amount,
207
4.38k
            asset_id,
208
4.38k
            tx_pointer,
209
4.38k
            witness_index,
210
4.38k
            ..Default::default()
211
4.38k
        }
212
4.38k
    }
213
214
0
    pub fn into_predicate(self) -> Coin<Predicate> {
215
0
        let Self {
216
0
            utxo_id,
217
0
            owner,
218
0
            amount,
219
0
            asset_id,
220
0
            tx_pointer,
221
0
            predicate,
222
0
            predicate_data,
223
0
            predicate_gas_used,
224
0
            ..
225
0
        } = self;
226
0
227
0
        Coin {
228
0
            utxo_id,
229
0
            owner,
230
0
            amount,
231
0
            asset_id,
232
0
            tx_pointer,
233
0
            predicate,
234
0
            predicate_data,
235
0
            predicate_gas_used,
236
0
            ..Default::default()
237
0
        }
238
0
    }
239
}
240
241
impl Coin<Signed> {
242
0
    pub fn into_full(self) -> Coin<Full> {
243
0
        let Self {
244
0
            utxo_id,
245
0
            owner,
246
0
            amount,
247
0
            asset_id,
248
0
            tx_pointer,
249
0
            witness_index,
250
0
            ..
251
0
        } = self;
252
0
253
0
        Coin {
254
0
            utxo_id,
255
0
            owner,
256
0
            amount,
257
0
            asset_id,
258
0
            tx_pointer,
259
0
            witness_index,
260
0
            ..Default::default()
261
0
        }
262
0
    }
263
}
264
265
impl Coin<Predicate> {
266
0
    pub fn into_full(self) -> Coin<Full> {
267
0
        let Self {
268
0
            utxo_id,
269
0
            owner,
270
0
            amount,
271
0
            asset_id,
272
0
            tx_pointer,
273
0
            predicate,
274
0
            predicate_data,
275
0
            predicate_gas_used,
276
0
            ..
277
0
        } = self;
278
0
279
0
        Coin {
280
0
            utxo_id,
281
0
            owner,
282
0
            amount,
283
0
            asset_id,
284
0
            tx_pointer,
285
0
            predicate,
286
0
            predicate_data,
287
0
            predicate_gas_used,
288
0
            ..Default::default()
289
0
        }
290
0
    }
291
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/types/input/predicate.rs
Line
Count
Source
1
use core::ops::{
2
    Deref,
3
    DerefMut,
4
};
5
use derivative::Derivative;
6
use fuel_types::fmt_truncated_hex;
7
8
use alloc::vec::Vec;
9
10
0
#[derive(Clone, Default, Derivative, serde::Serialize, serde::Deserialize)]
Unexecuted instantiation: _RNvXs9_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input9predicateNtB5_13PredicateCodeNtNtCsd3UI3IJrzMw_4core3cmp9PartialEq2eq
Unexecuted instantiation: _RINvXs8_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input9predicateNtB6_13PredicateCodeNtNtCsd3UI3IJrzMw_4core4hash4Hash4hashpEBe_
11
0
#[serde(transparent)]
12
17.5k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input9predicates0_1__NtB5_13PredicateCodeNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
12
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input9predicates0_1__NtB5_13PredicateCodeNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input9predicates0_1__NtB5_13PredicateCodeNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEBd_
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input9predicates0_1__NtB5_13PredicateCodeNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBd_
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input9predicates1_1__NtB5_13PredicateCodeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
12
8.77k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input9predicates1_1__NtB5_13PredicateCodeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
_RNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input9predicates1_1__NtB4_13PredicateCodeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_static
Line
Count
Source
12
162k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input9predicates1_1__NtB4_13PredicateCodeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamic
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input9predicates1_1__NtB5_13PredicateCodeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBd_
Line
Count
Source
12
8.77k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input9predicates1_1__NtB5_13PredicateCodeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBd_
13
0
#[derivative(Eq, PartialEq, Hash, Debug)]
14
0
pub struct PredicateCode {
15
0
    #[derivative(Debug(format_with = "fmt_truncated_hex::<16>"))]
16
    pub bytes: Vec<u8>,
17
0
}
18
19
impl From<Vec<u8>> for PredicateCode {
20
0
    fn from(bytes: Vec<u8>) -> Self {
21
0
        Self { bytes }
22
0
    }
23
}
24
25
impl From<&[u8]> for PredicateCode {
26
0
    fn from(bytes: &[u8]) -> Self {
27
0
        Self {
28
0
            bytes: bytes.to_vec(),
29
0
        }
30
0
    }
31
}
32
33
impl AsRef<[u8]> for PredicateCode {
34
0
    fn as_ref(&self) -> &[u8] {
35
0
        &self.bytes
36
0
    }
37
}
38
39
impl AsMut<[u8]> for PredicateCode {
40
0
    fn as_mut(&mut self) -> &mut [u8] {
41
0
        &mut self.bytes
42
0
    }
43
}
44
45
impl Deref for PredicateCode {
46
    type Target = Vec<u8>;
47
48
4.38k
    fn deref(&self) -> &Self::Target {
49
4.38k
        &self.bytes
50
4.38k
    }
_RNvXs2_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input9predicateNtB5_13PredicateCodeNtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
48
4.38k
    fn deref(&self) -> &Self::Target {
49
4.38k
        &self.bytes
50
4.38k
    }
Unexecuted instantiation: _RNvXs2_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input9predicateNtB5_13PredicateCodeNtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefBd_
51
}
52
53
impl DerefMut for PredicateCode {
54
0
    fn deref_mut(&mut self) -> &mut Self::Target {
55
0
        &mut self.bytes
56
0
    }
57
}
58
59
#[cfg(feature = "da-compression")]
60
impl fuel_compression::Compressible for PredicateCode {
61
    type Compressed = fuel_compression::RegistryKey;
62
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/types/input/repr.rs
Line
Count
Source
1
use super::{
2
    consts::*,
3
    Input,
4
};
5
6
#[derive(
7
    Debug,
8
    Clone,
9
    PartialEq,
10
    Eq,
11
    Hash,
12
52.6k
    fuel_types::canonical::Serialize,
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4repr1__NtB5_9InputReprNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
12
13.1k
    fuel_types::canonical::Serialize,
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4repr1__NtB5_9InputReprNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
12
13.1k
    fuel_types::canonical::Serialize,
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4repr1__NtB5_9InputReprNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBd_
Line
Count
Source
12
13.1k
    fuel_types::canonical::Serialize,
Unexecuted instantiation: _RNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4repr1__NtB4_9InputReprNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_static
Unexecuted instantiation: _RNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4repr1__NtB4_9InputReprNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamic
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4repr1__NtB5_9InputReprNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBd_
Line
Count
Source
12
13.1k
    fuel_types::canonical::Serialize,
13
13.1k
    fuel_types::canonical::Deserialize,
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4reprs_1__NtB5_9InputReprNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
13
6.57k
    fuel_types::canonical::Deserialize,
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4reprs_1__NtB5_9InputReprNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBd_
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4reprs_1__NtB5_9InputReprNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
13
6.57k
    fuel_types::canonical::Deserialize,
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4reprs_1__NtB5_9InputReprNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEBd_
14
)]
15
#[repr(u64)]
16
pub enum InputRepr {
17
    Coin = 0x00,
18
    Contract = 0x01,
19
    Message = 0x02,
20
}
21
22
impl InputRepr {
23
394k
    pub const fn utxo_id_offset(&self) -> Option<usize> {
24
394k
        match self {
25
394k
            Self::Coin | Self::Contract => Some(INPUT_UTXO_ID_OFFSET),
26
0
            Self::Message => None,
27
        }
28
394k
    }
_RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4reprNtB2_9InputRepr14utxo_id_offsetCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
23
394k
    pub const fn utxo_id_offset(&self) -> Option<usize> {
24
394k
        match self {
25
394k
            Self::Coin | Self::Contract => Some(INPUT_UTXO_ID_OFFSET),
26
0
            Self::Message => None,
27
        }
28
394k
    }
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4reprNtB2_9InputRepr14utxo_id_offsetBa_
29
30
444k
    pub const fn owner_offset(&self) -> Option<usize> {
31
444k
        match self {
32
444k
            Self::Coin => Some(INPUT_COIN_OWNER_OFFSET),
33
0
            Self::Message => Some(INPUT_MESSAGE_RECIPIENT_OFFSET),
34
0
            Self::Contract => None,
35
        }
36
444k
    }
_RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4reprNtB2_9InputRepr12owner_offsetCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
30
444k
    pub const fn owner_offset(&self) -> Option<usize> {
31
444k
        match self {
32
444k
            Self::Coin => Some(INPUT_COIN_OWNER_OFFSET),
33
0
            Self::Message => Some(INPUT_MESSAGE_RECIPIENT_OFFSET),
34
0
            Self::Contract => None,
35
        }
36
444k
    }
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4reprNtB2_9InputRepr12owner_offsetBa_
37
38
166k
    pub const fn asset_id_offset(&self) -> Option<usize> {
39
166k
        match self {
40
166k
            Self::Coin => Some(INPUT_COIN_ASSET_ID_OFFSET),
41
0
            Self::Message | Self::Contract => None,
42
        }
43
166k
    }
_RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4reprNtB2_9InputRepr15asset_id_offsetCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
38
166k
    pub const fn asset_id_offset(&self) -> Option<usize> {
39
166k
        match self {
40
166k
            Self::Coin => Some(INPUT_COIN_ASSET_ID_OFFSET),
41
0
            Self::Message | Self::Contract => None,
42
        }
43
166k
    }
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4reprNtB2_9InputRepr15asset_id_offsetBa_
44
45
0
    pub const fn data_offset(&self) -> Option<usize> {
46
0
        match self {
47
0
            Self::Message => Some(INPUT_MESSAGE_FIXED_SIZE),
48
0
            Self::Coin | Self::Contract => None,
49
        }
50
0
    }
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4reprNtB2_9InputRepr11data_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4reprNtB2_9InputRepr11data_offsetBa_
51
52
0
    pub const fn coin_predicate_offset(&self) -> Option<usize> {
53
0
        match self {
54
0
            Self::Coin => Some(INPUT_COIN_FIXED_SIZE),
55
0
            Self::Message | Self::Contract => None,
56
        }
57
0
    }
58
59
0
    pub const fn contract_balance_root_offset(&self) -> Option<usize> {
60
0
        match self {
61
0
            Self::Contract => Some(INPUT_CONTRACT_BALANCE_ROOT_OFFSET),
62
0
            Self::Message | Self::Coin => None,
63
        }
64
0
    }
65
66
0
    pub const fn contract_state_root_offset(&self) -> Option<usize> {
67
0
        match self {
68
0
            Self::Contract => Some(INPUT_CONTRACT_STATE_ROOT_OFFSET),
69
0
            Self::Message | Self::Coin => None,
70
        }
71
0
    }
72
73
250k
    pub const fn contract_id_offset(&self) -> Option<usize> {
74
250k
        match self {
75
250k
            Self::Contract => Some(INPUT_CONTRACT_ID_OFFSET),
76
0
            Self::Message | Self::Coin => None,
77
        }
78
250k
    }
_RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4reprNtB2_9InputRepr18contract_id_offsetCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
73
250k
    pub const fn contract_id_offset(&self) -> Option<usize> {
74
250k
        match self {
75
250k
            Self::Contract => Some(INPUT_CONTRACT_ID_OFFSET),
76
0
            Self::Message | Self::Coin => None,
77
        }
78
250k
    }
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4reprNtB2_9InputRepr18contract_id_offsetBa_
79
80
0
    pub const fn message_sender_offset(&self) -> Option<usize> {
81
0
        match self {
82
0
            Self::Message => Some(INPUT_MESSAGE_SENDER_OFFSET),
83
0
            Self::Contract | Self::Coin => None,
84
        }
85
0
    }
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4reprNtB2_9InputRepr21message_sender_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4reprNtB2_9InputRepr21message_sender_offsetBa_
86
87
0
    pub const fn message_recipient_offset(&self) -> Option<usize> {
88
0
        match self {
89
0
            Self::Message => Some(INPUT_MESSAGE_RECIPIENT_OFFSET),
90
0
            Self::Contract | Self::Coin => None,
91
        }
92
0
    }
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4reprNtB2_9InputRepr24message_recipient_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4reprNtB2_9InputRepr24message_recipient_offsetBa_
93
94
0
    pub const fn message_nonce_offset(&self) -> Option<usize> {
95
0
        match self {
96
0
            Self::Message => Some(INPUT_NONCE_RECIPIENT_OFFSET),
97
0
            Self::Contract | Self::Coin => None,
98
        }
99
0
    }
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4reprNtB2_9InputRepr20message_nonce_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4reprNtB2_9InputRepr20message_nonce_offsetBa_
100
101
1.20M
    pub const fn tx_pointer_offset(&self) -> Option<usize> {
102
1.20M
        match self {
103
1.20M
            Self::Coin => Some(INPUT_COIN_TX_POINTER_OFFSET),
104
0
            Self::Contract => Some(INPUT_CONTRACT_TX_POINTER_OFFSET),
105
0
            Self::Message => None,
106
        }
107
1.20M
    }
_RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4reprNtB2_9InputRepr17tx_pointer_offsetCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
101
1.20M
    pub const fn tx_pointer_offset(&self) -> Option<usize> {
102
1.20M
        match self {
103
1.20M
            Self::Coin => Some(INPUT_COIN_TX_POINTER_OFFSET),
104
0
            Self::Contract => Some(INPUT_CONTRACT_TX_POINTER_OFFSET),
105
0
            Self::Message => None,
106
        }
107
1.20M
    }
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4reprNtB2_9InputRepr17tx_pointer_offsetBa_
108
109
2.87M
    pub const fn from_input(input: &Input) -> Self {
110
2.87M
        match input {
111
2.40M
            Input::CoinSigned(_) | Input::CoinPredicate(_) => InputRepr::Coin,
112
467k
            Input::Contract(_) => InputRepr::Contract,
113
            Input::MessageCoinSigned(_)
114
            | Input::MessageCoinPredicate(_)
115
            | Input::MessageDataSigned(_)
116
0
            | Input::MessageDataPredicate(_) => InputRepr::Message,
117
        }
118
2.87M
    }
_RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4reprNtB2_9InputRepr10from_inputCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
109
2.84M
    pub const fn from_input(input: &Input) -> Self {
110
2.84M
        match input {
111
2.38M
            Input::CoinSigned(_) | Input::CoinPredicate(_) => InputRepr::Coin,
112
458k
            Input::Contract(_) => InputRepr::Contract,
113
            Input::MessageCoinSigned(_)
114
            | Input::MessageCoinPredicate(_)
115
            | Input::MessageDataSigned(_)
116
0
            | Input::MessageDataPredicate(_) => InputRepr::Message,
117
        }
118
2.84M
    }
_RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4reprNtB2_9InputRepr10from_inputBa_
Line
Count
Source
109
26.3k
    pub const fn from_input(input: &Input) -> Self {
110
26.3k
        match input {
111
17.5k
            Input::CoinSigned(_) | Input::CoinPredicate(_) => InputRepr::Coin,
112
8.77k
            Input::Contract(_) => InputRepr::Contract,
113
            Input::MessageCoinSigned(_)
114
            | Input::MessageCoinPredicate(_)
115
            | Input::MessageDataSigned(_)
116
0
            | Input::MessageDataPredicate(_) => InputRepr::Message,
117
        }
118
26.3k
    }
119
}
120
121
impl From<&Input> for InputRepr {
122
413k
    fn from(input: &Input) -> Self {
123
413k
        Self::from_input(input)
124
413k
    }
_RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4reprNtB4_9InputReprINtNtCsd3UI3IJrzMw_4core7convert4FromRNtB6_5InputE4fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
122
387k
    fn from(input: &Input) -> Self {
123
387k
        Self::from_input(input)
124
387k
    }
_RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4reprNtB4_9InputReprINtNtCsd3UI3IJrzMw_4core7convert4FromRNtB6_5InputE4fromBc_
Line
Count
Source
122
26.3k
    fn from(input: &Input) -> Self {
123
26.3k
        Self::from_input(input)
124
26.3k
    }
125
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/types/input/contract.rs
Line
Count
Source
1
use crate::{
2
    TxPointer,
3
    UtxoId,
4
};
5
use fuel_types::{
6
    Bytes32,
7
    ContractId,
8
};
9
10
/// It is a full representation of the contract input from the specification:
11
/// <https://github.com/FuelLabs/fuel-specs/blob/master/src/tx-format/input.md#inputcontract>.
12
///
13
/// The specification defines the layout of the [`Contract`] in the serialized form for
14
/// the `fuel-vm`.
15
#[derive(
16
0
    Default, Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input8contracts_1__NtB7_8ContractNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1u_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input8contracts_1__NtBa_8ContractNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1x_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input8contracts_1__NtB8_8ContractNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1v_7Visitor9visit_u64pEBg_
Unexecuted instantiation: _RINvXNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input8contracts_1__NtB8_8ContractNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1v_7Visitor9visit_strpEBg_
Unexecuted instantiation: _RINvXNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input8contracts_1__NtB8_8ContractNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1v_7Visitor11visit_bytespEBg_
Unexecuted instantiation: _RINvXs_NvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input8contracts_1__NtBa_8ContractNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1v_11deserializepEBi_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input8contracts_1__NtBb_8ContractNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1y_7Visitor9visit_seqpEBj_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input8contracts_1__NtBb_8ContractNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1y_7Visitor9visit_mappEBj_
17
)]
18
#[cfg_attr(
19
    feature = "da-compression",
20
    derive(fuel_compression::Compress, fuel_compression::Decompress)
21
)]
22
17.5k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input8contracts0_1__NtB5_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
22
2.19k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input8contracts0_1__NtB5_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
22
2.19k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input8contracts0_1__NtB5_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEBd_
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input8contracts0_1__NtB5_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBd_
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input8contracts1_1__NtB5_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
22
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input8contracts1_1__NtB5_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
22
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input8contracts1_1__NtB4_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_static
Line
Count
Source
22
81.1k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input8contracts1_1__NtB4_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamic
Line
Count
Source
22
81.1k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input8contracts1_1__NtB5_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBd_
Line
Count
Source
22
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input8contracts1_1__NtB5_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBd_
Line
Count
Source
22
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
23
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen(js_name = InputContract))]
24
pub struct Contract {
25
    #[cfg_attr(feature = "da-compression", compress(skip))]
26
    pub utxo_id: UtxoId,
27
    #[cfg_attr(feature = "da-compression", compress(skip))]
28
    pub balance_root: Bytes32,
29
    #[cfg_attr(feature = "da-compression", compress(skip))]
30
    pub state_root: Bytes32,
31
    /// Pointer to transction that last modified the contract state.
32
    #[cfg_attr(feature = "da-compression", compress(skip))]
33
    pub tx_pointer: TxPointer,
34
    pub contract_id: ContractId,
35
}
36
37
impl Contract {
38
    /// The "Note" section from the specification:
39
    /// <https://github.com/FuelLabs/fuel-specs/blob/master/src/tx-format/input.md#inputcontract>.
40
8.77k
    pub fn prepare_sign(&mut self) {
41
8.77k
        self.utxo_id = Default::default();
42
8.77k
        self.balance_root = Default::default();
43
8.77k
        self.state_root = Default::default();
44
8.77k
        self.tx_pointer = Default::default();
45
8.77k
    }
46
}
47
48
#[cfg(feature = "random")]
49
use rand::{
50
    distributions::{
51
        Distribution,
52
        Standard,
53
    },
54
    Rng,
55
};
56
57
#[cfg(feature = "random")]
58
impl Distribution<Contract> for Standard {
59
0
    fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Contract {
60
0
        Contract {
61
0
            utxo_id: rng.gen(),
62
0
            balance_root: rng.gen(),
63
0
            state_root: rng.gen(),
64
0
            tx_pointer: rng.gen(),
65
0
            contract_id: rng.gen(),
66
0
        }
67
0
    }
68
}
69
70
#[cfg(feature = "typescript")]
71
pub mod typescript {
72
    use wasm_bindgen::prelude::*;
73
74
    use super::*;
75
76
    use crate::{
77
        TxPointer,
78
        UtxoId,
79
    };
80
    use fuel_types::{
81
        Bytes32,
82
        ContractId,
83
    };
84
85
    #[wasm_bindgen(js_class = InputContract)]
86
    impl Contract {
87
        #[wasm_bindgen(constructor)]
88
        pub fn typescript_new(
89
            utxo_id: UtxoId,
90
            balance_root: Bytes32,
91
            state_root: Bytes32,
92
            tx_pointer: TxPointer,
93
            contract_id: ContractId,
94
        ) -> Self {
95
            Self {
96
                utxo_id,
97
                balance_root,
98
                state_root,
99
                tx_pointer,
100
                contract_id,
101
            }
102
        }
103
    }
104
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/types/input/message.rs
Line
Count
Source
1
use crate::{
2
    input::fmt_as_field,
3
    transaction::types::input::AsField,
4
};
5
use alloc::vec::Vec;
6
use derivative::Derivative;
7
#[cfg(feature = "da-compression")]
8
use fuel_compression::Compressible;
9
use fuel_types::{
10
    Address,
11
    MessageId,
12
    Nonce,
13
    Word,
14
};
15
16
use super::PredicateCode;
17
18
pub type FullMessage = Message<specifications::Full>;
19
pub type MessageDataSigned = Message<specifications::MessageData<specifications::Signed>>;
20
pub type MessageDataPredicate =
21
    Message<specifications::MessageData<specifications::Predicate>>;
22
pub type MessageCoinSigned = Message<specifications::MessageCoin<specifications::Signed>>;
23
pub type MessageCoinPredicate =
24
    Message<specifications::MessageCoin<specifications::Predicate>>;
25
26
mod private {
27
    pub trait Seal {}
28
29
    impl Seal for super::specifications::Full {}
30
    impl Seal for super::specifications::MessageData<super::specifications::Signed> {}
31
    impl Seal for super::specifications::MessageData<super::specifications::Predicate> {}
32
    impl Seal for super::specifications::MessageCoin<super::specifications::Signed> {}
33
    impl Seal for super::specifications::MessageCoin<super::specifications::Predicate> {}
34
}
35
36
/// Specifies the message based on the usage context. See [`Message`].
37
#[cfg(feature = "da-compression")]
38
pub trait MessageSpecification: private::Seal {
39
    type Data: AsField<Vec<u8>>
40
        + for<'a> Compressible<
41
            Compressed: core::fmt::Debug
42
                            + PartialEq
43
                            + Clone
44
                            + serde::Serialize
45
                            + serde::Deserialize<'a>,
46
        >;
47
    type Predicate: AsField<PredicateCode>
48
        + for<'a> Compressible<
49
            Compressed: core::fmt::Debug
50
                            + PartialEq
51
                            + Clone
52
                            + serde::Serialize
53
                            + serde::Deserialize<'a>,
54
        >;
55
    type PredicateData: AsField<Vec<u8>>
56
        + for<'a> Compressible<
57
            Compressed: core::fmt::Debug
58
                            + PartialEq
59
                            + Clone
60
                            + serde::Serialize
61
                            + serde::Deserialize<'a>,
62
        >;
63
    type PredicateGasUsed: AsField<Word>
64
        + for<'a> Compressible<
65
            Compressed: core::fmt::Debug
66
                            + PartialEq
67
                            + Clone
68
                            + serde::Serialize
69
                            + serde::Deserialize<'a>,
70
        > + Default;
71
    type Witness: AsField<u16>
72
        + for<'a> Compressible<
73
            Compressed: core::fmt::Debug
74
                            + PartialEq
75
                            + Clone
76
                            + serde::Serialize
77
                            + serde::Deserialize<'a>,
78
        >;
79
}
80
81
#[cfg(not(feature = "da-compression"))]
82
pub trait MessageSpecification: private::Seal {
83
    type Data: AsField<Vec<u8>>;
84
    type Predicate: AsField<PredicateCode>;
85
    type PredicateData: AsField<Vec<u8>>;
86
    type PredicateGasUsed: AsField<Word>;
87
    type Witness: AsField<u16>;
88
}
89
90
pub mod specifications {
91
    use alloc::vec::Vec;
92
93
    use super::MessageSpecification;
94
    use crate::input::{
95
        Empty,
96
        PredicateCode,
97
    };
98
    use fuel_types::Word;
99
100
    /// The type means that the message should be signed by the `recipient`, and the
101
    /// signature(witness) should be stored under the `witness_index` index in the
102
    /// `witnesses` vector of the [`crate::Transaction`].
103
    #[derive(
104
0
        Default, Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7message14specificationss_1__NtB7_6SignedNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtB1J_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7message14specificationss_1__NtB8_6SignedNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtB1K_7Visitor10visit_unitpEBi_
105
    )]
106
    #[cfg_attr(
107
        feature = "da-compression",
108
        derive(fuel_compression::Compress, fuel_compression::Decompress)
109
    )]
110
    pub struct Signed;
111
112
    /// The type means that the message is not signed, and the `owner` is a `predicate`
113
    /// bytecode. The merkle root from the `predicate` should be equal to the `owner`.
114
    #[derive(
115
0
        Default, Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7message14specificationss1_1__NtB7_9PredicateNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtB1N_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7message14specificationss1_1__NtB8_9PredicateNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtB1O_7Visitor10visit_unitpEBi_
116
    )]
117
    #[cfg_attr(
118
        feature = "da-compression",
119
        derive(fuel_compression::Compress, fuel_compression::Decompress)
120
    )]
121
    pub struct Predicate;
122
123
    /// The retrayable message metadata. It is a message that can't be used as a coin to
124
    /// pay for fees but can be used to pass metadata to the contract. It may have a
125
    /// non-zero `value` that will be transferred to the contract as a native asset
126
    /// during the execution. If the execution of the transaction fails, the metadata
127
    /// is not consumed and can be used later until successful execution.
128
    #[derive(
129
0
        Default, Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize,
Unexecuted instantiation: _RNvXININvXNvNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7message14specificationss3_1__INtBa_11MessageDatapENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserialize0pEINtB5_9___VisitorpENtB1W_7Visitor9expectingBk_
Unexecuted instantiation: _RINvXININvXNvNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7message14specificationss3_1__INtBb_11MessageDatapENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserialize0pEINtB6_9___VisitorpENtB1X_7Visitor20visit_newtype_structpEBl_
Unexecuted instantiation: _RINvXININvXNvNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7message14specificationss3_1__INtBb_11MessageDatapENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserialize0pEINtB6_9___VisitorpENtB1X_7Visitor9visit_seqpEBl_
130
    )]
131
    pub struct MessageData<UsageRules>(core::marker::PhantomData<UsageRules>);
132
133
    impl MessageSpecification for MessageData<Signed> {
134
        type Data = Vec<u8>;
135
        type Predicate = Empty<PredicateCode>;
136
        type PredicateData = Empty<Vec<u8>>;
137
        type PredicateGasUsed = Empty<Word>;
138
        type Witness = u16;
139
    }
140
141
    impl MessageSpecification for MessageData<Predicate> {
142
        type Data = Vec<u8>;
143
        type Predicate = PredicateCode;
144
        type PredicateData = Vec<u8>;
145
        type PredicateGasUsed = Word;
146
        type Witness = Empty<u16>;
147
    }
148
149
    /// The spendable message acts as a standard coin.
150
    #[derive(
151
0
        Default, Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize,
Unexecuted instantiation: _RNvXININvXNvNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7message14specificationss5_1__INtBa_11MessageCoinpENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserialize0pEINtB5_9___VisitorpENtB1W_7Visitor9expectingBk_
Unexecuted instantiation: _RINvXININvXNvNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7message14specificationss5_1__INtBb_11MessageCoinpENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserialize0pEINtB6_9___VisitorpENtB1X_7Visitor20visit_newtype_structpEBl_
Unexecuted instantiation: _RINvXININvXNvNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7message14specificationss5_1__INtBb_11MessageCoinpENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserialize0pEINtB6_9___VisitorpENtB1X_7Visitor9visit_seqpEBl_
152
    )]
153
    pub struct MessageCoin<UsageRules>(core::marker::PhantomData<UsageRules>);
154
155
    impl MessageSpecification for MessageCoin<Signed> {
156
        type Data = Empty<Vec<u8>>;
157
        type Predicate = Empty<PredicateCode>;
158
        type PredicateData = Empty<Vec<u8>>;
159
        type PredicateGasUsed = Empty<Word>;
160
        type Witness = u16;
161
    }
162
163
    impl MessageSpecification for MessageCoin<Predicate> {
164
        type Data = Empty<Vec<u8>>;
165
        type Predicate = PredicateCode;
166
        type PredicateData = Vec<u8>;
167
        type PredicateGasUsed = Word;
168
        type Witness = Empty<u16>;
169
    }
170
171
    /// The type is used to represent the full message. It is used during the
172
    /// deserialization of the message to determine the final type.
173
    /// If the `data` field is empty, it should be transformed into [`MessageData`].
174
    /// Otherwise into [`MessageCoin`].
175
    /// If the `predicate` is empty, the usage rules should be [`Signed`], else
176
    /// [`Predicate`].
177
    #[derive(
178
0
        Default, Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7message14specificationss7_1__NtB7_4FullNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtB1I_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7message14specificationss7_1__NtB8_4FullNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtB1J_7Visitor10visit_unitpEBi_
179
    )]
180
    pub struct Full;
181
182
    impl MessageSpecification for Full {
183
        type Data = Vec<u8>;
184
        type Predicate = PredicateCode;
185
        type PredicateData = Vec<u8>;
186
        type PredicateGasUsed = Word;
187
        type Witness = u16;
188
    }
189
}
190
191
0
/// It is a full representation of the message from the specification:
192
0
/// <https://github.com/FuelLabs/fuel-specs/blob/master/src/tx-format/input.md#inputmessage>.
193
0
///
194
0
/// The specification defines the layout of the [`Message`] in the serialized form for
195
0
/// the `fuel-vm`. But on the business logic level, we don't use all fields at the same
196
0
/// time. It is why in the [`super::Input`] the message is represented by several forms
197
0
/// based on the usage context. Leaving some fields empty reduces the memory consumption
198
0
/// by the structure and erases the empty useless fields.
199
0
///
200
0
/// The [`MessageSpecification`] trait specifies the sub-messages for the corresponding
201
0
/// usage context. It allows us to write the common logic of all sub-messages without the
202
0
/// overhead and duplication.
203
0
///
204
0
/// Sub-messages from [`specifications`]:
205
0
/// - [`specifications::MessageData`] with [`specifications::Signed`] usage rules.
206
0
/// - [`specifications::MessageData`] with [`specifications::Predicate`] usage rules.
207
0
/// - [`specifications::Full`].
208
0
#[derive(Default, Derivative, Clone, PartialEq, Eq, Hash)]
209
0
#[derivative(Debug)]
210
0
#[derive(serde::Serialize, serde::Deserialize)]
Unexecuted instantiation: _RNvXNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages_1__INtB7_7MessagepENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1v_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages_1__INtB8_7MessagepENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1w_7Visitor9visit_u64pEBg_
Unexecuted instantiation: _RINvXNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages_1__INtB8_7MessagepENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1w_7Visitor9visit_strpEBg_
Unexecuted instantiation: _RINvXNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages_1__INtB8_7MessagepENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1w_7Visitor11visit_bytespEBg_
Unexecuted instantiation: _RINvXs_NvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages_1__INtBa_7MessagepENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1w_11deserializepEBi_
Unexecuted instantiation: _RNvXININvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages_1__INtBa_7MessagepENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializes0_0pEINtB5_9___VisitorpENtB1y_7Visitor9expectingBi_
Unexecuted instantiation: _RINvXININvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages_1__INtBb_7MessagepENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializes0_0pEINtB6_9___VisitorpENtB1z_7Visitor9visit_seqpEBj_
Unexecuted instantiation: _RINvXININvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages_1__INtBb_7MessagepENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializes0_0pEINtB6_9___VisitorpENtB1z_7Visitor9visit_mappEBj_
211
0
#[cfg_attr(feature = "da-compression", derive(fuel_compression::Compress))]
212
0
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages0_1__INtB5_7MessageINtNtB5_14specifications11MessageCoinNtB1t_6SignedEENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages0_1__INtB5_7MessageINtNtB5_14specifications11MessageCoinNtB1t_9PredicateEENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages0_1__INtB5_7MessageINtNtB5_14specifications11MessageDataNtB1t_6SignedEENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages0_1__INtB5_7MessageINtNtB5_14specifications11MessageDataNtB1t_9PredicateEENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages0_1__INtB5_7MessageNtNtB5_14specifications4FullENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages0_1__INtB5_7MessageNtNtB5_14specifications4FullENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEBd_
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages0_1__INtB5_7MessageINtNtB5_14specifications11MessageCoinNtB1t_6SignedEENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBd_
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages0_1__INtB5_7MessageINtNtB5_14specifications11MessageCoinNtB1t_9PredicateEENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBd_
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages0_1__INtB5_7MessageINtNtB5_14specifications11MessageDataNtB1t_6SignedEENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBd_
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages0_1__INtB5_7MessageINtNtB5_14specifications11MessageDataNtB1t_9PredicateEENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBd_
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages1_1__INtB5_7MessageINtNtB5_14specifications11MessageCoinNtB1t_6SignedEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages1_1__INtB5_7MessageINtNtB5_14specifications11MessageCoinNtB1t_6SignedEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages1_1__INtB5_7MessageINtNtB5_14specifications11MessageCoinNtB1t_9PredicateEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages1_1__INtB5_7MessageINtNtB5_14specifications11MessageCoinNtB1t_9PredicateEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages1_1__INtB5_7MessageINtNtB5_14specifications11MessageDataNtB1t_6SignedEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages1_1__INtB5_7MessageINtNtB5_14specifications11MessageDataNtB1t_6SignedEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages1_1__INtB5_7MessageINtNtB5_14specifications11MessageDataNtB1t_9PredicateEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages1_1__INtB5_7MessageINtNtB5_14specifications11MessageDataNtB1t_9PredicateEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages1_1__INtB4_7MessageINtNtB4_14specifications11MessageCoinNtB1s_6SignedEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_staticBc_
Unexecuted instantiation: _RNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages1_1__INtB4_7MessageINtNtB4_14specifications11MessageCoinNtB1s_9PredicateEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_staticBc_
Unexecuted instantiation: _RNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages1_1__INtB4_7MessageINtNtB4_14specifications11MessageDataNtB1s_6SignedEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_staticBc_
Unexecuted instantiation: _RNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages1_1__INtB4_7MessageINtNtB4_14specifications11MessageDataNtB1s_9PredicateEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_staticBc_
Unexecuted instantiation: _RNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages1_1__INtB4_7MessageINtNtB4_14specifications11MessageCoinNtB1s_6SignedEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamicBc_
Unexecuted instantiation: _RNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages1_1__INtB4_7MessageINtNtB4_14specifications11MessageCoinNtB1s_9PredicateEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamicBc_
Unexecuted instantiation: _RNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages1_1__INtB4_7MessageINtNtB4_14specifications11MessageDataNtB1s_6SignedEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamicBc_
Unexecuted instantiation: _RNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages1_1__INtB4_7MessageINtNtB4_14specifications11MessageDataNtB1s_9PredicateEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamicBc_
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages1_1__INtB5_7MessageINtNtB5_14specifications11MessageCoinNtB1t_6SignedEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBd_
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages1_1__INtB5_7MessageINtNtB5_14specifications11MessageCoinNtB1t_9PredicateEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBd_
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages1_1__INtB5_7MessageINtNtB5_14specifications11MessageDataNtB1t_6SignedEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBd_
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages1_1__INtB5_7MessageINtNtB5_14specifications11MessageDataNtB1t_9PredicateEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBd_
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages1_1__INtB5_7MessageINtNtB5_14specifications11MessageCoinNtB1t_6SignedEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBd_
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages1_1__INtB5_7MessageINtNtB5_14specifications11MessageCoinNtB1t_9PredicateEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBd_
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages1_1__INtB5_7MessageINtNtB5_14specifications11MessageDataNtB1t_6SignedEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBd_
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messages1_1__INtB5_7MessageINtNtB5_14specifications11MessageDataNtB1t_9PredicateEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBd_
213
0
pub struct Message<Specification>
214
0
where
215
0
    Specification: MessageSpecification,
216
0
{
217
0
    /// The sender from the L1 chain.
218
0
    #[cfg_attr(feature = "da-compression", compress(skip))]
219
0
    pub sender: Address,
220
0
    /// The receiver on the `Fuel` chain.
221
0
    #[cfg_attr(feature = "da-compression", compress(skip))]
222
0
    pub recipient: Address,
223
0
    #[cfg_attr(feature = "da-compression", compress(skip))]
224
0
    pub amount: Word,
225
0
    // Unique identifier of the message
226
0
    pub nonce: Nonce,
227
0
    #[derivative(Debug(format_with = "fmt_as_field"))]
Unexecuted instantiation: _RNvXNvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtB8_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB2_5DummyINtNtB8_14specifications11MessageCoinNtB2f_6SignedEEB1p_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtB8_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB2_5DummyINtNtB8_14specifications11MessageCoinNtB2f_9PredicateEEB1p_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtB8_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB2_5DummyINtNtB8_14specifications11MessageDataNtB2f_6SignedEEB1p_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtB8_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB2_5DummyINtNtB8_14specifications11MessageDataNtB2f_9PredicateEEB1p_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtB8_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB2_5DummyINtNtB8_14specifications11MessageCoinNtB2f_6SignedEEB1p_3fmtBg_
Unexecuted instantiation: _RNvXNvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtB8_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB2_5DummyINtNtB8_14specifications11MessageCoinNtB2f_9PredicateEEB1p_3fmtBg_
Unexecuted instantiation: _RNvXNvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtB8_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB2_5DummyINtNtB8_14specifications11MessageDataNtB2f_6SignedEEB1p_3fmtBg_
Unexecuted instantiation: _RNvXNvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtB8_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB2_5DummyINtNtB8_14specifications11MessageDataNtB2f_9PredicateEEB1p_3fmtBg_
228
0
    pub witness_index: Specification::Witness,
229
0
    /// Exact amount of gas used by the predicate.
230
0
    /// If the predicate consumes different amount of gas,
231
0
    /// it's considered to be false.
232
0
    #[derivative(Debug(format_with = "fmt_as_field"))]
Unexecuted instantiation: _RNvXs_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBa_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB4_s_5DummyINtNtBa_14specifications11MessageCoinNtB2j_6SignedEEB1r_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBa_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB4_s_5DummyINtNtBa_14specifications11MessageCoinNtB2j_9PredicateEEB1r_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBa_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB4_s_5DummyINtNtBa_14specifications11MessageDataNtB2j_6SignedEEB1r_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBa_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB4_s_5DummyINtNtBa_14specifications11MessageDataNtB2j_9PredicateEEB1r_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBa_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB4_s_5DummyINtNtBa_14specifications11MessageCoinNtB2j_6SignedEEB1r_3fmtBi_
Unexecuted instantiation: _RNvXs_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBa_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB4_s_5DummyINtNtBa_14specifications11MessageCoinNtB2j_9PredicateEEB1r_3fmtBi_
Unexecuted instantiation: _RNvXs_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBa_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB4_s_5DummyINtNtBa_14specifications11MessageDataNtB2j_6SignedEEB1r_3fmtBi_
Unexecuted instantiation: _RNvXs_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBa_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB4_s_5DummyINtNtBa_14specifications11MessageDataNtB2j_9PredicateEEB1r_3fmtBi_
233
0
    pub predicate_gas_used: Specification::PredicateGasUsed,
234
0
    #[cfg_attr(feature = "da-compression", compress(skip))]
235
0
    #[derivative(Debug(format_with = "fmt_as_field"))]
Unexecuted instantiation: _RNvXs0_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBb_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s0_5DummyINtNtBb_14specifications11MessageCoinNtB2l_6SignedEEB1s_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs0_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBb_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s0_5DummyINtNtBb_14specifications11MessageCoinNtB2l_9PredicateEEB1s_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs0_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBb_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s0_5DummyINtNtBb_14specifications11MessageDataNtB2l_6SignedEEB1s_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs0_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBb_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s0_5DummyINtNtBb_14specifications11MessageDataNtB2l_9PredicateEEB1s_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs0_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBb_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s0_5DummyINtNtBb_14specifications11MessageCoinNtB2l_6SignedEEB1s_3fmtBj_
Unexecuted instantiation: _RNvXs0_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBb_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s0_5DummyINtNtBb_14specifications11MessageCoinNtB2l_9PredicateEEB1s_3fmtBj_
Unexecuted instantiation: _RNvXs0_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBb_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s0_5DummyINtNtBb_14specifications11MessageDataNtB2l_6SignedEEB1s_3fmtBj_
Unexecuted instantiation: _RNvXs0_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBb_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s0_5DummyINtNtBb_14specifications11MessageDataNtB2l_9PredicateEEB1s_3fmtBj_
236
0
    pub data: Specification::Data,
237
0
    #[derivative(Debug(format_with = "fmt_as_field"))]
Unexecuted instantiation: _RNvXs1_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBb_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s1_5DummyINtNtBb_14specifications11MessageCoinNtB2l_6SignedEEB1s_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs1_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBb_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s1_5DummyINtNtBb_14specifications11MessageCoinNtB2l_9PredicateEEB1s_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs1_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBb_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s1_5DummyINtNtBb_14specifications11MessageDataNtB2l_6SignedEEB1s_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs1_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBb_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s1_5DummyINtNtBb_14specifications11MessageDataNtB2l_9PredicateEEB1s_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs1_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBb_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s1_5DummyINtNtBb_14specifications11MessageCoinNtB2l_6SignedEEB1s_3fmtBj_
Unexecuted instantiation: _RNvXs1_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBb_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s1_5DummyINtNtBb_14specifications11MessageCoinNtB2l_9PredicateEEB1s_3fmtBj_
Unexecuted instantiation: _RNvXs1_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBb_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s1_5DummyINtNtBb_14specifications11MessageDataNtB2l_6SignedEEB1s_3fmtBj_
Unexecuted instantiation: _RNvXs1_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBb_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s1_5DummyINtNtBb_14specifications11MessageDataNtB2l_9PredicateEEB1s_3fmtBj_
238
0
    pub predicate: Specification::Predicate,
239
0
    #[derivative(Debug(format_with = "fmt_as_field"))]
Unexecuted instantiation: _RNvXs2_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBb_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s2_5DummyINtNtBb_14specifications11MessageCoinNtB2l_6SignedEEB1s_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs2_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBb_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s2_5DummyINtNtBb_14specifications11MessageCoinNtB2l_9PredicateEEB1s_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs2_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBb_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s2_5DummyINtNtBb_14specifications11MessageDataNtB2l_6SignedEEB1s_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs2_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBb_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s2_5DummyINtNtBb_14specifications11MessageDataNtB2l_9PredicateEEB1s_3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs2_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBb_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s2_5DummyINtNtBb_14specifications11MessageCoinNtB2l_6SignedEEB1s_3fmtBj_
Unexecuted instantiation: _RNvXs2_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBb_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s2_5DummyINtNtBb_14specifications11MessageCoinNtB2l_9PredicateEEB1s_3fmtBj_
Unexecuted instantiation: _RNvXs2_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBb_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s2_5DummyINtNtBb_14specifications11MessageDataNtB2l_6SignedEEB1s_3fmtBj_
Unexecuted instantiation: _RNvXs2_NvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtBb_7MessagepENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtINtB5_s2_5DummyINtNtBb_14specifications11MessageDataNtB2l_9PredicateEEB1s_3fmtBj_
240
0
    pub predicate_data: Specification::PredicateData,
241
0
}
Unexecuted instantiation: _RNvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtB5_7MessageINtNtB5_14specifications11MessageCoinNtB1n_6SignedEENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtB5_7MessageINtNtB5_14specifications11MessageCoinNtB1n_9PredicateEENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtB5_7MessageINtNtB5_14specifications11MessageDataNtB1n_6SignedEENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtB5_7MessageINtNtB5_14specifications11MessageDataNtB1n_9PredicateEENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtB5_7MessageINtNtB5_14specifications11MessageCoinNtB1n_6SignedEENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtBd_
Unexecuted instantiation: _RNvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtB5_7MessageINtNtB5_14specifications11MessageCoinNtB1n_9PredicateEENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtBd_
Unexecuted instantiation: _RNvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtB5_7MessageINtNtB5_14specifications11MessageDataNtB1n_6SignedEENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtBd_
Unexecuted instantiation: _RNvXs5_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtB5_7MessageINtNtB5_14specifications11MessageDataNtB1n_9PredicateEENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtBd_
242
243
impl<Specification> Message<Specification>
244
where
245
    Specification: MessageSpecification,
246
{
247
0
    pub fn prepare_sign(&mut self) {
248
0
        if let Some(predicate_gas_used_field) = self.predicate_gas_used.as_mut_field() {
249
0
            *predicate_gas_used_field = Default::default();
250
0
        }
251
0
    }
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtB2_7MessageINtNtB2_14specifications11MessageCoinNtB1k_6SignedEE12prepare_signBa_
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtB2_7MessageINtNtB2_14specifications11MessageCoinNtB1k_9PredicateEE12prepare_signBa_
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtB2_7MessageINtNtB2_14specifications11MessageDataNtB1k_6SignedEE12prepare_signBa_
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtB2_7MessageINtNtB2_14specifications11MessageDataNtB1k_9PredicateEE12prepare_signBa_
252
253
0
    pub fn message_id(&self) -> MessageId {
254
0
        let Self {
255
0
            sender,
256
0
            recipient,
257
0
            amount,
258
0
            nonce,
259
0
            data,
260
0
            ..
261
0
        } = self;
262
0
        if let Some(data) = data.as_field() {
263
0
            compute_message_id(sender, recipient, nonce, *amount, data)
264
        } else {
265
0
            compute_message_id(sender, recipient, nonce, *amount, &[])
266
        }
267
0
    }
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtB2_7MessageINtNtB2_14specifications11MessageCoinNtB1k_6SignedEE10message_idBa_
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtB2_7MessageINtNtB2_14specifications11MessageCoinNtB1k_9PredicateEE10message_idBa_
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtB2_7MessageINtNtB2_14specifications11MessageDataNtB1k_6SignedEE10message_idBa_
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input7messageINtB2_7MessageINtNtB2_14specifications11MessageDataNtB1k_9PredicateEE10message_idBa_
268
}
269
270
impl FullMessage {
271
0
    pub fn into_message_data_signed(self) -> MessageDataSigned {
272
0
        let Self {
273
0
            sender,
274
0
            recipient,
275
0
            amount,
276
0
            nonce,
277
0
            witness_index,
278
0
            data,
279
0
            ..
280
0
        } = self;
281
0
282
0
        Message {
283
0
            sender,
284
0
            recipient,
285
0
            amount,
286
0
            nonce,
287
0
            witness_index,
288
0
            data,
289
0
            ..Default::default()
290
0
        }
291
0
    }
292
293
0
    pub fn into_message_data_predicate(self) -> MessageDataPredicate {
294
0
        let Self {
295
0
            sender,
296
0
            recipient,
297
0
            amount,
298
0
            nonce,
299
0
            data,
300
0
            predicate,
301
0
            predicate_data,
302
0
            predicate_gas_used,
303
0
            ..
304
0
        } = self;
305
0
306
0
        Message {
307
0
            sender,
308
0
            recipient,
309
0
            amount,
310
0
            nonce,
311
0
            data,
312
0
            predicate,
313
0
            predicate_data,
314
0
            predicate_gas_used,
315
0
            ..Default::default()
316
0
        }
317
0
    }
318
319
0
    pub fn into_coin_signed(self) -> MessageCoinSigned {
320
0
        let Self {
321
0
            sender,
322
0
            recipient,
323
0
            amount,
324
0
            nonce,
325
0
            witness_index,
326
0
            ..
327
0
        } = self;
328
0
329
0
        Message {
330
0
            sender,
331
0
            recipient,
332
0
            amount,
333
0
            nonce,
334
0
            witness_index,
335
0
            ..Default::default()
336
0
        }
337
0
    }
338
339
0
    pub fn into_coin_predicate(self) -> MessageCoinPredicate {
340
0
        let Self {
341
0
            sender,
342
0
            recipient,
343
0
            amount,
344
0
            nonce,
345
0
            predicate,
346
0
            predicate_data,
347
0
            predicate_gas_used,
348
0
            ..
349
0
        } = self;
350
0
351
0
        Message {
352
0
            sender,
353
0
            recipient,
354
0
            amount,
355
0
            nonce,
356
0
            predicate,
357
0
            predicate_data,
358
0
            predicate_gas_used,
359
0
            ..Default::default()
360
0
        }
361
0
    }
362
}
363
364
impl MessageCoinSigned {
365
0
    pub fn into_full(self) -> FullMessage {
366
0
        let Self {
367
0
            sender,
368
0
            recipient,
369
0
            amount,
370
0
            nonce,
371
0
            witness_index,
372
0
            ..
373
0
        } = self;
374
0
375
0
        Message {
376
0
            sender,
377
0
            recipient,
378
0
            amount,
379
0
            nonce,
380
0
            witness_index,
381
0
            ..Default::default()
382
0
        }
383
0
    }
384
}
385
386
impl MessageCoinPredicate {
387
0
    pub fn into_full(self) -> FullMessage {
388
0
        let Self {
389
0
            sender,
390
0
            recipient,
391
0
            amount,
392
0
            nonce,
393
0
            predicate,
394
0
            predicate_data,
395
0
            predicate_gas_used,
396
0
            ..
397
0
        } = self;
398
0
399
0
        Message {
400
0
            sender,
401
0
            recipient,
402
0
            amount,
403
0
            nonce,
404
0
            predicate,
405
0
            predicate_data,
406
0
            predicate_gas_used,
407
0
            ..Default::default()
408
0
        }
409
0
    }
410
}
411
412
impl MessageDataPredicate {
413
0
    pub fn into_full(self) -> FullMessage {
414
0
        let Self {
415
0
            sender,
416
0
            recipient,
417
0
            amount,
418
0
            nonce,
419
0
            data,
420
0
            predicate,
421
0
            predicate_data,
422
0
            predicate_gas_used,
423
0
            ..
424
0
        } = self;
425
0
426
0
        Message {
427
0
            sender,
428
0
            recipient,
429
0
            amount,
430
0
            nonce,
431
0
            data,
432
0
            predicate,
433
0
            predicate_data,
434
0
            predicate_gas_used,
435
0
            ..Default::default()
436
0
        }
437
0
    }
438
}
439
440
impl MessageDataSigned {
441
0
    pub fn into_full(self) -> FullMessage {
442
0
        let Self {
443
0
            sender,
444
0
            recipient,
445
0
            amount,
446
0
            nonce,
447
0
            witness_index,
448
0
            data,
449
0
            ..
450
0
        } = self;
451
0
452
0
        Message {
453
0
            sender,
454
0
            recipient,
455
0
            amount,
456
0
            nonce,
457
0
            witness_index,
458
0
            data,
459
0
            ..Default::default()
460
0
        }
461
0
    }
462
}
463
464
0
pub fn compute_message_id(
465
0
    sender: &Address,
466
0
    recipient: &Address,
467
0
    nonce: &Nonce,
468
0
    amount: Word,
469
0
    data: &[u8],
470
0
) -> MessageId {
471
0
    let hasher = fuel_crypto::Hasher::default()
472
0
        .chain(sender)
473
0
        .chain(recipient)
474
0
        .chain(nonce)
475
0
        .chain(amount.to_be_bytes())
476
0
        .chain(data);
477
0
478
0
    (*hasher.finalize()).into()
479
0
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/types/utxo_id.rs
Line
Count
Source
1
use crate::TxId;
2
3
use fuel_types::Bytes32;
4
5
use core::{
6
    fmt,
7
    str,
8
};
9
10
#[cfg(feature = "random")]
11
use rand::{
12
    distributions::{
13
        Distribution,
14
        Standard,
15
    },
16
    Rng,
17
};
18
19
/// Identification of unspend transaction output.
20
#[derive(Debug, Default, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
21
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
22
#[derive(
23
    serde::Serialize,
24
0
    serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_ids_1__NtB7_6UtxoIdNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1j_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_ids_1__NtBa_6UtxoIdNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1m_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_ids_1__NtB8_6UtxoIdNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1k_7Visitor9visit_u64pEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_ids_1__NtB8_6UtxoIdNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1k_7Visitor9visit_strpEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_ids_1__NtB8_6UtxoIdNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1k_7Visitor11visit_bytespEBe_
Unexecuted instantiation: _RINvXs_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_ids_1__NtBa_6UtxoIdNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1k_11deserializepEBg_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_ids_1__NtBb_6UtxoIdNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1n_7Visitor9visit_seqpEBh_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_ids_1__NtBb_6UtxoIdNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1n_7Visitor9visit_mappEBh_
25
13.1k
    fuel_types::canonical::Deserialize,
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_ids0_1__NtB5_6UtxoIdNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
25
6.57k
    fuel_types::canonical::Deserialize,
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_ids0_1__NtB5_6UtxoIdNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
25
6.57k
    fuel_types::canonical::Deserialize,
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_ids0_1__NtB5_6UtxoIdNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_ids0_1__NtB5_6UtxoIdNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBb_
26
52.6k
    fuel_types::canonical::Serialize,
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_ids1_1__NtB5_6UtxoIdNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
26
13.1k
    fuel_types::canonical::Serialize,
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_ids1_1__NtB5_6UtxoIdNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
26
13.1k
    fuel_types::canonical::Serialize,
_RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_ids1_1__NtB4_6UtxoIdNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_static
Line
Count
Source
26
243k
    fuel_types::canonical::Serialize,
_RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_ids1_1__NtB4_6UtxoIdNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamic
Line
Count
Source
26
243k
    fuel_types::canonical::Serialize,
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_ids1_1__NtB5_6UtxoIdNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Line
Count
Source
26
13.1k
    fuel_types::canonical::Serialize,
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_ids1_1__NtB5_6UtxoIdNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Line
Count
Source
26
13.1k
    fuel_types::canonical::Serialize,
27
)]
28
pub struct UtxoId {
29
    /// transaction id
30
    tx_id: TxId,
31
    /// output index
32
    output_index: u16,
33
}
34
35
#[cfg(feature = "da-compression")]
36
#[derive(
37
    Debug,
38
    Default,
39
    Copy,
40
    Clone,
41
    PartialEq,
42
    Eq,
43
    PartialOrd,
44
    Ord,
45
    Hash,
46
    serde::Serialize,
47
    serde::Deserialize,
48
)]
49
pub struct CompressedUtxoId {
50
    pub tx_pointer: crate::TxPointer,
51
    pub output_index: u16,
52
}
53
54
#[cfg(feature = "da-compression")]
55
impl fuel_compression::Compressible for UtxoId {
56
    type Compressed = CompressedUtxoId;
57
}
58
59
impl UtxoId {
60
    pub const LEN: usize = TxId::LEN + 8;
61
62
6.57k
    pub const fn new(tx_id: TxId, output_index: u16) -> Self {
63
6.57k
        Self {
64
6.57k
            tx_id,
65
6.57k
            output_index,
66
6.57k
        }
67
6.57k
    }
_RNvMNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_idNtB2_6UtxoId3newCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
62
6.57k
    pub const fn new(tx_id: TxId, output_index: u16) -> Self {
63
6.57k
        Self {
64
6.57k
            tx_id,
65
6.57k
            output_index,
66
6.57k
        }
67
6.57k
    }
Unexecuted instantiation: _RNvMNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_idNtB2_6UtxoId3newB8_
68
69
0
    pub const fn tx_id(&self) -> &TxId {
70
0
        &self.tx_id
71
0
    }
72
73
250k
    pub const fn output_index(&self) -> u16 {
74
250k
        self.output_index
75
250k
    }
_RNvMNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_idNtB2_6UtxoId12output_indexCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
73
250k
    pub const fn output_index(&self) -> u16 {
74
250k
        self.output_index
75
250k
    }
Unexecuted instantiation: _RNvMNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_idNtB2_6UtxoId12output_indexB8_
76
77
0
    pub fn replace_tx_id(&mut self, tx_id: TxId) {
78
0
        self.tx_id = tx_id;
79
0
    }
80
}
81
82
#[cfg(feature = "random")]
83
impl Distribution<UtxoId> for Standard {
84
6.57k
    fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> UtxoId {
85
6.57k
        let mut tx_id = Bytes32::default();
86
6.57k
        rng.fill_bytes(tx_id.as_mut());
87
6.57k
        UtxoId::new(tx_id, rng.gen())
88
6.57k
    }
_RINvXs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_idNtNtCsaiZOB2jUGOZ_4rand13distributions8StandardINtNtB10_12distribution12DistributionNtB5_6UtxoIdE6sampleNtNtNtB12_4rngs3std6StdRngECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
84
6.57k
    fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> UtxoId {
85
6.57k
        let mut tx_id = Bytes32::default();
86
6.57k
        rng.fill_bytes(tx_id.as_mut());
87
6.57k
        UtxoId::new(tx_id, rng.gen())
88
6.57k
    }
Unexecuted instantiation: _RINvXs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_idNtNtCsaiZOB2jUGOZ_4rand13distributions8StandardINtNtB10_12distribution12DistributionNtB5_6UtxoIdE6sampleNtNtNtB12_4rngs3std6StdRngEBb_
89
}
90
91
impl fmt::LowerHex for UtxoId {
92
0
    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
93
0
        if f.alternate() {
94
0
            write!(f, "{:#x}{:04x}", self.tx_id, self.output_index)
95
        } else {
96
0
            write!(f, "{:x}{:04x}", self.tx_id, self.output_index)
97
        }
98
0
    }
99
}
100
101
impl fmt::UpperHex for UtxoId {
102
0
    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
103
0
        if f.alternate() {
104
0
            write!(f, "{:#X}{:04X}", self.tx_id, self.output_index)
105
        } else {
106
0
            write!(f, "{:X}{:04X}", self.tx_id, self.output_index)
107
        }
108
0
    }
109
}
110
111
impl core::fmt::Display for UtxoId {
112
0
    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
113
0
        if f.alternate() {
114
0
            write!(f, "{:#x}{:04x}", self.tx_id, self.output_index)
115
        } else {
116
0
            write!(f, "{:x}{:04x}", self.tx_id, self.output_index)
117
        }
118
0
    }
119
}
120
121
impl str::FromStr for UtxoId {
122
    type Err = &'static str;
123
124
    /// UtxoId is encoded as hex string with optional 0x prefix, where
125
    /// the last two characters are the output index and the part
126
    /// optionally preceeding it is the transaction id.
127
0
    fn from_str(s: &str) -> Result<Self, Self::Err> {
128
        const ERR: &str = "Invalid encoded byte in UtxoId";
129
0
        let s = s.strip_prefix("0x").unwrap_or(s);
130
0
131
0
        Ok(if s.is_empty() {
132
0
            UtxoId::new(Bytes32::default(), 0)
133
0
        } else if s.len() <= 4 {
134
            UtxoId::new(
135
0
                TxId::default(),
136
0
                u16::from_str_radix(s, 16).map_err(|_| ERR)?,
137
            )
138
        } else {
139
            #[allow(clippy::arithmetic_side_effects)] // Checked above
140
0
            let i = s.len() - 4;
141
0
            if !s.is_char_boundary(i) {
142
0
                return Err(ERR)
143
0
            }
144
0
            let (tx_id, output_index) = s.split_at(i);
145
0
            let tx_id = tx_id.strip_suffix(':').unwrap_or(tx_id);
146
0
147
0
            UtxoId::new(
148
0
                Bytes32::from_str(tx_id)?,
149
0
                u16::from_str_radix(output_index, 16).map_err(|_| ERR)?,
150
            )
151
        })
152
0
    }
153
}
154
155
#[cfg(feature = "typescript")]
156
pub mod typescript {
157
    use super::*;
158
159
    use wasm_bindgen::prelude::*;
160
161
    use alloc::{
162
        format,
163
        string::String,
164
        vec::Vec,
165
    };
166
167
    #[wasm_bindgen]
168
    impl UtxoId {
169
        #[wasm_bindgen(constructor)]
170
        pub fn typescript_new(value: &str) -> Result<UtxoId, js_sys::Error> {
171
            use core::str::FromStr;
172
            UtxoId::from_str(value).map_err(js_sys::Error::new)
173
        }
174
175
        #[wasm_bindgen(js_name = toString)]
176
        pub fn typescript_to_string(&self) -> String {
177
            format!("{:#x}", self)
178
        }
179
180
        #[wasm_bindgen(js_name = to_bytes)]
181
        pub fn typescript_to_bytes(&self) -> Vec<u8> {
182
            use fuel_types::canonical::Serialize;
183
            <Self as Serialize>::to_bytes(self)
184
        }
185
186
        #[wasm_bindgen(js_name = from_bytes)]
187
        pub fn typescript_from_bytes(value: &[u8]) -> Result<UtxoId, js_sys::Error> {
188
            use fuel_types::canonical::Deserialize;
189
190
            <Self as Deserialize>::from_bytes(value)
191
                .map_err(|e| js_sys::Error::new(&format!("{:?}", e)))
192
        }
193
    }
194
}
195
196
#[cfg(test)]
197
mod tests {
198
    use super::*;
199
    use core::str::FromStr;
200
    use fuel_types::Bytes32;
201
202
    #[test]
203
    fn fmt_utxo_id_with_one_bytes_output_index() {
204
        let mut tx_id = Bytes32::zeroed();
205
        *tx_id.get_mut(0).unwrap() = 12;
206
        *tx_id.get_mut(31).unwrap() = 11;
207
208
        let utxo_id = UtxoId {
209
            tx_id,
210
            output_index: 0xab,
211
        };
212
        assert_eq!(
213
            format!("{utxo_id:#x}"),
214
            "0x0c0000000000000000000000000000000000000000000000000000000000000b00ab"
215
        );
216
        assert_eq!(
217
            format!("{utxo_id:x}"),
218
            "0c0000000000000000000000000000000000000000000000000000000000000b00ab"
219
        );
220
    }
221
222
    #[test]
223
    fn fmt_utxo_id_with_two_bytes_output_index() {
224
        let mut tx_id = Bytes32::zeroed();
225
        *tx_id.get_mut(0).unwrap() = 12;
226
        *tx_id.get_mut(31).unwrap() = 11;
227
228
        let utxo_id = UtxoId {
229
            tx_id,
230
            output_index: 0xabcd,
231
        };
232
        assert_eq!(
233
            format!("{utxo_id:#x}"),
234
            "0x0c0000000000000000000000000000000000000000000000000000000000000babcd"
235
        );
236
        assert_eq!(
237
            format!("{utxo_id:x}"),
238
            "0c0000000000000000000000000000000000000000000000000000000000000babcd"
239
        );
240
    }
241
242
    #[test]
243
    fn from_str_utxo_id() -> Result<(), &'static str> {
244
        let utxo_id = UtxoId::from_str(
245
            "0x0c0000000000000000000000000000000000000000000000000000000000000babcd",
246
        )?;
247
248
        assert_eq!(utxo_id.output_index, 0xabcd);
249
        assert_eq!(utxo_id.tx_id[31], 11);
250
        assert_eq!(utxo_id.tx_id[0], 12);
251
        Ok(())
252
    }
253
254
    #[test]
255
    fn from_str_utxo_id_colon_separator() -> Result<(), &'static str> {
256
        let utxo_id = UtxoId::from_str(
257
            "0c0000000000000000000000000000000000000000000000000000000000000b:abcd",
258
        )?;
259
260
        assert_eq!(utxo_id.output_index, 0xabcd);
261
        assert_eq!(utxo_id.tx_id[31], 11);
262
        assert_eq!(utxo_id.tx_id[0], 12);
263
        Ok(())
264
    }
265
266
    /// See https://github.com/FuelLabs/fuel-vm/issues/521
267
    #[test]
268
    fn from_str_utxo_id_multibyte_bug() {
269
        UtxoId::from_str("0x00😎").expect_err("Should fail on incorrect input");
270
        UtxoId::from_str("0x000😎").expect_err("Should fail on incorrect input");
271
    }
272
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/types/witness.rs
Line
Count
Source
1
use derivative::Derivative;
2
use fuel_types::fmt_truncated_hex;
3
4
use alloc::vec::Vec;
5
6
use crate::{
7
    Input,
8
    TxId,
9
    ValidityError,
10
};
11
use fuel_crypto::{
12
    Message,
13
    Signature,
14
};
15
16
#[cfg(feature = "random")]
17
use rand::{
18
    distributions::{
19
        Distribution,
20
        Standard,
21
    },
22
    Rng,
23
};
24
25
#[derive(Derivative, Default, Clone, PartialEq, Eq, Hash)]
26
0
#[derivative(Debug)]
27
0
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
28
0
#[derive(serde::Serialize, serde::Deserialize)]
Unexecuted instantiation: _RNvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witnesss_1__NtB7_7WitnessNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1k_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witnesss_1__NtBa_7WitnessNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1n_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witnesss_1__NtB8_7WitnessNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1l_7Visitor9visit_u64pEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witnesss_1__NtB8_7WitnessNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1l_7Visitor9visit_strpEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witnesss_1__NtB8_7WitnessNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1l_7Visitor11visit_bytespEBe_
Unexecuted instantiation: _RINvXs_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witnesss_1__NtBa_7WitnessNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1l_11deserializepEBg_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witnesss_1__NtBb_7WitnessNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1o_7Visitor9visit_seqpEBh_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witnesss_1__NtBb_7WitnessNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1o_7Visitor9visit_mappEBh_
29
0
#[cfg_attr(
30
0
    feature = "da-compression",
31
0
    derive(fuel_compression::Compress, fuel_compression::Decompress)
32
0
)]
33
13.1k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witnesss0_1__NtB5_7WitnessNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
33
6.57k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witnesss0_1__NtB5_7WitnessNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
33
6.57k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witnesss0_1__NtB5_7WitnessNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witnesss0_1__NtB5_7WitnessNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBb_
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witnesss1_1__NtB5_7WitnessNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
33
6.57k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witnesss1_1__NtB5_7WitnessNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
33
6.57k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witnesss1_1__NtB4_7WitnessNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_static
Line
Count
Source
33
210k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witnesss1_1__NtB4_7WitnessNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamic
Line
Count
Source
33
210k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witnesss1_1__NtB5_7WitnessNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witnesss1_1__NtB5_7WitnessNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
34
0
pub struct Witness {
35
0
    #[derivative(Debug(format_with = "fmt_truncated_hex::<16>"))]
36
    data: Vec<u8>,
37
0
}
38
39
impl Witness {
40
0
    pub const fn as_vec(&self) -> &Vec<u8> {
41
0
        &self.data
42
0
    }
Unexecuted instantiation: _RNvMNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witnessNtB2_7Witness6as_vecCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witnessNtB2_7Witness6as_vecB8_
43
44
0
    pub fn as_vec_mut(&mut self) -> &mut Vec<u8> {
45
0
        &mut self.data
46
0
    }
47
48
0
    pub fn into_inner(self) -> Vec<u8> {
49
0
        self.data
50
0
    }
51
52
    /// ECRecover an address from a witness
53
4.38k
    pub fn recover_witness(
54
4.38k
        &self,
55
4.38k
        txhash: &TxId,
56
4.38k
        input_index: usize,
57
4.38k
    ) -> Result<fuel_types::Address, ValidityError> {
58
4.38k
        let bytes = <[u8; Signature::LEN]>::try_from(self.as_ref())
59
4.38k
            .map_err(|_| ValidityError::InputInvalidSignature { index: input_index })?;
60
4.38k
        let signature = Signature::from_bytes(bytes);
61
4.38k
62
4.38k
        let message = Message::from_bytes_ref(txhash);
63
4.38k
64
4.38k
        signature
65
4.38k
            .recover(message)
66
4.38k
            .map_err(|_| ValidityError::InputInvalidSignature { index: input_index })
67
4.38k
            .map(|pk| Input::owner(&pk))
68
4.38k
    }
69
}
70
71
impl From<Vec<u8>> for Witness {
72
6.57k
    fn from(data: Vec<u8>) -> Self {
73
6.57k
        Self { data }
74
6.57k
    }
_RNvXs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witnessNtB4_7WitnessINtNtCsd3UI3IJrzMw_4core7convert4FromINtNtCs5vansr6XbJU_5alloc3vec3VechEE4fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
72
2.19k
    fn from(data: Vec<u8>) -> Self {
73
2.19k
        Self { data }
74
2.19k
    }
_RNvXs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witnessNtB4_7WitnessINtNtCsd3UI3IJrzMw_4core7convert4FromINtNtCs5vansr6XbJU_5alloc3vec3VechEE4fromBa_
Line
Count
Source
72
4.38k
    fn from(data: Vec<u8>) -> Self {
73
4.38k
        Self { data }
74
4.38k
    }
75
}
76
77
impl From<&[u8]> for Witness {
78
4.38k
    fn from(data: &[u8]) -> Self {
79
4.38k
        data.to_vec().into()
80
4.38k
    }
81
}
82
83
impl AsRef<[u8]> for Witness {
84
122k
    fn as_ref(&self) -> &[u8] {
85
122k
        self.data.as_ref()
86
122k
    }
87
}
88
89
impl AsMut<[u8]> for Witness {
90
0
    fn as_mut(&mut self) -> &mut [u8] {
91
0
        self.data.as_mut()
92
0
    }
93
}
94
95
impl Extend<u8> for Witness {
96
0
    fn extend<T: IntoIterator<Item = u8>>(&mut self, iter: T) {
97
0
        self.data.extend(iter);
98
0
    }
99
}
100
101
#[cfg(feature = "random")]
102
impl Distribution<Witness> for Standard {
103
0
    fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Witness {
104
0
        let len = rng.gen_range(0..512);
105
0
106
0
        let mut data = alloc::vec![0u8; len];
107
0
        rng.fill_bytes(data.as_mut_slice());
108
0
109
0
        data.into()
110
0
    }
111
}
112
113
#[cfg(feature = "typescript")]
114
pub mod typescript {
115
    use wasm_bindgen::prelude::*;
116
117
    use super::Witness;
118
119
    use alloc::{
120
        format,
121
        string::String,
122
        vec::Vec,
123
    };
124
125
    #[wasm_bindgen]
126
    impl Witness {
127
        #[wasm_bindgen(js_name = toJSON)]
128
        pub fn to_json(&self) -> String {
129
            serde_json::to_string(&self.data).expect("unable to json format")
130
        }
131
132
        #[wasm_bindgen(js_name = toString)]
133
        pub fn typescript_to_string(&self) -> String {
134
            format!("{:?}", self.data)
135
        }
136
137
        #[wasm_bindgen(js_name = to_bytes)]
138
        pub fn typescript_to_bytes(&self) -> Vec<u8> {
139
            use fuel_types::canonical::Serialize;
140
            self.to_bytes()
141
        }
142
143
        #[wasm_bindgen(js_name = from_bytes)]
144
        pub fn typescript_from_bytes(value: &[u8]) -> Result<Witness, js_sys::Error> {
145
            use alloc::string::ToString;
146
            use fuel_types::canonical::Deserialize;
147
            <Self as Deserialize>::from_bytes(value)
148
                .map_err(|e| js_sys::Error::new(&e.to_string()))
149
        }
150
    }
151
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/types/output/repr.rs
Line
Count
Source
1
use super::{
2
    consts::*,
3
    Output,
4
};
5
6
#[cfg(feature = "std")]
7
use fuel_types::Word;
8
9
#[cfg(feature = "std")]
10
use std::io;
11
12
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
13
pub enum OutputRepr {
14
    Coin = 0x00,
15
    Contract = 0x01,
16
    Change = 0x02,
17
    Variable = 0x03,
18
    ContractCreated = 0x04,
19
}
20
21
impl OutputRepr {
22
450k
    pub const fn to_offset(&self) -> Option<usize> {
23
450k
        match self {
24
            OutputRepr::Coin | OutputRepr::Change | OutputRepr::Variable => {
25
450k
                Some(OUTPUT_CCV_TO_OFFSET)
26
            }
27
0
            _ => None,
28
        }
29
450k
    }
_RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output4reprNtB2_10OutputRepr9to_offsetCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
22
450k
    pub const fn to_offset(&self) -> Option<usize> {
23
450k
        match self {
24
            OutputRepr::Coin | OutputRepr::Change | OutputRepr::Variable => {
25
450k
                Some(OUTPUT_CCV_TO_OFFSET)
26
            }
27
0
            _ => None,
28
        }
29
450k
    }
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output4reprNtB2_10OutputRepr9to_offsetBa_
30
31
283k
    pub const fn asset_id_offset(&self) -> Option<usize> {
32
283k
        match self {
33
            OutputRepr::Coin | OutputRepr::Change | OutputRepr::Variable => {
34
283k
                Some(OUTPUT_CCV_ASSET_ID_OFFSET)
35
            }
36
0
            _ => None,
37
        }
38
283k
    }
_RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output4reprNtB2_10OutputRepr15asset_id_offsetCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
31
283k
    pub const fn asset_id_offset(&self) -> Option<usize> {
32
283k
        match self {
33
            OutputRepr::Coin | OutputRepr::Change | OutputRepr::Variable => {
34
283k
                Some(OUTPUT_CCV_ASSET_ID_OFFSET)
35
            }
36
0
            _ => None,
37
        }
38
283k
    }
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output4reprNtB2_10OutputRepr15asset_id_offsetBa_
39
40
0
    pub const fn contract_balance_root_offset(&self) -> Option<usize> {
41
0
        match self {
42
0
            Self::Contract => Some(OUTPUT_CONTRACT_BALANCE_ROOT_OFFSET),
43
0
            _ => None,
44
        }
45
0
    }
46
47
0
    pub const fn contract_state_root_offset(&self) -> Option<usize> {
48
0
        match self {
49
0
            Self::Contract => Some(OUTPUT_CONTRACT_STATE_ROOT_OFFSET),
50
0
            _ => None,
51
        }
52
0
    }
53
54
0
    pub const fn contract_created_state_root_offset(&self) -> Option<usize> {
55
0
        match self {
56
0
            Self::ContractCreated => Some(OUTPUT_CONTRACT_CREATED_STATE_ROOT_OFFSET),
57
0
            _ => None,
58
        }
59
0
    }
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output4reprNtB2_10OutputRepr34contract_created_state_root_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output4reprNtB2_10OutputRepr34contract_created_state_root_offsetBa_
60
61
0
    pub const fn contract_id_offset(&self) -> Option<usize> {
62
0
        match self {
63
0
            Self::ContractCreated => Some(OUTPUT_CONTRACT_CREATED_ID_OFFSET),
64
0
            _ => None,
65
        }
66
0
    }
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output4reprNtB2_10OutputRepr18contract_id_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output4reprNtB2_10OutputRepr18contract_id_offsetBa_
67
68
900k
    pub const fn from_output(output: &Output) -> Self {
69
900k
        match output {
70
0
            Output::Coin { .. } => Self::Coin,
71
166k
            Output::Contract(_) => Self::Contract,
72
733k
            Output::Change { .. } => Self::Change,
73
0
            Output::Variable { .. } => Self::Variable,
74
0
            Output::ContractCreated { .. } => Self::ContractCreated,
75
        }
76
900k
    }
_RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output4reprNtB2_10OutputRepr11from_outputCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
68
900k
    pub const fn from_output(output: &Output) -> Self {
69
900k
        match output {
70
0
            Output::Coin { .. } => Self::Coin,
71
166k
            Output::Contract(_) => Self::Contract,
72
733k
            Output::Change { .. } => Self::Change,
73
0
            Output::Variable { .. } => Self::Variable,
74
0
            Output::ContractCreated { .. } => Self::ContractCreated,
75
        }
76
900k
    }
Unexecuted instantiation: _RNvMNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output4reprNtB2_10OutputRepr11from_outputBa_
77
}
78
79
#[cfg(feature = "std")]
80
impl TryFrom<Word> for OutputRepr {
81
    type Error = io::Error;
82
83
0
    fn try_from(b: Word) -> Result<Self, Self::Error> {
84
0
        match b {
85
0
            0x00 => Ok(Self::Coin),
86
0
            0x01 => Ok(Self::Contract),
87
0
            0x02 => Ok(Self::Change),
88
0
            0x03 => Ok(Self::Variable),
89
0
            0x04 => Ok(Self::ContractCreated),
90
0
            i => Err(io::Error::new(
91
0
                io::ErrorKind::InvalidData,
92
0
                format!("The provided output identifier ({i}) is invalid!"),
93
0
            )),
94
        }
95
0
    }
96
}
97
98
impl From<&Output> for OutputRepr {
99
166k
    fn from(o: &Output) -> Self {
100
166k
        Self::from_output(o)
101
166k
    }
_RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output4reprNtB5_10OutputReprINtNtCsd3UI3IJrzMw_4core7convert4FromRNtB7_6OutputE4fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
99
166k
    fn from(o: &Output) -> Self {
100
166k
        Self::from_output(o)
101
166k
    }
Unexecuted instantiation: _RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output4reprNtB5_10OutputReprINtNtCsd3UI3IJrzMw_4core7convert4FromRNtB7_6OutputE4fromBd_
102
}
103
104
impl From<&mut Output> for OutputRepr {
105
0
    fn from(o: &mut Output) -> Self {
106
0
        Self::from_output(o)
107
0
    }
108
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/types/output/contract.rs
Line
Count
Source
1
use fuel_types::Bytes32;
2
3
/// It is a full representation of the contract output from the specification:
4
/// <https://github.com/FuelLabs/fuel-specs/blob/master/src/tx-format/output.md#outputcontract>.
5
///
6
/// The specification defines the layout of the [`Contract`] in the serialized form for
7
/// the `fuel-vm`.
8
#[derive(
9
0
    Default, Debug, Copy, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output8contracts_1__NtB7_8ContractNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1v_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output8contracts_1__NtBa_8ContractNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1y_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output8contracts_1__NtB8_8ContractNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1w_7Visitor9visit_u64pEBg_
Unexecuted instantiation: _RINvXNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output8contracts_1__NtB8_8ContractNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1w_7Visitor9visit_strpEBg_
Unexecuted instantiation: _RINvXNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output8contracts_1__NtB8_8ContractNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1w_7Visitor11visit_bytespEBg_
Unexecuted instantiation: _RINvXs_NvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output8contracts_1__NtBa_8ContractNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1w_11deserializepEBi_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output8contracts_1__NtBb_8ContractNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1z_7Visitor9visit_seqpEBj_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output8contracts_1__NtBb_8ContractNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1z_7Visitor9visit_mappEBj_
10
)]
11
#[cfg_attr(
12
    feature = "da-compression",
13
    derive(fuel_compression::Compress, fuel_compression::Decompress)
14
)]
15
21.9k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output8contracts0_1__NtB5_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
15
2.19k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output8contracts0_1__NtB5_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
15
2.19k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output8contracts0_1__NtB5_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEBd_
Unexecuted instantiation: _RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output8contracts0_1__NtB5_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBd_
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output8contracts1_1__NtB5_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
15
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output8contracts1_1__NtB5_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticQShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
15
2.19k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output8contracts1_1__NtB5_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
15
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output8contracts1_1__NtB5_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicQShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
15
2.19k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output8contracts1_1__NtB4_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_static
Line
Count
Source
15
74.5k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RNvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output8contracts1_1__NtB4_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamic
Line
Count
Source
15
74.5k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output8contracts1_1__NtB5_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBd_
Line
Count
Source
15
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output8contracts1_1__NtB5_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBd_
Line
Count
Source
15
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
16
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen(js_name = OutputContract))]
17
pub struct Contract {
18
    /// Index of input contract.
19
    pub input_index: u16,
20
    /// Root of amount of coins owned by contract after transaction execution.
21
    #[cfg_attr(feature = "da-compression", compress(skip))]
22
    pub balance_root: Bytes32,
23
    /// State root of contract after transaction execution.
24
    #[cfg_attr(feature = "da-compression", compress(skip))]
25
    pub state_root: Bytes32,
26
}
27
28
impl Contract {
29
    /// The "Note" section from the specification:
30
    /// <https://github.com/FuelLabs/fuel-specs/blob/master/src/tx-format/output.md#outputcontract>.
31
8.77k
    pub fn prepare_sign(&mut self) {
32
8.77k
        self.balance_root = Default::default();
33
8.77k
        self.state_root = Default::default();
34
8.77k
    }
35
}
36
37
#[cfg(feature = "random")]
38
use rand::{
39
    distributions::{
40
        Distribution,
41
        Standard,
42
    },
43
    Rng,
44
};
45
46
#[cfg(feature = "random")]
47
impl Distribution<Contract> for Standard {
48
0
    fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Contract {
49
0
        Contract {
50
0
            input_index: rng.gen(),
51
0
            balance_root: rng.gen(),
52
0
            state_root: rng.gen(),
53
0
        }
54
0
    }
55
}
56
57
#[cfg(feature = "typescript")]
58
pub mod typescript {
59
    use wasm_bindgen::prelude::*;
60
61
    use super::*;
62
63
    use fuel_types::Bytes32;
64
65
    #[wasm_bindgen(js_class = OutputContract)]
66
    impl Contract {
67
        #[wasm_bindgen(constructor)]
68
        pub fn typescript_new(
69
            input_index: u16,
70
            balance_root: Bytes32,
71
            state_root: Bytes32,
72
        ) -> Self {
73
            Self {
74
                input_index,
75
                balance_root,
76
                state_root,
77
            }
78
        }
79
    }
80
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/types/blob.rs
Line
Count
Source
1
use crate::{
2
    transaction::{
3
        fee::min_gas,
4
        id::PrepareSign,
5
        metadata::CommonMetadata,
6
        types::chargeable_transaction::{
7
            ChargeableMetadata,
8
            ChargeableTransaction,
9
            UniqueFormatValidityChecks,
10
        },
11
        Chargeable,
12
    },
13
    ConsensusParameters,
14
    FeeParameters,
15
    GasCosts,
16
    Input,
17
    Output,
18
    TransactionRepr,
19
    ValidityError,
20
};
21
use derivative::Derivative;
22
use fuel_types::{
23
    bytes::WORD_SIZE,
24
    canonical::Serialize,
25
    BlobId,
26
    ChainId,
27
    Word,
28
};
29
30
/// Adds method to `BlobId` to compute the it from blob data.
31
pub trait BlobIdExt {
32
    /// Computes the `BlobId` from by hashing the given data.
33
    fn compute(data: &[u8]) -> BlobId;
34
}
35
36
impl BlobIdExt for BlobId {
37
0
    fn compute(data: &[u8]) -> Self {
38
0
        Self::new(*fuel_crypto::Hasher::hash(data))
39
0
    }
40
}
41
42
pub type Blob = ChargeableTransaction<BlobBody, BlobMetadata>;
43
44
#[derive(Default, Debug, Clone, PartialEq, Eq, Hash)]
45
pub struct BlobMetadata;
46
47
0
/// The body of the [`Blob`] transaction.
48
0
#[derive(Clone, Default, Derivative, serde::Serialize, serde::Deserialize)]
Unexecuted instantiation: _RNvXsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blobNtB5_8BlobBodyNtNtCsd3UI3IJrzMw_4core3cmp9PartialEq2eq
Unexecuted instantiation: _RINvXse_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blobNtB6_8BlobBodyNtNtCsd3UI3IJrzMw_4core4hash4Hash4hashpEBc_
Unexecuted instantiation: _RNvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blobs_1__NtB7_8BlobBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1i_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blobs_1__NtBa_8BlobBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1l_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blobs_1__NtB8_8BlobBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1j_7Visitor9visit_u64pEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blobs_1__NtB8_8BlobBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1j_7Visitor9visit_strpEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blobs_1__NtB8_8BlobBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1j_7Visitor11visit_bytespEBe_
Unexecuted instantiation: _RINvXs_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blobs_1__NtBa_8BlobBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1j_11deserializepEBg_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blobs_1__NtBb_8BlobBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1m_7Visitor9visit_seqpEBh_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blobs_1__NtBb_8BlobBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1m_7Visitor9visit_mappEBh_
49
0
#[cfg_attr(
50
0
    feature = "da-compression",
51
0
    derive(fuel_compression::Compress, fuel_compression::Decompress)
52
0
)]
53
0
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blobs0_1__NtB5_8BlobBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blobs0_1__NtB5_8BlobBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blobs0_1__NtB5_8BlobBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blobs0_1__NtB5_8BlobBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blobs1_1__NtB5_8BlobBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blobs1_1__NtB5_8BlobBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blobs1_1__NtB4_8BlobBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_static
Unexecuted instantiation: _RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blobs1_1__NtB4_8BlobBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamic
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blobs1_1__NtB5_8BlobBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blobs1_1__NtB5_8BlobBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
54
0
#[canonical(prefix = TransactionRepr::Blob)]
55
0
#[derivative(Eq, PartialEq, Hash, Debug)]
56
0
pub struct BlobBody {
57
0
    /// Hash of the bytecode. Used both as a unique identifier and to verify the
58
0
    /// bytecode.
59
0
    pub id: BlobId,
60
0
    /// The witness index of the payload.
61
0
    pub witness_index: u16,
62
0
}
63
64
impl PrepareSign for BlobBody {
65
0
    fn prepare_sign(&mut self) {}
Unexecuted instantiation: _RNvXs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blobNtB4_8BlobBodyNtNtB8_2id11PrepareSign12prepare_signCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blobNtB4_8BlobBodyNtNtB8_2id11PrepareSign12prepare_signBa_
66
}
67
68
impl Chargeable for Blob {
69
0
    fn min_gas(&self, gas_costs: &GasCosts, fee: &FeeParameters) -> fuel_asm::Word {
70
0
        min_gas(self, gas_costs, fee)
71
0
    }
72
73
    #[inline(always)]
74
0
    fn metered_bytes_size(&self) -> usize {
75
0
        Serialize::size(self)
76
0
    }
77
78
    #[inline(always)]
79
0
    fn gas_used_by_metadata(&self, gas_cost: &GasCosts) -> Word {
80
0
        let bytes = Serialize::size(self);
81
0
        let blob_len = self
82
0
            .witnesses
83
0
            .get(self.body.witness_index as usize)
84
0
            .map(|c| c.as_ref().len())
85
0
            .unwrap_or(0);
86
0
87
0
        // Gas required to calculate the `tx_id` and `blob_id`.
88
0
        gas_cost
89
0
            .s256()
90
0
            .resolve(bytes as u64)
91
0
            .saturating_add(gas_cost.s256().resolve(blob_len as u64))
92
0
    }
93
}
94
95
impl UniqueFormatValidityChecks for Blob {
96
0
    fn check_unique_rules(
97
0
        &self,
98
0
        consensus_params: &ConsensusParameters,
99
0
    ) -> Result<(), ValidityError> {
100
0
        let index = self.body.witness_index as usize;
101
0
        let witness = self
102
0
            .witnesses
103
0
            .get(index)
104
0
            .ok_or(ValidityError::InputWitnessIndexBounds { index })?;
105
106
        // Verify that blob id is correct
107
0
        if BlobId::compute(witness.as_ref()) != self.body.id {
108
0
            return Err(ValidityError::TransactionBlobIdVerificationFailed);
109
0
        }
110
0
111
0
        self.inputs
112
0
            .iter()
113
0
            .enumerate()
114
0
            .try_for_each(|(index, input)| {
115
0
                if let Some(asset_id) = input.asset_id(consensus_params.base_asset_id()) {
116
0
                    if asset_id != consensus_params.base_asset_id() {
117
0
                        return Err(
118
0
                            ValidityError::TransactionInputContainsNonBaseAssetId {
119
0
                                index,
120
0
                            },
121
0
                        );
122
0
                    }
123
0
                }
124
125
0
                match input {
126
                    Input::Contract(_) => {
127
0
                        Err(ValidityError::TransactionInputContainsContract { index })
128
                    }
129
                    Input::MessageDataSigned(_) | Input::MessageDataPredicate(_) => {
130
0
                        Err(ValidityError::TransactionInputContainsMessageData { index })
131
                    }
132
0
                    _ => Ok(()),
133
                }
134
0
            })?;
135
136
0
        self.outputs
137
0
            .iter()
138
0
            .enumerate()
139
0
            .try_for_each(|(index, output)| match output {
140
                Output::Contract(_) => {
141
0
                    Err(ValidityError::TransactionOutputContainsContract { index })
142
                }
143
144
                Output::Variable { .. } => {
145
0
                    Err(ValidityError::TransactionOutputContainsVariable { index })
146
                }
147
148
0
                Output::Change { asset_id, .. } => {
149
0
                    if asset_id != consensus_params.base_asset_id() {
150
0
                        Err(ValidityError::TransactionChangeChangeUsesNotBaseAsset {
151
0
                            index,
152
0
                        })
153
                    } else {
154
0
                        Ok(())
155
                    }
156
                }
157
158
                Output::ContractCreated { .. } => {
159
0
                    Err(ValidityError::TransactionOutputContainsContractCreated { index })
160
                }
161
162
0
                Output::Coin { .. } => Ok(()),
163
0
            })?;
164
165
0
        Ok(())
166
0
    }
167
}
168
169
impl crate::Cacheable for Blob {
170
0
    fn is_computed(&self) -> bool {
171
0
        self.metadata.is_some()
172
0
    }
173
174
0
    fn precompute(&mut self, chain_id: &ChainId) -> Result<(), ValidityError> {
175
0
        self.metadata = None;
176
0
        self.metadata = Some(ChargeableMetadata {
177
0
            common: CommonMetadata::compute(self, chain_id)?,
178
0
            body: BlobMetadata {},
179
0
        });
180
0
        Ok(())
181
0
    }
182
}
183
184
mod field {
185
    use super::*;
186
    use crate::field::{
187
        self,
188
        BlobId as BlobIdField,
189
        BytecodeWitnessIndex,
190
    };
191
192
    impl field::BlobId for Blob {
193
        #[inline(always)]
194
0
        fn blob_id(&self) -> &BlobId {
195
0
            &self.body.id
196
0
        }
197
198
        #[inline(always)]
199
        fn blob_id_mut(&mut self) -> &mut BlobId {
200
            &mut self.body.id
201
        }
202
203
        #[inline(always)]
204
0
        fn blob_id_offset_static() -> usize {
205
0
            WORD_SIZE // `Transaction` enum discriminant
206
0
        }
207
    }
208
209
    impl field::BytecodeWitnessIndex for Blob {
210
        #[inline(always)]
211
0
        fn bytecode_witness_index(&self) -> &u16 {
212
0
            &self.body.witness_index
213
0
        }
214
215
        #[inline(always)]
216
        fn bytecode_witness_index_mut(&mut self) -> &mut u16 {
217
            &mut self.body.witness_index
218
        }
219
220
        #[inline(always)]
221
0
        fn bytecode_witness_index_offset_static() -> usize {
222
0
            Self::blob_id_offset_static().saturating_add(BlobId::LEN)
223
0
        }
224
    }
225
226
    impl field::ChargeableBody<BlobBody> for Blob {
227
0
        fn body(&self) -> &BlobBody {
228
0
            &self.body
229
0
        }
230
231
0
        fn body_mut(&mut self) -> &mut BlobBody {
232
0
            &mut self.body
233
0
        }
234
235
        #[allow(clippy::arithmetic_side_effects)] // Statically known to be ok
236
0
        fn body_offset_end(&self) -> usize {
237
0
            Self::bytecode_witness_index_offset_static().saturating_add(
238
0
                WORD_SIZE // witness_index
239
0
                + WORD_SIZE // Policies size
240
0
                + WORD_SIZE // Inputs size
241
0
                + WORD_SIZE // Outputs size
242
0
                + WORD_SIZE, // Witnesses size
243
0
            )
244
0
        }
245
    }
246
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/types/upgrade.rs
Line
Count
Source
1
use crate::{
2
    transaction::{
3
        id::PrepareSign,
4
        metadata::CommonMetadata,
5
        types::chargeable_transaction::{
6
            ChargeableMetadata,
7
            ChargeableTransaction,
8
            UniqueFormatValidityChecks,
9
        },
10
        Chargeable,
11
    },
12
    ConsensusParameters,
13
    GasCosts,
14
    Input,
15
    Output,
16
    TransactionRepr,
17
    ValidityError,
18
};
19
use derivative::Derivative;
20
use fuel_types::{
21
    bytes::WORD_SIZE,
22
    canonical::Serialize,
23
    Bytes32,
24
    ChainId,
25
    Word,
26
};
27
28
use fuel_crypto::Hasher;
29
30
#[cfg(feature = "alloc")]
31
use alloc::boxed::Box;
32
33
pub type Upgrade = ChargeableTransaction<UpgradeBody, UpgradeMetadata>;
34
35
#[derive(Default, Debug, Clone, PartialEq, Eq, Hash)]
36
pub enum UpgradeMetadata {
37
    /// The metadata for the upgrade transaction that changes the consensus parameters.
38
    ConsensusParameters {
39
        /// Deserialized consensus parameters from the witness.
40
        consensus_parameters: Box<ConsensusParameters>,
41
        /// The actual checksum of the serialized consensus parameters.
42
        calculated_checksum: Bytes32,
43
    },
44
    /// Currently there is no metadata for state transition upgrades, so leave it empty.
45
    #[default]
46
    StateTransition,
47
}
48
49
impl UpgradeMetadata {
50
0
    pub fn compute(tx: &Upgrade) -> Result<Self, ValidityError> {
51
0
        match &tx.body.purpose {
52
            UpgradePurpose::ConsensusParameters {
53
0
                witness_index,
54
0
                checksum,
55
0
            } => {
56
0
                let index = *witness_index as usize;
57
0
                let witness = tx
58
0
                    .witnesses
59
0
                    .get(index)
60
0
                    .ok_or(ValidityError::InputWitnessIndexBounds { index })?;
61
62
0
                let serialized_consensus_parameters = witness.as_vec();
63
0
                let actual_checksum = Hasher::hash(serialized_consensus_parameters);
64
0
65
0
                if &actual_checksum != checksum {
66
0
                    Err(ValidityError::TransactionUpgradeConsensusParametersChecksumMismatch)?;
67
0
                }
68
69
                // The code that creates/verifies the `Upgrade` transaction should always
70
                // be able to decode the current consensus parameters
71
                // type. The state transition function should always know
72
                // how to decode consensus parameters. Otherwise, the next
73
                // block will be impossible to produce. If deserialization fails, it is a
74
                // sign that the code/state transition function should be updated.
75
0
                let consensus_parameters = postcard::from_bytes::<ConsensusParameters>(
76
0
                    serialized_consensus_parameters,
77
0
                )
78
0
                .map_err(|_| {
79
0
                    ValidityError::TransactionUpgradeConsensusParametersDeserialization
80
0
                })?;
81
82
0
                Ok(Self::ConsensusParameters {
83
0
                    consensus_parameters: Box::new(consensus_parameters),
84
0
                    calculated_checksum: actual_checksum,
85
0
                })
86
            }
87
            UpgradePurpose::StateTransition { .. } => {
88
                // Nothing metadata for state transition upgrades.
89
0
                Ok(Self::StateTransition)
90
            }
91
        }
92
0
    }
93
}
94
95
0
/// The types describe the purpose of the upgrade performed by the [`Upgrade`]
96
/// transaction.
97
#[derive(
98
0
    Copy, Clone, Derivative, strum_macros::EnumCount, serde::Serialize, serde::Deserialize,
Unexecuted instantiation: _RNvXsg_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgradeNtB5_14UpgradePurposeNtNtCsd3UI3IJrzMw_4core3cmp9PartialEq2eq
Unexecuted instantiation: _RINvXsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgradeNtB6_14UpgradePurposeNtNtCsd3UI3IJrzMw_4core4hash4Hash4hashpEBc_
Unexecuted instantiation: _RNvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades_1__NtB7_14UpgradePurposeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1s_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades_1__NtBa_14UpgradePurposeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1v_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades_1__NtBd_14UpgradePurposeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB8_9___VisitorNtB1y_7Visitor10visit_enumNtB2_14___FieldVisitorB2D_9expecting
Unexecuted instantiation: _RNvXs0_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades_1__NtBg_14UpgradePurposeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_9___VisitorB2G_9expecting
Unexecuted instantiation: _RNvXs1_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades_1__NtBg_14UpgradePurposeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_s_14___FieldVisitorB2G_9expecting
Unexecuted instantiation: _RNvXs3_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades_1__NtBg_14UpgradePurposeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_s_9___VisitorB2G_9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades_1__NtB8_14UpgradePurposeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1t_7Visitor9visit_u64pEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades_1__NtB8_14UpgradePurposeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1t_7Visitor9visit_strpEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades_1__NtB8_14UpgradePurposeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1t_7Visitor11visit_bytespEBe_
Unexecuted instantiation: _RINvXs_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades_1__NtBa_14UpgradePurposeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1t_11deserializepEBg_
Unexecuted instantiation: _RINvXNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades_1__NtBe_14UpgradePurposeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB9_9___VisitorNtB1z_7Visitor10visit_enumNtB3_14___FieldVisitorB2E_9visit_u64pEBk_
Unexecuted instantiation: _RINvXNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades_1__NtBe_14UpgradePurposeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB9_9___VisitorNtB1z_7Visitor10visit_enumNtB3_14___FieldVisitorB2E_9visit_strpEBk_
Unexecuted instantiation: _RINvXNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades_1__NtBe_14UpgradePurposeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB9_9___VisitorNtB1z_7Visitor10visit_enumNtB3_14___FieldVisitorB2E_11visit_bytespEBk_
Unexecuted instantiation: _RINvXs_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades_1__NtBg_14UpgradePurposeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1B_7Visitor10visit_enumNtB5_7___FieldB1z_11deserializepEBm_
Unexecuted instantiation: _RINvXs0_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades_1__NtBh_14UpgradePurposeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_9___VisitorB2H_9visit_seqpEBn_
Unexecuted instantiation: _RINvXs0_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades_1__NtBh_14UpgradePurposeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_9___VisitorB2H_9visit_mappEBn_
Unexecuted instantiation: _RINvXs1_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades_1__NtBh_14UpgradePurposeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s_14___FieldVisitorB2H_9visit_u64pEBn_
Unexecuted instantiation: _RINvXs1_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades_1__NtBh_14UpgradePurposeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s_14___FieldVisitorB2H_9visit_strpEBn_
Unexecuted instantiation: _RINvXs1_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades_1__NtBh_14UpgradePurposeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s_14___FieldVisitorB2H_11visit_bytespEBn_
Unexecuted instantiation: _RINvXs2_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades_1__NtBh_14UpgradePurposeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s_7___FieldB1A_11deserializepEBn_
Unexecuted instantiation: _RINvXs3_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades_1__NtBh_14UpgradePurposeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s_9___VisitorB2H_9visit_seqpEBn_
Unexecuted instantiation: _RINvXs3_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades_1__NtBh_14UpgradePurposeNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1C_7Visitor10visit_enumNtB6_s_9___VisitorB2H_9visit_mappEBn_
99
0
)]
100
0
#[cfg_attr(
101
0
    feature = "da-compression",
102
0
    derive(fuel_compression::Compress, fuel_compression::Decompress)
103
0
)]
104
0
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades0_1__NtB5_14UpgradePurposeNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades0_1__NtB5_14UpgradePurposeNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades0_1__NtB5_14UpgradePurposeNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades0_1__NtB5_14UpgradePurposeNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades1_1__NtB5_14UpgradePurposeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades1_1__NtB5_14UpgradePurposeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades1_1__NtB4_14UpgradePurposeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_static
Unexecuted instantiation: _RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades1_1__NtB4_14UpgradePurposeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamic
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades1_1__NtB5_14UpgradePurposeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades1_1__NtB5_14UpgradePurposeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
105
0
#[derivative(Eq, PartialEq, Hash, Debug)]
106
0
pub enum UpgradePurpose {
107
0
    /// The upgrade is performed to change the consensus parameters.
108
0
    ConsensusParameters {
109
        /// The index of the witness in the [`Witnesses`] field that contains
110
        /// the serialized consensus parameters.
111
        witness_index: u16,
112
        /// The hash of the serialized consensus parameters.
113
        /// Since the serialized consensus parameters live inside witnesses(malleable
114
        /// data), any party can override them. The `checksum` is used to verify that the
115
        /// data was not modified.
116
        checksum: Bytes32,
117
    },
118
    /// The upgrade is performed to change the state transition function.
119
0
    StateTransition {
120
        /// The Merkle root of the new bytecode of the state transition function.
121
        /// The bytecode must be present on the blockchain(should be known by the
122
        /// network) at the moment of inclusion of this transaction.
123
        root: Bytes32,
124
    },
125
0
}
126
127
0
/// The body of the [`Upgrade`] transaction.
128
0
#[derive(Clone, Derivative, serde::Serialize, serde::Deserialize)]
Unexecuted instantiation: _RNvXsm_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgradeNtB5_11UpgradeBodyNtNtCsd3UI3IJrzMw_4core3cmp9PartialEq2eq
Unexecuted instantiation: _RINvXsl_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgradeNtB6_11UpgradeBodyNtNtCsd3UI3IJrzMw_4core4hash4Hash4hashpEBc_
Unexecuted instantiation: _RNvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades3_1__NtB7_11UpgradeBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1q_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades3_1__NtBa_11UpgradeBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1t_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades3_1__NtB8_11UpgradeBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1r_7Visitor9visit_u64pEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades3_1__NtB8_11UpgradeBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1r_7Visitor9visit_strpEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades3_1__NtB8_11UpgradeBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1r_7Visitor11visit_bytespEBe_
Unexecuted instantiation: _RINvXs_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades3_1__NtBa_11UpgradeBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1r_11deserializepEBg_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades3_1__NtBb_11UpgradeBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1u_7Visitor9visit_seqpEBh_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades3_1__NtBb_11UpgradeBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1u_7Visitor9visit_mappEBh_
129
0
#[cfg_attr(
130
0
    feature = "da-compression",
131
0
    derive(fuel_compression::Compress, fuel_compression::Decompress)
132
0
)]
133
0
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades4_1__NtB5_11UpgradeBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades4_1__NtB5_11UpgradeBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades4_1__NtB5_11UpgradeBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades4_1__NtB5_11UpgradeBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades5_1__NtB5_11UpgradeBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades5_1__NtB5_11UpgradeBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades5_1__NtB4_11UpgradeBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_static
Unexecuted instantiation: _RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades5_1__NtB4_11UpgradeBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamic
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades5_1__NtB5_11UpgradeBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrades5_1__NtB5_11UpgradeBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
134
0
#[canonical(prefix = TransactionRepr::Upgrade)]
135
0
#[derivative(Eq, PartialEq, Hash, Debug)]
136
0
pub struct UpgradeBody {
137
0
    /// The purpose of the upgrade.
138
0
    pub(crate) purpose: UpgradePurpose,
139
0
}
140
141
impl Default for UpgradeBody {
142
0
    fn default() -> Self {
143
0
        Self {
144
0
            purpose: UpgradePurpose::StateTransition {
145
0
                root: Default::default(),
146
0
            },
147
0
        }
148
0
    }
149
}
150
151
impl PrepareSign for UpgradeBody {
152
0
    fn prepare_sign(&mut self) {}
Unexecuted instantiation: _RNvXs0_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgradeNtB5_11UpgradeBodyNtNtB9_2id11PrepareSign12prepare_signCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs0_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgradeNtB5_11UpgradeBodyNtNtB9_2id11PrepareSign12prepare_signBb_
153
}
154
155
impl Chargeable for Upgrade {
156
    #[inline(always)]
157
0
    fn metered_bytes_size(&self) -> usize {
158
0
        Serialize::size(self)
159
0
    }
160
161
    #[inline(always)]
162
0
    fn gas_used_by_metadata(&self, gas_cost: &GasCosts) -> Word {
163
0
        let bytes = Serialize::size(self);
164
0
        // Gas required to calculate the `tx_id`.
165
0
        let tx_id_gas = gas_cost.s256().resolve(bytes as u64);
166
167
0
        let purpose_gas = match &self.body.purpose {
168
0
            UpgradePurpose::ConsensusParameters { witness_index, .. } => {
169
0
                let len = self
170
0
                    .witnesses
171
0
                    .get(*witness_index as usize)
172
0
                    .map_or(0, |w| w.as_vec().len());
Unexecuted instantiation: _RNCNvXs1_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgradeINtNtB9_22chargeable_transaction21ChargeableTransactionNtB7_11UpgradeBodyNtB7_15UpgradeMetadataENtNtBb_3fee10Chargeable20gas_used_by_metadata0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs1_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgradeINtNtB9_22chargeable_transaction21ChargeableTransactionNtB7_11UpgradeBodyNtB7_15UpgradeMetadataENtNtBb_3fee10Chargeable20gas_used_by_metadata0Bd_
173
0
                gas_cost.s256().resolve(len as u64)
174
            }
175
            UpgradePurpose::StateTransition { .. } => {
176
                // In the case of the state transition upgrade, we only require the
177
                // existence of the bytecode on the blockchain. So we
178
                // verify nothing and charge nothing.
179
0
                0
180
            }
181
        };
182
183
0
        tx_id_gas.saturating_add(purpose_gas)
184
0
    }
185
}
186
187
impl UniqueFormatValidityChecks for Upgrade {
188
0
    fn check_unique_rules(
189
0
        &self,
190
0
        consensus_params: &ConsensusParameters,
191
0
    ) -> Result<(), ValidityError> {
192
0
        // At least one of inputs must be owned by the privileged address.
193
0
        self.inputs
194
0
            .iter()
195
0
            .find(|input| {
196
0
                if let Some(owner) = input.input_owner() {
197
0
                    owner == consensus_params.privileged_address()
198
                } else {
199
0
                    false
200
                }
201
0
            })
202
0
            .ok_or(ValidityError::TransactionUpgradeNoPrivilegedAddress)?;
203
204
        // We verify validity of the `UpgradePurpose` in the
205
        // `UpgradeMetadata::compute`.
206
0
        let calculated_metadata = UpgradeMetadata::compute(self)?;
207
208
0
        if let Some(metadata) = self.metadata.as_ref() {
209
0
            if metadata.body != calculated_metadata {
210
0
                return Err(ValidityError::TransactionMetadataMismatch);
211
0
            }
212
0
        }
213
214
        // The upgrade transaction cant touch the contract.
215
0
        self.inputs
216
0
            .iter()
217
0
            .enumerate()
218
0
            .try_for_each(|(index, input)| {
219
0
                if let Some(asset_id) = input.asset_id(consensus_params.base_asset_id()) {
220
0
                    if asset_id != consensus_params.base_asset_id() {
221
0
                        return Err(
222
0
                            ValidityError::TransactionInputContainsNonBaseAssetId {
223
0
                                index,
224
0
                            },
225
0
                        );
226
0
                    }
227
0
                }
228
229
0
                match input {
230
                    Input::Contract(_) => {
231
0
                        Err(ValidityError::TransactionInputContainsContract { index })
232
                    }
233
                    Input::MessageDataSigned(_) | Input::MessageDataPredicate(_) => {
234
0
                        Err(ValidityError::TransactionInputContainsMessageData { index })
235
                    }
236
0
                    _ => Ok(()),
237
                }
238
0
            })?;
239
240
        // The upgrade transaction can't create a contract.
241
0
        self.outputs
242
0
            .iter()
243
0
            .enumerate()
244
0
            .try_for_each(|(index, output)| match output {
245
                Output::Contract(_) => {
246
0
                    Err(ValidityError::TransactionOutputContainsContract { index })
247
                }
248
249
                Output::Variable { .. } => {
250
0
                    Err(ValidityError::TransactionOutputContainsVariable { index })
251
                }
252
253
0
                Output::Change { asset_id, .. }
254
0
                    if asset_id != consensus_params.base_asset_id() =>
255
0
                {
256
0
                    Err(ValidityError::TransactionChangeChangeUsesNotBaseAsset { index })
257
                }
258
259
                Output::ContractCreated { .. } => {
260
0
                    Err(ValidityError::TransactionOutputContainsContractCreated { index })
261
                }
262
0
                _ => Ok(()),
263
0
            })?;
264
265
0
        Ok(())
266
0
    }
267
}
268
269
impl crate::Cacheable for Upgrade {
270
0
    fn is_computed(&self) -> bool {
271
0
        self.metadata.is_some()
272
0
    }
273
274
0
    fn precompute(&mut self, chain_id: &ChainId) -> Result<(), ValidityError> {
275
0
        self.metadata = None;
276
0
        self.metadata = Some(ChargeableMetadata {
277
0
            common: CommonMetadata::compute(self, chain_id)?,
278
0
            body: UpgradeMetadata::compute(self)?,
279
        });
280
0
        Ok(())
281
0
    }
282
}
283
284
mod field {
285
    use super::*;
286
    use crate::field::{
287
        ChargeableBody,
288
        UpgradePurpose as UpgradePurposeTrait,
289
    };
290
291
    impl UpgradePurposeTrait for Upgrade {
292
        #[inline(always)]
293
0
        fn upgrade_purpose(&self) -> &UpgradePurpose {
294
0
            &self.body.purpose
295
0
        }
296
297
        #[inline(always)]
298
        fn upgrade_purpose_mut(&mut self) -> &mut UpgradePurpose {
299
            &mut self.body.purpose
300
        }
301
302
        #[inline(always)]
303
0
        fn upgrade_purpose_offset_static() -> usize {
304
0
            WORD_SIZE // `Transaction` enum discriminant
305
0
        }
306
    }
307
308
    impl ChargeableBody<UpgradeBody> for Upgrade {
309
0
        fn body(&self) -> &UpgradeBody {
310
0
            &self.body
311
0
        }
312
313
0
        fn body_mut(&mut self) -> &mut UpgradeBody {
314
0
            &mut self.body
315
0
        }
316
317
0
        fn body_offset_end(&self) -> usize {
318
0
            Self::upgrade_purpose_offset_static()
319
0
                .saturating_add(self.body.purpose.size())
320
0
                .saturating_add(
321
0
                    WORD_SIZE  // Policies size
322
0
                    + WORD_SIZE // Inputs size
323
0
                    + WORD_SIZE // Outputs size
324
0
                    + WORD_SIZE, // Witnesses size
325
0
                )
326
0
        }
327
    }
328
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/types/upload.rs
Line
Count
Source
1
use crate::{
2
    transaction::{
3
        fee::min_gas,
4
        id::PrepareSign,
5
        metadata::CommonMetadata,
6
        types::chargeable_transaction::{
7
            ChargeableMetadata,
8
            ChargeableTransaction,
9
            UniqueFormatValidityChecks,
10
        },
11
        Chargeable,
12
    },
13
    ConsensusParameters,
14
    FeeParameters,
15
    GasCosts,
16
    Input,
17
    Output,
18
    TransactionRepr,
19
    ValidityError,
20
};
21
use core::ops::Deref;
22
use derivative::Derivative;
23
use fuel_types::{
24
    bytes::WORD_SIZE,
25
    canonical::Serialize,
26
    Bytes32,
27
    ChainId,
28
    Word,
29
};
30
31
#[cfg(feature = "alloc")]
32
use alloc::vec::Vec;
33
34
pub type Upload = ChargeableTransaction<UploadBody, UploadMetadata>;
35
36
#[derive(Default, Debug, Clone, PartialEq, Eq, Hash)]
37
pub struct UploadMetadata;
38
39
0
/// The body of the [`Upload`] transaction.
40
0
#[derive(Clone, Default, Derivative, serde::Serialize, serde::Deserialize)]
Unexecuted instantiation: _RNvXsf_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploadNtB5_10UploadBodyNtNtCsd3UI3IJrzMw_4core3cmp9PartialEq2eq
Unexecuted instantiation: _RINvXse_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploadNtB6_10UploadBodyNtNtCsd3UI3IJrzMw_4core4hash4Hash4hashpEBc_
Unexecuted instantiation: _RNvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads_1__NtB7_10UploadBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1n_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads_1__NtBa_10UploadBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1q_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads_1__NtB8_10UploadBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1o_7Visitor9visit_u64pEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads_1__NtB8_10UploadBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1o_7Visitor9visit_strpEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads_1__NtB8_10UploadBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1o_7Visitor11visit_bytespEBe_
Unexecuted instantiation: _RINvXs_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads_1__NtBa_10UploadBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1o_11deserializepEBg_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads_1__NtBb_10UploadBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1r_7Visitor9visit_seqpEBh_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads_1__NtBb_10UploadBodyNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1r_7Visitor9visit_mappEBh_
41
0
#[cfg_attr(
42
0
    feature = "da-compression",
43
0
    derive(fuel_compression::Compress, fuel_compression::Decompress)
44
0
)]
45
0
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads0_1__NtB5_10UploadBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads0_1__NtB5_10UploadBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads0_1__NtB5_10UploadBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads0_1__NtB5_10UploadBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads1_1__NtB5_10UploadBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads1_1__NtB5_10UploadBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads1_1__NtB4_10UploadBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_static
Unexecuted instantiation: _RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads1_1__NtB4_10UploadBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamic
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads1_1__NtB5_10UploadBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads1_1__NtB5_10UploadBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
46
0
#[canonical(prefix = TransactionRepr::Upload)]
47
0
#[derivative(Eq, PartialEq, Hash, Debug)]
48
0
pub struct UploadBody {
49
0
    /// The root of the Merkle tree is created over the bytecode.
50
0
    pub root: Bytes32,
51
0
    /// The witness index of the subsection of the bytecode.
52
0
    pub witness_index: u16,
53
0
    /// The index of the subsection of the bytecode.
54
0
    pub subsection_index: u16,
55
0
    /// The total number of subsections on which bytecode was divided.
56
0
    pub subsections_number: u16,
57
0
    /// The proof set helps to verify the connection of the subsection to the `root`.
58
0
    pub proof_set: Vec<Bytes32>,
59
0
}
60
61
#[derive(
62
0
    Clone, Default, Eq, PartialEq, Hash, Debug, serde::Serialize, serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads3_1__NtB7_16UploadSubsectionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1u_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads3_1__NtBa_16UploadSubsectionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1x_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads3_1__NtB8_16UploadSubsectionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1v_7Visitor9visit_u64pEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads3_1__NtB8_16UploadSubsectionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1v_7Visitor9visit_strpEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads3_1__NtB8_16UploadSubsectionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1v_7Visitor11visit_bytespEBe_
Unexecuted instantiation: _RINvXs_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads3_1__NtBa_16UploadSubsectionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1v_11deserializepEBg_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads3_1__NtBb_16UploadSubsectionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1y_7Visitor9visit_seqpEBh_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads3_1__NtBb_16UploadSubsectionNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1y_7Visitor9visit_mappEBh_
63
)]
64
pub struct UploadSubsection {
65
    /// The root of the Merkle tree is created over the bytecode.
66
    pub root: Bytes32,
67
    /// The subsection of the bytecode.
68
    pub subsection: Vec<u8>,
69
    /// The index of the subsection.
70
    pub subsection_index: u16,
71
    /// The total number of subsections on which bytecode was divided.
72
    pub subsections_number: u16,
73
    /// The proof set helps to verify the connection of the subsection to the `root`.
74
    pub proof_set: Vec<Bytes32>,
75
}
76
77
#[derive(
78
0
    Copy, Clone, Eq, PartialEq, Hash, Debug, serde::Serialize, serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads5_1__NtB7_10SplitErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1o_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads5_1__NtBa_10SplitErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1r_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads5_1__NtB8_10SplitErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1p_7Visitor9visit_u64pEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads5_1__NtB8_10SplitErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1p_7Visitor9visit_strpEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads5_1__NtB8_10SplitErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1p_7Visitor11visit_bytespEBe_
Unexecuted instantiation: _RINvXs_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads5_1__NtBa_10SplitErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1p_11deserializepEBg_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploads5_1__NtBb_10SplitErrorNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1s_7Visitor10visit_enumpEBh_
79
)]
80
pub enum SplitError {
81
    /// The size of the subsection is too small to fit all subsections into `u16::MAX`.
82
    SubsectionSizeTooSmall,
83
}
84
85
impl UploadSubsection {
86
    /// Splits the bytecode into verifiable subsections and returns a vector of
87
    /// [`UploadSubsection`]s.
88
0
    pub fn split_bytecode(
89
0
        bytecode: &[u8],
90
0
        subsection_size: usize,
91
0
    ) -> Result<Vec<UploadSubsection>, SplitError> {
92
0
        let subsections = bytecode
93
0
            .chunks(subsection_size)
94
0
            .map(|subsection| subsection.to_vec())
95
0
            .collect::<Vec<_>>();
96
0
97
0
        if subsections.len() > u16::MAX as usize {
98
0
            return Err(SplitError::SubsectionSizeTooSmall);
99
0
        }
100
0
        let subsections_number =
101
0
            u16::try_from(subsections.len()).expect("We've just checked it; qed");
102
0
103
0
        let mut merkle_tree = fuel_merkle::binary::in_memory::MerkleTree::new();
104
0
        subsections
105
0
            .iter()
106
0
            .for_each(|subsection| merkle_tree.push(subsection));
107
0
108
0
        let merkle_root = merkle_tree.root();
109
0
110
0
        let subsections = subsections
111
0
            .into_iter()
112
0
            .enumerate()
113
0
            .map(|(index, subsection)| {
114
0
                let (root, proof_set) = merkle_tree
115
0
                    .prove(index as u64)
116
0
                    .expect("We've just created a merkle tree, so it is valid; qed");
117
0
                debug_assert_eq!(root, merkle_root);
118
119
0
                UploadSubsection {
120
0
                    root: merkle_root.into(),
121
0
                    subsection,
122
0
                    subsection_index: u16::try_from(index).expect(
123
0
                        "The total number of subsections is less than u16::MAX; qed",
124
0
                    ),
125
0
                    subsections_number,
126
0
                    proof_set: proof_set.into_iter().map(Into::into).collect(),
127
0
                }
128
0
            })
129
0
            .collect();
130
0
131
0
        Ok(subsections)
132
0
    }
133
}
134
135
impl PrepareSign for UploadBody {
136
0
    fn prepare_sign(&mut self) {}
Unexecuted instantiation: _RNvXs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploadNtB4_10UploadBodyNtNtB8_2id11PrepareSign12prepare_signCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6uploadNtB4_10UploadBodyNtNtB8_2id11PrepareSign12prepare_signBa_
137
}
138
139
impl Chargeable for Upload {
140
0
    fn min_gas(&self, gas_costs: &GasCosts, fee: &FeeParameters) -> fuel_asm::Word {
141
0
        let bytecode_len = self
142
0
            .witnesses
143
0
            .get(self.body.witness_index as usize)
144
0
            .map(|c| c.as_ref().len())
145
0
            .unwrap_or(0);
146
0
147
0
        // Since the `Upload` transaction occupies much of the storage, we want to
148
0
        // discourage people from using it too much. For that, we charge additional gas
149
0
        // for the storage.
150
0
        let additional_charge_for_storage = gas_costs
151
0
            .new_storage_per_byte()
152
0
            .saturating_mul(bytecode_len as u64);
153
0
154
0
        min_gas(self, gas_costs, fee).saturating_add(additional_charge_for_storage)
155
0
    }
156
157
    #[inline(always)]
158
0
    fn metered_bytes_size(&self) -> usize {
159
0
        Serialize::size(self)
160
0
    }
161
162
    #[inline(always)]
163
0
    fn gas_used_by_metadata(&self, gas_cost: &GasCosts) -> Word {
164
0
        let bytes = Serialize::size(self);
165
0
        // Gas required to calculate the `tx_id`.
166
0
        let tx_id_gas = gas_cost.s256().resolve(bytes as u64);
167
0
168
0
        let bytecode_len = self
169
0
            .witnesses
170
0
            .get(self.body.witness_index as usize)
171
0
            .map(|c| c.as_ref().len())
172
0
            .unwrap_or(0);
173
0
174
0
        let leaf_hash_gas = gas_cost.s256().resolve(bytecode_len as u64);
175
0
        let verify_proof_gas = gas_cost
176
0
            .state_root()
177
0
            .resolve(self.body.subsections_number as u64);
178
0
179
0
        tx_id_gas
180
0
            .saturating_add(leaf_hash_gas)
181
0
            .saturating_add(verify_proof_gas)
182
0
    }
183
}
184
185
impl UniqueFormatValidityChecks for Upload {
186
0
    fn check_unique_rules(
187
0
        &self,
188
0
        consensus_params: &ConsensusParameters,
189
0
    ) -> Result<(), ValidityError> {
190
0
        if self.body.subsections_number
191
0
            > consensus_params.tx_params().max_bytecode_subsections()
192
        {
193
0
            return Err(ValidityError::TransactionUploadTooManyBytecodeSubsections);
194
0
        }
195
0
196
0
        let index = self.body.witness_index as usize;
197
0
        let witness = self
198
0
            .witnesses
199
0
            .get(index)
200
0
            .ok_or(ValidityError::InputWitnessIndexBounds { index })?;
201
202
0
        let proof_set = self
203
0
            .body
204
0
            .proof_set
205
0
            .iter()
206
0
            .map(|proof| (*proof).into())
207
0
            .collect::<Vec<_>>();
208
0
209
0
        // Verify that subsection of the bytecode is connected to the `root` of the
210
0
        // bytecode.
211
0
        let result = fuel_merkle::binary::verify(
212
0
            self.body.root.deref(),
213
0
            witness,
214
0
            &proof_set,
215
0
            self.body.subsection_index as u64,
216
0
            self.body.subsections_number as u64,
217
0
        );
218
0
219
0
        if !result {
220
0
            return Err(ValidityError::TransactionUploadRootVerificationFailed);
221
0
        }
222
0
223
0
        self.inputs
224
0
            .iter()
225
0
            .enumerate()
226
0
            .try_for_each(|(index, input)| {
227
0
                if let Some(asset_id) = input.asset_id(consensus_params.base_asset_id()) {
228
0
                    if asset_id != consensus_params.base_asset_id() {
229
0
                        return Err(
230
0
                            ValidityError::TransactionInputContainsNonBaseAssetId {
231
0
                                index,
232
0
                            },
233
0
                        );
234
0
                    }
235
0
                }
236
237
0
                match input {
238
                    Input::Contract(_) => {
239
0
                        Err(ValidityError::TransactionInputContainsContract { index })
240
                    }
241
                    Input::MessageDataSigned(_) | Input::MessageDataPredicate(_) => {
242
0
                        Err(ValidityError::TransactionInputContainsMessageData { index })
243
                    }
244
0
                    _ => Ok(()),
245
                }
246
0
            })?;
247
248
0
        self.outputs
249
0
            .iter()
250
0
            .enumerate()
251
0
            .try_for_each(|(index, output)| match output {
252
                Output::Contract(_) => {
253
0
                    Err(ValidityError::TransactionOutputContainsContract { index })
254
                }
255
256
                Output::Variable { .. } => {
257
0
                    Err(ValidityError::TransactionOutputContainsVariable { index })
258
                }
259
260
0
                Output::Change { asset_id, .. }
261
0
                    if asset_id != consensus_params.base_asset_id() =>
262
0
                {
263
0
                    Err(ValidityError::TransactionChangeChangeUsesNotBaseAsset { index })
264
                }
265
266
                Output::ContractCreated { .. } => {
267
0
                    Err(ValidityError::TransactionOutputContainsContractCreated { index })
268
                }
269
0
                _ => Ok(()),
270
0
            })?;
271
272
0
        Ok(())
273
0
    }
274
}
275
276
impl crate::Cacheable for Upload {
277
0
    fn is_computed(&self) -> bool {
278
0
        self.metadata.is_some()
279
0
    }
280
281
0
    fn precompute(&mut self, chain_id: &ChainId) -> Result<(), ValidityError> {
282
0
        self.metadata = None;
283
0
        self.metadata = Some(ChargeableMetadata {
284
0
            common: CommonMetadata::compute(self, chain_id)?,
285
0
            body: UploadMetadata {},
286
0
        });
287
0
        Ok(())
288
0
    }
289
}
290
291
mod field {
292
    use super::*;
293
    use crate::field::{
294
        BytecodeRoot,
295
        BytecodeWitnessIndex,
296
        ChargeableBody,
297
        ProofSet,
298
        SubsectionIndex,
299
        SubsectionsNumber,
300
    };
301
302
    impl BytecodeRoot for Upload {
303
        #[inline(always)]
304
0
        fn bytecode_root(&self) -> &Bytes32 {
305
0
            &self.body.root
306
0
        }
307
308
        #[inline(always)]
309
        fn bytecode_root_mut(&mut self) -> &mut Bytes32 {
310
            &mut self.body.root
311
        }
312
313
        #[inline(always)]
314
0
        fn bytecode_root_offset_static() -> usize {
315
0
            WORD_SIZE // `Transaction` enum discriminant
316
0
        }
317
    }
318
319
    impl BytecodeWitnessIndex for Upload {
320
        #[inline(always)]
321
0
        fn bytecode_witness_index(&self) -> &u16 {
322
0
            &self.body.witness_index
323
0
        }
324
325
        #[inline(always)]
326
        fn bytecode_witness_index_mut(&mut self) -> &mut u16 {
327
            &mut self.body.witness_index
328
        }
329
330
        #[inline(always)]
331
0
        fn bytecode_witness_index_offset_static() -> usize {
332
0
            Self::bytecode_root_offset_static().saturating_add(Bytes32::LEN)
333
0
        }
334
    }
335
336
    impl SubsectionIndex for Upload {
337
        #[inline(always)]
338
0
        fn subsection_index(&self) -> &u16 {
339
0
            &self.body.subsection_index
340
0
        }
341
342
        #[inline(always)]
343
        fn subsection_index_mut(&mut self) -> &mut u16 {
344
            &mut self.body.subsection_index
345
        }
346
347
        #[inline(always)]
348
0
        fn subsection_index_offset_static() -> usize {
349
0
            Self::bytecode_witness_index_offset_static().saturating_add(WORD_SIZE)
350
0
        }
351
    }
352
353
    impl SubsectionsNumber for Upload {
354
        #[inline(always)]
355
0
        fn subsections_number(&self) -> &u16 {
356
0
            &self.body.subsections_number
357
0
        }
358
359
        #[inline(always)]
360
        fn subsections_number_mut(&mut self) -> &mut u16 {
361
            &mut self.body.subsections_number
362
        }
363
364
        #[inline(always)]
365
0
        fn subsections_number_offset_static() -> usize {
366
0
            Self::subsection_index_offset_static().saturating_add(WORD_SIZE)
367
0
        }
368
    }
369
370
    impl ProofSet for Upload {
371
        #[inline(always)]
372
        fn proof_set(&self) -> &Vec<Bytes32> {
373
            &self.body.proof_set
374
        }
375
376
        #[inline(always)]
377
        fn proof_set_mut(&mut self) -> &mut Vec<Bytes32> {
378
            &mut self.body.proof_set
379
        }
380
381
        #[inline(always)]
382
0
        fn proof_set_offset_static() -> usize {
383
0
            Self::subsections_number_offset_static().saturating_add(
384
0
                WORD_SIZE
385
0
                + WORD_SIZE // Proof set size
386
0
                + WORD_SIZE // Policies size
387
0
                + WORD_SIZE // Inputs size
388
0
                + WORD_SIZE // Outputs size
389
0
                + WORD_SIZE, // Witnesses size
390
0
            )
391
0
        }
392
    }
393
394
    impl ChargeableBody<UploadBody> for Upload {
395
0
        fn body(&self) -> &UploadBody {
396
0
            &self.body
397
0
        }
398
399
0
        fn body_mut(&mut self) -> &mut UploadBody {
400
0
            &mut self.body
401
0
        }
402
403
0
        fn body_offset_end(&self) -> usize {
404
0
            Self::proof_set_offset_static()
405
0
                .saturating_add(self.body.proof_set.len().saturating_mul(Bytes32::LEN))
406
0
        }
407
    }
408
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/types/chargeable_transaction.rs
Line
Count
Source
1
use crate::{
2
    field::ChargeableBody,
3
    policies::Policies,
4
    transaction::{
5
        field::{
6
            Inputs,
7
            Outputs,
8
            Policies as PoliciesField,
9
            Witnesses,
10
        },
11
        id::PrepareSign,
12
        metadata::CommonMetadata,
13
        validity::{
14
            check_common_part,
15
            FormatValidityChecks,
16
        },
17
        Chargeable,
18
    },
19
    ConsensusParameters,
20
    Input,
21
    Output,
22
    UniqueIdentifier,
23
    ValidityError,
24
    Witness,
25
};
26
use derivative::Derivative;
27
use fuel_types::{
28
    bytes,
29
    canonical::Serialize,
30
    BlockHeight,
31
    Bytes32,
32
    ChainId,
33
};
34
use hashbrown::HashMap;
35
36
#[cfg(feature = "alloc")]
37
use alloc::vec::Vec;
38
39
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
40
pub struct ChargeableMetadata<Body> {
41
    pub common: CommonMetadata,
42
    pub body: Body,
43
}
44
45
#[cfg(feature = "da-compression")]
46
use fuel_compression::Compressible;
47
48
#[cfg(feature = "da-compression")]
49
pub trait BodyConstraints:
50
    for<'a> Compressible<
51
    Compressed: core::fmt::Debug
52
                    + PartialEq
53
                    + Clone
54
                    + serde::Serialize
55
                    + serde::Deserialize<'a>,
56
>
57
{
58
}
59
60
#[cfg(feature = "da-compression")]
61
impl<T> BodyConstraints for T where
62
    T: for<'a> Compressible<
63
        Compressed: core::fmt::Debug
64
                        + PartialEq
65
                        + Clone
66
                        + serde::Serialize
67
                        + serde::Deserialize<'a>,
68
    >
69
{
70
}
71
72
#[cfg(not(feature = "da-compression"))]
73
pub trait BodyConstraints {}
74
#[cfg(not(feature = "da-compression"))]
75
impl<T> BodyConstraints for T {}
76
77
4.38k
#[derive(Clone, Derivative)]
Unexecuted instantiation: _RNvXse_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1J_12BlobMetadataENtNtCsd3UI3IJrzMw_4core3cmp9PartialEq2eqCsg6P9hFxt0iW_7fuel_vm
_RNvXse_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1J_14CreateMetadataENtNtCsd3UI3IJrzMw_4core3cmp9PartialEq2eqCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
77
2.19k
#[derive(Clone, Derivative)]
_RNvXse_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1J_14ScriptMetadataENtNtCsd3UI3IJrzMw_4core3cmp9PartialEq2eqCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
77
2.19k
#[derive(Clone, Derivative)]
Unexecuted instantiation: _RNvXse_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1J_14UploadMetadataENtNtCsd3UI3IJrzMw_4core3cmp9PartialEq2eqCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXse_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1J_15UpgradeMetadataENtNtCsd3UI3IJrzMw_4core3cmp9PartialEq2eqCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXse_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1J_12BlobMetadataENtNtCsd3UI3IJrzMw_4core3cmp9PartialEq2eqBb_
Unexecuted instantiation: _RNvXse_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1J_14CreateMetadataENtNtCsd3UI3IJrzMw_4core3cmp9PartialEq2eqBb_
Unexecuted instantiation: _RNvXse_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1J_14ScriptMetadataENtNtCsd3UI3IJrzMw_4core3cmp9PartialEq2eqBb_
Unexecuted instantiation: _RNvXse_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1J_14UploadMetadataENtNtCsd3UI3IJrzMw_4core3cmp9PartialEq2eqBb_
Unexecuted instantiation: _RNvXse_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1J_15UpgradeMetadataENtNtCsd3UI3IJrzMw_4core3cmp9PartialEq2eqBb_
Unexecuted instantiation: _RINvXININtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionsd_0ppEINtB6_21ChargeableTransactionppENtNtCsd3UI3IJrzMw_4core4hash4Hash4hashpEBc_
78
0
#[derivative(Eq, PartialEq, Hash, Debug)]
79
0
#[derive(serde::Serialize, serde::Deserialize)]
Unexecuted instantiation: _RNvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions_1__INtB7_21ChargeableTransactionppENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1T_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions_1__INtB8_21ChargeableTransactionppENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1U_7Visitor9visit_u64pEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions_1__INtB8_21ChargeableTransactionppENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1U_7Visitor9visit_strpEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions_1__INtB8_21ChargeableTransactionppENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1U_7Visitor11visit_bytespEBe_
Unexecuted instantiation: _RINvXs_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions_1__INtBa_21ChargeableTransactionppENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1U_11deserializepEBg_
Unexecuted instantiation: _RNvXININvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions_1__INtBa_21ChargeableTransactionppENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializes0_0ppEINtB5_9___VisitorppENtB1W_7Visitor9expectingBg_
Unexecuted instantiation: _RINvXININvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions_1__INtBb_21ChargeableTransactionppENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializes0_0ppEINtB6_9___VisitorppENtB1X_7Visitor9visit_seqpEBh_
Unexecuted instantiation: _RINvXININvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions_1__INtBb_21ChargeableTransactionppENtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializes0_0ppEINtB6_9___VisitorppENtB1X_7Visitor9visit_mappEBh_
80
0
#[cfg_attr(
81
0
    feature = "da-compression",
82
0
    derive(fuel_compression::Compress, fuel_compression::Decompress)
83
0
)]
84
0
#[cfg_attr(feature = "da-compression", compress(discard(MetadataBody)))]
85
35.0k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions0_1__INtB5_21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1P_12BlobMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions0_1__INtB5_21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1P_12BlobMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions0_1__INtB5_21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1P_14CreateMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
85
2.19k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions0_1__INtB5_21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1P_14CreateMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
85
2.19k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions0_1__INtB5_21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1P_14ScriptMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
85
2.19k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions0_1__INtB5_21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1P_14ScriptMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
85
2.19k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions0_1__INtB5_21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1P_14UploadMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions0_1__INtB5_21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1P_14UploadMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions0_1__INtB5_21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1P_15UpgradeMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions0_1__INtB5_21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1P_15UpgradeMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions0_1__INtB5_21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1P_12BlobMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions0_1__INtB5_21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1P_14CreateMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions0_1__INtB5_21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1P_14ScriptMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions0_1__INtB5_21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1P_14UploadMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions0_1__INtB5_21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1P_15UpgradeMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions0_1__INtB5_21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1P_12BlobMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions0_1__INtB5_21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1P_14CreateMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions0_1__INtB5_21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1P_14ScriptMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions0_1__INtB5_21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1P_14UploadMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions0_1__INtB5_21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1P_15UpgradeMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB5_21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1P_12BlobMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB5_21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1P_12BlobMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB5_21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1P_14CreateMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
85
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB5_21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1P_14CreateMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
85
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB5_21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1P_14ScriptMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
85
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB5_21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1P_14ScriptMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
85
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB5_21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1P_14UploadMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB5_21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1P_14UploadMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB5_21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1P_15UpgradeMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB5_21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1P_15UpgradeMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB4_21ChargeableTransactionNtNtB6_4blob8BlobBodyNtB1O_12BlobMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_staticCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB4_21ChargeableTransactionNtNtB6_4blob8BlobBodyNtB1O_12BlobMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamicCsg6P9hFxt0iW_7fuel_vm
_RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB4_21ChargeableTransactionNtNtB6_6create10CreateBodyNtB1O_14CreateMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_staticCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
85
30.7k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB4_21ChargeableTransactionNtNtB6_6create10CreateBodyNtB1O_14CreateMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamicCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
85
30.7k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB4_21ChargeableTransactionNtNtB6_6script10ScriptBodyNtB1O_14ScriptMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_staticCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
85
52.6k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB4_21ChargeableTransactionNtNtB6_6script10ScriptBodyNtB1O_14ScriptMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamicCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
85
52.6k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB4_21ChargeableTransactionNtNtB6_6upload10UploadBodyNtB1O_14UploadMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_staticCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB4_21ChargeableTransactionNtNtB6_6upload10UploadBodyNtB1O_14UploadMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamicCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB4_21ChargeableTransactionNtNtB6_7upgrade11UpgradeBodyNtB1O_15UpgradeMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_staticCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB4_21ChargeableTransactionNtNtB6_7upgrade11UpgradeBodyNtB1O_15UpgradeMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamicCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB4_21ChargeableTransactionNtNtB6_4blob8BlobBodyNtB1O_12BlobMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_staticBa_
_RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB4_21ChargeableTransactionNtNtB6_6create10CreateBodyNtB1O_14CreateMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_staticBa_
Line
Count
Source
85
28.5k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB4_21ChargeableTransactionNtNtB6_6script10ScriptBodyNtB1O_14ScriptMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_staticBa_
Line
Count
Source
85
6.57k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB4_21ChargeableTransactionNtNtB6_6upload10UploadBodyNtB1O_14UploadMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_staticBa_
Unexecuted instantiation: _RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB4_21ChargeableTransactionNtNtB6_7upgrade11UpgradeBodyNtB1O_15UpgradeMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_staticBa_
Unexecuted instantiation: _RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB4_21ChargeableTransactionNtNtB6_4blob8BlobBodyNtB1O_12BlobMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamicBa_
_RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB4_21ChargeableTransactionNtNtB6_6create10CreateBodyNtB1O_14CreateMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamicBa_
Line
Count
Source
85
28.5k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB4_21ChargeableTransactionNtNtB6_6script10ScriptBodyNtB1O_14ScriptMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamicBa_
Line
Count
Source
85
6.57k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB4_21ChargeableTransactionNtNtB6_6upload10UploadBodyNtB1O_14UploadMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamicBa_
Unexecuted instantiation: _RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB4_21ChargeableTransactionNtNtB6_7upgrade11UpgradeBodyNtB1O_15UpgradeMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamicBa_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB5_21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1P_12BlobMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB5_21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1P_14CreateMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Line
Count
Source
85
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB5_21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1P_14ScriptMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Line
Count
Source
85
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB5_21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1P_14UploadMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB5_21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1P_15UpgradeMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB5_21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1P_12BlobMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB5_21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1P_14CreateMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Line
Count
Source
85
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB5_21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1P_14ScriptMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Line
Count
Source
85
4.38k
#[derive(fuel_types::canonical::Deserialize, fuel_types::canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB5_21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1P_14UploadMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactions1_1__INtB5_21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1P_15UpgradeMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
86
0
pub struct ChargeableTransaction<Body, MetadataBody>
87
0
where
88
0
    Body: BodyConstraints,
89
0
{
90
0
    pub(crate) body: Body,
91
0
    pub(crate) policies: Policies,
92
0
    pub(crate) inputs: Vec<Input>,
93
0
    pub(crate) outputs: Vec<Output>,
94
0
    pub(crate) witnesses: Vec<Witness>,
95
0
    #[serde(skip)]
96
0
    #[cfg_attr(feature = "da-compression", compress(skip))]
97
0
    #[derivative(PartialEq = "ignore", Hash = "ignore")]
98
0
    #[canonical(skip)]
99
0
    pub(crate) metadata: Option<ChargeableMetadata<MetadataBody>>,
100
0
}
Unexecuted instantiation: _RNvXsb_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1J_12BlobMetadataENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXsb_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1J_14CreateMetadataENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXsb_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1J_14ScriptMetadataENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXsb_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1J_14UploadMetadataENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXsb_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1J_15UpgradeMetadataENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXsb_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1J_12BlobMetadataENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtBb_
Unexecuted instantiation: _RNvXsb_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1J_14CreateMetadataENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtBb_
Unexecuted instantiation: _RNvXsb_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1J_14ScriptMetadataENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtBb_
Unexecuted instantiation: _RNvXsb_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1J_14UploadMetadataENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtBb_
Unexecuted instantiation: _RNvXsb_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1J_15UpgradeMetadataENtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmtBb_
101
102
impl<Body, MetadataBody> Default for ChargeableTransaction<Body, MetadataBody>
103
where
104
    Body: BodyConstraints + Default,
105
{
106
4.38k
    fn default() -> Self {
107
4.38k
        Self {
108
4.38k
            body: Default::default(),
109
4.38k
            policies: Policies::new()
110
4.38k
                .with_maturity(0.into())
111
4.38k
                .with_witness_limit(10000),
112
4.38k
            inputs: Default::default(),
113
4.38k
            outputs: Default::default(),
114
4.38k
            witnesses: Default::default(),
115
4.38k
            metadata: None,
116
4.38k
        }
117
4.38k
    }
Unexecuted instantiation: _RNvXs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB4_21ChargeableTransactionNtNtB6_4blob8BlobBodyNtB1I_12BlobMetadataENtNtCsd3UI3IJrzMw_4core7default7Default7defaultCsg6P9hFxt0iW_7fuel_vm
_RNvXs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB4_21ChargeableTransactionNtNtB6_6create10CreateBodyNtB1I_14CreateMetadataENtNtCsd3UI3IJrzMw_4core7default7Default7defaultCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
106
2.19k
    fn default() -> Self {
107
2.19k
        Self {
108
2.19k
            body: Default::default(),
109
2.19k
            policies: Policies::new()
110
2.19k
                .with_maturity(0.into())
111
2.19k
                .with_witness_limit(10000),
112
2.19k
            inputs: Default::default(),
113
2.19k
            outputs: Default::default(),
114
2.19k
            witnesses: Default::default(),
115
2.19k
            metadata: None,
116
2.19k
        }
117
2.19k
    }
_RNvXs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB4_21ChargeableTransactionNtNtB6_6script10ScriptBodyNtB1I_14ScriptMetadataENtNtCsd3UI3IJrzMw_4core7default7Default7defaultCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
106
2.19k
    fn default() -> Self {
107
2.19k
        Self {
108
2.19k
            body: Default::default(),
109
2.19k
            policies: Policies::new()
110
2.19k
                .with_maturity(0.into())
111
2.19k
                .with_witness_limit(10000),
112
2.19k
            inputs: Default::default(),
113
2.19k
            outputs: Default::default(),
114
2.19k
            witnesses: Default::default(),
115
2.19k
            metadata: None,
116
2.19k
        }
117
2.19k
    }
Unexecuted instantiation: _RNvXs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB4_21ChargeableTransactionNtNtB6_6upload10UploadBodyNtB1I_14UploadMetadataENtNtCsd3UI3IJrzMw_4core7default7Default7defaultCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB4_21ChargeableTransactionNtNtB6_7upgrade11UpgradeBodyNtB1I_15UpgradeMetadataENtNtCsd3UI3IJrzMw_4core7default7Default7defaultCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB4_21ChargeableTransactionNtNtB6_6script10ScriptBodyNtB1I_14ScriptMetadataENtNtCsd3UI3IJrzMw_4core7default7Default7defaultBa_
118
}
119
120
impl<Body, MetadataBody> ChargeableTransaction<Body, MetadataBody>
121
where
122
    Body: BodyConstraints,
123
{
124
2.19k
    pub fn metadata(&self) -> &Option<ChargeableMetadata<MetadataBody>> {
125
2.19k
        &self.metadata
126
2.19k
    }
_RNvMs0_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1J_14CreateMetadataE8metadataCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
124
2.19k
    pub fn metadata(&self) -> &Option<ChargeableMetadata<MetadataBody>> {
125
2.19k
        &self.metadata
126
2.19k
    }
Unexecuted instantiation: _RNvMs0_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1J_15UpgradeMetadataE8metadataCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMs0_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionppE8metadataBb_
127
}
128
129
impl<Body, MetadataBody> PrepareSign for ChargeableTransaction<Body, MetadataBody>
130
where
131
    Body: BodyConstraints + PrepareSign,
132
    Self: ChargeableBody<Body>,
133
{
134
17.5k
    fn prepare_sign(&mut self) {
135
17.5k
        self.body.prepare_sign();
136
17.5k
        self.inputs_mut().iter_mut().for_each(Input::prepare_sign);
137
17.5k
        self.outputs_mut().iter_mut().for_each(Output::prepare_sign);
138
17.5k
    }
Unexecuted instantiation: _RNvXs1_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1J_12BlobMetadataENtNtB9_2id11PrepareSign12prepare_signCsg6P9hFxt0iW_7fuel_vm
_RNvXs1_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1J_14CreateMetadataENtNtB9_2id11PrepareSign12prepare_signCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
134
4.38k
    fn prepare_sign(&mut self) {
135
4.38k
        self.body.prepare_sign();
136
4.38k
        self.inputs_mut().iter_mut().for_each(Input::prepare_sign);
137
4.38k
        self.outputs_mut().iter_mut().for_each(Output::prepare_sign);
138
4.38k
    }
_RNvXs1_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1J_14ScriptMetadataENtNtB9_2id11PrepareSign12prepare_signCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
134
4.38k
    fn prepare_sign(&mut self) {
135
4.38k
        self.body.prepare_sign();
136
4.38k
        self.inputs_mut().iter_mut().for_each(Input::prepare_sign);
137
4.38k
        self.outputs_mut().iter_mut().for_each(Output::prepare_sign);
138
4.38k
    }
Unexecuted instantiation: _RNvXs1_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1J_14UploadMetadataENtNtB9_2id11PrepareSign12prepare_signCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs1_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1J_15UpgradeMetadataENtNtB9_2id11PrepareSign12prepare_signCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs1_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1J_12BlobMetadataENtNtB9_2id11PrepareSign12prepare_signBb_
_RNvXs1_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1J_14CreateMetadataENtNtB9_2id11PrepareSign12prepare_signBb_
Line
Count
Source
134
4.38k
    fn prepare_sign(&mut self) {
135
4.38k
        self.body.prepare_sign();
136
4.38k
        self.inputs_mut().iter_mut().for_each(Input::prepare_sign);
137
4.38k
        self.outputs_mut().iter_mut().for_each(Output::prepare_sign);
138
4.38k
    }
_RNvXs1_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1J_14ScriptMetadataENtNtB9_2id11PrepareSign12prepare_signBb_
Line
Count
Source
134
4.38k
    fn prepare_sign(&mut self) {
135
4.38k
        self.body.prepare_sign();
136
4.38k
        self.inputs_mut().iter_mut().for_each(Input::prepare_sign);
137
4.38k
        self.outputs_mut().iter_mut().for_each(Output::prepare_sign);
138
4.38k
    }
Unexecuted instantiation: _RNvXs1_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1J_14UploadMetadataENtNtB9_2id11PrepareSign12prepare_signBb_
Unexecuted instantiation: _RNvXs1_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1J_15UpgradeMetadataENtNtB9_2id11PrepareSign12prepare_signBb_
139
}
140
141
impl<Body, MetadataBody> UniqueIdentifier for ChargeableTransaction<Body, MetadataBody>
142
where
143
    Body: BodyConstraints + PrepareSign,
144
    Self: Clone,
145
    Self: ChargeableBody<Body>,
146
    Self: fuel_types::canonical::Serialize,
147
{
148
21.9k
    fn id(&self, chain_id: &ChainId) -> Bytes32 {
149
21.9k
        if let Some(id) = self.cached_id() {
150
8.77k
            return id;
151
13.1k
        }
152
13.1k
153
13.1k
        let mut clone = self.clone();
154
13.1k
155
13.1k
        // Empties fields that should be zero during the signing.
156
13.1k
        clone.prepare_sign();
157
13.1k
        clone.witnesses_mut().clear();
158
13.1k
159
13.1k
        crate::transaction::compute_transaction_id(chain_id, &mut clone)
160
21.9k
    }
Unexecuted instantiation: _RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1J_12BlobMetadataENtNtB9_2id16UniqueIdentifier2idCsg6P9hFxt0iW_7fuel_vm
_RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1J_14CreateMetadataENtNtB9_2id16UniqueIdentifier2idCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
148
6.57k
    fn id(&self, chain_id: &ChainId) -> Bytes32 {
149
6.57k
        if let Some(id) = self.cached_id() {
150
4.38k
            return id;
151
2.19k
        }
152
2.19k
153
2.19k
        let mut clone = self.clone();
154
2.19k
155
2.19k
        // Empties fields that should be zero during the signing.
156
2.19k
        clone.prepare_sign();
157
2.19k
        clone.witnesses_mut().clear();
158
2.19k
159
2.19k
        crate::transaction::compute_transaction_id(chain_id, &mut clone)
160
6.57k
    }
_RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1J_14ScriptMetadataENtNtB9_2id16UniqueIdentifier2idCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
148
6.57k
    fn id(&self, chain_id: &ChainId) -> Bytes32 {
149
6.57k
        if let Some(id) = self.cached_id() {
150
4.38k
            return id;
151
2.19k
        }
152
2.19k
153
2.19k
        let mut clone = self.clone();
154
2.19k
155
2.19k
        // Empties fields that should be zero during the signing.
156
2.19k
        clone.prepare_sign();
157
2.19k
        clone.witnesses_mut().clear();
158
2.19k
159
2.19k
        crate::transaction::compute_transaction_id(chain_id, &mut clone)
160
6.57k
    }
Unexecuted instantiation: _RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1J_14UploadMetadataENtNtB9_2id16UniqueIdentifier2idCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1J_15UpgradeMetadataENtNtB9_2id16UniqueIdentifier2idCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1J_12BlobMetadataENtNtB9_2id16UniqueIdentifier2idBb_
_RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1J_14CreateMetadataENtNtB9_2id16UniqueIdentifier2idBb_
Line
Count
Source
148
4.38k
    fn id(&self, chain_id: &ChainId) -> Bytes32 {
149
4.38k
        if let Some(id) = self.cached_id() {
150
0
            return id;
151
4.38k
        }
152
4.38k
153
4.38k
        let mut clone = self.clone();
154
4.38k
155
4.38k
        // Empties fields that should be zero during the signing.
156
4.38k
        clone.prepare_sign();
157
4.38k
        clone.witnesses_mut().clear();
158
4.38k
159
4.38k
        crate::transaction::compute_transaction_id(chain_id, &mut clone)
160
4.38k
    }
_RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1J_14ScriptMetadataENtNtB9_2id16UniqueIdentifier2idBb_
Line
Count
Source
148
4.38k
    fn id(&self, chain_id: &ChainId) -> Bytes32 {
149
4.38k
        if let Some(id) = self.cached_id() {
150
0
            return id;
151
4.38k
        }
152
4.38k
153
4.38k
        let mut clone = self.clone();
154
4.38k
155
4.38k
        // Empties fields that should be zero during the signing.
156
4.38k
        clone.prepare_sign();
157
4.38k
        clone.witnesses_mut().clear();
158
4.38k
159
4.38k
        crate::transaction::compute_transaction_id(chain_id, &mut clone)
160
4.38k
    }
Unexecuted instantiation: _RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1J_14UploadMetadataENtNtB9_2id16UniqueIdentifier2idBb_
Unexecuted instantiation: _RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1J_15UpgradeMetadataENtNtB9_2id16UniqueIdentifier2idBb_
161
162
21.9k
    fn cached_id(&self) -> Option<Bytes32> {
163
21.9k
        self.metadata.as_ref().map(|m| m.common.id)
Unexecuted instantiation: _RNCNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB7_21ChargeableTransactionNtNtB9_4blob8BlobBodyNtB1L_12BlobMetadataENtNtBb_2id16UniqueIdentifier9cached_id0Csg6P9hFxt0iW_7fuel_vm
_RNCNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB7_21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1L_14CreateMetadataENtNtBb_2id16UniqueIdentifier9cached_id0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
163
4.38k
        self.metadata.as_ref().map(|m| m.common.id)
_RNCNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB7_21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1L_14ScriptMetadataENtNtBb_2id16UniqueIdentifier9cached_id0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
163
4.38k
        self.metadata.as_ref().map(|m| m.common.id)
Unexecuted instantiation: _RNCNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB7_21ChargeableTransactionNtNtB9_6upload10UploadBodyNtB1L_14UploadMetadataENtNtBb_2id16UniqueIdentifier9cached_id0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB7_21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1L_15UpgradeMetadataENtNtBb_2id16UniqueIdentifier9cached_id0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB7_21ChargeableTransactionNtNtB9_4blob8BlobBodyNtB1L_12BlobMetadataENtNtBb_2id16UniqueIdentifier9cached_id0Bd_
Unexecuted instantiation: _RNCNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB7_21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1L_14CreateMetadataENtNtBb_2id16UniqueIdentifier9cached_id0Bd_
Unexecuted instantiation: _RNCNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB7_21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1L_14ScriptMetadataENtNtBb_2id16UniqueIdentifier9cached_id0Bd_
Unexecuted instantiation: _RNCNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB7_21ChargeableTransactionNtNtB9_6upload10UploadBodyNtB1L_14UploadMetadataENtNtBb_2id16UniqueIdentifier9cached_id0Bd_
Unexecuted instantiation: _RNCNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB7_21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1L_15UpgradeMetadataENtNtBb_2id16UniqueIdentifier9cached_id0Bd_
164
21.9k
    }
Unexecuted instantiation: _RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1J_12BlobMetadataENtNtB9_2id16UniqueIdentifier9cached_idCsg6P9hFxt0iW_7fuel_vm
_RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1J_14CreateMetadataENtNtB9_2id16UniqueIdentifier9cached_idCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
162
6.57k
    fn cached_id(&self) -> Option<Bytes32> {
163
6.57k
        self.metadata.as_ref().map(|m| m.common.id)
164
6.57k
    }
_RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1J_14ScriptMetadataENtNtB9_2id16UniqueIdentifier9cached_idCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
162
6.57k
    fn cached_id(&self) -> Option<Bytes32> {
163
6.57k
        self.metadata.as_ref().map(|m| m.common.id)
164
6.57k
    }
Unexecuted instantiation: _RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1J_14UploadMetadataENtNtB9_2id16UniqueIdentifier9cached_idCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1J_15UpgradeMetadataENtNtB9_2id16UniqueIdentifier9cached_idCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1J_12BlobMetadataENtNtB9_2id16UniqueIdentifier9cached_idBb_
_RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1J_14CreateMetadataENtNtB9_2id16UniqueIdentifier9cached_idBb_
Line
Count
Source
162
4.38k
    fn cached_id(&self) -> Option<Bytes32> {
163
4.38k
        self.metadata.as_ref().map(|m| m.common.id)
164
4.38k
    }
_RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1J_14ScriptMetadataENtNtB9_2id16UniqueIdentifier9cached_idBb_
Line
Count
Source
162
4.38k
    fn cached_id(&self) -> Option<Bytes32> {
163
4.38k
        self.metadata.as_ref().map(|m| m.common.id)
164
4.38k
    }
Unexecuted instantiation: _RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1J_14UploadMetadataENtNtB9_2id16UniqueIdentifier9cached_idBb_
Unexecuted instantiation: _RNvXs2_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1J_15UpgradeMetadataENtNtB9_2id16UniqueIdentifier9cached_idBb_
165
}
166
167
pub(crate) trait UniqueFormatValidityChecks {
168
    /// Checks unique rules inherited from the `Body` for chargeable transaction.
169
    fn check_unique_rules(
170
        &self,
171
        consensus_params: &ConsensusParameters,
172
    ) -> Result<(), ValidityError>;
173
}
174
175
impl<Body, MetadataBody> FormatValidityChecks
176
    for ChargeableTransaction<Body, MetadataBody>
177
where
178
    Body: BodyConstraints + PrepareSign,
179
    Self: Clone,
180
    Self: ChargeableBody<Body>,
181
    Self: fuel_types::canonical::Serialize,
182
    Self: Chargeable,
183
    Self: UniqueFormatValidityChecks,
184
{
185
4.38k
    fn check_signatures(&self, chain_id: &ChainId) -> Result<(), ValidityError> {
186
4.38k
        let id = self.id(chain_id);
187
4.38k
188
4.38k
        // There will be at most len(witnesses) signatures to cache
189
4.38k
        let mut recovery_cache = Some(HashMap::with_capacity(self.witnesses().len()));
190
4.38k
191
4.38k
        self.inputs()
192
4.38k
            .iter()
193
4.38k
            .enumerate()
194
6.57k
            .try_for_each(|(index, input)| {
195
6.57k
                input.check_signature(index, &id, self.witnesses(), &mut recovery_cache)
196
6.57k
            })?;
Unexecuted instantiation: _RNCNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB7_21ChargeableTransactionNtNtB9_4blob8BlobBodyNtB1L_12BlobMetadataENtNtBb_8validity20FormatValidityChecks16check_signatures0Csg6P9hFxt0iW_7fuel_vm
_RNCNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB7_21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1L_14CreateMetadataENtNtBb_8validity20FormatValidityChecks16check_signatures0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
194
2.19k
            .try_for_each(|(index, input)| {
195
2.19k
                input.check_signature(index, &id, self.witnesses(), &mut recovery_cache)
196
2.19k
            })?;
_RNCNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB7_21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1L_14ScriptMetadataENtNtBb_8validity20FormatValidityChecks16check_signatures0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
194
4.38k
            .try_for_each(|(index, input)| {
195
4.38k
                input.check_signature(index, &id, self.witnesses(), &mut recovery_cache)
196
4.38k
            })?;
Unexecuted instantiation: _RNCNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB7_21ChargeableTransactionNtNtB9_6upload10UploadBodyNtB1L_14UploadMetadataENtNtBb_8validity20FormatValidityChecks16check_signatures0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB7_21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1L_15UpgradeMetadataENtNtBb_8validity20FormatValidityChecks16check_signatures0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB7_21ChargeableTransactionNtNtB9_4blob8BlobBodyNtB1L_12BlobMetadataENtNtBb_8validity20FormatValidityChecks16check_signatures0Bd_
Unexecuted instantiation: _RNCNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB7_21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1L_14CreateMetadataENtNtBb_8validity20FormatValidityChecks16check_signatures0Bd_
Unexecuted instantiation: _RNCNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB7_21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1L_14ScriptMetadataENtNtBb_8validity20FormatValidityChecks16check_signatures0Bd_
Unexecuted instantiation: _RNCNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB7_21ChargeableTransactionNtNtB9_6upload10UploadBodyNtB1L_14UploadMetadataENtNtBb_8validity20FormatValidityChecks16check_signatures0Bd_
Unexecuted instantiation: _RNCNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB7_21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1L_15UpgradeMetadataENtNtBb_8validity20FormatValidityChecks16check_signatures0Bd_
197
198
4.38k
        Ok(())
199
4.38k
    }
Unexecuted instantiation: _RNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1J_12BlobMetadataENtNtB9_8validity20FormatValidityChecks16check_signaturesCsg6P9hFxt0iW_7fuel_vm
_RNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1J_14CreateMetadataENtNtB9_8validity20FormatValidityChecks16check_signaturesCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
185
2.19k
    fn check_signatures(&self, chain_id: &ChainId) -> Result<(), ValidityError> {
186
2.19k
        let id = self.id(chain_id);
187
2.19k
188
2.19k
        // There will be at most len(witnesses) signatures to cache
189
2.19k
        let mut recovery_cache = Some(HashMap::with_capacity(self.witnesses().len()));
190
2.19k
191
2.19k
        self.inputs()
192
2.19k
            .iter()
193
2.19k
            .enumerate()
194
2.19k
            .try_for_each(|(index, input)| {
195
                input.check_signature(index, &id, self.witnesses(), &mut recovery_cache)
196
2.19k
            })?;
197
198
2.19k
        Ok(())
199
2.19k
    }
_RNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1J_14ScriptMetadataENtNtB9_8validity20FormatValidityChecks16check_signaturesCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
185
2.19k
    fn check_signatures(&self, chain_id: &ChainId) -> Result<(), ValidityError> {
186
2.19k
        let id = self.id(chain_id);
187
2.19k
188
2.19k
        // There will be at most len(witnesses) signatures to cache
189
2.19k
        let mut recovery_cache = Some(HashMap::with_capacity(self.witnesses().len()));
190
2.19k
191
2.19k
        self.inputs()
192
2.19k
            .iter()
193
2.19k
            .enumerate()
194
2.19k
            .try_for_each(|(index, input)| {
195
                input.check_signature(index, &id, self.witnesses(), &mut recovery_cache)
196
2.19k
            })?;
197
198
2.19k
        Ok(())
199
2.19k
    }
Unexecuted instantiation: _RNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1J_14UploadMetadataENtNtB9_8validity20FormatValidityChecks16check_signaturesCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1J_15UpgradeMetadataENtNtB9_8validity20FormatValidityChecks16check_signaturesCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1J_12BlobMetadataENtNtB9_8validity20FormatValidityChecks16check_signaturesBb_
Unexecuted instantiation: _RNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1J_14CreateMetadataENtNtB9_8validity20FormatValidityChecks16check_signaturesBb_
Unexecuted instantiation: _RNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1J_14ScriptMetadataENtNtB9_8validity20FormatValidityChecks16check_signaturesBb_
Unexecuted instantiation: _RNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1J_14UploadMetadataENtNtB9_8validity20FormatValidityChecks16check_signaturesBb_
Unexecuted instantiation: _RNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1J_15UpgradeMetadataENtNtB9_8validity20FormatValidityChecks16check_signaturesBb_
200
201
4.38k
    fn check_without_signatures(
202
4.38k
        &self,
203
4.38k
        block_height: BlockHeight,
204
4.38k
        consensus_params: &ConsensusParameters,
205
4.38k
    ) -> Result<(), ValidityError> {
206
4.38k
        check_common_part(self, block_height, consensus_params)?;
207
4.38k
        self.check_unique_rules(consensus_params)?;
208
209
4.38k
        Ok(())
210
4.38k
    }
Unexecuted instantiation: _RNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1J_12BlobMetadataENtNtB9_8validity20FormatValidityChecks24check_without_signaturesCsg6P9hFxt0iW_7fuel_vm
_RNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1J_14CreateMetadataENtNtB9_8validity20FormatValidityChecks24check_without_signaturesCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
201
2.19k
    fn check_without_signatures(
202
2.19k
        &self,
203
2.19k
        block_height: BlockHeight,
204
2.19k
        consensus_params: &ConsensusParameters,
205
2.19k
    ) -> Result<(), ValidityError> {
206
2.19k
        check_common_part(self, block_height, consensus_params)?;
207
2.19k
        self.check_unique_rules(consensus_params)?;
208
209
2.19k
        Ok(())
210
2.19k
    }
_RNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1J_14ScriptMetadataENtNtB9_8validity20FormatValidityChecks24check_without_signaturesCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
201
2.19k
    fn check_without_signatures(
202
2.19k
        &self,
203
2.19k
        block_height: BlockHeight,
204
2.19k
        consensus_params: &ConsensusParameters,
205
2.19k
    ) -> Result<(), ValidityError> {
206
2.19k
        check_common_part(self, block_height, consensus_params)?;
207
2.19k
        self.check_unique_rules(consensus_params)?;
208
209
2.19k
        Ok(())
210
2.19k
    }
Unexecuted instantiation: _RNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1J_14UploadMetadataENtNtB9_8validity20FormatValidityChecks24check_without_signaturesCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1J_15UpgradeMetadataENtNtB9_8validity20FormatValidityChecks24check_without_signaturesCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1J_12BlobMetadataENtNtB9_8validity20FormatValidityChecks24check_without_signaturesBb_
Unexecuted instantiation: _RNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1J_14CreateMetadataENtNtB9_8validity20FormatValidityChecks24check_without_signaturesBb_
Unexecuted instantiation: _RNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1J_14ScriptMetadataENtNtB9_8validity20FormatValidityChecks24check_without_signaturesBb_
Unexecuted instantiation: _RNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1J_14UploadMetadataENtNtB9_8validity20FormatValidityChecks24check_without_signaturesBb_
Unexecuted instantiation: _RNvXs3_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transactionINtB5_21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1J_15UpgradeMetadataENtNtB9_8validity20FormatValidityChecks24check_without_signaturesBb_
211
}
212
213
mod field {
214
    use super::*;
215
    use crate::field::ChargeableBody;
216
217
    impl<Body, MetadataBody> PoliciesField for ChargeableTransaction<Body, MetadataBody>
218
    where
219
        Body: BodyConstraints,
220
        Self: ChargeableBody<Body>,
221
    {
222
        #[inline(always)]
223
586k
        fn policies(&self) -> &Policies {
224
586k
            &self.policies
225
586k
        }
Unexecuted instantiation: _RNvXNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB4_21ChargeableTransactionNtNtB6_4blob8BlobBodyNtB1O_12BlobMetadataENtNtB8_5field8Policies8policiesCsg6P9hFxt0iW_7fuel_vm
_RNvXNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB4_21ChargeableTransactionNtNtB6_6create10CreateBodyNtB1O_14CreateMetadataENtNtB8_5field8Policies8policiesCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
223
35.0k
        fn policies(&self) -> &Policies {
224
35.0k
            &self.policies
225
35.0k
        }
_RNvXNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB4_21ChargeableTransactionNtNtB6_6script10ScriptBodyNtB1O_14ScriptMetadataENtNtB8_5field8Policies8policiesCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
223
551k
        fn policies(&self) -> &Policies {
224
551k
            &self.policies
225
551k
        }
Unexecuted instantiation: _RNvXNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB4_21ChargeableTransactionNtNtB6_6upload10UploadBodyNtB1O_14UploadMetadataENtNtB8_5field8Policies8policiesCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB4_21ChargeableTransactionNtNtB6_7upgrade11UpgradeBodyNtB1O_15UpgradeMetadataENtNtB8_5field8Policies8policiesCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB4_21ChargeableTransactionNtNtB6_4blob8BlobBodyNtB1O_12BlobMetadataENtNtB8_5field8Policies8policiesBa_
Unexecuted instantiation: _RNvXNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB4_21ChargeableTransactionNtNtB6_6create10CreateBodyNtB1O_14CreateMetadataENtNtB8_5field8Policies8policiesBa_
Unexecuted instantiation: _RNvXNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB4_21ChargeableTransactionNtNtB6_6script10ScriptBodyNtB1O_14ScriptMetadataENtNtB8_5field8Policies8policiesBa_
Unexecuted instantiation: _RNvXNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB4_21ChargeableTransactionNtNtB6_6upload10UploadBodyNtB1O_14UploadMetadataENtNtB8_5field8Policies8policiesBa_
Unexecuted instantiation: _RNvXNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB4_21ChargeableTransactionNtNtB6_7upgrade11UpgradeBodyNtB1O_15UpgradeMetadataENtNtB8_5field8Policies8policiesBa_
226
227
        #[inline(always)]
228
6.57k
        fn policies_mut(&mut self) -> &mut Policies {
229
6.57k
            &mut self.policies
230
6.57k
        }
_RNvXNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB4_21ChargeableTransactionNtNtB6_6script10ScriptBodyNtB1O_14ScriptMetadataENtNtB8_5field8Policies12policies_mutCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
228
2.19k
        fn policies_mut(&mut self) -> &mut Policies {
229
2.19k
            &mut self.policies
230
2.19k
        }
_RNvXNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB4_21ChargeableTransactionNtNtB6_6create10CreateBodyNtB1O_14CreateMetadataENtNtB8_5field8Policies12policies_mutCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
228
4.38k
        fn policies_mut(&mut self) -> &mut Policies {
229
4.38k
            &mut self.policies
230
4.38k
        }
Unexecuted instantiation: _RNvXNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB4_21ChargeableTransactionNtNtB6_4blob8BlobBodyNtB1O_12BlobMetadataENtNtB8_5field8Policies12policies_mutCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB4_21ChargeableTransactionNtNtB6_6script10ScriptBodyNtB1O_14ScriptMetadataENtNtB8_5field8Policies12policies_mutBa_
231
232
        #[inline(always)]
233
52.6k
        fn policies_offset(&self) -> usize {
234
52.6k
            self.body_offset_end()
235
52.6k
        }
Unexecuted instantiation: _RNvXNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB4_21ChargeableTransactionNtNtB6_4blob8BlobBodyNtB1O_12BlobMetadataENtNtB8_5field8Policies15policies_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB4_21ChargeableTransactionNtNtB6_6create10CreateBodyNtB1O_14CreateMetadataENtNtB8_5field8Policies15policies_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB4_21ChargeableTransactionNtNtB6_6script10ScriptBodyNtB1O_14ScriptMetadataENtNtB8_5field8Policies15policies_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB4_21ChargeableTransactionNtNtB6_6upload10UploadBodyNtB1O_14UploadMetadataENtNtB8_5field8Policies15policies_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB4_21ChargeableTransactionNtNtB6_7upgrade11UpgradeBodyNtB1O_15UpgradeMetadataENtNtB8_5field8Policies15policies_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB4_21ChargeableTransactionNtNtB6_4blob8BlobBodyNtB1O_12BlobMetadataENtNtB8_5field8Policies15policies_offsetBa_
_RNvXNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB4_21ChargeableTransactionNtNtB6_6create10CreateBodyNtB1O_14CreateMetadataENtNtB8_5field8Policies15policies_offsetBa_
Line
Count
Source
233
26.3k
        fn policies_offset(&self) -> usize {
234
26.3k
            self.body_offset_end()
235
26.3k
        }
_RNvXNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB4_21ChargeableTransactionNtNtB6_6script10ScriptBodyNtB1O_14ScriptMetadataENtNtB8_5field8Policies15policies_offsetBa_
Line
Count
Source
233
26.3k
        fn policies_offset(&self) -> usize {
234
26.3k
            self.body_offset_end()
235
26.3k
        }
Unexecuted instantiation: _RNvXNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB4_21ChargeableTransactionNtNtB6_6upload10UploadBodyNtB1O_14UploadMetadataENtNtB8_5field8Policies15policies_offsetBa_
Unexecuted instantiation: _RNvXNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB4_21ChargeableTransactionNtNtB6_7upgrade11UpgradeBodyNtB1O_15UpgradeMetadataENtNtB8_5field8Policies15policies_offsetBa_
236
    }
237
238
    impl<Body, MetadataBody> Inputs for ChargeableTransaction<Body, MetadataBody>
239
    where
240
        Body: BodyConstraints,
241
        Self: ChargeableBody<Body>,
242
    {
243
        #[inline(always)]
244
4.23M
        fn inputs(&self) -> &Vec<Input> {
245
4.23M
            &self.inputs
246
4.23M
        }
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_4blob8BlobBodyNtB1Q_12BlobMetadataENtNtBa_5field6Inputs6inputsCsg6P9hFxt0iW_7fuel_vm
_RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6create10CreateBodyNtB1Q_14CreateMetadataENtNtBa_5field6Inputs6inputsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
244
50.4k
        fn inputs(&self) -> &Vec<Input> {
245
50.4k
            &self.inputs
246
50.4k
        }
_RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6script10ScriptBodyNtB1Q_14ScriptMetadataENtNtBa_5field6Inputs6inputsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
244
4.11M
        fn inputs(&self) -> &Vec<Input> {
245
4.11M
            &self.inputs
246
4.11M
        }
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6upload10UploadBodyNtB1Q_14UploadMetadataENtNtBa_5field6Inputs6inputsCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_7upgrade11UpgradeBodyNtB1Q_15UpgradeMetadataENtNtBa_5field6Inputs6inputsCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_4blob8BlobBodyNtB1Q_12BlobMetadataENtNtBa_5field6Inputs6inputsBc_
_RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6create10CreateBodyNtB1Q_14CreateMetadataENtNtBa_5field6Inputs6inputsBc_
Line
Count
Source
244
30.7k
        fn inputs(&self) -> &Vec<Input> {
245
30.7k
            &self.inputs
246
30.7k
        }
_RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6script10ScriptBodyNtB1Q_14ScriptMetadataENtNtBa_5field6Inputs6inputsBc_
Line
Count
Source
244
35.0k
        fn inputs(&self) -> &Vec<Input> {
245
35.0k
            &self.inputs
246
35.0k
        }
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6upload10UploadBodyNtB1Q_14UploadMetadataENtNtBa_5field6Inputs6inputsBc_
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_7upgrade11UpgradeBodyNtB1Q_15UpgradeMetadataENtNtBa_5field6Inputs6inputsBc_
247
248
        #[inline(always)]
249
24.1k
        fn inputs_mut(&mut self) -> &mut Vec<Input> {
250
24.1k
            &mut self.inputs
251
24.1k
        }
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_4blob8BlobBodyNtB1Q_12BlobMetadataENtNtBa_5field6Inputs10inputs_mutCsg6P9hFxt0iW_7fuel_vm
_RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6create10CreateBodyNtB1Q_14CreateMetadataENtNtBa_5field6Inputs10inputs_mutCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
249
6.57k
        fn inputs_mut(&mut self) -> &mut Vec<Input> {
250
6.57k
            &mut self.inputs
251
6.57k
        }
_RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6script10ScriptBodyNtB1Q_14ScriptMetadataENtNtBa_5field6Inputs10inputs_mutCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
249
8.77k
        fn inputs_mut(&mut self) -> &mut Vec<Input> {
250
8.77k
            &mut self.inputs
251
8.77k
        }
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6upload10UploadBodyNtB1Q_14UploadMetadataENtNtBa_5field6Inputs10inputs_mutCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_7upgrade11UpgradeBodyNtB1Q_15UpgradeMetadataENtNtBa_5field6Inputs10inputs_mutCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_4blob8BlobBodyNtB1Q_12BlobMetadataENtNtBa_5field6Inputs10inputs_mutBc_
_RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6create10CreateBodyNtB1Q_14CreateMetadataENtNtBa_5field6Inputs10inputs_mutBc_
Line
Count
Source
249
4.38k
        fn inputs_mut(&mut self) -> &mut Vec<Input> {
250
4.38k
            &mut self.inputs
251
4.38k
        }
_RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6script10ScriptBodyNtB1Q_14ScriptMetadataENtNtBa_5field6Inputs10inputs_mutBc_
Line
Count
Source
249
4.38k
        fn inputs_mut(&mut self) -> &mut Vec<Input> {
250
4.38k
            &mut self.inputs
251
4.38k
        }
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6upload10UploadBodyNtB1Q_14UploadMetadataENtNtBa_5field6Inputs10inputs_mutBc_
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_7upgrade11UpgradeBodyNtB1Q_15UpgradeMetadataENtNtBa_5field6Inputs10inputs_mutBc_
252
253
        #[inline(always)]
254
52.6k
        fn inputs_offset(&self) -> usize {
255
            if let Some(ChargeableMetadata {
256
0
                common: CommonMetadata { inputs_offset, .. },
257
                ..
258
52.6k
            }) = &self.metadata
259
            {
260
0
                return *inputs_offset;
261
52.6k
            }
262
52.6k
263
52.6k
            self.policies_offset()
264
52.6k
                .saturating_add(self.policies.size_dynamic())
265
52.6k
        }
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_4blob8BlobBodyNtB1Q_12BlobMetadataENtNtBa_5field6Inputs13inputs_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6create10CreateBodyNtB1Q_14CreateMetadataENtNtBa_5field6Inputs13inputs_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6script10ScriptBodyNtB1Q_14ScriptMetadataENtNtBa_5field6Inputs13inputs_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6upload10UploadBodyNtB1Q_14UploadMetadataENtNtBa_5field6Inputs13inputs_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_7upgrade11UpgradeBodyNtB1Q_15UpgradeMetadataENtNtBa_5field6Inputs13inputs_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_4blob8BlobBodyNtB1Q_12BlobMetadataENtNtBa_5field6Inputs13inputs_offsetBc_
_RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6create10CreateBodyNtB1Q_14CreateMetadataENtNtBa_5field6Inputs13inputs_offsetBc_
Line
Count
Source
254
26.3k
        fn inputs_offset(&self) -> usize {
255
            if let Some(ChargeableMetadata {
256
0
                common: CommonMetadata { inputs_offset, .. },
257
                ..
258
26.3k
            }) = &self.metadata
259
            {
260
0
                return *inputs_offset;
261
26.3k
            }
262
26.3k
263
26.3k
            self.policies_offset()
264
26.3k
                .saturating_add(self.policies.size_dynamic())
265
26.3k
        }
_RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6script10ScriptBodyNtB1Q_14ScriptMetadataENtNtBa_5field6Inputs13inputs_offsetBc_
Line
Count
Source
254
26.3k
        fn inputs_offset(&self) -> usize {
255
            if let Some(ChargeableMetadata {
256
0
                common: CommonMetadata { inputs_offset, .. },
257
                ..
258
26.3k
            }) = &self.metadata
259
            {
260
0
                return *inputs_offset;
261
26.3k
            }
262
26.3k
263
26.3k
            self.policies_offset()
264
26.3k
                .saturating_add(self.policies.size_dynamic())
265
26.3k
        }
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6upload10UploadBodyNtB1Q_14UploadMetadataENtNtBa_5field6Inputs13inputs_offsetBc_
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_7upgrade11UpgradeBodyNtB1Q_15UpgradeMetadataENtNtBa_5field6Inputs13inputs_offsetBc_
266
267
        #[inline(always)]
268
2.86M
        fn inputs_offset_at(&self, idx: usize) -> Option<usize> {
269
            if let Some(ChargeableMetadata {
270
                common:
271
                    CommonMetadata {
272
2.86M
                        inputs_offset_at, ..
273
                    },
274
                ..
275
2.86M
            }) = &self.metadata
276
            {
277
2.86M
                return inputs_offset_at.get(idx).cloned();
278
0
            }
279
0
280
0
            if idx < self.inputs.len() {
281
0
                Some(
282
0
                    self.inputs_offset().saturating_add(
283
0
                        self.inputs()
284
0
                            .iter()
285
0
                            .take(idx)
286
0
                            .map(|i| i.size())
Unexecuted instantiation: _RNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB8_21ChargeableTransactionNtNtBa_4blob8BlobBodyNtB1S_12BlobMetadataENtNtBc_5field6Inputs16inputs_offset_at0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB8_21ChargeableTransactionNtNtBa_6create10CreateBodyNtB1S_14CreateMetadataENtNtBc_5field6Inputs16inputs_offset_at0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB8_21ChargeableTransactionNtNtBa_6script10ScriptBodyNtB1S_14ScriptMetadataENtNtBc_5field6Inputs16inputs_offset_at0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB8_21ChargeableTransactionNtNtBa_6upload10UploadBodyNtB1S_14UploadMetadataENtNtBc_5field6Inputs16inputs_offset_at0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB8_21ChargeableTransactionNtNtBa_7upgrade11UpgradeBodyNtB1S_15UpgradeMetadataENtNtBc_5field6Inputs16inputs_offset_at0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB8_21ChargeableTransactionNtNtBa_4blob8BlobBodyNtB1S_12BlobMetadataENtNtBc_5field6Inputs16inputs_offset_at0Be_
Unexecuted instantiation: _RNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB8_21ChargeableTransactionNtNtBa_6create10CreateBodyNtB1S_14CreateMetadataENtNtBc_5field6Inputs16inputs_offset_at0Be_
Unexecuted instantiation: _RNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB8_21ChargeableTransactionNtNtBa_6script10ScriptBodyNtB1S_14ScriptMetadataENtNtBc_5field6Inputs16inputs_offset_at0Be_
Unexecuted instantiation: _RNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB8_21ChargeableTransactionNtNtBa_6upload10UploadBodyNtB1S_14UploadMetadataENtNtBc_5field6Inputs16inputs_offset_at0Be_
Unexecuted instantiation: _RNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB8_21ChargeableTransactionNtNtBa_7upgrade11UpgradeBodyNtB1S_15UpgradeMetadataENtNtBc_5field6Inputs16inputs_offset_at0Be_
287
0
                            .reduce(usize::saturating_add)
288
0
                            .unwrap_or_default(),
289
0
                    ),
290
0
                )
291
            } else {
292
0
                None
293
            }
294
2.86M
        }
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_4blob8BlobBodyNtB1Q_12BlobMetadataENtNtBa_5field6Inputs16inputs_offset_atCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6create10CreateBodyNtB1Q_14CreateMetadataENtNtBa_5field6Inputs16inputs_offset_atCsg6P9hFxt0iW_7fuel_vm
_RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6script10ScriptBodyNtB1Q_14ScriptMetadataENtNtBa_5field6Inputs16inputs_offset_atCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
268
2.86M
        fn inputs_offset_at(&self, idx: usize) -> Option<usize> {
269
            if let Some(ChargeableMetadata {
270
                common:
271
                    CommonMetadata {
272
2.86M
                        inputs_offset_at, ..
273
                    },
274
                ..
275
2.86M
            }) = &self.metadata
276
            {
277
2.86M
                return inputs_offset_at.get(idx).cloned();
278
0
            }
279
0
280
0
            if idx < self.inputs.len() {
281
0
                Some(
282
0
                    self.inputs_offset().saturating_add(
283
0
                        self.inputs()
284
0
                            .iter()
285
0
                            .take(idx)
286
0
                            .map(|i| i.size())
287
0
                            .reduce(usize::saturating_add)
288
0
                            .unwrap_or_default(),
289
0
                    ),
290
0
                )
291
            } else {
292
0
                None
293
            }
294
2.86M
        }
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6upload10UploadBodyNtB1Q_14UploadMetadataENtNtBa_5field6Inputs16inputs_offset_atCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_7upgrade11UpgradeBodyNtB1Q_15UpgradeMetadataENtNtBa_5field6Inputs16inputs_offset_atCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_4blob8BlobBodyNtB1Q_12BlobMetadataENtNtBa_5field6Inputs16inputs_offset_atBc_
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6create10CreateBodyNtB1Q_14CreateMetadataENtNtBa_5field6Inputs16inputs_offset_atBc_
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6script10ScriptBodyNtB1Q_14ScriptMetadataENtNtBa_5field6Inputs16inputs_offset_atBc_
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6upload10UploadBodyNtB1Q_14UploadMetadataENtNtBa_5field6Inputs16inputs_offset_atBc_
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_7upgrade11UpgradeBodyNtB1Q_15UpgradeMetadataENtNtBa_5field6Inputs16inputs_offset_atBc_
295
296
        #[inline(always)]
297
19.7k
        fn inputs_predicate_offset_at(&self, idx: usize) -> Option<(usize, usize)> {
298
            if let Some(ChargeableMetadata {
299
                common:
300
                    CommonMetadata {
301
6.57k
                        inputs_predicate_offset_at,
302
                        ..
303
                    },
304
                ..
305
19.7k
            }) = &self.metadata
306
            {
307
6.57k
                return inputs_predicate_offset_at.get(idx).cloned().unwrap_or(None);
308
13.1k
            }
309
13.1k
310
13.1k
            self.inputs().get(idx).and_then(|input| {
311
13.1k
                input
312
13.1k
                    .predicate_offset()
313
13.1k
                    .and_then(|predicate| {
314
0
                        self.inputs_offset_at(idx)
315
0
                            .map(|inputs| inputs.saturating_add(predicate))
Unexecuted instantiation: _RNCNCNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtBc_21ChargeableTransactionNtNtBe_4blob8BlobBodyNtB1W_12BlobMetadataENtNtBg_5field6Inputs26inputs_predicate_offset_at000Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNCNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtBc_21ChargeableTransactionNtNtBe_6create10CreateBodyNtB1W_14CreateMetadataENtNtBg_5field6Inputs26inputs_predicate_offset_at000Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNCNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtBc_21ChargeableTransactionNtNtBe_6script10ScriptBodyNtB1W_14ScriptMetadataENtNtBg_5field6Inputs26inputs_predicate_offset_at000Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNCNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtBc_21ChargeableTransactionNtNtBe_6upload10UploadBodyNtB1W_14UploadMetadataENtNtBg_5field6Inputs26inputs_predicate_offset_at000Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNCNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtBc_21ChargeableTransactionNtNtBe_7upgrade11UpgradeBodyNtB1W_15UpgradeMetadataENtNtBg_5field6Inputs26inputs_predicate_offset_at000Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNCNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtBc_21ChargeableTransactionNtNtBe_4blob8BlobBodyNtB1W_12BlobMetadataENtNtBg_5field6Inputs26inputs_predicate_offset_at000Bi_
Unexecuted instantiation: _RNCNCNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtBc_21ChargeableTransactionNtNtBe_6create10CreateBodyNtB1W_14CreateMetadataENtNtBg_5field6Inputs26inputs_predicate_offset_at000Bi_
Unexecuted instantiation: _RNCNCNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtBc_21ChargeableTransactionNtNtBe_6script10ScriptBodyNtB1W_14ScriptMetadataENtNtBg_5field6Inputs26inputs_predicate_offset_at000Bi_
Unexecuted instantiation: _RNCNCNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtBc_21ChargeableTransactionNtNtBe_6upload10UploadBodyNtB1W_14UploadMetadataENtNtBg_5field6Inputs26inputs_predicate_offset_at000Bi_
Unexecuted instantiation: _RNCNCNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtBc_21ChargeableTransactionNtNtBe_7upgrade11UpgradeBodyNtB1W_15UpgradeMetadataENtNtBg_5field6Inputs26inputs_predicate_offset_at000Bi_
316
13.1k
                    })
Unexecuted instantiation: _RNCNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtBa_21ChargeableTransactionNtNtBc_4blob8BlobBodyNtB1U_12BlobMetadataENtNtBe_5field6Inputs26inputs_predicate_offset_at00Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtBa_21ChargeableTransactionNtNtBc_6create10CreateBodyNtB1U_14CreateMetadataENtNtBe_5field6Inputs26inputs_predicate_offset_at00Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtBa_21ChargeableTransactionNtNtBc_6script10ScriptBodyNtB1U_14ScriptMetadataENtNtBe_5field6Inputs26inputs_predicate_offset_at00Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtBa_21ChargeableTransactionNtNtBc_6upload10UploadBodyNtB1U_14UploadMetadataENtNtBe_5field6Inputs26inputs_predicate_offset_at00Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtBa_21ChargeableTransactionNtNtBc_7upgrade11UpgradeBodyNtB1U_15UpgradeMetadataENtNtBe_5field6Inputs26inputs_predicate_offset_at00Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtBa_21ChargeableTransactionNtNtBc_4blob8BlobBodyNtB1U_12BlobMetadataENtNtBe_5field6Inputs26inputs_predicate_offset_at00Bg_
Unexecuted instantiation: _RNCNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtBa_21ChargeableTransactionNtNtBc_6create10CreateBodyNtB1U_14CreateMetadataENtNtBe_5field6Inputs26inputs_predicate_offset_at00Bg_
Unexecuted instantiation: _RNCNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtBa_21ChargeableTransactionNtNtBc_6script10ScriptBodyNtB1U_14ScriptMetadataENtNtBe_5field6Inputs26inputs_predicate_offset_at00Bg_
Unexecuted instantiation: _RNCNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtBa_21ChargeableTransactionNtNtBc_6upload10UploadBodyNtB1U_14UploadMetadataENtNtBe_5field6Inputs26inputs_predicate_offset_at00Bg_
Unexecuted instantiation: _RNCNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtBa_21ChargeableTransactionNtNtBc_7upgrade11UpgradeBodyNtB1U_15UpgradeMetadataENtNtBe_5field6Inputs26inputs_predicate_offset_at00Bg_
317
13.1k
                    .zip(input.predicate_len().and_then(bytes::padded_len_usize))
318
13.1k
            })
Unexecuted instantiation: _RNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB8_21ChargeableTransactionNtNtBa_4blob8BlobBodyNtB1S_12BlobMetadataENtNtBc_5field6Inputs26inputs_predicate_offset_at0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB8_21ChargeableTransactionNtNtBa_6create10CreateBodyNtB1S_14CreateMetadataENtNtBc_5field6Inputs26inputs_predicate_offset_at0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB8_21ChargeableTransactionNtNtBa_6script10ScriptBodyNtB1S_14ScriptMetadataENtNtBc_5field6Inputs26inputs_predicate_offset_at0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB8_21ChargeableTransactionNtNtBa_6upload10UploadBodyNtB1S_14UploadMetadataENtNtBc_5field6Inputs26inputs_predicate_offset_at0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB8_21ChargeableTransactionNtNtBa_7upgrade11UpgradeBodyNtB1S_15UpgradeMetadataENtNtBc_5field6Inputs26inputs_predicate_offset_at0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB8_21ChargeableTransactionNtNtBa_4blob8BlobBodyNtB1S_12BlobMetadataENtNtBc_5field6Inputs26inputs_predicate_offset_at0Be_
_RNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB8_21ChargeableTransactionNtNtBa_6create10CreateBodyNtB1S_14CreateMetadataENtNtBc_5field6Inputs26inputs_predicate_offset_at0Be_
Line
Count
Source
310
4.38k
            self.inputs().get(idx).and_then(|input| {
311
4.38k
                input
312
4.38k
                    .predicate_offset()
313
4.38k
                    .and_then(|predicate| {
314
                        self.inputs_offset_at(idx)
315
                            .map(|inputs| inputs.saturating_add(predicate))
316
4.38k
                    })
317
4.38k
                    .zip(input.predicate_len().and_then(bytes::padded_len_usize))
318
4.38k
            })
_RNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB8_21ChargeableTransactionNtNtBa_6script10ScriptBodyNtB1S_14ScriptMetadataENtNtBc_5field6Inputs26inputs_predicate_offset_at0Be_
Line
Count
Source
310
8.77k
            self.inputs().get(idx).and_then(|input| {
311
8.77k
                input
312
8.77k
                    .predicate_offset()
313
8.77k
                    .and_then(|predicate| {
314
                        self.inputs_offset_at(idx)
315
                            .map(|inputs| inputs.saturating_add(predicate))
316
8.77k
                    })
317
8.77k
                    .zip(input.predicate_len().and_then(bytes::padded_len_usize))
318
8.77k
            })
Unexecuted instantiation: _RNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB8_21ChargeableTransactionNtNtBa_6upload10UploadBodyNtB1S_14UploadMetadataENtNtBc_5field6Inputs26inputs_predicate_offset_at0Be_
Unexecuted instantiation: _RNCNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB8_21ChargeableTransactionNtNtBa_7upgrade11UpgradeBodyNtB1S_15UpgradeMetadataENtNtBc_5field6Inputs26inputs_predicate_offset_at0Be_
319
19.7k
        }
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_4blob8BlobBodyNtB1Q_12BlobMetadataENtNtBa_5field6Inputs26inputs_predicate_offset_atCsg6P9hFxt0iW_7fuel_vm
_RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6create10CreateBodyNtB1Q_14CreateMetadataENtNtBa_5field6Inputs26inputs_predicate_offset_atCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
297
2.19k
        fn inputs_predicate_offset_at(&self, idx: usize) -> Option<(usize, usize)> {
298
            if let Some(ChargeableMetadata {
299
                common:
300
                    CommonMetadata {
301
2.19k
                        inputs_predicate_offset_at,
302
                        ..
303
                    },
304
                ..
305
2.19k
            }) = &self.metadata
306
            {
307
2.19k
                return inputs_predicate_offset_at.get(idx).cloned().unwrap_or(None);
308
0
            }
309
0
310
0
            self.inputs().get(idx).and_then(|input| {
311
                input
312
                    .predicate_offset()
313
                    .and_then(|predicate| {
314
                        self.inputs_offset_at(idx)
315
                            .map(|inputs| inputs.saturating_add(predicate))
316
                    })
317
                    .zip(input.predicate_len().and_then(bytes::padded_len_usize))
318
0
            })
319
2.19k
        }
_RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6script10ScriptBodyNtB1Q_14ScriptMetadataENtNtBa_5field6Inputs26inputs_predicate_offset_atCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
297
4.38k
        fn inputs_predicate_offset_at(&self, idx: usize) -> Option<(usize, usize)> {
298
            if let Some(ChargeableMetadata {
299
                common:
300
                    CommonMetadata {
301
4.38k
                        inputs_predicate_offset_at,
302
                        ..
303
                    },
304
                ..
305
4.38k
            }) = &self.metadata
306
            {
307
4.38k
                return inputs_predicate_offset_at.get(idx).cloned().unwrap_or(None);
308
0
            }
309
0
310
0
            self.inputs().get(idx).and_then(|input| {
311
                input
312
                    .predicate_offset()
313
                    .and_then(|predicate| {
314
                        self.inputs_offset_at(idx)
315
                            .map(|inputs| inputs.saturating_add(predicate))
316
                    })
317
                    .zip(input.predicate_len().and_then(bytes::padded_len_usize))
318
0
            })
319
4.38k
        }
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6upload10UploadBodyNtB1Q_14UploadMetadataENtNtBa_5field6Inputs26inputs_predicate_offset_atCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_7upgrade11UpgradeBodyNtB1Q_15UpgradeMetadataENtNtBa_5field6Inputs26inputs_predicate_offset_atCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_4blob8BlobBodyNtB1Q_12BlobMetadataENtNtBa_5field6Inputs26inputs_predicate_offset_atBc_
_RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6create10CreateBodyNtB1Q_14CreateMetadataENtNtBa_5field6Inputs26inputs_predicate_offset_atBc_
Line
Count
Source
297
4.38k
        fn inputs_predicate_offset_at(&self, idx: usize) -> Option<(usize, usize)> {
298
            if let Some(ChargeableMetadata {
299
                common:
300
                    CommonMetadata {
301
0
                        inputs_predicate_offset_at,
302
                        ..
303
                    },
304
                ..
305
4.38k
            }) = &self.metadata
306
            {
307
0
                return inputs_predicate_offset_at.get(idx).cloned().unwrap_or(None);
308
4.38k
            }
309
4.38k
310
4.38k
            self.inputs().get(idx).and_then(|input| {
311
                input
312
                    .predicate_offset()
313
                    .and_then(|predicate| {
314
                        self.inputs_offset_at(idx)
315
                            .map(|inputs| inputs.saturating_add(predicate))
316
                    })
317
                    .zip(input.predicate_len().and_then(bytes::padded_len_usize))
318
4.38k
            })
319
4.38k
        }
_RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6script10ScriptBodyNtB1Q_14ScriptMetadataENtNtBa_5field6Inputs26inputs_predicate_offset_atBc_
Line
Count
Source
297
8.77k
        fn inputs_predicate_offset_at(&self, idx: usize) -> Option<(usize, usize)> {
298
            if let Some(ChargeableMetadata {
299
                common:
300
                    CommonMetadata {
301
0
                        inputs_predicate_offset_at,
302
                        ..
303
                    },
304
                ..
305
8.77k
            }) = &self.metadata
306
            {
307
0
                return inputs_predicate_offset_at.get(idx).cloned().unwrap_or(None);
308
8.77k
            }
309
8.77k
310
8.77k
            self.inputs().get(idx).and_then(|input| {
311
                input
312
                    .predicate_offset()
313
                    .and_then(|predicate| {
314
                        self.inputs_offset_at(idx)
315
                            .map(|inputs| inputs.saturating_add(predicate))
316
                    })
317
                    .zip(input.predicate_len().and_then(bytes::padded_len_usize))
318
8.77k
            })
319
8.77k
        }
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_6upload10UploadBodyNtB1Q_14UploadMetadataENtNtBa_5field6Inputs26inputs_predicate_offset_atBc_
Unexecuted instantiation: _RNvXs_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB6_21ChargeableTransactionNtNtB8_7upgrade11UpgradeBodyNtB1Q_15UpgradeMetadataENtNtBa_5field6Inputs26inputs_predicate_offset_atBc_
320
    }
321
322
    impl<Body, MetadataBody> Outputs for ChargeableTransaction<Body, MetadataBody>
323
    where
324
        Body: BodyConstraints,
325
        Self: ChargeableBody<Body>,
326
    {
327
        #[inline(always)]
328
1.64M
        fn outputs(&self) -> &Vec<Output> {
329
1.64M
            &self.outputs
330
1.64M
        }
Unexecuted instantiation: _RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_4blob8BlobBodyNtB1R_12BlobMetadataENtNtBb_5field7Outputs7outputsCsg6P9hFxt0iW_7fuel_vm
_RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1R_14CreateMetadataENtNtBb_5field7Outputs7outputsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
328
17.5k
        fn outputs(&self) -> &Vec<Output> {
329
17.5k
            &self.outputs
330
17.5k
        }
_RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1R_14ScriptMetadataENtNtBb_5field7Outputs7outputsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
328
1.59M
        fn outputs(&self) -> &Vec<Output> {
329
1.59M
            &self.outputs
330
1.59M
        }
Unexecuted instantiation: _RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6upload10UploadBodyNtB1R_14UploadMetadataENtNtBb_5field7Outputs7outputsCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1R_15UpgradeMetadataENtNtBb_5field7Outputs7outputsCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_4blob8BlobBodyNtB1R_12BlobMetadataENtNtBb_5field7Outputs7outputsBd_
_RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1R_14CreateMetadataENtNtBb_5field7Outputs7outputsBd_
Line
Count
Source
328
13.1k
        fn outputs(&self) -> &Vec<Output> {
329
13.1k
            &self.outputs
330
13.1k
        }
_RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1R_14ScriptMetadataENtNtBb_5field7Outputs7outputsBd_
Line
Count
Source
328
13.1k
        fn outputs(&self) -> &Vec<Output> {
329
13.1k
            &self.outputs
330
13.1k
        }
Unexecuted instantiation: _RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6upload10UploadBodyNtB1R_14UploadMetadataENtNtBb_5field7Outputs7outputsBd_
Unexecuted instantiation: _RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1R_15UpgradeMetadataENtNtBb_5field7Outputs7outputsBd_
331
332
        #[inline(always)]
333
35.0k
        fn outputs_mut(&mut self) -> &mut Vec<Output> {
334
35.0k
            &mut self.outputs
335
35.0k
        }
Unexecuted instantiation: _RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_4blob8BlobBodyNtB1R_12BlobMetadataENtNtBb_5field7Outputs11outputs_mutCsg6P9hFxt0iW_7fuel_vm
_RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1R_14CreateMetadataENtNtBb_5field7Outputs11outputs_mutCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
333
8.77k
        fn outputs_mut(&mut self) -> &mut Vec<Output> {
334
8.77k
            &mut self.outputs
335
8.77k
        }
_RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1R_14ScriptMetadataENtNtBb_5field7Outputs11outputs_mutCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
333
15.3k
        fn outputs_mut(&mut self) -> &mut Vec<Output> {
334
15.3k
            &mut self.outputs
335
15.3k
        }
Unexecuted instantiation: _RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6upload10UploadBodyNtB1R_14UploadMetadataENtNtBb_5field7Outputs11outputs_mutCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1R_15UpgradeMetadataENtNtBb_5field7Outputs11outputs_mutCsg6P9hFxt0iW_7fuel_vm
_RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1R_14CreateMetadataENtNtBb_5field7Outputs11outputs_mutBd_
Line
Count
Source
333
6.57k
        fn outputs_mut(&mut self) -> &mut Vec<Output> {
334
6.57k
            &mut self.outputs
335
6.57k
        }
Unexecuted instantiation: _RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_4blob8BlobBodyNtB1R_12BlobMetadataENtNtBb_5field7Outputs11outputs_mutBd_
_RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1R_14ScriptMetadataENtNtBb_5field7Outputs11outputs_mutBd_
Line
Count
Source
333
4.38k
        fn outputs_mut(&mut self) -> &mut Vec<Output> {
334
4.38k
            &mut self.outputs
335
4.38k
        }
Unexecuted instantiation: _RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6upload10UploadBodyNtB1R_14UploadMetadataENtNtBb_5field7Outputs11outputs_mutBd_
Unexecuted instantiation: _RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1R_15UpgradeMetadataENtNtBb_5field7Outputs11outputs_mutBd_
336
337
        #[inline(always)]
338
35.0k
        fn outputs_offset(&self) -> usize {
339
            if let Some(ChargeableMetadata {
340
0
                common: CommonMetadata { outputs_offset, .. },
341
                ..
342
35.0k
            }) = &self.metadata
343
            {
344
0
                return *outputs_offset;
345
35.0k
            }
346
35.0k
347
35.0k
            self.inputs_offset().saturating_add(
348
35.0k
                self.inputs()
349
35.0k
                    .iter()
350
52.6k
                    .map(|i| i.size())
Unexecuted instantiation: _RNCNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_4blob8BlobBodyNtB1T_12BlobMetadataENtNtBd_5field7Outputs14outputs_offset0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_6create10CreateBodyNtB1T_14CreateMetadataENtNtBd_5field7Outputs14outputs_offset0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_6script10ScriptBodyNtB1T_14ScriptMetadataENtNtBd_5field7Outputs14outputs_offset0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_6upload10UploadBodyNtB1T_14UploadMetadataENtNtBd_5field7Outputs14outputs_offset0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_7upgrade11UpgradeBodyNtB1T_15UpgradeMetadataENtNtBd_5field7Outputs14outputs_offset0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_4blob8BlobBodyNtB1T_12BlobMetadataENtNtBd_5field7Outputs14outputs_offset0Bf_
_RNCNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_6create10CreateBodyNtB1T_14CreateMetadataENtNtBd_5field7Outputs14outputs_offset0Bf_
Line
Count
Source
350
17.5k
                    .map(|i| i.size())
_RNCNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_6script10ScriptBodyNtB1T_14ScriptMetadataENtNtBd_5field7Outputs14outputs_offset0Bf_
Line
Count
Source
350
35.0k
                    .map(|i| i.size())
Unexecuted instantiation: _RNCNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_6upload10UploadBodyNtB1T_14UploadMetadataENtNtBd_5field7Outputs14outputs_offset0Bf_
Unexecuted instantiation: _RNCNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_7upgrade11UpgradeBodyNtB1T_15UpgradeMetadataENtNtBd_5field7Outputs14outputs_offset0Bf_
351
35.0k
                    .reduce(usize::saturating_add)
352
35.0k
                    .unwrap_or_default(),
353
35.0k
            )
354
35.0k
        }
Unexecuted instantiation: _RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_4blob8BlobBodyNtB1R_12BlobMetadataENtNtBb_5field7Outputs14outputs_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1R_14CreateMetadataENtNtBb_5field7Outputs14outputs_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1R_14ScriptMetadataENtNtBb_5field7Outputs14outputs_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6upload10UploadBodyNtB1R_14UploadMetadataENtNtBb_5field7Outputs14outputs_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1R_15UpgradeMetadataENtNtBb_5field7Outputs14outputs_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_4blob8BlobBodyNtB1R_12BlobMetadataENtNtBb_5field7Outputs14outputs_offsetBd_
_RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1R_14CreateMetadataENtNtBb_5field7Outputs14outputs_offsetBd_
Line
Count
Source
338
17.5k
        fn outputs_offset(&self) -> usize {
339
            if let Some(ChargeableMetadata {
340
0
                common: CommonMetadata { outputs_offset, .. },
341
                ..
342
17.5k
            }) = &self.metadata
343
            {
344
0
                return *outputs_offset;
345
17.5k
            }
346
17.5k
347
17.5k
            self.inputs_offset().saturating_add(
348
17.5k
                self.inputs()
349
17.5k
                    .iter()
350
17.5k
                    .map(|i| i.size())
351
17.5k
                    .reduce(usize::saturating_add)
352
17.5k
                    .unwrap_or_default(),
353
17.5k
            )
354
17.5k
        }
_RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1R_14ScriptMetadataENtNtBb_5field7Outputs14outputs_offsetBd_
Line
Count
Source
338
17.5k
        fn outputs_offset(&self) -> usize {
339
            if let Some(ChargeableMetadata {
340
0
                common: CommonMetadata { outputs_offset, .. },
341
                ..
342
17.5k
            }) = &self.metadata
343
            {
344
0
                return *outputs_offset;
345
17.5k
            }
346
17.5k
347
17.5k
            self.inputs_offset().saturating_add(
348
17.5k
                self.inputs()
349
17.5k
                    .iter()
350
17.5k
                    .map(|i| i.size())
351
17.5k
                    .reduce(usize::saturating_add)
352
17.5k
                    .unwrap_or_default(),
353
17.5k
            )
354
17.5k
        }
Unexecuted instantiation: _RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6upload10UploadBodyNtB1R_14UploadMetadataENtNtBb_5field7Outputs14outputs_offsetBd_
Unexecuted instantiation: _RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1R_15UpgradeMetadataENtNtBb_5field7Outputs14outputs_offsetBd_
355
356
        #[inline(always)]
357
1.14M
        fn outputs_offset_at(&self, idx: usize) -> Option<usize> {
358
            if let Some(ChargeableMetadata {
359
                common:
360
                    CommonMetadata {
361
1.14M
                        outputs_offset_at, ..
362
                    },
363
                ..
364
1.14M
            }) = &self.metadata
365
            {
366
1.14M
                return outputs_offset_at.get(idx).cloned();
367
0
            }
368
0
369
0
            if idx < self.outputs.len() {
370
0
                Some(
371
0
                    self.outputs_offset().saturating_add(
372
0
                        self.outputs()
373
0
                            .iter()
374
0
                            .take(idx)
375
0
                            .map(|i| i.size())
Unexecuted instantiation: _RNCNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_4blob8BlobBodyNtB1T_12BlobMetadataENtNtBd_5field7Outputs17outputs_offset_at0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_6create10CreateBodyNtB1T_14CreateMetadataENtNtBd_5field7Outputs17outputs_offset_at0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_6script10ScriptBodyNtB1T_14ScriptMetadataENtNtBd_5field7Outputs17outputs_offset_at0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_6upload10UploadBodyNtB1T_14UploadMetadataENtNtBd_5field7Outputs17outputs_offset_at0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_7upgrade11UpgradeBodyNtB1T_15UpgradeMetadataENtNtBd_5field7Outputs17outputs_offset_at0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXININtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fields0_0ppEINtB9_21ChargeableTransactionppENtNtBd_5field7Outputs17outputs_offset_at0Bf_
376
0
                            .reduce(usize::saturating_add)
377
0
                            .unwrap_or_default(),
378
0
                    ),
379
0
                )
380
            } else {
381
0
                None
382
            }
383
1.14M
        }
Unexecuted instantiation: _RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_4blob8BlobBodyNtB1R_12BlobMetadataENtNtBb_5field7Outputs17outputs_offset_atCsg6P9hFxt0iW_7fuel_vm
_RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1R_14CreateMetadataENtNtBb_5field7Outputs17outputs_offset_atCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
357
2.19k
        fn outputs_offset_at(&self, idx: usize) -> Option<usize> {
358
            if let Some(ChargeableMetadata {
359
                common:
360
                    CommonMetadata {
361
2.19k
                        outputs_offset_at, ..
362
                    },
363
                ..
364
2.19k
            }) = &self.metadata
365
            {
366
2.19k
                return outputs_offset_at.get(idx).cloned();
367
0
            }
368
0
369
0
            if idx < self.outputs.len() {
370
0
                Some(
371
0
                    self.outputs_offset().saturating_add(
372
0
                        self.outputs()
373
0
                            .iter()
374
0
                            .take(idx)
375
0
                            .map(|i| i.size())
376
0
                            .reduce(usize::saturating_add)
377
0
                            .unwrap_or_default(),
378
0
                    ),
379
0
                )
380
            } else {
381
0
                None
382
            }
383
2.19k
        }
_RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1R_14ScriptMetadataENtNtBb_5field7Outputs17outputs_offset_atCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
357
1.14M
        fn outputs_offset_at(&self, idx: usize) -> Option<usize> {
358
            if let Some(ChargeableMetadata {
359
                common:
360
                    CommonMetadata {
361
1.14M
                        outputs_offset_at, ..
362
                    },
363
                ..
364
1.14M
            }) = &self.metadata
365
            {
366
1.14M
                return outputs_offset_at.get(idx).cloned();
367
0
            }
368
0
369
0
            if idx < self.outputs.len() {
370
0
                Some(
371
0
                    self.outputs_offset().saturating_add(
372
0
                        self.outputs()
373
0
                            .iter()
374
0
                            .take(idx)
375
0
                            .map(|i| i.size())
376
0
                            .reduce(usize::saturating_add)
377
0
                            .unwrap_or_default(),
378
0
                    ),
379
0
                )
380
            } else {
381
0
                None
382
            }
383
1.14M
        }
Unexecuted instantiation: _RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6upload10UploadBodyNtB1R_14UploadMetadataENtNtBb_5field7Outputs17outputs_offset_atCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs0_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1R_15UpgradeMetadataENtNtBb_5field7Outputs17outputs_offset_atCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXININtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fields0_0ppEINtB7_21ChargeableTransactionppENtNtBb_5field7Outputs17outputs_offset_atBd_
384
    }
385
386
    impl<Body, MetadataBody> Witnesses for ChargeableTransaction<Body, MetadataBody>
387
    where
388
        Body: BodyConstraints,
389
        Self: ChargeableBody<Body>,
390
    {
391
        #[inline(always)]
392
1.11M
        fn witnesses(&self) -> &Vec<Witness> {
393
1.11M
            &self.witnesses
394
1.11M
        }
Unexecuted instantiation: _RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_4blob8BlobBodyNtB1R_12BlobMetadataENtNtBb_5field9Witnesses9witnessesCsg6P9hFxt0iW_7fuel_vm
_RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1R_14CreateMetadataENtNtBb_5field9Witnesses9witnessesCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
392
24.1k
        fn witnesses(&self) -> &Vec<Witness> {
393
24.1k
            &self.witnesses
394
24.1k
        }
_RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1R_14ScriptMetadataENtNtBb_5field9Witnesses9witnessesCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
392
1.08M
        fn witnesses(&self) -> &Vec<Witness> {
393
1.08M
            &self.witnesses
394
1.08M
        }
Unexecuted instantiation: _RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6upload10UploadBodyNtB1R_14UploadMetadataENtNtBb_5field9Witnesses9witnessesCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1R_15UpgradeMetadataENtNtBb_5field9Witnesses9witnessesCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_4blob8BlobBodyNtB1R_12BlobMetadataENtNtBb_5field9Witnesses9witnessesBd_
_RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1R_14CreateMetadataENtNtBb_5field9Witnesses9witnessesBd_
Line
Count
Source
392
4.38k
        fn witnesses(&self) -> &Vec<Witness> {
393
4.38k
            &self.witnesses
394
4.38k
        }
_RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1R_14ScriptMetadataENtNtBb_5field9Witnesses9witnessesBd_
Line
Count
Source
392
4.38k
        fn witnesses(&self) -> &Vec<Witness> {
393
4.38k
            &self.witnesses
394
4.38k
        }
Unexecuted instantiation: _RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6upload10UploadBodyNtB1R_14UploadMetadataENtNtBb_5field9Witnesses9witnessesBd_
Unexecuted instantiation: _RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1R_15UpgradeMetadataENtNtBb_5field9Witnesses9witnessesBd_
395
396
        #[inline(always)]
397
24.1k
        fn witnesses_mut(&mut self) -> &mut Vec<Witness> {
398
24.1k
            &mut self.witnesses
399
24.1k
        }
Unexecuted instantiation: _RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_4blob8BlobBodyNtB1R_12BlobMetadataENtNtBb_5field9Witnesses13witnesses_mutCsg6P9hFxt0iW_7fuel_vm
_RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1R_14CreateMetadataENtNtBb_5field9Witnesses13witnesses_mutCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
397
6.57k
        fn witnesses_mut(&mut self) -> &mut Vec<Witness> {
398
6.57k
            &mut self.witnesses
399
6.57k
        }
_RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1R_14ScriptMetadataENtNtBb_5field9Witnesses13witnesses_mutCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
397
6.57k
        fn witnesses_mut(&mut self) -> &mut Vec<Witness> {
398
6.57k
            &mut self.witnesses
399
6.57k
        }
Unexecuted instantiation: _RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6upload10UploadBodyNtB1R_14UploadMetadataENtNtBb_5field9Witnesses13witnesses_mutCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1R_15UpgradeMetadataENtNtBb_5field9Witnesses13witnesses_mutCsg6P9hFxt0iW_7fuel_vm
_RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1R_14CreateMetadataENtNtBb_5field9Witnesses13witnesses_mutBd_
Line
Count
Source
397
6.57k
        fn witnesses_mut(&mut self) -> &mut Vec<Witness> {
398
6.57k
            &mut self.witnesses
399
6.57k
        }
Unexecuted instantiation: _RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_4blob8BlobBodyNtB1R_12BlobMetadataENtNtBb_5field9Witnesses13witnesses_mutBd_
_RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1R_14ScriptMetadataENtNtBb_5field9Witnesses13witnesses_mutBd_
Line
Count
Source
397
4.38k
        fn witnesses_mut(&mut self) -> &mut Vec<Witness> {
398
4.38k
            &mut self.witnesses
399
4.38k
        }
Unexecuted instantiation: _RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6upload10UploadBodyNtB1R_14UploadMetadataENtNtBb_5field9Witnesses13witnesses_mutBd_
Unexecuted instantiation: _RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1R_15UpgradeMetadataENtNtBb_5field9Witnesses13witnesses_mutBd_
400
401
        #[inline(always)]
402
17.5k
        fn witnesses_offset(&self) -> usize {
403
            if let Some(ChargeableMetadata {
404
                common:
405
                    CommonMetadata {
406
0
                        witnesses_offset, ..
407
                    },
408
                ..
409
17.5k
            }) = &self.metadata
410
            {
411
0
                return *witnesses_offset;
412
17.5k
            }
413
17.5k
414
17.5k
            self.outputs_offset().saturating_add(
415
17.5k
                self.outputs()
416
17.5k
                    .iter()
417
26.3k
                    .map(|i| i.size())
Unexecuted instantiation: _RNCNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_4blob8BlobBodyNtB1T_12BlobMetadataENtNtBd_5field9Witnesses16witnesses_offset0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_6create10CreateBodyNtB1T_14CreateMetadataENtNtBd_5field9Witnesses16witnesses_offset0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_6script10ScriptBodyNtB1T_14ScriptMetadataENtNtBd_5field9Witnesses16witnesses_offset0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_6upload10UploadBodyNtB1T_14UploadMetadataENtNtBd_5field9Witnesses16witnesses_offset0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_7upgrade11UpgradeBodyNtB1T_15UpgradeMetadataENtNtBd_5field9Witnesses16witnesses_offset0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_4blob8BlobBodyNtB1T_12BlobMetadataENtNtBd_5field9Witnesses16witnesses_offset0Bf_
_RNCNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_6create10CreateBodyNtB1T_14CreateMetadataENtNtBd_5field9Witnesses16witnesses_offset0Bf_
Line
Count
Source
417
8.77k
                    .map(|i| i.size())
_RNCNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_6script10ScriptBodyNtB1T_14ScriptMetadataENtNtBd_5field9Witnesses16witnesses_offset0Bf_
Line
Count
Source
417
17.5k
                    .map(|i| i.size())
Unexecuted instantiation: _RNCNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_6upload10UploadBodyNtB1T_14UploadMetadataENtNtBd_5field9Witnesses16witnesses_offset0Bf_
Unexecuted instantiation: _RNCNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_7upgrade11UpgradeBodyNtB1T_15UpgradeMetadataENtNtBd_5field9Witnesses16witnesses_offset0Bf_
418
17.5k
                    .reduce(usize::saturating_add)
419
17.5k
                    .unwrap_or_default(),
420
17.5k
            )
421
17.5k
        }
Unexecuted instantiation: _RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_4blob8BlobBodyNtB1R_12BlobMetadataENtNtBb_5field9Witnesses16witnesses_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1R_14CreateMetadataENtNtBb_5field9Witnesses16witnesses_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1R_14ScriptMetadataENtNtBb_5field9Witnesses16witnesses_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6upload10UploadBodyNtB1R_14UploadMetadataENtNtBb_5field9Witnesses16witnesses_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1R_15UpgradeMetadataENtNtBb_5field9Witnesses16witnesses_offsetCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_4blob8BlobBodyNtB1R_12BlobMetadataENtNtBb_5field9Witnesses16witnesses_offsetBd_
_RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1R_14CreateMetadataENtNtBb_5field9Witnesses16witnesses_offsetBd_
Line
Count
Source
402
8.77k
        fn witnesses_offset(&self) -> usize {
403
            if let Some(ChargeableMetadata {
404
                common:
405
                    CommonMetadata {
406
0
                        witnesses_offset, ..
407
                    },
408
                ..
409
8.77k
            }) = &self.metadata
410
            {
411
0
                return *witnesses_offset;
412
8.77k
            }
413
8.77k
414
8.77k
            self.outputs_offset().saturating_add(
415
8.77k
                self.outputs()
416
8.77k
                    .iter()
417
8.77k
                    .map(|i| i.size())
418
8.77k
                    .reduce(usize::saturating_add)
419
8.77k
                    .unwrap_or_default(),
420
8.77k
            )
421
8.77k
        }
_RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1R_14ScriptMetadataENtNtBb_5field9Witnesses16witnesses_offsetBd_
Line
Count
Source
402
8.77k
        fn witnesses_offset(&self) -> usize {
403
            if let Some(ChargeableMetadata {
404
                common:
405
                    CommonMetadata {
406
0
                        witnesses_offset, ..
407
                    },
408
                ..
409
8.77k
            }) = &self.metadata
410
            {
411
0
                return *witnesses_offset;
412
8.77k
            }
413
8.77k
414
8.77k
            self.outputs_offset().saturating_add(
415
8.77k
                self.outputs()
416
8.77k
                    .iter()
417
8.77k
                    .map(|i| i.size())
418
8.77k
                    .reduce(usize::saturating_add)
419
8.77k
                    .unwrap_or_default(),
420
8.77k
            )
421
8.77k
        }
Unexecuted instantiation: _RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6upload10UploadBodyNtB1R_14UploadMetadataENtNtBb_5field9Witnesses16witnesses_offsetBd_
Unexecuted instantiation: _RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1R_15UpgradeMetadataENtNtBb_5field9Witnesses16witnesses_offsetBd_
422
423
        #[inline(always)]
424
692k
        fn witnesses_offset_at(&self, idx: usize) -> Option<usize> {
425
            if let Some(ChargeableMetadata {
426
                common:
427
                    CommonMetadata {
428
692k
                        witnesses_offset_at,
429
                        ..
430
                    },
431
                ..
432
692k
            }) = &self.metadata
433
            {
434
692k
                return witnesses_offset_at.get(idx).cloned();
435
0
            }
436
0
437
0
            if idx < self.witnesses.len() {
438
0
                Some(
439
0
                    self.witnesses_offset().saturating_add(
440
0
                        self.witnesses()
441
0
                            .iter()
442
0
                            .take(idx)
443
0
                            .map(|i| i.size())
Unexecuted instantiation: _RNCNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_4blob8BlobBodyNtB1T_12BlobMetadataENtNtBd_5field9Witnesses19witnesses_offset_at0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_6create10CreateBodyNtB1T_14CreateMetadataENtNtBd_5field9Witnesses19witnesses_offset_at0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_6script10ScriptBodyNtB1T_14ScriptMetadataENtNtBd_5field9Witnesses19witnesses_offset_at0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_6upload10UploadBodyNtB1T_14UploadMetadataENtNtBd_5field9Witnesses19witnesses_offset_at0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB9_21ChargeableTransactionNtNtBb_7upgrade11UpgradeBodyNtB1T_15UpgradeMetadataENtNtBd_5field9Witnesses19witnesses_offset_at0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXININtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fields1_0ppEINtB9_21ChargeableTransactionppENtNtBd_5field9Witnesses19witnesses_offset_at0Bf_
444
0
                            .reduce(usize::saturating_add)
445
0
                            .unwrap_or_default(),
446
0
                    ),
447
0
                )
448
            } else {
449
0
                None
450
            }
451
692k
        }
Unexecuted instantiation: _RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_4blob8BlobBodyNtB1R_12BlobMetadataENtNtBb_5field9Witnesses19witnesses_offset_atCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1R_14CreateMetadataENtNtBb_5field9Witnesses19witnesses_offset_atCsg6P9hFxt0iW_7fuel_vm
_RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1R_14ScriptMetadataENtNtBb_5field9Witnesses19witnesses_offset_atCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
424
692k
        fn witnesses_offset_at(&self, idx: usize) -> Option<usize> {
425
            if let Some(ChargeableMetadata {
426
                common:
427
                    CommonMetadata {
428
692k
                        witnesses_offset_at,
429
                        ..
430
                    },
431
                ..
432
692k
            }) = &self.metadata
433
            {
434
692k
                return witnesses_offset_at.get(idx).cloned();
435
0
            }
436
0
437
0
            if idx < self.witnesses.len() {
438
0
                Some(
439
0
                    self.witnesses_offset().saturating_add(
440
0
                        self.witnesses()
441
0
                            .iter()
442
0
                            .take(idx)
443
0
                            .map(|i| i.size())
444
0
                            .reduce(usize::saturating_add)
445
0
                            .unwrap_or_default(),
446
0
                    ),
447
0
                )
448
            } else {
449
0
                None
450
            }
451
692k
        }
Unexecuted instantiation: _RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_6upload10UploadBodyNtB1R_14UploadMetadataENtNtBb_5field9Witnesses19witnesses_offset_atCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs1_NtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fieldINtB7_21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1R_15UpgradeMetadataENtNtBb_5field9Witnesses19witnesses_offset_atCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXININtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction5fields1_0ppEINtB7_21ChargeableTransactionppENtNtBb_5field9Witnesses19witnesses_offset_atBd_
452
    }
453
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/types/output.rs
Line
Count
Source
1
use fuel_crypto::Hasher;
2
use fuel_types::{
3
    canonical::{
4
        self,
5
        Serialize as _,
6
    },
7
    Address,
8
    AssetId,
9
    Bytes32,
10
    ContractId,
11
    Nonce,
12
    Word,
13
};
14
15
mod consts;
16
pub mod contract;
17
mod repr;
18
19
use contract::Contract;
20
pub use repr::OutputRepr;
21
22
#[derive(
23
    Debug,
24
    Clone,
25
    Copy,
26
    PartialEq,
27
    Eq,
28
    Hash,
29
    strum_macros::EnumCount,
30
    serde::Serialize,
31
0
    serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtB7_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1i_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBa_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1l_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBd_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB8_9___VisitorNtB1o_7Visitor10visit_enumNtB2_14___FieldVisitorB2t_9expecting
Unexecuted instantiation: _RNvXs0_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBg_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1r_7Visitor10visit_enumNtB5_9___VisitorB2w_9expecting
Unexecuted instantiation: _RNvXs1_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBg_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1r_7Visitor10visit_enumNtB5_s_14___FieldVisitorB2w_9expecting
Unexecuted instantiation: _RNvXs3_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBg_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1r_7Visitor10visit_enumNtB5_s_9___VisitorB2w_9expecting
Unexecuted instantiation: _RNvXs4_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBg_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1r_7Visitor10visit_enumNtB5_s0_14___FieldVisitorB2w_9expecting
Unexecuted instantiation: _RNvXs6_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBg_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1r_7Visitor10visit_enumNtB5_s0_9___VisitorB2w_9expecting
Unexecuted instantiation: _RNvXs7_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBg_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1r_7Visitor10visit_enumNtB5_s1_14___FieldVisitorB2w_9expecting
Unexecuted instantiation: _RNvXs9_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBg_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1r_7Visitor10visit_enumNtB5_s1_9___VisitorB2w_9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtB8_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1j_7Visitor9visit_u64pEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtB8_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1j_7Visitor9visit_strpEBe_
Unexecuted instantiation: _RINvXNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtB8_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1j_7Visitor11visit_bytespEBe_
Unexecuted instantiation: _RINvXs_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBa_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1j_11deserializepEBg_
Unexecuted instantiation: _RINvXNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBe_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB9_9___VisitorNtB1p_7Visitor10visit_enumNtB3_14___FieldVisitorB2u_9visit_u64pEBk_
Unexecuted instantiation: _RINvXNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBe_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB9_9___VisitorNtB1p_7Visitor10visit_enumNtB3_14___FieldVisitorB2u_9visit_strpEBk_
Unexecuted instantiation: _RINvXNvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBe_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB9_9___VisitorNtB1p_7Visitor10visit_enumNtB3_14___FieldVisitorB2u_11visit_bytespEBk_
Unexecuted instantiation: _RINvXs_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBg_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB1r_7Visitor10visit_enumNtB5_7___FieldB1p_11deserializepEBm_
Unexecuted instantiation: _RINvXs0_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBh_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1s_7Visitor10visit_enumNtB6_9___VisitorB2x_9visit_seqpEBn_
Unexecuted instantiation: _RINvXs0_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBh_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1s_7Visitor10visit_enumNtB6_9___VisitorB2x_9visit_mappEBn_
Unexecuted instantiation: _RINvXs1_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBh_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1s_7Visitor10visit_enumNtB6_s_14___FieldVisitorB2x_9visit_u64pEBn_
Unexecuted instantiation: _RINvXs1_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBh_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1s_7Visitor10visit_enumNtB6_s_14___FieldVisitorB2x_9visit_strpEBn_
Unexecuted instantiation: _RINvXs1_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBh_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1s_7Visitor10visit_enumNtB6_s_14___FieldVisitorB2x_11visit_bytespEBn_
Unexecuted instantiation: _RINvXs2_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBh_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1s_7Visitor10visit_enumNtB6_s_7___FieldB1q_11deserializepEBn_
Unexecuted instantiation: _RINvXs3_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBh_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1s_7Visitor10visit_enumNtB6_s_9___VisitorB2x_9visit_seqpEBn_
Unexecuted instantiation: _RINvXs3_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBh_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1s_7Visitor10visit_enumNtB6_s_9___VisitorB2x_9visit_mappEBn_
Unexecuted instantiation: _RINvXs4_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBh_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1s_7Visitor10visit_enumNtB6_s0_14___FieldVisitorB2x_9visit_u64pEBn_
Unexecuted instantiation: _RINvXs4_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBh_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1s_7Visitor10visit_enumNtB6_s0_14___FieldVisitorB2x_9visit_strpEBn_
Unexecuted instantiation: _RINvXs4_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBh_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1s_7Visitor10visit_enumNtB6_s0_14___FieldVisitorB2x_11visit_bytespEBn_
Unexecuted instantiation: _RINvXs5_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBh_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1s_7Visitor10visit_enumNtB6_s0_7___FieldB1q_11deserializepEBn_
Unexecuted instantiation: _RINvXs6_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBh_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1s_7Visitor10visit_enumNtB6_s0_9___VisitorB2x_9visit_seqpEBn_
Unexecuted instantiation: _RINvXs6_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBh_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1s_7Visitor10visit_enumNtB6_s0_9___VisitorB2x_9visit_mappEBn_
Unexecuted instantiation: _RINvXs7_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBh_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1s_7Visitor10visit_enumNtB6_s1_14___FieldVisitorB2x_9visit_u64pEBn_
Unexecuted instantiation: _RINvXs7_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBh_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1s_7Visitor10visit_enumNtB6_s1_14___FieldVisitorB2x_9visit_strpEBn_
Unexecuted instantiation: _RINvXs7_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBh_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1s_7Visitor10visit_enumNtB6_s1_14___FieldVisitorB2x_11visit_bytespEBn_
Unexecuted instantiation: _RINvXs8_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBh_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1s_7Visitor10visit_enumNtB6_s1_7___FieldB1q_11deserializepEBn_
Unexecuted instantiation: _RINvXs9_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBh_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1s_7Visitor10visit_enumNtB6_s1_9___VisitorB2x_9visit_seqpEBn_
Unexecuted instantiation: _RINvXs9_NvXs0_NvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs_1__NtBh_6OutputNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB1s_7Visitor10visit_enumNtB6_s1_9___VisitorB2x_9visit_mappEBn_
32
)]
33
#[cfg_attr(
34
    feature = "da-compression",
35
    derive(fuel_compression::Compress, fuel_compression::Decompress)
36
)]
37
513k
#[derive(canonical::Deserialize, canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs0_1__NtB5_6OutputNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
6.57k
#[derive(canonical::Deserialize, canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs0_1__NtB5_6OutputNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBb_
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs0_1__NtB5_6OutputNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
6.57k
#[derive(canonical::Deserialize, canonical::Serialize)]
Unexecuted instantiation: _RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs0_1__NtB5_6OutputNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEBb_
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs1_1__NtB5_6OutputNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
13.1k
#[derive(canonical::Deserialize, canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs1_1__NtB5_6OutputNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticQShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
6.57k
#[derive(canonical::Deserialize, canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs1_1__NtB5_6OutputNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
13.1k
#[derive(canonical::Deserialize, canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs1_1__NtB5_6OutputNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicQShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
6.57k
#[derive(canonical::Deserialize, canonical::Serialize)]
_RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs1_1__NtB4_6OutputNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_static
Line
Count
Source
37
223k
#[derive(canonical::Deserialize, canonical::Serialize)]
_RNvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs1_1__NtB4_6OutputNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamic
Line
Count
Source
37
223k
#[derive(canonical::Deserialize, canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs1_1__NtB5_6OutputNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Line
Count
Source
37
13.1k
#[derive(canonical::Deserialize, canonical::Serialize)]
_RINvXNvNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputs1_1__NtB5_6OutputNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Line
Count
Source
37
13.1k
#[derive(canonical::Deserialize, canonical::Serialize)]
38
pub enum Output {
39
    Coin {
40
        to: Address,
41
        amount: Word,
42
        asset_id: AssetId,
43
    },
44
45
    Contract(Contract),
46
47
    Change {
48
        to: Address,
49
        #[cfg_attr(feature = "da-compression", compress(skip))]
50
        amount: Word,
51
        asset_id: AssetId,
52
    },
53
54
    Variable {
55
        #[cfg_attr(feature = "da-compression", compress(skip))]
56
        to: Address,
57
        #[cfg_attr(feature = "da-compression", compress(skip))]
58
        amount: Word,
59
        #[cfg_attr(feature = "da-compression", compress(skip))]
60
        asset_id: AssetId,
61
    },
62
63
    ContractCreated {
64
        contract_id: ContractId,
65
        state_root: Bytes32,
66
    },
67
}
68
69
impl Default for Output {
70
0
    fn default() -> Self {
71
0
        Self::ContractCreated {
72
0
            contract_id: Default::default(),
73
0
            state_root: Default::default(),
74
0
        }
75
0
    }
76
}
77
78
impl Output {
79
733k
    pub const fn repr(&self) -> OutputRepr {
80
733k
        OutputRepr::from_output(self)
81
733k
    }
_RNvMs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputNtB4_6Output4reprCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
79
733k
    pub const fn repr(&self) -> OutputRepr {
80
733k
        OutputRepr::from_output(self)
81
733k
    }
Unexecuted instantiation: _RNvMs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputNtB4_6Output4reprBa_
82
83
0
    pub const fn coin(to: Address, amount: Word, asset_id: AssetId) -> Self {
84
0
        Self::Coin {
85
0
            to,
86
0
            amount,
87
0
            asset_id,
88
0
        }
89
0
    }
Unexecuted instantiation: _RNvMs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputNtB4_6Output4coinCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputNtB4_6Output4coinBa_
90
91
2.19k
    pub const fn contract(
92
2.19k
        input_index: u16,
93
2.19k
        balance_root: Bytes32,
94
2.19k
        state_root: Bytes32,
95
2.19k
    ) -> Self {
96
2.19k
        Self::Contract(Contract {
97
2.19k
            input_index,
98
2.19k
            balance_root,
99
2.19k
            state_root,
100
2.19k
        })
101
2.19k
    }
_RNvMs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputNtB4_6Output8contractCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
91
2.19k
    pub const fn contract(
92
2.19k
        input_index: u16,
93
2.19k
        balance_root: Bytes32,
94
2.19k
        state_root: Bytes32,
95
2.19k
    ) -> Self {
96
2.19k
        Self::Contract(Contract {
97
2.19k
            input_index,
98
2.19k
            balance_root,
99
2.19k
            state_root,
100
2.19k
        })
101
2.19k
    }
Unexecuted instantiation: _RNvMs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputNtB4_6Output8contractBa_
102
103
2.19k
    pub const fn change(to: Address, amount: Word, asset_id: AssetId) -> Self {
104
2.19k
        Self::Change {
105
2.19k
            to,
106
2.19k
            amount,
107
2.19k
            asset_id,
108
2.19k
        }
109
2.19k
    }
_RNvMs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputNtB4_6Output6changeCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
103
2.19k
    pub const fn change(to: Address, amount: Word, asset_id: AssetId) -> Self {
104
2.19k
        Self::Change {
105
2.19k
            to,
106
2.19k
            amount,
107
2.19k
            asset_id,
108
2.19k
        }
109
2.19k
    }
Unexecuted instantiation: _RNvMs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputNtB4_6Output6changeBa_
110
111
0
    pub const fn variable(to: Address, amount: Word, asset_id: AssetId) -> Self {
112
0
        Self::Variable {
113
0
            to,
114
0
            amount,
115
0
            asset_id,
116
0
        }
117
0
    }
Unexecuted instantiation: _RNvMs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputNtB4_6Output8variableCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputNtB4_6Output8variableBa_
118
119
2.19k
    pub const fn contract_created(contract_id: ContractId, state_root: Bytes32) -> Self {
120
2.19k
        Self::ContractCreated {
121
2.19k
            contract_id,
122
2.19k
            state_root,
123
2.19k
        }
124
2.19k
    }
125
126
0
    pub const fn asset_id(&self) -> Option<&AssetId> {
127
0
        match self {
128
0
            Output::Coin { asset_id, .. }
129
0
            | Output::Change { asset_id, .. }
130
0
            | Output::Variable { asset_id, .. } => Some(asset_id),
131
0
            _ => None,
132
        }
133
0
    }
134
135
0
    pub const fn to(&self) -> Option<&Address> {
136
0
        match self {
137
0
            Output::Coin { to, .. }
138
0
            | Output::Change { to, .. }
139
0
            | Output::Variable { to, .. } => Some(to),
140
0
            _ => None,
141
        }
142
0
    }
143
144
0
    pub const fn amount(&self) -> Option<Word> {
145
0
        match self {
146
0
            Output::Coin { amount, .. }
147
0
            | Output::Change { amount, .. }
148
0
            | Output::Variable { amount, .. } => Some(*amount),
149
0
            _ => None,
150
        }
151
0
    }
Unexecuted instantiation: _RNvMs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputNtB4_6Output6amountCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputNtB4_6Output6amountBa_
152
153
83.3k
    pub const fn input_index(&self) -> Option<u16> {
154
83.3k
        match self {
155
83.3k
            Output::Contract(Contract { input_index, .. }) => Some(*input_index),
156
0
            _ => None,
157
        }
158
83.3k
    }
_RNvMs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputNtB4_6Output11input_indexCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
153
83.3k
    pub const fn input_index(&self) -> Option<u16> {
154
83.3k
        match self {
155
83.3k
            Output::Contract(Contract { input_index, .. }) => Some(*input_index),
156
0
            _ => None,
157
        }
158
83.3k
    }
Unexecuted instantiation: _RNvMs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputNtB4_6Output11input_indexBa_
159
160
0
    pub const fn balance_root(&self) -> Option<&Bytes32> {
161
0
        match self {
162
0
            Output::Contract(Contract { balance_root, .. }) => Some(balance_root),
163
0
            _ => None,
164
        }
165
0
    }
166
167
0
    pub const fn state_root(&self) -> Option<&Bytes32> {
168
0
        match self {
169
0
            Output::Contract(Contract { state_root, .. })
170
0
            | Output::ContractCreated { state_root, .. } => Some(state_root),
171
0
            _ => None,
172
        }
173
0
    }
174
175
0
    pub const fn contract_id(&self) -> Option<&ContractId> {
176
0
        match self {
177
0
            Output::ContractCreated { contract_id, .. } => Some(contract_id),
178
0
            _ => None,
179
        }
180
0
    }
181
182
733k
    pub const fn is_coin(&self) -> bool {
183
733k
        matches!(self, Self::Coin { .. })
184
733k
    }
_RNvMs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputNtB4_6Output7is_coinCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
182
733k
    pub const fn is_coin(&self) -> bool {
183
733k
        matches!(self, Self::Coin { .. })
184
733k
    }
Unexecuted instantiation: _RNvMs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputNtB4_6Output7is_coinBa_
185
186
733k
    pub const fn is_change(&self) -> bool {
187
733k
        matches!(self, Self::Change { .. })
188
733k
    }
_RNvMs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputNtB4_6Output9is_changeCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
186
733k
    pub const fn is_change(&self) -> bool {
187
733k
        matches!(self, Self::Change { .. })
188
733k
    }
Unexecuted instantiation: _RNvMs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputNtB4_6Output9is_changeBa_
189
190
0
    pub const fn is_variable(&self) -> bool {
191
0
        matches!(self, Self::Variable { .. })
192
0
    }
Unexecuted instantiation: _RNvMs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputNtB4_6Output11is_variableCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputNtB4_6Output11is_variableBa_
193
194
83.3k
    pub const fn is_contract(&self) -> bool {
195
83.3k
        matches!(self, Self::Contract(_))
196
83.3k
    }
_RNvMs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputNtB4_6Output11is_contractCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
194
83.3k
    pub const fn is_contract(&self) -> bool {
195
83.3k
        matches!(self, Self::Contract(_))
196
83.3k
    }
Unexecuted instantiation: _RNvMs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputNtB4_6Output11is_contractBa_
197
198
2
    pub const fn is_contract_created(&self) -> bool {
199
2
        matches!(self, Self::ContractCreated { .. })
200
2
    }
_RNvMs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputNtB4_6Output19is_contract_createdCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
198
2
    pub const fn is_contract_created(&self) -> bool {
199
2
        matches!(self, Self::ContractCreated { .. })
200
2
    }
Unexecuted instantiation: _RNvMs_NtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6outputNtB4_6Output19is_contract_createdBa_
201
202
88.9k
    pub fn message_nonce(txid: &Bytes32, idx: Word) -> Nonce {
203
88.9k
        (*Hasher::default()
204
88.9k
            .chain(txid)
205
88.9k
            .chain(idx.to_bytes())
206
88.9k
            .finalize())
207
88.9k
        .into()
208
88.9k
    }
209
210
88.9k
    pub fn message_digest(data: &[u8]) -> Bytes32 {
211
88.9k
        Hasher::hash(data)
212
88.9k
    }
213
214
    /// Empties fields that should be zero during the signing.
215
26.3k
    pub fn prepare_sign(&mut self) {
216
26.3k
        match self {
217
8.77k
            Output::Contract(contract) => contract.prepare_sign(),
218
219
8.77k
            Output::Change { amount, .. } => {
220
8.77k
                *amount = 0;
221
8.77k
            }
222
223
            Output::Variable {
224
0
                to,
225
0
                amount,
226
0
                asset_id,
227
0
                ..
228
0
            } => {
229
0
                *to = Address::default();
230
0
                *amount = 0;
231
0
                *asset_id = AssetId::default();
232
0
            }
233
234
8.77k
            _ => (),
235
        }
236
26.3k
    }
237
238
    /// Prepare the output for VM initialization for script execution
239
    /// or predicate verification
240
0
    pub fn prepare_init_execute(&mut self) {
241
0
        self.prepare_sign() // Currently does the same thing
242
0
    }
243
}
244
245
#[cfg(feature = "typescript")]
246
pub mod typescript {
247
    use wasm_bindgen::prelude::*;
248
249
    use super::*;
250
251
    use fuel_types::{
252
        Address,
253
        AssetId,
254
        Bytes32,
255
        Word,
256
    };
257
258
    use alloc::{
259
        boxed::Box,
260
        format,
261
        string::String,
262
        vec::Vec,
263
    };
264
265
    #[derive(Clone, Eq, Hash, PartialEq, serde::Serialize, serde::Deserialize)]
266
    #[wasm_bindgen]
267
    pub struct Output(#[wasm_bindgen(skip)] pub Box<crate::Output>);
268
269
    #[wasm_bindgen]
270
    impl Output {
271
        #[wasm_bindgen(js_name = toJSON)]
272
        pub fn to_json(&self) -> String {
273
            serde_json::to_string(&self.0).expect("unable to json format")
274
        }
275
276
        #[wasm_bindgen(js_name = toString)]
277
        pub fn typescript_to_string(&self) -> String {
278
            format!("{:?}", self.0)
279
        }
280
281
        #[wasm_bindgen(js_name = to_bytes)]
282
        pub fn typescript_to_bytes(&self) -> Vec<u8> {
283
            use fuel_types::canonical::Serialize;
284
            self.0.to_bytes()
285
        }
286
287
        #[wasm_bindgen(js_name = from_bytes)]
288
        pub fn typescript_from_bytes(value: &[u8]) -> Result<Output, js_sys::Error> {
289
            use fuel_types::canonical::Deserialize;
290
            crate::Output::from_bytes(value)
291
                .map(|v| Output(Box::new(v)))
292
                .map_err(|e| js_sys::Error::new(&format!("{:?}", e)))
293
        }
294
295
        #[wasm_bindgen]
296
        pub fn coin(to: Address, amount: Word, asset_id: AssetId) -> Output {
297
            Output(Box::new(crate::Output::coin(to, amount, asset_id)))
298
        }
299
300
        #[wasm_bindgen]
301
        pub fn contract(
302
            input_index: u16,
303
            balance_root: Bytes32,
304
            state_root: Bytes32,
305
        ) -> Output {
306
            Output(Box::new(crate::Output::contract(
307
                input_index,
308
                balance_root,
309
                state_root,
310
            )))
311
        }
312
313
        #[wasm_bindgen]
314
        pub fn change(to: Address, amount: Word, asset_id: AssetId) -> Output {
315
            Output(Box::new(crate::Output::change(to, amount, asset_id)))
316
        }
317
318
        #[wasm_bindgen]
319
        pub fn variable(to: Address, amount: Word, asset_id: AssetId) -> Output {
320
            Output(Box::new(crate::Output::variable(to, amount, asset_id)))
321
        }
322
323
        #[wasm_bindgen]
324
        pub fn contract_created(contract_id: ContractId, state_root: Bytes32) -> Output {
325
            Output(Box::new(crate::Output::contract_created(
326
                contract_id,
327
                state_root,
328
            )))
329
        }
330
    }
331
}
/home/marten/fuel/fuel-vm/fuel-tx/src/transaction/consensus_parameters.rs
Line
Count
Source
1
use fuel_types::{
2
    bytes::WORD_SIZE,
3
    Address,
4
    AssetId,
5
    Bytes32,
6
    ChainId,
7
};
8
9
pub mod gas;
10
11
pub use gas::{
12
    DependentCost,
13
    GasCostNotDefined,
14
    GasCosts,
15
    GasCostsValues,
16
};
17
18
use crate::consts::BALANCE_ENTRY_SIZE;
19
20
#[cfg(feature = "test-helpers")]
21
const MAX_GAS: u64 = 100_000_000;
22
#[cfg(feature = "test-helpers")]
23
const MAX_SIZE: u64 = 110 * 1024;
24
25
0
#[derive(Debug, derive_more::Display)]
26
#[display(fmt = "setting block transaction size limit is not supported")]
27
pub struct SettingBlockTransactionSizeLimitNotSupported;
28
#[cfg(feature = "std")]
29
impl std::error::Error for SettingBlockTransactionSizeLimitNotSupported {}
30
31
/// A versioned set of consensus parameters.
32
0
#[derive(Clone, Debug, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
Unexecuted instantiation: _RNvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss_1__NtB7_19ConsensusParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1D_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss_1__NtB8_19ConsensusParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1E_7Visitor9visit_u64NtNtCs1b0Bw0OchLA_8postcard5error5ErrorEBc_
Unexecuted instantiation: _RINvXs_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss_1__NtBa_19ConsensusParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1E_11deserializeINtNtB1G_5value15U32DeserializerNtNtCs1b0Bw0OchLA_8postcard5error5ErrorEEBe_
Unexecuted instantiation: _RNvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss_1__NtBa_19ConsensusParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1G_7Visitor9expecting
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss_1__NtBb_19ConsensusParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1H_7Visitor10visit_enumQINtNtNtCs1b0Bw0OchLA_8postcard2de12deserializer12DeserializerNtNtB3i_7flavors5SliceEEBf_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss_1__NtB8_19ConsensusParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1E_7Visitor9visit_strpEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss_1__NtB8_19ConsensusParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1E_7Visitor11visit_bytespEBc_
33
pub enum ConsensusParameters {
34
    /// Version 1 of the consensus parameters
35
    V1(ConsensusParametersV1),
36
    V2(ConsensusParametersV2),
37
}
38
39
#[cfg(feature = "test-helpers")]
40
impl Default for ConsensusParameters {
41
0
    fn default() -> Self {
42
0
        Self::standard()
43
0
    }
44
}
45
46
impl ConsensusParameters {
47
    #[cfg(feature = "test-helpers")]
48
    /// Constructor for the `ConsensusParameters` with Standard values.
49
8.77k
    pub fn standard() -> Self {
50
8.77k
        ConsensusParametersV2::standard().into()
51
8.77k
    }
52
53
    #[cfg(feature = "test-helpers")]
54
    /// Constructor for the `ConsensusParameters` with Standard values around `ChainId`.
55
0
    pub fn standard_with_id(chain_id: ChainId) -> Self {
56
0
        ConsensusParametersV2::standard_with_id(chain_id).into()
57
0
    }
58
59
    /// Constructor for the `ConsensusParameters`
60
0
    pub const fn new(
61
0
        tx_params: TxParameters,
62
0
        predicate_params: PredicateParameters,
63
0
        script_params: ScriptParameters,
64
0
        contract_params: ContractParameters,
65
0
        fee_params: FeeParameters,
66
0
        chain_id: ChainId,
67
0
        gas_costs: GasCosts,
68
0
        base_asset_id: AssetId,
69
0
        block_gas_limit: u64,
70
0
        block_transaction_size_limit: u64,
71
0
        privileged_address: Address,
72
0
    ) -> Self {
73
0
        Self::V2(ConsensusParametersV2 {
74
0
            tx_params,
75
0
            predicate_params,
76
0
            script_params,
77
0
            contract_params,
78
0
            fee_params,
79
0
            chain_id,
80
0
            gas_costs,
81
0
            base_asset_id,
82
0
            block_gas_limit,
83
0
            block_transaction_size_limit,
84
0
            privileged_address,
85
0
        })
86
0
    }
87
88
    /// Get the transaction parameters
89
46.0k
    pub const fn tx_params(&self) -> &TxParameters {
90
46.0k
        match self {
91
0
            Self::V1(params) => &params.tx_params,
92
46.0k
            Self::V2(params) => &params.tx_params,
93
        }
94
46.0k
    }
_RNvMs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters9tx_paramsCs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
89
4.38k
    pub const fn tx_params(&self) -> &TxParameters {
90
4.38k
        match self {
91
0
            Self::V1(params) => &params.tx_params,
92
4.38k
            Self::V2(params) => &params.tx_params,
93
        }
94
4.38k
    }
_RNvMs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters9tx_paramsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
89
41.6k
    pub const fn tx_params(&self) -> &TxParameters {
90
41.6k
        match self {
91
0
            Self::V1(params) => &params.tx_params,
92
41.6k
            Self::V2(params) => &params.tx_params,
93
        }
94
41.6k
    }
Unexecuted instantiation: _RNvMs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters9tx_paramsB9_
95
96
    /// Get the predicate parameters
97
24.1k
    pub const fn predicate_params(&self) -> &PredicateParameters {
98
24.1k
        match self {
99
0
            Self::V1(params) => &params.predicate_params,
100
24.1k
            Self::V2(params) => &params.predicate_params,
101
        }
102
24.1k
    }
_RNvMs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters16predicate_paramsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
97
24.1k
    pub const fn predicate_params(&self) -> &PredicateParameters {
98
24.1k
        match self {
99
0
            Self::V1(params) => &params.predicate_params,
100
24.1k
            Self::V2(params) => &params.predicate_params,
101
        }
102
24.1k
    }
Unexecuted instantiation: _RNvMs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters16predicate_paramsB9_
103
104
    /// Get the script parameters
105
4.38k
    pub const fn script_params(&self) -> &ScriptParameters {
106
4.38k
        match self {
107
0
            Self::V1(params) => &params.script_params,
108
4.38k
            Self::V2(params) => &params.script_params,
109
        }
110
4.38k
    }
_RNvMs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters13script_paramsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
105
2.19k
    pub const fn script_params(&self) -> &ScriptParameters {
106
2.19k
        match self {
107
0
            Self::V1(params) => &params.script_params,
108
2.19k
            Self::V2(params) => &params.script_params,
109
        }
110
2.19k
    }
_RNvMs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters13script_paramsB9_
Line
Count
Source
105
2.19k
    pub const fn script_params(&self) -> &ScriptParameters {
106
2.19k
        match self {
107
0
            Self::V1(params) => &params.script_params,
108
2.19k
            Self::V2(params) => &params.script_params,
109
        }
110
2.19k
    }
111
112
    /// Get the contract parameters
113
13.1k
    pub const fn contract_params(&self) -> &ContractParameters {
114
13.1k
        match self {
115
0
            Self::V1(params) => &params.contract_params,
116
13.1k
            Self::V2(params) => &params.contract_params,
117
        }
118
13.1k
    }
_RNvMs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters15contract_paramsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
113
10.9k
    pub const fn contract_params(&self) -> &ContractParameters {
114
10.9k
        match self {
115
0
            Self::V1(params) => &params.contract_params,
116
10.9k
            Self::V2(params) => &params.contract_params,
117
        }
118
10.9k
    }
_RNvMs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters15contract_paramsB9_
Line
Count
Source
113
2.19k
    pub const fn contract_params(&self) -> &ContractParameters {
114
2.19k
        match self {
115
0
            Self::V1(params) => &params.contract_params,
116
2.19k
            Self::V2(params) => &params.contract_params,
117
        }
118
2.19k
    }
119
120
    /// Get the fee parameters
121
24.1k
    pub const fn fee_params(&self) -> &FeeParameters {
122
24.1k
        match self {
123
0
            Self::V1(params) => &params.fee_params,
124
24.1k
            Self::V2(params) => &params.fee_params,
125
        }
126
24.1k
    }
_RNvMs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters10fee_paramsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
121
24.1k
    pub const fn fee_params(&self) -> &FeeParameters {
122
24.1k
        match self {
123
0
            Self::V1(params) => &params.fee_params,
124
24.1k
            Self::V2(params) => &params.fee_params,
125
        }
126
24.1k
    }
Unexecuted instantiation: _RNvMs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters10fee_paramsB9_
127
128
    /// Get the chain ID
129
26.3k
    pub const fn chain_id(&self) -> ChainId {
130
26.3k
        match self {
131
0
            Self::V1(params) => params.chain_id,
132
26.3k
            Self::V2(params) => params.chain_id,
133
        }
134
26.3k
    }
_RNvMs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters8chain_idCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
129
26.3k
    pub const fn chain_id(&self) -> ChainId {
130
26.3k
        match self {
131
0
            Self::V1(params) => params.chain_id,
132
26.3k
            Self::V2(params) => params.chain_id,
133
        }
134
26.3k
    }
Unexecuted instantiation: _RNvMs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters8chain_idB9_
135
136
    /// Get the gas costs
137
21.9k
    pub const fn gas_costs(&self) -> &GasCosts {
138
21.9k
        match self {
139
0
            Self::V1(params) => &params.gas_costs,
140
21.9k
            Self::V2(params) => &params.gas_costs,
141
        }
142
21.9k
    }
_RNvMs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters9gas_costsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
137
21.9k
    pub const fn gas_costs(&self) -> &GasCosts {
138
21.9k
        match self {
139
0
            Self::V1(params) => &params.gas_costs,
140
21.9k
            Self::V2(params) => &params.gas_costs,
141
        }
142
21.9k
    }
Unexecuted instantiation: _RNvMs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters9gas_costsB9_
143
144
    /// Get the base asset ID
145
35.0k
    pub const fn base_asset_id(&self) -> &AssetId {
146
35.0k
        match self {
147
0
            Self::V1(params) => &params.base_asset_id,
148
35.0k
            Self::V2(params) => &params.base_asset_id,
149
        }
150
35.0k
    }
_RNvMs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters13base_asset_idCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
145
28.5k
    pub const fn base_asset_id(&self) -> &AssetId {
146
28.5k
        match self {
147
0
            Self::V1(params) => &params.base_asset_id,
148
28.5k
            Self::V2(params) => &params.base_asset_id,
149
        }
150
28.5k
    }
_RNvMs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters13base_asset_idB9_
Line
Count
Source
145
6.57k
    pub const fn base_asset_id(&self) -> &AssetId {
146
6.57k
        match self {
147
0
            Self::V1(params) => &params.base_asset_id,
148
6.57k
            Self::V2(params) => &params.base_asset_id,
149
        }
150
6.57k
    }
151
152
    /// Get the block gas limit
153
0
    pub const fn block_gas_limit(&self) -> u64 {
154
0
        match self {
155
0
            Self::V1(params) => params.block_gas_limit,
156
0
            Self::V2(params) => params.block_gas_limit,
157
        }
158
0
    }
Unexecuted instantiation: _RNvMs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters15block_gas_limitCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters15block_gas_limitB9_
159
160
    /// Get the block transaction size limit
161
0
    pub fn block_transaction_size_limit(&self) -> u64 {
162
0
        match self {
163
            Self::V1(_) => {
164
                // In V1 there was no limit on the transaction size. For the sake of
165
                // backwards compatibility we allow for a largest limit possible.
166
0
                u64::MAX
167
            }
168
0
            Self::V2(params) => params.block_transaction_size_limit,
169
        }
170
0
    }
Unexecuted instantiation: _RNvMs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters28block_transaction_size_limitCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters28block_transaction_size_limitB9_
171
172
    /// Get the privileged address
173
0
    pub const fn privileged_address(&self) -> &Address {
174
0
        match self {
175
0
            Self::V1(params) => &params.privileged_address,
176
0
            Self::V2(params) => &params.privileged_address,
177
        }
178
0
    }
Unexecuted instantiation: _RNvMs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters18privileged_addressCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMs0_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters18privileged_addressB9_
179
}
180
181
impl ConsensusParameters {
182
    /// Set the transaction parameters.
183
2.19k
    pub fn set_tx_params(&mut self, tx_params: TxParameters) {
184
2.19k
        match self {
185
0
            Self::V1(params) => params.tx_params = tx_params,
186
2.19k
            Self::V2(params) => params.tx_params = tx_params,
187
        }
188
2.19k
    }
_RNvMs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters13set_tx_paramsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
183
2.19k
    pub fn set_tx_params(&mut self, tx_params: TxParameters) {
184
2.19k
        match self {
185
0
            Self::V1(params) => params.tx_params = tx_params,
186
2.19k
            Self::V2(params) => params.tx_params = tx_params,
187
        }
188
2.19k
    }
Unexecuted instantiation: _RNvMs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters13set_tx_paramsB9_
189
190
    /// Set the predicate parameters.
191
2.19k
    pub fn set_predicate_params(&mut self, predicate_params: PredicateParameters) {
192
2.19k
        match self {
193
0
            Self::V1(params) => params.predicate_params = predicate_params,
194
2.19k
            Self::V2(params) => params.predicate_params = predicate_params,
195
        }
196
2.19k
    }
_RNvMs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters20set_predicate_paramsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
191
2.19k
    pub fn set_predicate_params(&mut self, predicate_params: PredicateParameters) {
192
2.19k
        match self {
193
0
            Self::V1(params) => params.predicate_params = predicate_params,
194
2.19k
            Self::V2(params) => params.predicate_params = predicate_params,
195
        }
196
2.19k
    }
Unexecuted instantiation: _RNvMs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters20set_predicate_paramsB9_
197
198
    /// Set the script parameters.
199
2.19k
    pub fn set_script_params(&mut self, script_params: ScriptParameters) {
200
2.19k
        match self {
201
0
            Self::V1(params) => params.script_params = script_params,
202
2.19k
            Self::V2(params) => params.script_params = script_params,
203
        }
204
2.19k
    }
_RNvMs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters17set_script_paramsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
199
2.19k
    pub fn set_script_params(&mut self, script_params: ScriptParameters) {
200
2.19k
        match self {
201
0
            Self::V1(params) => params.script_params = script_params,
202
2.19k
            Self::V2(params) => params.script_params = script_params,
203
        }
204
2.19k
    }
Unexecuted instantiation: _RNvMs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters17set_script_paramsB9_
205
206
    /// Set the contract parameters.
207
2.19k
    pub fn set_contract_params(&mut self, contract_params: ContractParameters) {
208
2.19k
        match self {
209
0
            Self::V1(params) => params.contract_params = contract_params,
210
2.19k
            Self::V2(params) => params.contract_params = contract_params,
211
        }
212
2.19k
    }
_RNvMs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters19set_contract_paramsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
207
2.19k
    pub fn set_contract_params(&mut self, contract_params: ContractParameters) {
208
2.19k
        match self {
209
0
            Self::V1(params) => params.contract_params = contract_params,
210
2.19k
            Self::V2(params) => params.contract_params = contract_params,
211
        }
212
2.19k
    }
Unexecuted instantiation: _RNvMs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters19set_contract_paramsB9_
213
214
    /// Set the fee parameters.
215
2.19k
    pub fn set_fee_params(&mut self, fee_params: FeeParameters) {
216
2.19k
        match self {
217
0
            Self::V1(params) => params.fee_params = fee_params,
218
2.19k
            Self::V2(params) => params.fee_params = fee_params,
219
        }
220
2.19k
    }
_RNvMs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters14set_fee_paramsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
215
2.19k
    pub fn set_fee_params(&mut self, fee_params: FeeParameters) {
216
2.19k
        match self {
217
0
            Self::V1(params) => params.fee_params = fee_params,
218
2.19k
            Self::V2(params) => params.fee_params = fee_params,
219
        }
220
2.19k
    }
Unexecuted instantiation: _RNvMs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters14set_fee_paramsB9_
221
222
    /// Set the chain ID.
223
0
    pub fn set_chain_id(&mut self, chain_id: ChainId) {
224
0
        match self {
225
0
            Self::V1(params) => params.chain_id = chain_id,
226
0
            Self::V2(params) => params.chain_id = chain_id,
227
        }
228
0
    }
229
230
    /// Set the gas costs.
231
0
    pub fn set_gas_costs(&mut self, gas_costs: GasCosts) {
232
0
        match self {
233
0
            Self::V1(params) => params.gas_costs = gas_costs,
234
0
            Self::V2(params) => params.gas_costs = gas_costs,
235
        }
236
0
    }
237
238
    /// Set the base asset ID.
239
2.19k
    pub fn set_base_asset_id(&mut self, base_asset_id: AssetId) {
240
2.19k
        match self {
241
0
            Self::V1(params) => params.base_asset_id = base_asset_id,
242
2.19k
            Self::V2(params) => params.base_asset_id = base_asset_id,
243
        }
244
2.19k
    }
_RNvMs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters17set_base_asset_idCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
239
2.19k
    pub fn set_base_asset_id(&mut self, base_asset_id: AssetId) {
240
2.19k
        match self {
241
0
            Self::V1(params) => params.base_asset_id = base_asset_id,
242
2.19k
            Self::V2(params) => params.base_asset_id = base_asset_id,
243
        }
244
2.19k
    }
Unexecuted instantiation: _RNvMs1_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19ConsensusParameters17set_base_asset_idB9_
245
246
    /// Set the block gas limit.
247
0
    pub fn set_block_gas_limit(&mut self, block_gas_limit: u64) {
248
0
        match self {
249
0
            Self::V1(params) => params.block_gas_limit = block_gas_limit,
250
0
            Self::V2(params) => params.block_gas_limit = block_gas_limit,
251
        }
252
0
    }
253
254
    /// Set the block transaction size limit.
255
0
    pub fn set_block_transaction_size_limit(
256
0
        &mut self,
257
0
        block_transaction_size_limit: u64,
258
0
    ) -> Result<(), SettingBlockTransactionSizeLimitNotSupported> {
259
0
        match self {
260
0
            Self::V1(_) => Err(SettingBlockTransactionSizeLimitNotSupported),
261
0
            Self::V2(params) => {
262
0
                params.block_transaction_size_limit = block_transaction_size_limit;
263
0
                Ok(())
264
            }
265
        }
266
0
    }
267
268
    /// Set the privileged address.
269
0
    pub fn set_privileged_address(&mut self, privileged_address: Address) {
270
0
        match self {
271
0
            Self::V1(params) => params.privileged_address = privileged_address,
272
0
            Self::V2(params) => params.privileged_address = privileged_address,
273
        }
274
0
    }
275
}
276
277
/// A collection of parameters for convenience
278
0
#[derive(Clone, Debug, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
Unexecuted instantiation: _RNvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss1_1__NtB7_21ConsensusParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1G_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss1_1__NtBa_21ConsensusParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1J_7Visitor9expecting
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss1_1__NtBb_21ConsensusParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1K_7Visitor9visit_seqINtNtNtCs1b0Bw0OchLA_8postcard2de12deserializer9SeqAccessNtNtB3i_7flavors5SliceEEBf_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss1_1__NtB8_21ConsensusParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1H_7Visitor9visit_u64pEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss1_1__NtB8_21ConsensusParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1H_7Visitor9visit_strpEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss1_1__NtB8_21ConsensusParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1H_7Visitor11visit_bytespEBc_
Unexecuted instantiation: _RINvXs_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss1_1__NtBa_21ConsensusParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1H_11deserializepEBe_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss1_1__NtBb_21ConsensusParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1K_7Visitor9visit_mappEBf_
279
pub struct ConsensusParametersV1 {
280
    pub tx_params: TxParameters,
281
    pub predicate_params: PredicateParameters,
282
    pub script_params: ScriptParameters,
283
    pub contract_params: ContractParameters,
284
    pub fee_params: FeeParameters,
285
    pub chain_id: ChainId,
286
    pub gas_costs: GasCosts,
287
    pub base_asset_id: AssetId,
288
    pub block_gas_limit: u64,
289
    /// The privileged address(user or predicate) that can perform permissioned
290
    /// operations(like upgrading the network).
291
    pub privileged_address: Address,
292
}
293
294
#[cfg(feature = "test-helpers")]
295
impl ConsensusParametersV1 {
296
    /// Constructor for the `ConsensusParameters` with Standard values.
297
0
    pub fn standard() -> Self {
298
0
        Self::standard_with_id(ChainId::default())
299
0
    }
300
301
    /// Constructor for the `ConsensusParameters` with Standard values around `ChainId`.
302
0
    pub fn standard_with_id(chain_id: ChainId) -> Self {
303
0
        Self {
304
0
            tx_params: TxParameters::DEFAULT,
305
0
            predicate_params: PredicateParameters::DEFAULT,
306
0
            script_params: ScriptParameters::DEFAULT,
307
0
            contract_params: ContractParameters::DEFAULT,
308
0
            fee_params: FeeParameters::DEFAULT,
309
0
            chain_id,
310
0
            gas_costs: GasCosts::default(),
311
0
            base_asset_id: Default::default(),
312
0
            block_gas_limit: TxParameters::DEFAULT.max_gas_per_tx(),
313
0
            privileged_address: Default::default(),
314
0
        }
315
0
    }
316
}
317
318
#[cfg(feature = "test-helpers")]
319
impl Default for ConsensusParametersV1 {
320
0
    fn default() -> Self {
321
0
        Self::standard()
322
0
    }
323
}
324
325
impl From<ConsensusParametersV1> for ConsensusParameters {
326
0
    fn from(params: ConsensusParametersV1) -> Self {
327
0
        Self::V1(params)
328
0
    }
329
}
330
331
/// A collection of parameters for convenience
332
/// The difference with [`ConsensusParametersV1`]:
333
/// - `block_transaction_size_limit` has been added.
334
0
#[derive(Clone, Debug, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
Unexecuted instantiation: _RNvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss3_1__NtB7_21ConsensusParametersV2NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1G_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss3_1__NtBa_21ConsensusParametersV2NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1J_7Visitor9expecting
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss3_1__NtBb_21ConsensusParametersV2NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1K_7Visitor9visit_seqINtNtNtCs1b0Bw0OchLA_8postcard2de12deserializer9SeqAccessNtNtB3i_7flavors5SliceEEBf_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss3_1__NtB8_21ConsensusParametersV2NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1H_7Visitor9visit_u64pEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss3_1__NtB8_21ConsensusParametersV2NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1H_7Visitor9visit_strpEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss3_1__NtB8_21ConsensusParametersV2NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1H_7Visitor11visit_bytespEBc_
Unexecuted instantiation: _RINvXs_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss3_1__NtBa_21ConsensusParametersV2NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1H_11deserializepEBe_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss3_1__NtBb_21ConsensusParametersV2NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1K_7Visitor9visit_mappEBf_
335
pub struct ConsensusParametersV2 {
336
    pub tx_params: TxParameters,
337
    pub predicate_params: PredicateParameters,
338
    pub script_params: ScriptParameters,
339
    pub contract_params: ContractParameters,
340
    pub fee_params: FeeParameters,
341
    pub chain_id: ChainId,
342
    pub gas_costs: GasCosts,
343
    pub base_asset_id: AssetId,
344
    pub block_gas_limit: u64,
345
    pub block_transaction_size_limit: u64,
346
    /// The privileged address(user or predicate) that can perform permissioned
347
    /// operations(like upgrading the network).
348
    pub privileged_address: Address,
349
}
350
351
#[cfg(feature = "test-helpers")]
352
impl ConsensusParametersV2 {
353
    const DEFAULT_BLOCK_TRANSACTION_SIZE_LIMIT: u64 = 126 * 1024;
354
355
    /// Constructor for the `ConsensusParameters` with Standard values.
356
8.77k
    pub fn standard() -> Self {
357
8.77k
        Self::standard_with_id(ChainId::default())
358
8.77k
    }
359
360
    /// Constructor for the `ConsensusParameters` with Standard values around `ChainId`.
361
8.77k
    pub fn standard_with_id(chain_id: ChainId) -> Self {
362
8.77k
        Self {
363
8.77k
            tx_params: TxParameters::DEFAULT,
364
8.77k
            predicate_params: PredicateParameters::DEFAULT,
365
8.77k
            script_params: ScriptParameters::DEFAULT,
366
8.77k
            contract_params: ContractParameters::DEFAULT,
367
8.77k
            fee_params: FeeParameters::DEFAULT,
368
8.77k
            chain_id,
369
8.77k
            gas_costs: GasCosts::default(),
370
8.77k
            base_asset_id: Default::default(),
371
8.77k
            block_gas_limit: TxParameters::DEFAULT.max_gas_per_tx(),
372
8.77k
            block_transaction_size_limit: Self::DEFAULT_BLOCK_TRANSACTION_SIZE_LIMIT,
373
8.77k
            privileged_address: Default::default(),
374
8.77k
        }
375
8.77k
    }
376
}
377
378
#[cfg(feature = "test-helpers")]
379
impl Default for ConsensusParametersV2 {
380
0
    fn default() -> Self {
381
0
        Self::standard()
382
0
    }
383
}
384
385
impl From<ConsensusParametersV2> for ConsensusParameters {
386
8.77k
    fn from(params: ConsensusParametersV2) -> Self {
387
8.77k
        Self::V2(params)
388
8.77k
    }
389
}
390
391
/// The versioned fee parameters.
392
#[derive(
393
0
    Copy, Clone, Debug, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss5_1__NtB7_13FeeParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1y_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss5_1__NtB8_13FeeParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1z_7Visitor9visit_u64NtNtCs1b0Bw0OchLA_8postcard5error5ErrorEBc_
Unexecuted instantiation: _RINvXs_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss5_1__NtBa_13FeeParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1z_11deserializeINtNtB1B_5value15U32DeserializerNtNtCs1b0Bw0OchLA_8postcard5error5ErrorEEBe_
Unexecuted instantiation: _RNvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss5_1__NtBa_13FeeParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1B_7Visitor9expecting
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss5_1__NtBb_13FeeParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1C_7Visitor10visit_enumQINtNtNtCs1b0Bw0OchLA_8postcard2de12deserializer12DeserializerNtNtB3d_7flavors5SliceEEBf_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss5_1__NtB8_13FeeParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1z_7Visitor9visit_strpEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss5_1__NtB8_13FeeParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1z_7Visitor11visit_bytespEBc_
394
)]
395
pub enum FeeParameters {
396
    V1(FeeParametersV1),
397
}
398
399
impl FeeParameters {
400
    #[cfg(feature = "test-helpers")]
401
    /// Default fee parameters just for testing.
402
    pub const DEFAULT: Self = Self::V1(FeeParametersV1::DEFAULT);
403
404
    /// Replace the gas price factor with the given argument
405
0
    pub const fn with_gas_price_factor(self, gas_price_factor: u64) -> Self {
406
0
        match self {
407
0
            Self::V1(mut params) => {
408
0
                params.gas_price_factor = gas_price_factor;
409
0
                Self::V1(params)
410
0
            }
411
0
        }
412
0
    }
413
414
0
    pub const fn with_gas_per_byte(self, gas_per_byte: u64) -> Self {
415
0
        match self {
416
0
            Self::V1(mut params) => {
417
0
                params.gas_per_byte = gas_per_byte;
418
0
                Self::V1(params)
419
0
            }
420
0
        }
421
0
    }
422
}
423
424
impl FeeParameters {
425
    /// Get the gas price factor
426
13.1k
    pub const fn gas_price_factor(&self) -> u64 {
427
13.1k
        match self {
428
13.1k
            Self::V1(params) => params.gas_price_factor,
429
13.1k
        }
430
13.1k
    }
_RNvMs9_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_13FeeParameters16gas_price_factorCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
426
13.1k
    pub const fn gas_price_factor(&self) -> u64 {
427
13.1k
        match self {
428
13.1k
            Self::V1(params) => params.gas_price_factor,
429
13.1k
        }
430
13.1k
    }
Unexecuted instantiation: _RNvMs9_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_13FeeParameters16gas_price_factorB9_
431
432
    /// Get the gas per byte
433
70.1k
    pub const fn gas_per_byte(&self) -> u64 {
434
70.1k
        match self {
435
70.1k
            Self::V1(params) => params.gas_per_byte,
436
70.1k
        }
437
70.1k
    }
_RNvMs9_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_13FeeParameters12gas_per_byteCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
433
70.1k
    pub const fn gas_per_byte(&self) -> u64 {
434
70.1k
        match self {
435
70.1k
            Self::V1(params) => params.gas_per_byte,
436
70.1k
        }
437
70.1k
    }
Unexecuted instantiation: _RNvMs9_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_13FeeParameters12gas_per_byteB9_
438
}
439
440
#[cfg(feature = "test-helpers")]
441
impl Default for FeeParameters {
442
0
    fn default() -> Self {
443
0
        Self::DEFAULT
444
0
    }
Unexecuted instantiation: _RNvXsa_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_13FeeParametersNtNtCsd3UI3IJrzMw_4core7default7Default7defaultCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXsa_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_13FeeParametersNtNtCsd3UI3IJrzMw_4core7default7Default7defaultB9_
445
}
446
447
impl From<FeeParametersV1> for FeeParameters {
448
0
    fn from(params: FeeParametersV1) -> Self {
449
0
        Self::V1(params)
450
0
    }
451
}
452
453
/// Consensus configurable parameters used for verifying transactions
454
#[derive(
455
0
    Copy, Clone, Debug, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss7_1__NtB7_15FeeParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1A_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss7_1__NtBa_15FeeParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1D_7Visitor9expecting
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss7_1__NtBb_15FeeParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1E_7Visitor9visit_seqINtNtNtCs1b0Bw0OchLA_8postcard2de12deserializer9SeqAccessNtNtB3c_7flavors5SliceEEBf_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss7_1__NtB8_15FeeParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1B_7Visitor9visit_u64pEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss7_1__NtB8_15FeeParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1B_7Visitor9visit_strpEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss7_1__NtB8_15FeeParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1B_7Visitor11visit_bytespEBc_
Unexecuted instantiation: _RINvXs_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss7_1__NtBa_15FeeParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1B_11deserializepEBe_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss7_1__NtBb_15FeeParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1E_7Visitor9visit_mappEBf_
456
)]
457
pub struct FeeParametersV1 {
458
    /// Factor to convert between gas and transaction assets value.
459
    pub gas_price_factor: u64,
460
    /// A fixed ratio linking metered bytes to gas price
461
    pub gas_per_byte: u64,
462
}
463
464
#[cfg(feature = "test-helpers")]
465
impl FeeParametersV1 {
466
    /// Default fee parameters just for tests.
467
    pub const DEFAULT: Self = FeeParametersV1 {
468
        gas_price_factor: 1_000_000_000,
469
        gas_per_byte: 4,
470
    };
471
}
472
473
#[cfg(feature = "test-helpers")]
474
impl Default for FeeParametersV1 {
475
0
    fn default() -> Self {
476
0
        Self::DEFAULT
477
0
    }
478
}
479
480
/// Versioned predicate parameters.
481
#[derive(
482
0
    Copy, Clone, Debug, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss9_1__NtB7_19PredicateParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1E_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss9_1__NtB8_19PredicateParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1F_7Visitor9visit_u64NtNtCs1b0Bw0OchLA_8postcard5error5ErrorEBc_
Unexecuted instantiation: _RINvXs_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss9_1__NtBa_19PredicateParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1F_11deserializeINtNtB1H_5value15U32DeserializerNtNtCs1b0Bw0OchLA_8postcard5error5ErrorEEBe_
Unexecuted instantiation: _RNvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss9_1__NtBa_19PredicateParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1H_7Visitor9expecting
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss9_1__NtBb_19PredicateParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1I_7Visitor10visit_enumQINtNtNtCs1b0Bw0OchLA_8postcard2de12deserializer12DeserializerNtNtB3j_7flavors5SliceEEBf_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss9_1__NtB8_19PredicateParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1F_7Visitor9visit_strpEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterss9_1__NtB8_19PredicateParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1F_7Visitor11visit_bytespEBc_
483
)]
484
pub enum PredicateParameters {
485
    V1(PredicateParametersV1),
486
}
487
488
impl PredicateParameters {
489
    #[cfg(feature = "test-helpers")]
490
    /// Default parameters just for testing.
491
    pub const DEFAULT: Self = Self::V1(PredicateParametersV1::DEFAULT);
492
493
    /// Replace the max predicate length with the given argument
494
0
    pub const fn with_max_predicate_length(self, max_predicate_length: u64) -> Self {
495
0
        match self {
496
0
            Self::V1(mut params) => {
497
0
                params.max_predicate_length = max_predicate_length;
498
0
                Self::V1(params)
499
0
            }
500
0
        }
501
0
    }
502
503
    /// Replace the max predicate data length with the given argument
504
0
    pub const fn with_max_predicate_data_length(
505
0
        self,
506
0
        max_predicate_data_length: u64,
507
0
    ) -> Self {
508
0
        match self {
509
0
            Self::V1(mut params) => {
510
0
                params.max_predicate_data_length = max_predicate_data_length;
511
0
                Self::V1(params)
512
0
            }
513
0
        }
514
0
    }
515
516
    /// Replace the max message data length with the given argument
517
0
    pub const fn with_max_message_data_length(
518
0
        self,
519
0
        max_message_data_length: u64,
520
0
    ) -> Self {
521
0
        match self {
522
0
            Self::V1(mut params) => {
523
0
                params.max_message_data_length = max_message_data_length;
524
0
                Self::V1(params)
525
0
            }
526
0
        }
527
0
    }
528
529
    /// Replace the max gas per predicate.
530
0
    pub const fn with_max_gas_per_predicate(self, max_gas_per_predicate: u64) -> Self {
531
0
        match self {
532
0
            Self::V1(mut params) => {
533
0
                params.max_gas_per_predicate = max_gas_per_predicate;
534
0
                Self::V1(params)
535
0
            }
536
0
        }
537
0
    }
538
}
539
540
impl PredicateParameters {
541
    /// Get the maximum predicate length
542
0
    pub const fn max_predicate_length(&self) -> u64 {
543
0
        match self {
544
0
            Self::V1(params) => params.max_predicate_length,
545
0
        }
546
0
    }
547
548
    /// Get the maximum predicate data length
549
0
    pub const fn max_predicate_data_length(&self) -> u64 {
550
0
        match self {
551
0
            Self::V1(params) => params.max_predicate_data_length,
552
0
        }
553
0
    }
554
555
    /// Get the maximum message data length
556
8.77k
    pub const fn max_message_data_length(&self) -> u64 {
557
8.77k
        match self {
558
8.77k
            Self::V1(params) => params.max_message_data_length,
559
8.77k
        }
560
8.77k
    }
_RNvMsf_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19PredicateParameters23max_message_data_lengthCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
556
8.77k
    pub const fn max_message_data_length(&self) -> u64 {
557
8.77k
        match self {
558
8.77k
            Self::V1(params) => params.max_message_data_length,
559
8.77k
        }
560
8.77k
    }
Unexecuted instantiation: _RNvMsf_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19PredicateParameters23max_message_data_lengthB9_
561
562
    /// Get the maximum gas per predicate
563
8.77k
    pub const fn max_gas_per_predicate(&self) -> u64 {
564
8.77k
        match self {
565
8.77k
            Self::V1(params) => params.max_gas_per_predicate,
566
8.77k
        }
567
8.77k
    }
_RNvMsf_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19PredicateParameters21max_gas_per_predicateCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
563
8.77k
    pub const fn max_gas_per_predicate(&self) -> u64 {
564
8.77k
        match self {
565
8.77k
            Self::V1(params) => params.max_gas_per_predicate,
566
8.77k
        }
567
8.77k
    }
Unexecuted instantiation: _RNvMsf_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_19PredicateParameters21max_gas_per_predicateB9_
568
}
569
570
impl From<PredicateParametersV1> for PredicateParameters {
571
0
    fn from(params: PredicateParametersV1) -> Self {
572
0
        Self::V1(params)
573
0
    }
574
}
575
576
#[cfg(feature = "test-helpers")]
577
impl Default for PredicateParameters {
578
0
    fn default() -> Self {
579
0
        Self::DEFAULT
580
0
    }
581
}
582
583
/// Consensus configurable parameters used for verifying transactions
584
#[derive(
585
0
    Copy, Clone, Debug, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssb_1__NtB7_21PredicateParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1G_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssb_1__NtBa_21PredicateParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1J_7Visitor9expecting
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssb_1__NtBb_21PredicateParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1K_7Visitor9visit_seqINtNtNtCs1b0Bw0OchLA_8postcard2de12deserializer9SeqAccessNtNtB3i_7flavors5SliceEEBf_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssb_1__NtB8_21PredicateParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1H_7Visitor9visit_u64pEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssb_1__NtB8_21PredicateParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1H_7Visitor9visit_strpEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssb_1__NtB8_21PredicateParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1H_7Visitor11visit_bytespEBc_
Unexecuted instantiation: _RINvXs_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssb_1__NtBa_21PredicateParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1H_11deserializepEBe_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssb_1__NtBb_21PredicateParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1K_7Visitor9visit_mappEBf_
586
)]
587
pub struct PredicateParametersV1 {
588
    /// Maximum length of predicate, in instructions.
589
    pub max_predicate_length: u64,
590
    /// Maximum length of predicate data, in bytes.
591
    pub max_predicate_data_length: u64,
592
    /// Maximum length of message data, in bytes.
593
    pub max_message_data_length: u64,
594
    /// Maximum gas spent per predicate
595
    pub max_gas_per_predicate: u64,
596
}
597
598
#[cfg(feature = "test-helpers")]
599
impl PredicateParametersV1 {
600
    /// Default parameters just for testing.
601
    pub const DEFAULT: Self = Self {
602
        max_predicate_length: 1024 * 1024,
603
        max_predicate_data_length: 1024 * 1024,
604
        max_message_data_length: 1024 * 1024,
605
        max_gas_per_predicate: MAX_GAS,
606
    };
607
}
608
609
#[cfg(feature = "test-helpers")]
610
impl Default for PredicateParametersV1 {
611
0
    fn default() -> Self {
612
0
        Self::DEFAULT
613
0
    }
614
}
615
616
/// Versioned transaction parameters.
617
#[derive(
618
0
    Copy, Clone, Debug, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssd_1__NtB7_12TxParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1x_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssd_1__NtB8_12TxParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1y_7Visitor9visit_u64NtNtCs1b0Bw0OchLA_8postcard5error5ErrorEBc_
Unexecuted instantiation: _RINvXs_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssd_1__NtBa_12TxParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1y_11deserializeINtNtB1A_5value15U32DeserializerNtNtCs1b0Bw0OchLA_8postcard5error5ErrorEEBe_
Unexecuted instantiation: _RNvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssd_1__NtBa_12TxParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1A_7Visitor9expecting
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssd_1__NtBb_12TxParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1B_7Visitor10visit_enumQINtNtNtCs1b0Bw0OchLA_8postcard2de12deserializer12DeserializerNtNtB3c_7flavors5SliceEEBf_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssd_1__NtB8_12TxParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1y_7Visitor9visit_strpEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssd_1__NtB8_12TxParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1y_7Visitor11visit_bytespEBc_
619
)]
620
pub enum TxParameters {
621
    /// Version 1 of the transaction parameters.
622
    V1(TxParametersV1),
623
}
624
625
impl TxParameters {
626
    #[cfg(feature = "test-helpers")]
627
    /// Default parameters just for testing.
628
    pub const DEFAULT: Self = Self::V1(TxParametersV1::DEFAULT);
629
630
    /// Transaction memory offset in VM runtime
631
17.5k
    pub const fn tx_offset(&self) -> usize {
632
17.5k
        let Some(balances_size) =
633
17.5k
            (self.max_inputs() as usize).checked_mul(BALANCE_ENTRY_SIZE)
634
        else {
635
0
            panic!(
636
0
                "Consensus parameters shouldn't allow max_inputs to cause overflow here"
637
0
            );
638
        };
639
640
17.5k
        balances_size.saturating_add(
641
17.5k
            Bytes32::LEN // Tx ID
642
17.5k
            + WORD_SIZE // Tx size
643
17.5k
            + AssetId::LEN, // Base asset ID
644
17.5k
        )
645
17.5k
    }
646
647
    /// Replace the max inputs with the given argument
648
0
    pub const fn with_max_inputs(self, max_inputs: u16) -> Self {
649
0
        match self {
650
0
            Self::V1(mut params) => {
651
0
                params.max_inputs = max_inputs;
652
0
                Self::V1(params)
653
0
            }
654
0
        }
655
0
    }
656
657
    /// Replace the max outputs with the given argument
658
0
    pub const fn with_max_outputs(self, max_outputs: u16) -> Self {
659
0
        match self {
660
0
            Self::V1(mut params) => {
661
0
                params.max_outputs = max_outputs;
662
0
                Self::V1(params)
663
0
            }
664
0
        }
665
0
    }
666
667
    /// Replace the max witnesses with the given argument
668
0
    pub const fn with_max_witnesses(self, max_witnesses: u32) -> Self {
669
0
        match self {
670
0
            Self::V1(mut params) => {
671
0
                params.max_witnesses = max_witnesses;
672
0
                Self::V1(params)
673
0
            }
674
0
        }
675
0
    }
676
677
    /// Replace the max gas per transaction with the given argument
678
0
    pub const fn with_max_gas_per_tx(self, max_gas_per_tx: u64) -> Self {
679
0
        match self {
680
0
            Self::V1(mut params) => {
681
0
                params.max_gas_per_tx = max_gas_per_tx;
682
0
                Self::V1(params)
683
0
            }
684
0
        }
685
0
    }
Unexecuted instantiation: _RNvMsk_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_12TxParameters19with_max_gas_per_txCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMsk_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_12TxParameters19with_max_gas_per_txB9_
686
687
    /// Replace the max size of the transaction with the given argument
688
0
    pub const fn with_max_size(self, max_size: u64) -> Self {
689
0
        match self {
690
0
            Self::V1(mut params) => {
691
0
                params.max_size = max_size;
692
0
                Self::V1(params)
693
0
            }
694
0
        }
695
0
    }
696
697
    /// Replace the max bytecode subsections with the given argument
698
0
    pub const fn with_max_bytecode_subsections(
699
0
        self,
700
0
        max_bytecode_subsections: u16,
701
0
    ) -> Self {
702
0
        match self {
703
0
            Self::V1(mut params) => {
704
0
                params.max_bytecode_subsections = max_bytecode_subsections;
705
0
                Self::V1(params)
706
0
            }
707
0
        }
708
0
    }
709
}
710
711
impl TxParameters {
712
    /// Get the maximum number of inputs
713
30.7k
    pub const fn max_inputs(&self) -> u16 {
714
30.7k
        match self {
715
30.7k
            Self::V1(params) => params.max_inputs,
716
30.7k
        }
717
30.7k
    }
_RNvMsl_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_12TxParameters10max_inputsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
713
13.1k
    pub const fn max_inputs(&self) -> u16 {
714
13.1k
        match self {
715
13.1k
            Self::V1(params) => params.max_inputs,
716
13.1k
        }
717
13.1k
    }
_RNvMsl_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_12TxParameters10max_inputsB9_
Line
Count
Source
713
17.5k
    pub const fn max_inputs(&self) -> u16 {
714
17.5k
        match self {
715
17.5k
            Self::V1(params) => params.max_inputs,
716
17.5k
        }
717
17.5k
    }
718
719
    /// Get the maximum number of outputs
720
4.38k
    pub const fn max_outputs(&self) -> u16 {
721
4.38k
        match self {
722
4.38k
            Self::V1(params) => params.max_outputs,
723
4.38k
        }
724
4.38k
    }
_RNvMsl_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_12TxParameters11max_outputsCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
720
4.38k
    pub const fn max_outputs(&self) -> u16 {
721
4.38k
        match self {
722
4.38k
            Self::V1(params) => params.max_outputs,
723
4.38k
        }
724
4.38k
    }
Unexecuted instantiation: _RNvMsl_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_12TxParameters11max_outputsB9_
725
726
    /// Get the maximum number of witnesses
727
8.77k
    pub const fn max_witnesses(&self) -> u32 {
728
8.77k
        match self {
729
8.77k
            Self::V1(params) => params.max_witnesses,
730
8.77k
        }
731
8.77k
    }
_RNvMsl_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_12TxParameters13max_witnessesCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
727
8.77k
    pub const fn max_witnesses(&self) -> u32 {
728
8.77k
        match self {
729
8.77k
            Self::V1(params) => params.max_witnesses,
730
8.77k
        }
731
8.77k
    }
Unexecuted instantiation: _RNvMsl_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_12TxParameters13max_witnessesB9_
732
733
    /// Get the maximum gas per transaction
734
21.9k
    pub const fn max_gas_per_tx(&self) -> u64 {
735
21.9k
        match self {
736
21.9k
            Self::V1(params) => params.max_gas_per_tx,
737
21.9k
        }
738
21.9k
    }
_RNvMsl_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_12TxParameters14max_gas_per_txCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
734
13.1k
    pub const fn max_gas_per_tx(&self) -> u64 {
735
13.1k
        match self {
736
13.1k
            Self::V1(params) => params.max_gas_per_tx,
737
13.1k
        }
738
13.1k
    }
_RNvMsl_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_12TxParameters14max_gas_per_txB9_
Line
Count
Source
734
8.77k
    pub const fn max_gas_per_tx(&self) -> u64 {
735
8.77k
        match self {
736
8.77k
            Self::V1(params) => params.max_gas_per_tx,
737
8.77k
        }
738
8.77k
    }
739
740
    /// Get the maximum size in bytes
741
4.38k
    pub const fn max_size(&self) -> u64 {
742
4.38k
        match self {
743
4.38k
            Self::V1(params) => params.max_size,
744
4.38k
        }
745
4.38k
    }
_RNvMsl_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_12TxParameters8max_sizeCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
741
4.38k
    pub const fn max_size(&self) -> u64 {
742
4.38k
        match self {
743
4.38k
            Self::V1(params) => params.max_size,
744
4.38k
        }
745
4.38k
    }
Unexecuted instantiation: _RNvMsl_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_12TxParameters8max_sizeB9_
746
747
    /// Get the maximum number of bytecode subsections.
748
0
    pub const fn max_bytecode_subsections(&self) -> u16 {
749
0
        match self {
750
0
            Self::V1(params) => params.max_bytecode_subsections,
751
0
        }
752
0
    }
753
}
754
755
#[cfg(feature = "test-helpers")]
756
impl Default for TxParameters {
757
0
    fn default() -> Self {
758
0
        Self::DEFAULT
759
0
    }
Unexecuted instantiation: _RNvXsm_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_12TxParametersNtNtCsd3UI3IJrzMw_4core7default7Default7defaultCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXsm_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_12TxParametersNtNtCsd3UI3IJrzMw_4core7default7Default7defaultB9_
760
}
761
762
#[cfg(feature = "test-helpers")]
763
impl TxParameters {
764
0
    pub fn set_max_size(&mut self, max_size: u64) {
765
0
        match self {
766
0
            Self::V1(params) => params.max_size = max_size,
767
0
        }
768
0
    }
769
}
770
771
impl From<TxParametersV1> for TxParameters {
772
0
    fn from(params: TxParametersV1) -> Self {
773
0
        Self::V1(params)
774
0
    }
775
}
776
777
#[derive(
778
0
    Copy, Clone, Debug, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssf_1__NtB7_14TxParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1z_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssf_1__NtBa_14TxParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1C_7Visitor9expecting
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssf_1__NtBb_14TxParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1D_7Visitor9visit_seqINtNtNtCs1b0Bw0OchLA_8postcard2de12deserializer9SeqAccessNtNtB3b_7flavors5SliceEEBf_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssf_1__NtB8_14TxParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1A_7Visitor9visit_u64pEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssf_1__NtB8_14TxParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1A_7Visitor9visit_strpEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssf_1__NtB8_14TxParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1A_7Visitor11visit_bytespEBc_
Unexecuted instantiation: _RINvXs_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssf_1__NtBa_14TxParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1A_11deserializepEBe_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssf_1__NtBb_14TxParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1D_7Visitor9visit_mappEBf_
779
)]
780
pub struct TxParametersV1 {
781
    /// Maximum number of inputs.
782
    pub max_inputs: u16,
783
    /// Maximum number of outputs.
784
    pub max_outputs: u16,
785
    /// Maximum number of witnesses.
786
    pub max_witnesses: u32,
787
    /// Maximum gas per transaction.
788
    pub max_gas_per_tx: u64,
789
    /// Maximum size in bytes
790
    pub max_size: u64,
791
    /// Maximum number of bytecode subsections.
792
    pub max_bytecode_subsections: u16,
793
}
794
795
#[cfg(feature = "test-helpers")]
796
impl TxParametersV1 {
797
    /// Default parameters just for testing.
798
    pub const DEFAULT: Self = Self {
799
        max_inputs: 255,
800
        max_outputs: 255,
801
        max_witnesses: 255,
802
        max_gas_per_tx: MAX_GAS,
803
        max_size: MAX_SIZE,
804
        max_bytecode_subsections: 255,
805
    };
806
}
807
808
#[cfg(feature = "test-helpers")]
809
impl Default for TxParametersV1 {
810
0
    fn default() -> Self {
811
0
        Self::DEFAULT
812
0
    }
813
}
814
815
/// Versioned script parameters.
816
#[derive(
817
0
    Copy, Clone, Debug, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssh_1__NtB7_16ScriptParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1B_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssh_1__NtB8_16ScriptParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1C_7Visitor9visit_u64NtNtCs1b0Bw0OchLA_8postcard5error5ErrorEBc_
Unexecuted instantiation: _RINvXs_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssh_1__NtBa_16ScriptParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1C_11deserializeINtNtB1E_5value15U32DeserializerNtNtCs1b0Bw0OchLA_8postcard5error5ErrorEEBe_
Unexecuted instantiation: _RNvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssh_1__NtBa_16ScriptParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1E_7Visitor9expecting
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssh_1__NtBb_16ScriptParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1F_7Visitor10visit_enumQINtNtNtCs1b0Bw0OchLA_8postcard2de12deserializer12DeserializerNtNtB3g_7flavors5SliceEEBf_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssh_1__NtB8_16ScriptParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1C_7Visitor9visit_strpEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssh_1__NtB8_16ScriptParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1C_7Visitor11visit_bytespEBc_
818
)]
819
pub enum ScriptParameters {
820
    V1(ScriptParametersV1),
821
}
822
823
impl ScriptParameters {
824
    #[cfg(feature = "test-helpers")]
825
    /// Default parameters just for testing.
826
    pub const DEFAULT: Self = Self::V1(ScriptParametersV1::DEFAULT);
827
828
    /// Replace the max script length with the given argument
829
0
    pub const fn with_max_script_length(self, max_script_length: u64) -> Self {
830
0
        match self {
831
0
            Self::V1(mut params) => {
832
0
                params.max_script_length = max_script_length;
833
0
                Self::V1(params)
834
0
            }
835
0
        }
836
0
    }
837
838
    /// Replace the max script data length with the given argument
839
0
    pub const fn with_max_script_data_length(self, max_script_data_length: u64) -> Self {
840
0
        match self {
841
0
            Self::V1(mut params) => {
842
0
                params.max_script_data_length = max_script_data_length;
843
0
                Self::V1(params)
844
0
            }
845
0
        }
846
0
    }
847
}
848
849
impl ScriptParameters {
850
    /// Get the maximum script length
851
2.19k
    pub const fn max_script_length(&self) -> u64 {
852
2.19k
        match self {
853
2.19k
            Self::V1(params) => params.max_script_length,
854
2.19k
        }
855
2.19k
    }
856
857
    /// Get the maximum script data length
858
2.19k
    pub const fn max_script_data_length(&self) -> u64 {
859
2.19k
        match self {
860
2.19k
            Self::V1(params) => params.max_script_data_length,
861
2.19k
        }
862
2.19k
    }
863
}
864
865
impl From<ScriptParametersV1> for ScriptParameters {
866
0
    fn from(params: ScriptParametersV1) -> Self {
867
0
        Self::V1(params)
868
0
    }
869
}
870
871
#[cfg(feature = "test-helpers")]
872
impl Default for ScriptParameters {
873
0
    fn default() -> Self {
874
0
        Self::DEFAULT
875
0
    }
876
}
877
878
#[derive(
879
0
    Copy, Clone, Debug, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssj_1__NtB7_18ScriptParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1D_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssj_1__NtBa_18ScriptParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1G_7Visitor9expecting
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssj_1__NtBb_18ScriptParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1H_7Visitor9visit_seqINtNtNtCs1b0Bw0OchLA_8postcard2de12deserializer9SeqAccessNtNtB3f_7flavors5SliceEEBf_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssj_1__NtB8_18ScriptParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1E_7Visitor9visit_u64pEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssj_1__NtB8_18ScriptParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1E_7Visitor9visit_strpEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssj_1__NtB8_18ScriptParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1E_7Visitor11visit_bytespEBc_
Unexecuted instantiation: _RINvXs_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssj_1__NtBa_18ScriptParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1E_11deserializepEBe_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssj_1__NtBb_18ScriptParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1H_7Visitor9visit_mappEBf_
880
)]
881
pub struct ScriptParametersV1 {
882
    /// Maximum length of script, in instructions.
883
    pub max_script_length: u64,
884
    /// Maximum length of script data, in bytes.
885
    pub max_script_data_length: u64,
886
}
887
888
#[cfg(feature = "test-helpers")]
889
impl ScriptParametersV1 {
890
    /// Default parameters just for testing.
891
    pub const DEFAULT: Self = Self {
892
        max_script_length: 1024 * 1024,
893
        max_script_data_length: 1024 * 1024,
894
    };
895
}
896
897
#[cfg(feature = "test-helpers")]
898
impl Default for ScriptParametersV1 {
899
0
    fn default() -> Self {
900
0
        Self::DEFAULT
901
0
    }
902
}
903
904
/// Versioned contract parameters.
905
#[derive(
906
0
    Copy, Clone, Debug, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssl_1__NtB7_18ContractParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1D_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssl_1__NtB8_18ContractParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1E_7Visitor9visit_u64NtNtCs1b0Bw0OchLA_8postcard5error5ErrorEBc_
Unexecuted instantiation: _RINvXs_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssl_1__NtBa_18ContractParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1E_11deserializeINtNtB1G_5value15U32DeserializerNtNtCs1b0Bw0OchLA_8postcard5error5ErrorEEBe_
Unexecuted instantiation: _RNvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssl_1__NtBa_18ContractParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1G_7Visitor9expecting
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssl_1__NtBb_18ContractParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1H_7Visitor10visit_enumQINtNtNtCs1b0Bw0OchLA_8postcard2de12deserializer12DeserializerNtNtB3i_7flavors5SliceEEBf_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssl_1__NtB8_18ContractParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1E_7Visitor9visit_strpEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssl_1__NtB8_18ContractParametersNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1E_7Visitor11visit_bytespEBc_
907
)]
908
pub enum ContractParameters {
909
    V1(ContractParametersV1),
910
}
911
912
impl ContractParameters {
913
    #[cfg(feature = "test-helpers")]
914
    /// Default parameters just for testing.
915
    pub const DEFAULT: Self = Self::V1(ContractParametersV1::DEFAULT);
916
917
    /// Replace the max contract size with the given argument
918
0
    pub const fn with_contract_max_size(self, contract_max_size: u64) -> Self {
919
0
        match self {
920
0
            Self::V1(mut params) => {
921
0
                params.contract_max_size = contract_max_size;
922
0
                Self::V1(params)
923
0
            }
924
0
        }
925
0
    }
926
927
    /// Replace the max storage slots with the given argument
928
0
    pub const fn with_max_storage_slots(self, max_storage_slots: u64) -> Self {
929
0
        match self {
930
0
            Self::V1(mut params) => {
931
0
                params.max_storage_slots = max_storage_slots;
932
0
                Self::V1(params)
933
0
            }
934
0
        }
935
0
    }
936
}
937
938
impl ContractParameters {
939
    /// Get the maximum contract size
940
10.9k
    pub const fn contract_max_size(&self) -> u64 {
941
10.9k
        match self {
942
10.9k
            Self::V1(params) => params.contract_max_size,
943
10.9k
        }
944
10.9k
    }
_RNvMsy_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_18ContractParameters17contract_max_sizeCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
940
8.77k
    pub const fn contract_max_size(&self) -> u64 {
941
8.77k
        match self {
942
8.77k
            Self::V1(params) => params.contract_max_size,
943
8.77k
        }
944
8.77k
    }
_RNvMsy_NtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parametersNtB5_18ContractParameters17contract_max_sizeB9_
Line
Count
Source
940
2.19k
    pub const fn contract_max_size(&self) -> u64 {
941
2.19k
        match self {
942
2.19k
            Self::V1(params) => params.contract_max_size,
943
2.19k
        }
944
2.19k
    }
945
946
    /// Get the maximum storage slots
947
2.19k
    pub const fn max_storage_slots(&self) -> u64 {
948
2.19k
        match self {
949
2.19k
            Self::V1(params) => params.max_storage_slots,
950
2.19k
        }
951
2.19k
    }
952
}
953
954
impl From<ContractParametersV1> for ContractParameters {
955
0
    fn from(params: ContractParametersV1) -> Self {
956
0
        Self::V1(params)
957
0
    }
958
}
959
960
#[cfg(feature = "test-helpers")]
961
impl Default for ContractParameters {
962
0
    fn default() -> Self {
963
0
        Self::DEFAULT
964
0
    }
965
}
966
967
#[derive(
968
0
    Copy, Clone, Debug, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssn_1__NtB7_20ContractParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1F_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssn_1__NtBa_20ContractParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1I_7Visitor9expecting
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssn_1__NtBb_20ContractParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1J_7Visitor9visit_seqINtNtNtCs1b0Bw0OchLA_8postcard2de12deserializer9SeqAccessNtNtB3h_7flavors5SliceEEBf_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssn_1__NtB8_20ContractParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1G_7Visitor9visit_u64pEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssn_1__NtB8_20ContractParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1G_7Visitor9visit_strpEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssn_1__NtB8_20ContractParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1G_7Visitor11visit_bytespEBc_
Unexecuted instantiation: _RINvXs_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssn_1__NtBa_20ContractParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1G_11deserializepEBe_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameterssn_1__NtBb_20ContractParametersV1NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1J_7Visitor9visit_mappEBf_
969
)]
970
pub struct ContractParametersV1 {
971
    /// Maximum contract size, in bytes.
972
    pub contract_max_size: u64,
973
974
    /// Maximum number of initial storage slots.
975
    pub max_storage_slots: u64,
976
}
977
978
#[cfg(feature = "test-helpers")]
979
impl ContractParametersV1 {
980
    /// Default parameters just for testing.
981
    pub const DEFAULT: Self = Self {
982
        contract_max_size: 100 * 1024,
983
        max_storage_slots: 255,
984
    };
985
}
986
987
#[cfg(feature = "test-helpers")]
988
impl Default for ContractParametersV1 {
989
0
    fn default() -> Self {
990
0
        Self::DEFAULT
991
0
    }
992
}
993
994
#[cfg(feature = "typescript")]
995
pub mod typescript {
996
    use wasm_bindgen::prelude::*;
997
998
    use super::{
999
        PredicateParameters as PredicateParametersRust,
1000
        PredicateParametersV1,
1001
    };
1002
1003
    #[derive(Clone, Debug, PartialEq, Eq, Hash)]
1004
    #[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
1005
    pub struct PredicateParameters(alloc::boxed::Box<PredicateParametersRust>);
1006
1007
    impl AsRef<PredicateParametersRust> for PredicateParameters {
1008
        fn as_ref(&self) -> &PredicateParametersRust {
1009
            &self.0
1010
        }
1011
    }
1012
1013
    #[wasm_bindgen]
1014
    impl PredicateParameters {
1015
        #[wasm_bindgen(constructor)]
1016
        pub fn typescript_new(
1017
            max_predicate_length: u64,
1018
            max_predicate_data_length: u64,
1019
            max_message_data_length: u64,
1020
            max_gas_per_predicate: u64,
1021
        ) -> Self {
1022
            let params: PredicateParametersRust = PredicateParametersV1 {
1023
                max_predicate_length,
1024
                max_predicate_data_length,
1025
                max_message_data_length,
1026
                max_gas_per_predicate,
1027
            }
1028
            .into();
1029
1030
            PredicateParameters(params.into())
1031
        }
1032
    }
1033
}
1034
1035
#[cfg(test)]
1036
mod tests {
1037
    use crate::consensus_parameters::{
1038
        ConsensusParametersV2,
1039
        SettingBlockTransactionSizeLimitNotSupported,
1040
    };
1041
1042
    use super::{
1043
        ConsensusParameters,
1044
        ConsensusParametersV1,
1045
    };
1046
1047
    #[test]
1048
    fn error_when_setting_block_size_limit_in_consensus_parameters_v1() {
1049
        let mut consensus_params: ConsensusParameters =
1050
            ConsensusParametersV1::default().into();
1051
1052
        let result = consensus_params.set_block_transaction_size_limit(0);
1053
1054
        assert!(matches!(
1055
            result,
1056
            Err(SettingBlockTransactionSizeLimitNotSupported)
1057
        ))
1058
    }
1059
1060
    #[test]
1061
    fn ok_when_setting_block_size_limit_in_consensus_parameters_v2() {
1062
        let mut consensus_params: ConsensusParameters =
1063
            ConsensusParametersV2::default().into();
1064
1065
        let result = consensus_params.set_block_transaction_size_limit(0);
1066
1067
        assert!(matches!(result, Ok(())))
1068
    }
1069
}
/home/marten/fuel/fuel-vm/fuel-tx/src/lib.rs
Line
Count
Source
1
#![cfg_attr(not(feature = "std"), no_std)]
2
#![allow(clippy::too_many_arguments)]
3
#![allow(clippy::try_err)]
4
// Wrong clippy convention; check
5
// https://rust-lang.github.io/api-guidelines/naming.html
6
#![allow(clippy::wrong_self_convention)]
7
#![deny(
8
    clippy::arithmetic_side_effects,
9
    clippy::cast_sign_loss,
10
    clippy::cast_possible_truncation,
11
    clippy::cast_possible_wrap,
12
    clippy::string_slice
13
)]
14
#![deny(unused_crate_dependencies)]
15
#![deny(unsafe_code)]
16
17
// TODO: Add docs
18
19
#[cfg(feature = "alloc")]
20
extern crate alloc;
21
extern crate core;
22
23
pub mod consts;
24
mod tx_pointer;
25
26
pub use fuel_asm::{
27
    PanicInstruction,
28
    PanicReason,
29
};
30
pub use fuel_types::{
31
    Address,
32
    AssetId,
33
    BlobId,
34
    Bytes32,
35
    Bytes4,
36
    Bytes64,
37
    Bytes8,
38
    ContractId,
39
    MessageId,
40
    Salt,
41
    Word,
42
};
43
pub use tx_pointer::TxPointer;
44
45
#[cfg(feature = "test-helpers")]
46
mod builder;
47
48
#[cfg(feature = "alloc")]
49
mod contract;
50
51
#[cfg(feature = "alloc")]
52
mod receipt;
53
54
#[cfg(feature = "alloc")]
55
mod transaction;
56
57
#[cfg(test)]
58
mod tests;
59
60
#[cfg(feature = "test-helpers")]
61
pub mod test_helper;
62
63
#[cfg(feature = "test-helpers")]
64
pub use builder::{
65
    Buildable,
66
    Finalizable,
67
    TransactionBuilder,
68
};
69
70
#[cfg(feature = "alloc")]
71
pub use receipt::{
72
    Receipt,
73
    ScriptExecutionResult,
74
};
75
76
#[cfg(feature = "alloc")]
77
pub use transaction::{
78
    consensus_parameters,
79
    field,
80
    input,
81
    input::Input,
82
    input::InputRepr,
83
    output,
84
    output::Output,
85
    output::OutputRepr,
86
    policies,
87
    Blob,
88
    BlobBody,
89
    BlobIdExt,
90
    BlobMetadata,
91
    Cacheable,
92
    Chargeable,
93
    ChargeableMetadata,
94
    ChargeableTransaction,
95
    ConsensusParameters,
96
    ContractParameters,
97
    Create,
98
    CreateMetadata,
99
    DependentCost,
100
    Executable,
101
    FeeParameters,
102
    FormatValidityChecks,
103
    GasCosts,
104
    GasCostsValues,
105
    Mint,
106
    PredicateParameters,
107
    Script,
108
    ScriptCode,
109
    ScriptParameters,
110
    StorageSlot,
111
    Transaction,
112
    TransactionFee,
113
    TransactionRepr,
114
    TxId,
115
    TxParameters,
116
    Upgrade,
117
    UpgradeBody,
118
    UpgradeMetadata,
119
    UpgradePurpose,
120
    Upload,
121
    UploadBody,
122
    UploadMetadata,
123
    UploadSubsection,
124
    UtxoId,
125
    ValidityError,
126
    Witness,
127
};
128
129
#[cfg(feature = "da-compression")]
130
pub use transaction::{
131
    CompressedMint,
132
    CompressedTransaction,
133
    CompressedUtxoId,
134
};
135
136
pub use transaction::{
137
    PrepareSign,
138
    Signable,
139
    UniqueIdentifier,
140
};
141
142
#[cfg(feature = "alloc")]
143
pub use contract::Contract;
144
145
/// Trait extends the functionality of the `ContractId` type.
146
pub trait ContractIdExt {
147
    /// Creates an `AssetId` from the `ContractId` and `sub_id`.
148
    fn asset_id(&self, sub_id: &Bytes32) -> AssetId;
149
150
    /// Creates an `AssetId` from the `ContractId` and the default 0x00..000 `sub_id`.
151
    fn default_asset(&self) -> AssetId;
152
}
153
154
impl ContractIdExt for ContractId {
155
157
    fn asset_id(&self, sub_id: &Bytes32) -> AssetId {
156
157
        let hasher = fuel_crypto::Hasher::default();
157
157
        AssetId::new(
158
157
            *hasher
159
157
                .chain(self.as_slice())
160
157
                .chain(sub_id.as_slice())
161
157
                .finalize(),
162
157
        )
163
157
    }
164
165
0
    fn default_asset(&self) -> AssetId {
166
0
        self.asset_id(&Bytes32::zeroed())
167
0
    }
168
}
/home/marten/fuel/fuel-vm/fuel-tx/src/receipt/receipt_repr.rs
Line
Count
Source
1
use crate::receipt::Receipt;
2
3
macro_rules! enum_from {
4
    (
5
        $(#[$meta:meta])* $vis:vis enum $name:ident {
6
            $($(#[$vmeta:meta])* $vname:ident $(= $val:expr)?,)*
7
        }
8
    ) => {
9
        $(#[$meta])*
10
        $vis enum $name {
11
            $($(#[$vmeta])* $vname $(= $val)?,)*
12
        }
13
14
        impl From<&Receipt> for $name {
15
0
            fn from(receipt: &Receipt) -> Self {
16
0
                match receipt {
17
0
                    $(Receipt::$vname { .. } => Self::$vname,)*
18
                }
19
0
            }
20
        }
21
22
        #[cfg(feature = "std")]
23
        impl TryFrom<fuel_types::Word> for $name {
24
            type Error = std::io::Error;
25
26
0
            fn try_from(x: fuel_types::Word) -> Result<Self, Self::Error> {
27
0
                match x {
28
0
                    $(x if x == $name::$vname as fuel_types::Word => Ok($name::$vname),)*
29
0
                    _ => Err(std::io::Error::new(
30
0
                        std::io::ErrorKind::InvalidData,
31
0
                        "The provided identifier is invalid!",
32
0
                    )),
33
                }
34
0
            }
35
        }
36
    }
37
}
38
39
enum_from! {
40
    #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
41
    pub enum ReceiptRepr {
42
        Call = 0x00,
43
        Return = 0x01,
44
        ReturnData = 0x02,
45
        Panic = 0x03,
46
        Revert = 0x04,
47
        Log = 0x05,
48
        LogData = 0x06,
49
        Transfer = 0x07,
50
        TransferOut = 0x08,
51
        ScriptResult = 0x09,
52
        MessageOut = 0x0A,
53
        Mint = 0x0B,
54
        Burn = 0x0C,
55
    }
56
}
/home/marten/fuel/fuel-vm/fuel-tx/src/receipt/script_result.rs
Line
Count
Source
1
use fuel_types::Word;
2
3
#[derive(
4
    Debug,
5
    Copy,
6
    Clone,
7
    PartialEq,
8
    Eq,
9
    Hash,
10
    serde::Serialize,
11
0
    serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx7receipt13script_results_1__NtB7_21ScriptExecutionResultNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB1t_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx7receipt13script_results_1__NtBa_21ScriptExecutionResultNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB1w_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx7receipt13script_results_1__NtB8_21ScriptExecutionResultNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1u_7Visitor9visit_u64pEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx7receipt13script_results_1__NtB8_21ScriptExecutionResultNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1u_7Visitor9visit_strpEBc_
Unexecuted instantiation: _RINvXNvXNvNtNtCseSMGV7FMBK4_7fuel_tx7receipt13script_results_1__NtB8_21ScriptExecutionResultNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB1u_7Visitor11visit_bytespEBc_
Unexecuted instantiation: _RINvXs_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx7receipt13script_results_1__NtBa_21ScriptExecutionResultNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB1u_11deserializepEBe_
Unexecuted instantiation: _RINvXs0_NvXNvNtNtCseSMGV7FMBK4_7fuel_tx7receipt13script_results_1__NtBb_21ScriptExecutionResultNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB1x_7Visitor10visit_enumpEBf_
12
0
    fuel_types::canonical::Deserialize,
13
8.77k
    fuel_types::canonical::Serialize,
_RINvXNvNtNtCseSMGV7FMBK4_7fuel_tx7receipt13script_results1_1__NtB5_21ScriptExecutionResultNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
13
2.19k
    fuel_types::canonical::Serialize,
_RINvXNvNtNtCseSMGV7FMBK4_7fuel_tx7receipt13script_results1_1__NtB5_21ScriptExecutionResultNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
13
2.19k
    fuel_types::canonical::Serialize,
_RNvXNvNtNtCseSMGV7FMBK4_7fuel_tx7receipt13script_results1_1__NtB4_21ScriptExecutionResultNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_static
Line
Count
Source
13
2.19k
    fuel_types::canonical::Serialize,
_RNvXNvNtNtCseSMGV7FMBK4_7fuel_tx7receipt13script_results1_1__NtB4_21ScriptExecutionResultNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamic
Line
Count
Source
13
2.19k
    fuel_types::canonical::Serialize,
Unexecuted instantiation: _RINvXNvNtNtCseSMGV7FMBK4_7fuel_tx7receipt13script_results1_1__NtB5_21ScriptExecutionResultNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB9_
Unexecuted instantiation: _RINvXNvNtNtCseSMGV7FMBK4_7fuel_tx7receipt13script_results1_1__NtB5_21ScriptExecutionResultNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB9_
14
)]
15
#[repr(u64)]
16
pub enum ScriptExecutionResult {
17
    Success,
18
    Revert,
19
    Panic,
20
    // Generic failure case since any u64 is valid here
21
    GenericFailure(u64),
22
}
23
24
impl From<ScriptExecutionResult> for Word {
25
0
    fn from(result: ScriptExecutionResult) -> Self {
26
0
        match result {
27
0
            ScriptExecutionResult::Success => 0x00,
28
0
            ScriptExecutionResult::Revert => 0x01,
29
0
            ScriptExecutionResult::Panic => 0x02,
30
0
            ScriptExecutionResult::GenericFailure(value) => value,
31
        }
32
0
    }
33
}
34
35
impl From<Word> for ScriptExecutionResult {
36
0
    fn from(value: u64) -> Self {
37
0
        match value {
38
0
            0x00 => Self::Success,
39
0
            0x01 => Self::Revert,
40
0
            0x02 => Self::Panic,
41
0
            value => Self::GenericFailure(value),
42
        }
43
0
    }
44
}
/home/marten/fuel/fuel-vm/fuel-tx/src/receipt.rs
Line
Count
Source
1
use crate::Output;
2
use alloc::vec::Vec;
3
use derivative::Derivative;
4
use fuel_asm::PanicInstruction;
5
use fuel_crypto::Hasher;
6
use fuel_types::{
7
    canonical::{
8
        Deserialize,
9
        Serialize,
10
    },
11
    fmt_option_truncated_hex,
12
    Address,
13
    AssetId,
14
    Bytes32,
15
    ContractId,
16
    MessageId,
17
    Nonce,
18
    Word,
19
};
20
21
mod receipt_repr;
22
mod script_result;
23
24
use crate::input::message::compute_message_id;
25
pub use script_result::ScriptExecutionResult;
26
27
#[derive(
28
3.69M
    Clone, Derivative, serde::Serialize, serde::Deserialize, Deserialize, Serialize,
Unexecuted instantiation: _RNvXs3_NtCseSMGV7FMBK4_7fuel_tx7receiptNtB5_7ReceiptNtNtCsd3UI3IJrzMw_4core3cmp9PartialEq2eq
Unexecuted instantiation: _RINvXs2_NtCseSMGV7FMBK4_7fuel_tx7receiptNtB6_7ReceiptNtNtCsd3UI3IJrzMw_4core4hash4Hash4hashpEB8_
Unexecuted instantiation: _RNvXNvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtB7_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtBX_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBa_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB10_7Visitor9expecting
Unexecuted instantiation: _RNvXNvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBd_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB8_9___VisitorNtB13_7Visitor10visit_enumNtB2_14___FieldVisitorB28_9expecting
Unexecuted instantiation: _RNvXs0_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBg_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB16_7Visitor10visit_enumNtB5_9___VisitorB2b_9expecting
Unexecuted instantiation: _RNvXs1_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBg_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB16_7Visitor10visit_enumNtB5_s_14___FieldVisitorB2b_9expecting
Unexecuted instantiation: _RNvXs3_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBg_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB16_7Visitor10visit_enumNtB5_s_9___VisitorB2b_9expecting
Unexecuted instantiation: _RNvXs4_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBg_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB16_7Visitor10visit_enumNtB5_s0_14___FieldVisitorB2b_9expecting
Unexecuted instantiation: _RNvXs6_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBg_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB16_7Visitor10visit_enumNtB5_s0_9___VisitorB2b_9expecting
Unexecuted instantiation: _RNvXs7_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBg_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB16_7Visitor10visit_enumNtB5_s1_14___FieldVisitorB2b_9expecting
Unexecuted instantiation: _RNvXs9_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBg_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB16_7Visitor10visit_enumNtB5_s1_9___VisitorB2b_9expecting
Unexecuted instantiation: _RNvXsa_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBg_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB16_7Visitor10visit_enumNtB5_s2_14___FieldVisitorB2b_9expecting
Unexecuted instantiation: _RNvXsc_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBg_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB16_7Visitor10visit_enumNtB5_s2_9___VisitorB2b_9expecting
Unexecuted instantiation: _RNvXsd_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBg_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB16_7Visitor10visit_enumNtB5_s3_14___FieldVisitorB2b_9expecting
Unexecuted instantiation: _RNvXsf_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBg_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB16_7Visitor10visit_enumNtB5_s3_9___VisitorB2b_9expecting
Unexecuted instantiation: _RNvXsg_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBg_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB16_7Visitor10visit_enumNtB5_s4_14___FieldVisitorB2b_9expecting
Unexecuted instantiation: _RNvXsi_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBg_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB16_7Visitor10visit_enumNtB5_s4_9___VisitorB2b_9expecting
Unexecuted instantiation: _RNvXsj_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBg_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB16_7Visitor10visit_enumNtB5_s5_14___FieldVisitorB2b_9expecting
Unexecuted instantiation: _RNvXsl_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBg_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB16_7Visitor10visit_enumNtB5_s5_9___VisitorB2b_9expecting
Unexecuted instantiation: _RNvXsm_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBg_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB16_7Visitor10visit_enumNtB5_s6_14___FieldVisitorB2b_9expecting
Unexecuted instantiation: _RNvXso_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBg_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB16_7Visitor10visit_enumNtB5_s6_9___VisitorB2b_9expecting
Unexecuted instantiation: _RNvXsp_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBg_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB16_7Visitor10visit_enumNtB5_s7_14___FieldVisitorB2b_9expecting
Unexecuted instantiation: _RNvXsr_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBg_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB16_7Visitor10visit_enumNtB5_s7_9___VisitorB2b_9expecting
Unexecuted instantiation: _RNvXss_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBg_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB16_7Visitor10visit_enumNtB5_s8_14___FieldVisitorB2b_9expecting
Unexecuted instantiation: _RNvXsu_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBg_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB16_7Visitor10visit_enumNtB5_s8_9___VisitorB2b_9expecting
Unexecuted instantiation: _RNvXsv_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBg_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB16_7Visitor10visit_enumNtB5_s9_14___FieldVisitorB2b_9expecting
Unexecuted instantiation: _RNvXsx_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBg_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB16_7Visitor10visit_enumNtB5_s9_9___VisitorB2b_9expecting
Unexecuted instantiation: _RNvXsy_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBg_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB16_7Visitor10visit_enumNtB5_sa_14___FieldVisitorB2b_9expecting
Unexecuted instantiation: _RNvXsA_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBg_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB16_7Visitor10visit_enumNtB5_sa_9___VisitorB2b_9expecting
Unexecuted instantiation: _RINvXNvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtB8_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtBY_7Visitor9visit_u64pEBa_
Unexecuted instantiation: _RINvXNvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtB8_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtBY_7Visitor9visit_strpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtB8_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtBY_7Visitor11visit_bytespEBa_
Unexecuted instantiation: _RINvXs_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBa_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldBY_11deserializepEBc_
Unexecuted instantiation: _RINvXNvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBe_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB9_9___VisitorNtB14_7Visitor10visit_enumNtB3_14___FieldVisitorB29_9visit_u64pEBg_
Unexecuted instantiation: _RINvXNvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBe_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB9_9___VisitorNtB14_7Visitor10visit_enumNtB3_14___FieldVisitorB29_9visit_strpEBg_
Unexecuted instantiation: _RINvXNvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBe_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB9_9___VisitorNtB14_7Visitor10visit_enumNtB3_14___FieldVisitorB29_11visit_bytespEBg_
Unexecuted instantiation: _RINvXs_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBg_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBb_9___VisitorNtB16_7Visitor10visit_enumNtB5_7___FieldB14_11deserializepEBi_
Unexecuted instantiation: _RINvXs0_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_9___VisitorB2c_9visit_seqpEBj_
Unexecuted instantiation: _RINvXs0_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_9___VisitorB2c_9visit_mappEBj_
Unexecuted instantiation: _RINvXs1_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s_14___FieldVisitorB2c_9visit_u64pEBj_
Unexecuted instantiation: _RINvXs1_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s_14___FieldVisitorB2c_9visit_strpEBj_
Unexecuted instantiation: _RINvXs1_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s_14___FieldVisitorB2c_11visit_bytespEBj_
Unexecuted instantiation: _RINvXs2_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s_7___FieldB15_11deserializepEBj_
Unexecuted instantiation: _RINvXs3_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s_9___VisitorB2c_9visit_seqpEBj_
Unexecuted instantiation: _RINvXs3_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s_9___VisitorB2c_9visit_mappEBj_
Unexecuted instantiation: _RINvXs4_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s0_14___FieldVisitorB2c_9visit_u64pEBj_
Unexecuted instantiation: _RINvXs4_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s0_14___FieldVisitorB2c_9visit_strpEBj_
Unexecuted instantiation: _RINvXs4_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s0_14___FieldVisitorB2c_11visit_bytespEBj_
Unexecuted instantiation: _RINvXs5_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s0_7___FieldB15_11deserializepEBj_
Unexecuted instantiation: _RINvXs6_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s0_9___VisitorB2c_9visit_seqpEBj_
Unexecuted instantiation: _RINvXs6_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s0_9___VisitorB2c_9visit_mappEBj_
Unexecuted instantiation: _RINvXs7_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s1_14___FieldVisitorB2c_9visit_u64pEBj_
Unexecuted instantiation: _RINvXs7_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s1_14___FieldVisitorB2c_9visit_strpEBj_
Unexecuted instantiation: _RINvXs7_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s1_14___FieldVisitorB2c_11visit_bytespEBj_
Unexecuted instantiation: _RINvXs8_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s1_7___FieldB15_11deserializepEBj_
Unexecuted instantiation: _RINvXs9_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s1_9___VisitorB2c_9visit_seqpEBj_
Unexecuted instantiation: _RINvXs9_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s1_9___VisitorB2c_9visit_mappEBj_
Unexecuted instantiation: _RINvXsa_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s2_14___FieldVisitorB2c_9visit_u64pEBj_
Unexecuted instantiation: _RINvXsa_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s2_14___FieldVisitorB2c_9visit_strpEBj_
Unexecuted instantiation: _RINvXsa_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s2_14___FieldVisitorB2c_11visit_bytespEBj_
Unexecuted instantiation: _RINvXsb_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s2_7___FieldB15_11deserializepEBj_
Unexecuted instantiation: _RINvXsc_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s2_9___VisitorB2c_9visit_seqpEBj_
Unexecuted instantiation: _RINvXsc_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s2_9___VisitorB2c_9visit_mappEBj_
Unexecuted instantiation: _RINvXsd_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s3_14___FieldVisitorB2c_9visit_u64pEBj_
Unexecuted instantiation: _RINvXsd_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s3_14___FieldVisitorB2c_9visit_strpEBj_
Unexecuted instantiation: _RINvXsd_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s3_14___FieldVisitorB2c_11visit_bytespEBj_
Unexecuted instantiation: _RINvXse_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s3_7___FieldB15_11deserializepEBj_
Unexecuted instantiation: _RINvXsf_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s3_9___VisitorB2c_9visit_seqpEBj_
Unexecuted instantiation: _RINvXsf_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s3_9___VisitorB2c_9visit_mappEBj_
Unexecuted instantiation: _RINvXsg_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s4_14___FieldVisitorB2c_9visit_u64pEBj_
Unexecuted instantiation: _RINvXsg_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s4_14___FieldVisitorB2c_9visit_strpEBj_
Unexecuted instantiation: _RINvXsg_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s4_14___FieldVisitorB2c_11visit_bytespEBj_
Unexecuted instantiation: _RINvXsh_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s4_7___FieldB15_11deserializepEBj_
Unexecuted instantiation: _RINvXsi_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s4_9___VisitorB2c_9visit_seqpEBj_
Unexecuted instantiation: _RINvXsi_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s4_9___VisitorB2c_9visit_mappEBj_
Unexecuted instantiation: _RINvXsj_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s5_14___FieldVisitorB2c_9visit_u64pEBj_
Unexecuted instantiation: _RINvXsj_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s5_14___FieldVisitorB2c_9visit_strpEBj_
Unexecuted instantiation: _RINvXsj_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s5_14___FieldVisitorB2c_11visit_bytespEBj_
Unexecuted instantiation: _RINvXsk_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s5_7___FieldB15_11deserializepEBj_
Unexecuted instantiation: _RINvXsl_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s5_9___VisitorB2c_9visit_seqpEBj_
Unexecuted instantiation: _RINvXsl_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s5_9___VisitorB2c_9visit_mappEBj_
Unexecuted instantiation: _RINvXsm_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s6_14___FieldVisitorB2c_9visit_u64pEBj_
Unexecuted instantiation: _RINvXsm_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s6_14___FieldVisitorB2c_9visit_strpEBj_
Unexecuted instantiation: _RINvXsm_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s6_14___FieldVisitorB2c_11visit_bytespEBj_
Unexecuted instantiation: _RINvXsn_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s6_7___FieldB15_11deserializepEBj_
Unexecuted instantiation: _RINvXso_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s6_9___VisitorB2c_9visit_seqpEBj_
Unexecuted instantiation: _RINvXso_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s6_9___VisitorB2c_9visit_mappEBj_
Unexecuted instantiation: _RINvXsp_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s7_14___FieldVisitorB2c_9visit_u64pEBj_
Unexecuted instantiation: _RINvXsp_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s7_14___FieldVisitorB2c_9visit_strpEBj_
Unexecuted instantiation: _RINvXsp_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s7_14___FieldVisitorB2c_11visit_bytespEBj_
Unexecuted instantiation: _RINvXsq_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s7_7___FieldB15_11deserializepEBj_
Unexecuted instantiation: _RINvXsr_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s7_9___VisitorB2c_9visit_seqpEBj_
Unexecuted instantiation: _RINvXsr_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s7_9___VisitorB2c_9visit_mappEBj_
Unexecuted instantiation: _RINvXss_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s8_14___FieldVisitorB2c_9visit_u64pEBj_
Unexecuted instantiation: _RINvXss_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s8_14___FieldVisitorB2c_9visit_strpEBj_
Unexecuted instantiation: _RINvXss_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s8_14___FieldVisitorB2c_11visit_bytespEBj_
Unexecuted instantiation: _RINvXst_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s8_7___FieldB15_11deserializepEBj_
Unexecuted instantiation: _RINvXsu_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s8_9___VisitorB2c_9visit_seqpEBj_
Unexecuted instantiation: _RINvXsu_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s8_9___VisitorB2c_9visit_mappEBj_
Unexecuted instantiation: _RINvXsv_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s9_14___FieldVisitorB2c_9visit_u64pEBj_
Unexecuted instantiation: _RINvXsv_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s9_14___FieldVisitorB2c_9visit_strpEBj_
Unexecuted instantiation: _RINvXsv_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s9_14___FieldVisitorB2c_11visit_bytespEBj_
Unexecuted instantiation: _RINvXsw_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s9_7___FieldB15_11deserializepEBj_
Unexecuted instantiation: _RINvXsx_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s9_9___VisitorB2c_9visit_seqpEBj_
Unexecuted instantiation: _RINvXsx_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_s9_9___VisitorB2c_9visit_mappEBj_
Unexecuted instantiation: _RINvXsy_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_sa_14___FieldVisitorB2c_9visit_u64pEBj_
Unexecuted instantiation: _RINvXsy_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_sa_14___FieldVisitorB2c_9visit_strpEBj_
Unexecuted instantiation: _RINvXsy_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_sa_14___FieldVisitorB2c_11visit_bytespEBj_
Unexecuted instantiation: _RINvXsz_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_sa_7___FieldB15_11deserializepEBj_
Unexecuted instantiation: _RINvXsA_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_sa_9___VisitorB2c_9visit_seqpEBj_
Unexecuted instantiation: _RINvXsA_NvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts_1__NtBh_7ReceiptNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtBc_9___VisitorNtB17_7Visitor10visit_enumNtB6_sa_9___VisitorB2c_9visit_mappEBj_
_RINvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts1_1__NtB5_7ReceiptNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
28
924k
    Clone, Derivative, serde::Serialize, serde::Deserialize, Deserialize, Serialize,
_RINvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts1_1__NtB5_7ReceiptNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
28
924k
    Clone, Derivative, serde::Serialize, serde::Deserialize, Deserialize, Serialize,
_RNvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts1_1__NtB4_7ReceiptNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_static
Line
Count
Source
28
924k
    Clone, Derivative, serde::Serialize, serde::Deserialize, Deserialize, Serialize,
_RNvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts1_1__NtB4_7ReceiptNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamic
Line
Count
Source
28
924k
    Clone, Derivative, serde::Serialize, serde::Deserialize, Deserialize, Serialize,
Unexecuted instantiation: _RINvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts1_1__NtB5_7ReceiptNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvXNvNtCseSMGV7FMBK4_7fuel_tx7receipts1_1__NtB5_7ReceiptNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
29
)]
30
0
#[derivative(Eq, PartialEq, Hash, Debug)]
31
pub enum Receipt {
32
0
    Call {
33
        id: ContractId,
34
        to: ContractId,
35
        amount: Word,
36
        asset_id: AssetId,
37
        gas: Word,
38
        param1: Word,
39
        param2: Word,
40
        pc: Word,
41
        is: Word,
42
    },
43
44
0
    Return {
45
        id: ContractId,
46
        val: Word,
47
        pc: Word,
48
        is: Word,
49
    },
50
51
0
    ReturnData {
52
        id: ContractId,
53
        ptr: Word,
54
        len: Word,
55
        digest: Bytes32,
56
        pc: Word,
57
        is: Word,
58
0
        #[derivative(Debug(format_with = "fmt_option_truncated_hex::<16>"))]
59
        #[derivative(PartialEq = "ignore", Hash = "ignore")]
60
        #[canonical(skip)]
61
        data: Option<Vec<u8>>,
62
    },
63
64
0
    Panic {
65
        id: ContractId,
66
        reason: PanicInstruction,
67
        pc: Word,
68
        is: Word,
69
        #[derivative(PartialEq = "ignore", Hash = "ignore")]
70
        #[canonical(skip)]
71
        contract_id: Option<ContractId>,
72
    },
73
74
0
    Revert {
75
        id: ContractId,
76
        ra: Word,
77
        pc: Word,
78
        is: Word,
79
    },
80
81
0
    Log {
82
        id: ContractId,
83
        ra: Word,
84
        rb: Word,
85
        rc: Word,
86
        rd: Word,
87
        pc: Word,
88
        is: Word,
89
    },
90
91
0
    LogData {
92
        id: ContractId,
93
        ra: Word,
94
        rb: Word,
95
        ptr: Word,
96
        len: Word,
97
        digest: Bytes32,
98
        pc: Word,
99
        is: Word,
100
0
        #[derivative(Debug(format_with = "fmt_option_truncated_hex::<16>"))]
101
        #[derivative(PartialEq = "ignore", Hash = "ignore")]
102
        #[canonical(skip)]
103
        data: Option<Vec<u8>>,
104
    },
105
106
0
    Transfer {
107
        id: ContractId,
108
        to: ContractId,
109
        amount: Word,
110
        asset_id: AssetId,
111
        pc: Word,
112
        is: Word,
113
    },
114
115
0
    TransferOut {
116
        id: ContractId,
117
        to: Address,
118
        amount: Word,
119
        asset_id: AssetId,
120
        pc: Word,
121
        is: Word,
122
    },
123
124
0
    ScriptResult {
125
        result: ScriptExecutionResult,
126
        gas_used: Word,
127
    },
128
129
0
    MessageOut {
130
        sender: Address,
131
        recipient: Address,
132
        amount: Word,
133
        nonce: Nonce,
134
        len: Word,
135
        digest: Bytes32,
136
0
        #[derivative(Debug(format_with = "fmt_option_truncated_hex::<16>"))]
137
        #[derivative(PartialEq = "ignore", Hash = "ignore")]
138
        #[canonical(skip)]
139
        data: Option<Vec<u8>>,
140
    },
141
0
    Mint {
142
        sub_id: Bytes32,
143
        contract_id: ContractId,
144
        val: Word,
145
        pc: Word,
146
        is: Word,
147
    },
148
0
    Burn {
149
        sub_id: Bytes32,
150
        contract_id: ContractId,
151
        val: Word,
152
        pc: Word,
153
        is: Word,
154
    },
155
0
}
156
157
impl Receipt {
158
12.3k
    pub const fn call(
159
12.3k
        id: ContractId,
160
12.3k
        to: ContractId,
161
12.3k
        amount: Word,
162
12.3k
        asset_id: AssetId,
163
12.3k
        gas: Word,
164
12.3k
        param1: Word,
165
12.3k
        param2: Word,
166
12.3k
        pc: Word,
167
12.3k
        is: Word,
168
12.3k
    ) -> Self {
169
12.3k
        Self::Call {
170
12.3k
            id,
171
12.3k
            to,
172
12.3k
            amount,
173
12.3k
            asset_id,
174
12.3k
            gas,
175
12.3k
            param1,
176
12.3k
            param2,
177
12.3k
            pc,
178
12.3k
            is,
179
12.3k
        }
180
12.3k
    }
_RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt4callCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
158
12.3k
    pub const fn call(
159
12.3k
        id: ContractId,
160
12.3k
        to: ContractId,
161
12.3k
        amount: Word,
162
12.3k
        asset_id: AssetId,
163
12.3k
        gas: Word,
164
12.3k
        param1: Word,
165
12.3k
        param2: Word,
166
12.3k
        pc: Word,
167
12.3k
        is: Word,
168
12.3k
    ) -> Self {
169
12.3k
        Self::Call {
170
12.3k
            id,
171
12.3k
            to,
172
12.3k
            amount,
173
12.3k
            asset_id,
174
12.3k
            gas,
175
12.3k
            param1,
176
12.3k
            param2,
177
12.3k
            pc,
178
12.3k
            is,
179
12.3k
        }
180
12.3k
    }
Unexecuted instantiation: _RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt4callB4_
181
182
    // return keyword is reserved
183
27
    pub const fn ret(id: ContractId, val: Word, pc: Word, is: Word) -> Self {
184
27
        Self::Return { id, val, pc, is }
185
27
    }
_RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt3retCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
183
27
    pub const fn ret(id: ContractId, val: Word, pc: Word, is: Word) -> Self {
184
27
        Self::Return { id, val, pc, is }
185
27
    }
Unexecuted instantiation: _RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt3retB4_
186
187
11.3k
    pub fn return_data(
188
11.3k
        id: ContractId,
189
11.3k
        ptr: Word,
190
11.3k
        pc: Word,
191
11.3k
        is: Word,
192
11.3k
        data: Vec<u8>,
193
11.3k
    ) -> Self {
194
11.3k
        let digest = Hasher::hash(&data);
195
11.3k
        Self::return_data_with_len(
196
11.3k
            id,
197
11.3k
            ptr,
198
11.3k
            data.len() as Word,
199
11.3k
            digest,
200
11.3k
            pc,
201
11.3k
            is,
202
11.3k
            Some(data),
203
11.3k
        )
204
11.3k
    }
205
206
11.3k
    pub const fn return_data_with_len(
207
11.3k
        id: ContractId,
208
11.3k
        ptr: Word,
209
11.3k
        len: Word,
210
11.3k
        digest: Bytes32,
211
11.3k
        pc: Word,
212
11.3k
        is: Word,
213
11.3k
        data: Option<Vec<u8>>,
214
11.3k
    ) -> Self {
215
11.3k
        Self::ReturnData {
216
11.3k
            id,
217
11.3k
            ptr,
218
11.3k
            len,
219
11.3k
            digest,
220
11.3k
            pc,
221
11.3k
            is,
222
11.3k
            data,
223
11.3k
        }
224
11.3k
    }
225
226
2.15k
    pub const fn panic(
227
2.15k
        id: ContractId,
228
2.15k
        reason: PanicInstruction,
229
2.15k
        pc: Word,
230
2.15k
        is: Word,
231
2.15k
    ) -> Self {
232
2.15k
        Self::Panic {
233
2.15k
            id,
234
2.15k
            reason,
235
2.15k
            pc,
236
2.15k
            is,
237
2.15k
            contract_id: None,
238
2.15k
        }
239
2.15k
    }
_RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt5panicCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
226
2.15k
    pub const fn panic(
227
2.15k
        id: ContractId,
228
2.15k
        reason: PanicInstruction,
229
2.15k
        pc: Word,
230
2.15k
        is: Word,
231
2.15k
    ) -> Self {
232
2.15k
        Self::Panic {
233
2.15k
            id,
234
2.15k
            reason,
235
2.15k
            pc,
236
2.15k
            is,
237
2.15k
            contract_id: None,
238
2.15k
        }
239
2.15k
    }
Unexecuted instantiation: _RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt5panicB4_
240
241
17
    pub fn with_panic_contract_id(mut self, _contract_id: Option<ContractId>) -> Self {
242
        if let Receipt::Panic {
243
17
            ref mut contract_id,
244
            ..
245
17
        } = self
246
17
        {
247
17
            *contract_id = _contract_id;
248
17
        }
249
17
        self
250
17
    }
_RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt22with_panic_contract_idCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
241
17
    pub fn with_panic_contract_id(mut self, _contract_id: Option<ContractId>) -> Self {
242
        if let Receipt::Panic {
243
17
            ref mut contract_id,
244
            ..
245
17
        } = self
246
17
        {
247
17
            *contract_id = _contract_id;
248
17
        }
249
17
        self
250
17
    }
Unexecuted instantiation: _RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt22with_panic_contract_idB4_
251
252
10
    pub const fn revert(id: ContractId, ra: Word, pc: Word, is: Word) -> Self {
253
10
        Self::Revert { id, ra, pc, is }
254
10
    }
_RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt6revertCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
252
10
    pub const fn revert(id: ContractId, ra: Word, pc: Word, is: Word) -> Self {
253
10
        Self::Revert { id, ra, pc, is }
254
10
    }
Unexecuted instantiation: _RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt6revertB4_
255
256
631k
    pub const fn log(
257
631k
        id: ContractId,
258
631k
        ra: Word,
259
631k
        rb: Word,
260
631k
        rc: Word,
261
631k
        rd: Word,
262
631k
        pc: Word,
263
631k
        is: Word,
264
631k
    ) -> Self {
265
631k
        Self::Log {
266
631k
            id,
267
631k
            ra,
268
631k
            rb,
269
631k
            rc,
270
631k
            rd,
271
631k
            pc,
272
631k
            is,
273
631k
        }
274
631k
    }
_RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt3logCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
256
631k
    pub const fn log(
257
631k
        id: ContractId,
258
631k
        ra: Word,
259
631k
        rb: Word,
260
631k
        rc: Word,
261
631k
        rd: Word,
262
631k
        pc: Word,
263
631k
        is: Word,
264
631k
    ) -> Self {
265
631k
        Self::Log {
266
631k
            id,
267
631k
            ra,
268
631k
            rb,
269
631k
            rc,
270
631k
            rd,
271
631k
            pc,
272
631k
            is,
273
631k
        }
274
631k
    }
Unexecuted instantiation: _RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt3logB4_
275
276
176k
    pub fn log_data(
277
176k
        id: ContractId,
278
176k
        ra: Word,
279
176k
        rb: Word,
280
176k
        ptr: Word,
281
176k
        pc: Word,
282
176k
        is: Word,
283
176k
        data: Vec<u8>,
284
176k
    ) -> Self {
285
176k
        let digest = Hasher::hash(&data);
286
176k
        Self::log_data_with_len(
287
176k
            id,
288
176k
            ra,
289
176k
            rb,
290
176k
            ptr,
291
176k
            data.len() as Word,
292
176k
            digest,
293
176k
            pc,
294
176k
            is,
295
176k
            Some(data),
296
176k
        )
297
176k
    }
298
299
176k
    pub const fn log_data_with_len(
300
176k
        id: ContractId,
301
176k
        ra: Word,
302
176k
        rb: Word,
303
176k
        ptr: Word,
304
176k
        len: Word,
305
176k
        digest: Bytes32,
306
176k
        pc: Word,
307
176k
        is: Word,
308
176k
        data: Option<Vec<u8>>,
309
176k
    ) -> Self {
310
176k
        Self::LogData {
311
176k
            id,
312
176k
            ra,
313
176k
            rb,
314
176k
            ptr,
315
176k
            len,
316
176k
            digest,
317
176k
            pc,
318
176k
            is,
319
176k
            data,
320
176k
        }
321
176k
    }
322
323
0
    pub const fn transfer(
324
0
        id: ContractId,
325
0
        to: ContractId,
326
0
        amount: Word,
327
0
        asset_id: AssetId,
328
0
        pc: Word,
329
0
        is: Word,
330
0
    ) -> Self {
331
0
        Self::Transfer {
332
0
            id,
333
0
            to,
334
0
            amount,
335
0
            asset_id,
336
0
            pc,
337
0
            is,
338
0
        }
339
0
    }
Unexecuted instantiation: _RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt8transferCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt8transferB4_
340
341
0
    pub const fn transfer_out(
342
0
        id: ContractId,
343
0
        to: Address,
344
0
        amount: Word,
345
0
        asset_id: AssetId,
346
0
        pc: Word,
347
0
        is: Word,
348
0
    ) -> Self {
349
0
        Self::TransferOut {
350
0
            id,
351
0
            to,
352
0
            amount,
353
0
            asset_id,
354
0
            pc,
355
0
            is,
356
0
        }
357
0
    }
Unexecuted instantiation: _RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt12transfer_outCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt12transfer_outB4_
358
359
2.19k
    pub const fn script_result(result: ScriptExecutionResult, gas_used: Word) -> Self {
360
2.19k
        Self::ScriptResult { result, gas_used }
361
2.19k
    }
_RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt13script_resultCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
359
2.19k
    pub const fn script_result(result: ScriptExecutionResult, gas_used: Word) -> Self {
360
2.19k
        Self::ScriptResult { result, gas_used }
361
2.19k
    }
Unexecuted instantiation: _RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt13script_resultB4_
362
363
88.9k
    pub fn message_out(
364
88.9k
        txid: &Bytes32,
365
88.9k
        idx: Word,
366
88.9k
        sender: Address,
367
88.9k
        recipient: Address,
368
88.9k
        amount: Word,
369
88.9k
        data: Vec<u8>,
370
88.9k
    ) -> Self {
371
88.9k
        let nonce = Output::message_nonce(txid, idx);
372
88.9k
        let digest = Output::message_digest(&data);
373
88.9k
374
88.9k
        Self::message_out_with_len(
375
88.9k
            sender,
376
88.9k
            recipient,
377
88.9k
            amount,
378
88.9k
            nonce,
379
88.9k
            data.len() as Word,
380
88.9k
            digest,
381
88.9k
            Some(data),
382
88.9k
        )
383
88.9k
    }
384
385
88.9k
    pub const fn message_out_with_len(
386
88.9k
        sender: Address,
387
88.9k
        recipient: Address,
388
88.9k
        amount: Word,
389
88.9k
        nonce: Nonce,
390
88.9k
        len: Word,
391
88.9k
        digest: Bytes32,
392
88.9k
        data: Option<Vec<u8>>,
393
88.9k
    ) -> Self {
394
88.9k
        Self::MessageOut {
395
88.9k
            sender,
396
88.9k
            recipient,
397
88.9k
            amount,
398
88.9k
            nonce,
399
88.9k
            len,
400
88.9k
            digest,
401
88.9k
            data,
402
88.9k
        }
403
88.9k
    }
404
405
44
    pub fn mint(
406
44
        sub_id: Bytes32,
407
44
        contract_id: ContractId,
408
44
        val: Word,
409
44
        pc: Word,
410
44
        is: Word,
411
44
    ) -> Self {
412
44
        Self::Mint {
413
44
            sub_id,
414
44
            contract_id,
415
44
            val,
416
44
            pc,
417
44
            is,
418
44
        }
419
44
    }
_RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt4mintCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
405
44
    pub fn mint(
406
44
        sub_id: Bytes32,
407
44
        contract_id: ContractId,
408
44
        val: Word,
409
44
        pc: Word,
410
44
        is: Word,
411
44
    ) -> Self {
412
44
        Self::Mint {
413
44
            sub_id,
414
44
            contract_id,
415
44
            val,
416
44
            pc,
417
44
            is,
418
44
        }
419
44
    }
Unexecuted instantiation: _RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt4mintB4_
420
421
112
    pub fn burn(
422
112
        sub_id: Bytes32,
423
112
        contract_id: ContractId,
424
112
        val: Word,
425
112
        pc: Word,
426
112
        is: Word,
427
112
    ) -> Self {
428
112
        Self::Burn {
429
112
            sub_id,
430
112
            contract_id,
431
112
            val,
432
112
            pc,
433
112
            is,
434
112
        }
435
112
    }
_RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt4burnCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
421
112
    pub fn burn(
422
112
        sub_id: Bytes32,
423
112
        contract_id: ContractId,
424
112
        val: Word,
425
112
        pc: Word,
426
112
        is: Word,
427
112
    ) -> Self {
428
112
        Self::Burn {
429
112
            sub_id,
430
112
            contract_id,
431
112
            val,
432
112
            pc,
433
112
            is,
434
112
        }
435
112
    }
Unexecuted instantiation: _RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt4burnB4_
436
437
    #[inline(always)]
438
    pub fn id(&self) -> Option<&ContractId> {
439
        trim_contract_id(match self {
440
            Self::Call { id, .. } => Some(id),
441
            Self::Return { id, .. } => Some(id),
442
            Self::ReturnData { id, .. } => Some(id),
443
            Self::Panic { id, .. } => Some(id),
444
            Self::Revert { id, .. } => Some(id),
445
            Self::Log { id, .. } => Some(id),
446
            Self::LogData { id, .. } => Some(id),
447
            Self::Transfer { id, .. } => Some(id),
448
            Self::TransferOut { id, .. } => Some(id),
449
            Self::ScriptResult { .. } => None,
450
            Self::MessageOut { .. } => None,
451
            Self::Mint { contract_id, .. } => Some(contract_id),
452
            Self::Burn { contract_id, .. } => Some(contract_id),
453
        })
454
    }
455
456
0
    pub const fn sub_id(&self) -> Option<&Bytes32> {
457
0
        match self {
458
0
            Self::Mint { sub_id, .. } => Some(sub_id),
459
0
            Self::Burn { sub_id, .. } => Some(sub_id),
460
0
            _ => None,
461
        }
462
0
    }
463
464
0
    pub const fn pc(&self) -> Option<Word> {
465
0
        match self {
466
0
            Self::Call { pc, .. } => Some(*pc),
467
0
            Self::Return { pc, .. } => Some(*pc),
468
0
            Self::ReturnData { pc, .. } => Some(*pc),
469
0
            Self::Panic { pc, .. } => Some(*pc),
470
0
            Self::Revert { pc, .. } => Some(*pc),
471
0
            Self::Log { pc, .. } => Some(*pc),
472
0
            Self::LogData { pc, .. } => Some(*pc),
473
0
            Self::Transfer { pc, .. } => Some(*pc),
474
0
            Self::TransferOut { pc, .. } => Some(*pc),
475
0
            Self::ScriptResult { .. } => None,
476
0
            Self::MessageOut { .. } => None,
477
0
            Self::Mint { pc, .. } => Some(*pc),
478
0
            Self::Burn { pc, .. } => Some(*pc),
479
        }
480
0
    }
481
482
0
    pub const fn is(&self) -> Option<Word> {
483
0
        match self {
484
0
            Self::Call { is, .. } => Some(*is),
485
0
            Self::Return { is, .. } => Some(*is),
486
0
            Self::ReturnData { is, .. } => Some(*is),
487
0
            Self::Panic { is, .. } => Some(*is),
488
0
            Self::Revert { is, .. } => Some(*is),
489
0
            Self::Log { is, .. } => Some(*is),
490
0
            Self::LogData { is, .. } => Some(*is),
491
0
            Self::Transfer { is, .. } => Some(*is),
492
0
            Self::TransferOut { is, .. } => Some(*is),
493
0
            Self::ScriptResult { .. } => None,
494
0
            Self::MessageOut { .. } => None,
495
0
            Self::Mint { is, .. } => Some(*is),
496
0
            Self::Burn { is, .. } => Some(*is),
497
        }
498
0
    }
499
500
    #[inline(always)]
501
    pub fn to(&self) -> Option<&ContractId> {
502
        trim_contract_id(match self {
503
            Self::Call { to, .. } => Some(to),
504
            Self::Transfer { to, .. } => Some(to),
505
            _ => None,
506
        })
507
    }
508
509
0
    pub const fn to_address(&self) -> Option<&Address> {
510
0
        match self {
511
0
            Self::TransferOut { to, .. } => Some(to),
512
0
            _ => None,
513
        }
514
0
    }
515
516
0
    pub const fn amount(&self) -> Option<Word> {
517
0
        match self {
518
0
            Self::Call { amount, .. } => Some(*amount),
519
0
            Self::Transfer { amount, .. } => Some(*amount),
520
0
            Self::TransferOut { amount, .. } => Some(*amount),
521
0
            Self::MessageOut { amount, .. } => Some(*amount),
522
0
            _ => None,
523
        }
524
0
    }
525
526
0
    pub const fn asset_id(&self) -> Option<&AssetId> {
527
0
        match self {
528
0
            Self::Call { asset_id, .. } => Some(asset_id),
529
0
            Self::Transfer { asset_id, .. } => Some(asset_id),
530
0
            Self::TransferOut { asset_id, .. } => Some(asset_id),
531
0
            _ => None,
532
        }
533
0
    }
534
535
0
    pub const fn gas(&self) -> Option<Word> {
536
0
        match self {
537
0
            Self::Call { gas, .. } => Some(*gas),
538
0
            _ => None,
539
        }
540
0
    }
541
542
0
    pub const fn param1(&self) -> Option<Word> {
543
0
        match self {
544
0
            Self::Call { param1, .. } => Some(*param1),
545
0
            _ => None,
546
        }
547
0
    }
548
549
0
    pub const fn param2(&self) -> Option<Word> {
550
0
        match self {
551
0
            Self::Call { param2, .. } => Some(*param2),
552
0
            _ => None,
553
        }
554
0
    }
555
556
0
    pub const fn val(&self) -> Option<Word> {
557
0
        match self {
558
0
            Self::Return { val, .. } => Some(*val),
559
0
            Self::Mint { val, .. } => Some(*val),
560
0
            Self::Burn { val, .. } => Some(*val),
561
0
            _ => None,
562
        }
563
0
    }
564
565
0
    pub const fn ptr(&self) -> Option<Word> {
566
0
        match self {
567
0
            Self::ReturnData { ptr, .. } => Some(*ptr),
568
0
            Self::LogData { ptr, .. } => Some(*ptr),
569
0
            _ => None,
570
        }
571
0
    }
572
573
0
    pub const fn len(&self) -> Option<Word> {
574
0
        match self {
575
0
            Self::ReturnData { len, .. } => Some(*len),
576
0
            Self::LogData { len, .. } => Some(*len),
577
0
            Self::MessageOut { len, .. } => Some(*len),
578
0
            _ => None,
579
        }
580
0
    }
581
582
0
    pub const fn is_empty(&self) -> Option<bool> {
583
0
        match self.len() {
584
0
            Some(0) => Some(true),
585
0
            Some(_) => Some(false),
586
0
            None => None,
587
        }
588
0
    }
589
590
11.3k
    pub const fn digest(&self) -> Option<&Bytes32> {
591
11.3k
        match self {
592
11.3k
            Self::ReturnData { digest, .. } => Some(digest),
593
0
            Self::LogData { digest, .. } => Some(digest),
594
0
            Self::MessageOut { digest, .. } => Some(digest),
595
0
            _ => None,
596
        }
597
11.3k
    }
_RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt6digestCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
590
11.3k
    pub const fn digest(&self) -> Option<&Bytes32> {
591
11.3k
        match self {
592
11.3k
            Self::ReturnData { digest, .. } => Some(digest),
593
0
            Self::LogData { digest, .. } => Some(digest),
594
0
            Self::MessageOut { digest, .. } => Some(digest),
595
0
            _ => None,
596
        }
597
11.3k
    }
Unexecuted instantiation: _RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt6digestB4_
598
599
0
    pub fn data(&self) -> Option<&[u8]> {
600
0
        match self {
601
0
            Self::ReturnData { data, .. } => data.as_ref().map(|data| data.as_slice()),
602
0
            Self::LogData { data, .. } => data.as_ref().map(|data| data.as_slice()),
603
0
            Self::MessageOut { data, .. } => data.as_ref().map(|data| data.as_slice()),
604
0
            _ => None,
605
        }
606
0
    }
607
608
0
    pub const fn reason(&self) -> Option<PanicInstruction> {
609
0
        match self {
610
0
            Self::Panic { reason, .. } => Some(*reason),
611
0
            _ => None,
612
        }
613
0
    }
614
615
0
    pub const fn ra(&self) -> Option<Word> {
616
0
        match self {
617
0
            Self::Revert { ra, .. } => Some(*ra),
618
0
            Self::Log { ra, .. } => Some(*ra),
619
0
            Self::LogData { ra, .. } => Some(*ra),
620
0
            _ => None,
621
        }
622
0
    }
Unexecuted instantiation: _RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt2raCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt2raB4_
623
624
0
    pub const fn rb(&self) -> Option<Word> {
625
0
        match self {
626
0
            Self::Log { rb, .. } => Some(*rb),
627
0
            Self::LogData { rb, .. } => Some(*rb),
628
0
            _ => None,
629
        }
630
0
    }
631
632
0
    pub const fn rc(&self) -> Option<Word> {
633
0
        match self {
634
0
            Self::Log { rc, .. } => Some(*rc),
635
0
            _ => None,
636
        }
637
0
    }
638
639
0
    pub const fn rd(&self) -> Option<Word> {
640
0
        match self {
641
0
            Self::Log { rd, .. } => Some(*rd),
642
0
            _ => None,
643
        }
644
0
    }
645
646
0
    pub const fn result(&self) -> Option<&ScriptExecutionResult> {
647
0
        match self {
648
0
            Self::ScriptResult { result, .. } => Some(result),
649
0
            _ => None,
650
        }
651
0
    }
Unexecuted instantiation: _RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt6resultCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMNtCseSMGV7FMBK4_7fuel_tx7receiptNtB2_7Receipt6resultB4_
652
653
0
    pub const fn gas_used(&self) -> Option<Word> {
654
0
        match self {
655
0
            Self::ScriptResult { gas_used, .. } => Some(*gas_used),
656
0
            _ => None,
657
        }
658
0
    }
659
660
0
    pub fn message_id(&self) -> Option<MessageId> {
661
0
        match self {
662
            Self::MessageOut {
663
0
                sender,
664
0
                recipient,
665
0
                amount,
666
0
                nonce,
667
0
                data,
668
0
                ..
669
0
            } => data.as_ref().map(|data| {
670
0
                compute_message_id(sender, recipient, nonce, *amount, data.as_slice())
671
0
            }),
672
0
            _ => None,
673
        }
674
0
    }
675
676
0
    pub const fn sender(&self) -> Option<&Address> {
677
0
        match self {
678
0
            Self::MessageOut { sender, .. } => Some(sender),
679
0
            _ => None,
680
        }
681
0
    }
682
683
0
    pub const fn recipient(&self) -> Option<&Address> {
684
0
        match self {
685
0
            Self::MessageOut { recipient, .. } => Some(recipient),
686
0
            _ => None,
687
        }
688
0
    }
689
690
0
    pub const fn nonce(&self) -> Option<&Nonce> {
691
0
        match self {
692
0
            Self::MessageOut { nonce, .. } => Some(nonce),
693
0
            _ => None,
694
        }
695
0
    }
696
697
0
    pub const fn contract_id(&self) -> Option<&ContractId> {
698
0
        match self {
699
0
            Self::Panic { contract_id, .. } => contract_id.as_ref(),
700
0
            _ => None,
701
        }
702
0
    }
703
}
704
705
0
fn trim_contract_id(id: Option<&ContractId>) -> Option<&ContractId> {
706
0
    id.and_then(|id| {
707
0
        if id != &ContractId::zeroed() {
708
0
            Some(id)
709
        } else {
710
0
            None
711
        }
712
0
    })
713
0
}
714
715
#[cfg(test)]
716
mod tests {
717
    use crate::Receipt;
718
    use fuel_types::ContractId;
719
720
    // TODO: Rewrite the test cases when `Receipt` will have its struct for
721
    //  each variant. It will allow to use `Default` trait.
722
    #[rstest::rstest]
723
    #[case(
724
        Receipt::Call {
725
            id: ContractId::from([1; 32]),
726
            to: Default::default(),
727
            amount: 0,
728
            asset_id: Default::default(),
729
            gas: 0,
730
            param1: 0,
731
            param2: 0,
732
            pc: 0,
733
            is: 0,
734
        },
735
        Some(ContractId::from([1; 32]))
736
    )]
737
    #[case(
738
        Receipt::Call {
739
            id: ContractId::from([0; 32]),
740
            to: Default::default(),
741
            amount: 0,
742
            asset_id: Default::default(),
743
            gas: 0,
744
            param1: 0,
745
            param2: 0,
746
            pc: 0,
747
            is: 0,
748
        },
749
        None
750
    )]
751
    #[case(
752
        Receipt::Return {
753
            id: ContractId::from([2; 32]),
754
            val: 0,
755
            pc: 0,
756
            is: 0,
757
        },
758
        Some(ContractId::from([2; 32]))
759
    )]
760
    #[case(
761
        Receipt::Return {
762
            id: ContractId::from([0; 32]),
763
            val: 0,
764
            pc: 0,
765
            is: 0,
766
        },
767
        None
768
    )]
769
    fn receipt_id(#[case] receipt: Receipt, #[case] expected_id: Option<ContractId>) {
770
        assert_eq!(receipt.id(), expected_id.as_ref());
771
    }
772
773
    // TODO: Rewrite the test cases when `Receipt` will have its struct for
774
    //  each variant. It will allow to use `Default` trait.
775
    #[rstest::rstest]
776
    #[case(
777
        Receipt::Call {
778
            id: Default::default(),
779
            to: ContractId::from([1; 32]),
780
            amount: 0,
781
            asset_id: Default::default(),
782
            gas: 0,
783
            param1: 0,
784
            param2: 0,
785
            pc: 0,
786
            is: 0,
787
        },
788
        Some(ContractId::from([1; 32]))
789
    )]
790
    #[case(
791
        Receipt::Call {
792
            id: Default::default(),
793
            to: ContractId::from([0; 32]),
794
            amount: 0,
795
            asset_id: Default::default(),
796
            gas: 0,
797
            param1: 0,
798
            param2: 0,
799
            pc: 0,
800
            is: 0,
801
        },
802
        None
803
    )]
804
    #[case(
805
        Receipt::Return {
806
            id: Default::default(),
807
            val: 0,
808
            pc: 0,
809
            is: 0,
810
        },
811
        None
812
    )]
813
    fn receipt_to(#[case] receipt: Receipt, #[case] expected_to: Option<ContractId>) {
814
        assert_eq!(receipt.to(), expected_to.as_ref());
815
    }
816
}
/home/marten/fuel/fuel-vm/fuel-tx/src/test_helper.rs
Line
Count
Source
1
#![cfg_attr(not(feature = "std"), no_std)]
2
3
extern crate alloc;
4
5
use fuel_types::bytes;
6
use rand::{
7
    CryptoRng,
8
    Rng,
9
};
10
11
#[cfg(feature = "std")]
12
pub use use_std::*;
13
14
use alloc::vec::Vec;
15
16
0
pub fn generate_nonempty_padded_bytes<R>(rng: &mut R) -> Vec<u8>
17
0
where
18
0
    R: Rng + CryptoRng,
19
0
{
20
0
    let len = rng.gen_range(1..512);
21
0
    let len = bytes::padded_len_usize(len).unwrap();
22
0
23
0
    let mut data = alloc::vec![0u8; len];
24
0
    rng.fill_bytes(data.as_mut_slice());
25
0
26
0
    data
27
0
}
28
29
0
pub fn generate_bytes<R>(rng: &mut R) -> Vec<u8>
30
0
where
31
0
    R: Rng + CryptoRng,
32
0
{
33
0
    let len = rng.gen_range(1..512);
34
0
35
0
    let mut data = alloc::vec![0u8; len];
36
0
    rng.fill_bytes(data.as_mut_slice());
37
0
38
0
    data
39
0
}
40
41
#[cfg(feature = "std")]
42
mod use_std {
43
    use super::{
44
        generate_bytes,
45
        generate_nonempty_padded_bytes,
46
    };
47
    use crate::{
48
        field,
49
        Blob,
50
        BlobBody,
51
        BlobIdExt,
52
        Buildable,
53
        ConsensusParameters,
54
        Contract,
55
        Create,
56
        Finalizable,
57
        Input,
58
        Mint,
59
        Output,
60
        Script,
61
        Transaction,
62
        TransactionBuilder,
63
        Upgrade,
64
        UpgradePurpose,
65
        Upload,
66
        UploadBody,
67
        UploadSubsection,
68
    };
69
    use core::marker::PhantomData;
70
    use fuel_crypto::{
71
        Hasher,
72
        SecretKey,
73
    };
74
    use fuel_types::{
75
        canonical::Deserialize,
76
        BlobId,
77
    };
78
    use rand::{
79
        distributions::{
80
            Distribution,
81
            Uniform,
82
        },
83
        rngs::StdRng,
84
        CryptoRng,
85
        Rng,
86
        SeedableRng,
87
    };
88
    use strum::EnumCount;
89
90
    pub struct TransactionFactory<R, Tx>
91
    where
92
        R: Rng + CryptoRng,
93
    {
94
        rng: R,
95
        input_sampler: Uniform<usize>,
96
        output_sampler: Uniform<usize>,
97
        marker: PhantomData<Tx>,
98
    }
99
100
    impl<R, Tx> From<R> for TransactionFactory<R, Tx>
101
    where
102
        R: Rng + CryptoRng,
103
    {
104
0
        fn from(rng: R) -> Self {
105
0
            let input_sampler = Uniform::from(0..Input::COUNT);
106
0
            let output_sampler = Uniform::from(0..Output::COUNT);
107
0
108
0
            // Trick to enforce coverage of all variants in compile-time
109
0
            //
110
0
            // When and if a new variant is added, this implementation enforces it will be
111
0
            // listed here.
112
0
            let empty: [u8; 0] = [];
113
0
            debug_assert!({
114
0
                Input::decode(&mut &empty[..])
115
0
                    .map(|i| match i {
116
0
                        Input::CoinSigned(_) => (),
117
0
                        Input::CoinPredicate(_) => (),
118
0
                        Input::Contract(_) => (),
119
0
                        Input::MessageCoinSigned(_) => (),
120
0
                        Input::MessageCoinPredicate(_) => (),
121
0
                        Input::MessageDataSigned(_) => (),
122
0
                        Input::MessageDataPredicate(_) => (),
123
0
                    })
124
0
                    .unwrap_or(());
125
0
126
0
                Output::decode(&mut &empty[..])
127
0
                    .map(|o| match o {
128
0
                        Output::Coin { .. } => (),
129
0
                        Output::Contract(_) => (),
130
0
                        Output::Change { .. } => (),
131
0
                        Output::Variable { .. } => (),
132
0
                        Output::ContractCreated { .. } => (),
133
0
                    })
134
0
                    .unwrap_or(());
135
0
136
0
                Transaction::decode(&mut &empty[..])
137
0
                    .map(|t| match t {
138
0
                        Transaction::Script(_) => (),
139
0
                        Transaction::Create(_) => (),
140
0
                        Transaction::Mint(_) => (),
141
0
                        Transaction::Upgrade(_) => (),
142
0
                        Transaction::Upload(_) => (),
143
0
                        Transaction::Blob(_) => (),
144
0
                    })
145
0
                    .unwrap_or(());
146
0
147
0
                true
148
            });
149
150
0
            Self {
151
0
                rng,
152
0
                input_sampler,
153
0
                output_sampler,
154
0
                marker: Default::default(),
155
0
            }
156
0
        }
157
    }
158
159
    impl<Tx> TransactionFactory<StdRng, Tx> {
160
0
        pub fn from_seed(seed: u64) -> Self {
161
0
            StdRng::seed_from_u64(seed).into()
162
0
        }
163
    }
164
165
    impl<R, Tx> TransactionFactory<R, Tx>
166
    where
167
        R: Rng + CryptoRng,
168
        Tx: field::Outputs,
169
    {
170
0
        fn fill_outputs(&mut self, builder: &mut TransactionBuilder<Tx>) {
171
0
            let outputs = self.rng.gen_range(0..10);
172
0
            for _ in 0..outputs {
173
0
                let variant = self.output_sampler.sample(&mut self.rng);
174
175
0
                let output = match variant {
176
0
                    0 => Output::coin(self.rng.gen(), self.rng.gen(), self.rng.gen()),
177
0
                    1 => Output::contract(self.rng.gen(), self.rng.gen(), self.rng.gen()),
178
0
                    2 => Output::change(self.rng.gen(), self.rng.gen(), self.rng.gen()),
179
0
                    3 => Output::variable(self.rng.gen(), self.rng.gen(), self.rng.gen()),
180
0
                    4 => Output::contract_created(self.rng.gen(), self.rng.gen()),
181
182
0
                    _ => unreachable!(),
183
                };
184
185
0
                builder.add_output(output);
186
            }
187
0
        }
188
    }
189
190
    impl<R, Tx> TransactionFactory<R, Tx>
191
    where
192
        R: Rng + CryptoRng,
193
        Tx: Buildable,
194
    {
195
0
        fn fill_transaction(
196
0
            &mut self,
197
0
            builder: &mut TransactionBuilder<Tx>,
198
0
        ) -> Vec<SecretKey> {
199
0
            let inputs = self.rng.gen_range(0..10);
200
0
            let mut input_coin_keys = Vec::with_capacity(10);
201
0
            let mut input_message_keys = Vec::with_capacity(10);
202
203
            enum MessageType {
204
                MessageCoin,
205
                MessageData,
206
            }
207
208
0
            for _ in 0..inputs {
209
0
                let variant = self.input_sampler.sample(&mut self.rng);
210
0
211
0
                match variant {
212
0
                    0 => {
213
0
                        let secret = SecretKey::random(&mut self.rng);
214
0
215
0
                        input_coin_keys.push(secret);
216
0
                    }
217
218
0
                    1 => {
219
0
                        let predicate = generate_nonempty_padded_bytes(&mut self.rng);
220
0
                        let owner = (*Contract::root_from_code(&predicate)).into();
221
0
222
0
                        let input = Input::coin_predicate(
223
0
                            self.rng.gen(),
224
0
                            owner,
225
0
                            self.rng.gen(),
226
0
                            self.rng.gen(),
227
0
                            self.rng.gen(),
228
0
                            self.rng.gen(),
229
0
                            predicate,
230
0
                            generate_bytes(&mut self.rng),
231
0
                        );
232
0
233
0
                        builder.add_input(input);
234
0
                    }
235
236
0
                    2 => {
237
0
                        let input = Input::contract(
238
0
                            self.rng.gen(),
239
0
                            self.rng.gen(),
240
0
                            self.rng.gen(),
241
0
                            self.rng.gen(),
242
0
                            self.rng.gen(),
243
0
                        );
244
0
245
0
                        builder.add_input(input);
246
0
                    }
247
248
0
                    3 => {
249
0
                        let secret = SecretKey::random(&mut self.rng);
250
0
251
0
                        input_message_keys.push((MessageType::MessageCoin, secret));
252
0
                    }
253
254
0
                    4 => {
255
0
                        let predicate = generate_nonempty_padded_bytes(&mut self.rng);
256
0
                        let recipient = (*Contract::root_from_code(&predicate)).into();
257
0
258
0
                        let input = Input::message_coin_predicate(
259
0
                            self.rng.gen(),
260
0
                            recipient,
261
0
                            self.rng.gen(),
262
0
                            self.rng.gen(),
263
0
                            self.rng.gen(),
264
0
                            predicate,
265
0
                            generate_bytes(&mut self.rng),
266
0
                        );
267
0
268
0
                        builder.add_input(input);
269
0
                    }
270
271
0
                    5 => {
272
0
                        let secret = SecretKey::random(&mut self.rng);
273
0
274
0
                        input_message_keys.push((MessageType::MessageData, secret));
275
0
                    }
276
277
0
                    6 => {
278
0
                        let predicate = generate_nonempty_padded_bytes(&mut self.rng);
279
0
                        let recipient = (*Contract::root_from_code(&predicate)).into();
280
0
281
0
                        let input = Input::message_data_predicate(
282
0
                            self.rng.gen(),
283
0
                            recipient,
284
0
                            self.rng.gen(),
285
0
                            self.rng.gen(),
286
0
                            self.rng.gen(),
287
0
                            generate_bytes(&mut self.rng),
288
0
                            predicate,
289
0
                            generate_bytes(&mut self.rng),
290
0
                        );
291
0
292
0
                        builder.add_input(input);
293
0
                    }
294
295
0
                    _ => unreachable!(),
296
                }
297
            }
298
299
0
            input_coin_keys.iter().for_each(|k| {
300
0
                builder.add_unsigned_coin_input(
301
0
                    *k,
302
0
                    self.rng.gen(),
303
0
                    self.rng.gen(),
304
0
                    self.rng.gen(),
305
0
                    self.rng.gen(),
306
0
                );
307
0
            });
308
0
309
0
            input_message_keys.iter().for_each(|(t, k)| match t {
310
0
                MessageType::MessageCoin => {
311
0
                    builder.add_unsigned_message_input(
312
0
                        *k,
313
0
                        self.rng.gen(),
314
0
                        self.rng.gen(),
315
0
                        self.rng.gen(),
316
0
                        vec![],
317
0
                    );
318
0
                }
319
0
                MessageType::MessageData => {
320
0
                    builder.add_unsigned_message_input(
321
0
                        *k,
322
0
                        self.rng.gen(),
323
0
                        self.rng.gen(),
324
0
                        self.rng.gen(),
325
0
                        generate_bytes(&mut self.rng),
326
0
                    );
327
0
                }
328
0
            });
329
0
330
0
            self.fill_outputs(builder);
331
0
332
0
            let witnesses = self.rng.gen_range(0..10);
333
0
            for _ in 0..witnesses {
334
0
                let witness = generate_bytes(&mut self.rng).into();
335
0
336
0
                builder.add_witness(witness);
337
0
            }
338
339
0
            let mut input_keys = input_coin_keys;
340
0
            input_keys.extend(input_message_keys.into_iter().map(|(_, k)| k));
341
0
            input_keys
342
0
        }
343
    }
344
345
    impl<R> TransactionFactory<R, Create>
346
    where
347
        R: Rng + CryptoRng,
348
    {
349
0
        pub fn transaction(&mut self) -> Create {
350
0
            self.transaction_with_keys().0
351
0
        }
352
353
0
        pub fn transaction_with_keys(&mut self) -> (Create, Vec<SecretKey>) {
354
0
            let slots = self.rng.gen_range(0..10);
355
0
            let mut builder = TransactionBuilder::<Create>::create(
356
0
                self.rng.gen(),
357
0
                self.rng.gen(),
358
0
                (0..slots).map(|_| self.rng.gen()).collect(),
359
0
            );
360
0
361
0
            let keys = self.fill_transaction(&mut builder);
362
0
            (builder.finalize(), keys)
363
0
        }
364
    }
365
366
    impl<R> TransactionFactory<R, Script>
367
    where
368
        R: Rng + CryptoRng,
369
    {
370
0
        pub fn transaction(&mut self) -> Script {
371
0
            self.transaction_with_keys().0
372
0
        }
373
374
0
        pub fn transaction_with_keys(&mut self) -> (Script, Vec<SecretKey>) {
375
0
            let mut builder = TransactionBuilder::<Script>::script(
376
0
                generate_bytes(&mut self.rng),
377
0
                generate_bytes(&mut self.rng),
378
0
            );
379
0
380
0
            let keys = self.fill_transaction(&mut builder);
381
0
            (builder.finalize(), keys)
382
0
        }
383
    }
384
385
    impl<R> TransactionFactory<R, Upgrade>
386
    where
387
        R: Rng + CryptoRng,
388
    {
389
0
        pub fn transaction(&mut self) -> Upgrade {
390
0
            self.transaction_with_keys().0
391
0
        }
392
393
0
        pub fn transaction_with_keys(&mut self) -> (Upgrade, Vec<SecretKey>) {
394
0
            let variant = self.rng.gen_range(0..UpgradePurpose::COUNT);
395
0
            let consensus_params =
396
0
                postcard::to_allocvec(&ConsensusParameters::default()).unwrap();
397
0
            let checksum = Hasher::hash(consensus_params.as_slice());
398
399
0
            let purpose = match variant {
400
0
                0 => UpgradePurpose::StateTransition {
401
0
                    root: self.rng.gen(),
402
0
                },
403
0
                1 => UpgradePurpose::ConsensusParameters {
404
0
                    witness_index: 0,
405
0
                    checksum,
406
0
                },
407
                _ => {
408
0
                    panic!("Not supported")
409
                }
410
            };
411
412
0
            let mut builder = TransactionBuilder::<Upgrade>::upgrade(purpose);
413
0
            builder.add_witness(consensus_params.into());
414
0
415
0
            let keys = self.fill_transaction(&mut builder);
416
0
            (builder.finalize(), keys)
417
0
        }
418
    }
419
420
    impl<R> TransactionFactory<R, Upload>
421
    where
422
        R: Rng + CryptoRng,
423
    {
424
0
        pub fn transaction(&mut self) -> Upload {
425
0
            self.transaction_with_keys().0
426
0
        }
427
428
0
        pub fn transaction_with_keys(&mut self) -> (Upload, Vec<SecretKey>) {
429
0
            let len = self.rng.gen_range(1..1024 * 1024);
430
0
431
0
            let mut bytecode = alloc::vec![0u8; len];
432
0
            self.rng.fill_bytes(bytecode.as_mut_slice());
433
0
434
0
            let subsection = UploadSubsection::split_bytecode(&bytecode, len / 10)
435
0
                .expect("Should split the bytecode")[0]
436
0
                .clone();
437
0
438
0
            let mut builder = TransactionBuilder::<Upload>::upload(UploadBody {
439
0
                root: subsection.root,
440
0
                witness_index: 0,
441
0
                subsection_index: subsection.subsection_index,
442
0
                subsections_number: subsection.subsections_number,
443
0
                proof_set: subsection.proof_set,
444
0
            });
445
0
            debug_assert_eq!(builder.witnesses().len(), 0);
446
0
            builder.add_witness(subsection.subsection.into());
447
0
448
0
            let keys = self.fill_transaction(&mut builder);
449
0
            (builder.finalize(), keys)
450
0
        }
451
    }
452
453
    impl<R> TransactionFactory<R, Blob>
454
    where
455
        R: Rng + CryptoRng,
456
    {
457
0
        pub fn transaction(&mut self) -> Blob {
458
0
            self.transaction_with_keys().0
459
0
        }
460
461
0
        pub fn transaction_with_keys(&mut self) -> (Blob, Vec<SecretKey>) {
462
0
            let len = self.rng.gen_range(1..1024 * 1024);
463
0
464
0
            let mut bytecode = alloc::vec![0u8; len];
465
0
            self.rng.fill_bytes(bytecode.as_mut_slice());
466
0
467
0
            let mut builder = TransactionBuilder::<Blob>::blob(BlobBody {
468
0
                id: BlobId::compute(&bytecode),
469
0
                witness_index: 0,
470
0
            });
471
0
            debug_assert_eq!(builder.witnesses().len(), 0);
472
0
            builder.add_witness(bytecode.into());
473
0
474
0
            let keys = self.fill_transaction(&mut builder);
475
0
            (builder.finalize(), keys)
476
0
        }
477
    }
478
479
    impl<R> TransactionFactory<R, Mint>
480
    where
481
        R: Rng + CryptoRng,
482
    {
483
0
        pub fn transaction(&mut self) -> Mint {
484
0
            let builder = TransactionBuilder::<Mint>::mint(
485
0
                self.rng.gen(),
486
0
                self.rng.gen(),
487
0
                self.rng.gen(),
488
0
                self.rng.gen(),
489
0
                self.rng.gen(),
490
0
                self.rng.gen(),
491
0
                self.rng.gen(),
492
0
            );
493
0
494
0
            builder.finalize()
495
0
        }
496
    }
497
498
    impl<R> Iterator for TransactionFactory<R, Create>
499
    where
500
        R: Rng + CryptoRng,
501
    {
502
        type Item = (Create, Vec<SecretKey>);
503
504
0
        fn next(&mut self) -> Option<(Create, Vec<SecretKey>)> {
505
0
            Some(self.transaction_with_keys())
506
0
        }
507
    }
508
509
    impl<R> Iterator for TransactionFactory<R, Script>
510
    where
511
        R: Rng + CryptoRng,
512
    {
513
        type Item = (Script, Vec<SecretKey>);
514
515
0
        fn next(&mut self) -> Option<(Script, Vec<SecretKey>)> {
516
0
            Some(self.transaction_with_keys())
517
0
        }
518
    }
519
520
    impl<R> Iterator for TransactionFactory<R, Upgrade>
521
    where
522
        R: Rng + CryptoRng,
523
    {
524
        type Item = (Upgrade, Vec<SecretKey>);
525
526
0
        fn next(&mut self) -> Option<(Upgrade, Vec<SecretKey>)> {
527
0
            Some(self.transaction_with_keys())
528
0
        }
529
    }
530
531
    impl<R> Iterator for TransactionFactory<R, Upload>
532
    where
533
        R: Rng + CryptoRng,
534
    {
535
        type Item = (Upload, Vec<SecretKey>);
536
537
0
        fn next(&mut self) -> Option<(Upload, Vec<SecretKey>)> {
538
0
            Some(self.transaction_with_keys())
539
0
        }
540
    }
541
542
    impl<R> Iterator for TransactionFactory<R, Blob>
543
    where
544
        R: Rng + CryptoRng,
545
    {
546
        type Item = (Blob, Vec<SecretKey>);
547
548
0
        fn next(&mut self) -> Option<(Blob, Vec<SecretKey>)> {
549
0
            Some(self.transaction_with_keys())
550
0
        }
551
    }
552
553
    impl<R> Iterator for TransactionFactory<R, Mint>
554
    where
555
        R: Rng + CryptoRng,
556
    {
557
        type Item = Mint;
558
559
0
        fn next(&mut self) -> Option<Mint> {
560
0
            Some(self.transaction())
561
0
        }
562
    }
563
}
/home/marten/fuel/fuel-vm/fuel-tx/src/contract.rs
Line
Count
Source
1
use crate::{
2
    StorageSlot,
3
    Transaction,
4
    ValidityError,
5
};
6
7
use derivative::Derivative;
8
use fuel_crypto::Hasher;
9
use fuel_merkle::{
10
    binary::root_calculator::MerkleRootCalculator as BinaryMerkleTree,
11
    sparse::{
12
        in_memory::MerkleTree as SparseMerkleTree,
13
        MerkleTreeKey,
14
    },
15
};
16
use fuel_types::{
17
    fmt_truncated_hex,
18
    Bytes32,
19
    ContractId,
20
    Salt,
21
};
22
23
use alloc::vec::Vec;
24
use core::iter;
25
26
/// The target size of Merkle tree leaves in bytes. Contract code will will be divided
27
/// into chunks of this size and pushed to the Merkle tree.
28
///
29
/// See https://github.com/FuelLabs/fuel-specs/blob/master/src/identifiers/contract-id.md
30
const LEAF_SIZE: usize = 16 * 1024;
31
/// In the event that contract code cannot be divided evenly by the `LEAF_SIZE`, the
32
/// remainder must be padded to the nearest multiple of 8 bytes. Padding is achieved by
33
/// repeating the `PADDING_BYTE`.
34
const PADDING_BYTE: u8 = 0u8;
35
const MULTIPLE: usize = 8;
36
37
#[derive(Default, Derivative, Clone, PartialEq, Eq, Hash)]
38
0
#[derivative(Debug)]
39
0
#[derive(
40
0
    serde::Serialize,
41
0
    serde::Deserialize,
Unexecuted instantiation: _RNvXNvXNvNtCseSMGV7FMBK4_7fuel_tx8contracts_1__NtB7_8ContractNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_9___VisitorNtBZ_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtCseSMGV7FMBK4_7fuel_tx8contracts_1__NtB8_8ContractNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtB10_7Visitor20visit_newtype_structpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCseSMGV7FMBK4_7fuel_tx8contracts_1__NtB8_8ContractNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_9___VisitorNtB10_7Visitor9visit_seqpEBa_
42
0
    fuel_types::canonical::Deserialize,
Unexecuted instantiation: _RINvXNvNtCseSMGV7FMBK4_7fuel_tx8contracts0_1__NtB5_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEB7_
Unexecuted instantiation: _RINvXNvNtCseSMGV7FMBK4_7fuel_tx8contracts0_1__NtB5_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEB7_
43
0
    fuel_types::canonical::Serialize,
Unexecuted instantiation: _RNvXNvNtCseSMGV7FMBK4_7fuel_tx8contracts1_1__NtB4_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_static
Unexecuted instantiation: _RNvXNvNtCseSMGV7FMBK4_7fuel_tx8contracts1_1__NtB4_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamic
Unexecuted instantiation: _RINvXNvNtCseSMGV7FMBK4_7fuel_tx8contracts1_1__NtB5_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvXNvNtCseSMGV7FMBK4_7fuel_tx8contracts1_1__NtB5_8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
44
0
)]
45
0
/// Deployable representation of a contract code.
46
0
pub struct Contract(
47
0
    #[derivative(Debug(format_with = "fmt_truncated_hex::<16>"))] Vec<u8>,
48
0
);
49
50
impl Contract {
51
    /// The `ContractId` of the contract with empty bytecode, zero salt, and empty state
52
    /// root.
53
    pub const EMPTY_CONTRACT_ID: ContractId = ContractId::new([
54
        55, 187, 13, 108, 165, 51, 58, 230, 74, 109, 215, 229, 33, 69, 82, 120, 81, 4,
55
        85, 54, 172, 30, 84, 115, 226, 164, 0, 99, 103, 189, 154, 243,
56
    ]);
57
58
    /// Number of bytes in the contract's bytecode
59
0
    pub fn len(&self) -> usize {
60
0
        self.0.len()
61
0
    }
62
63
    /// Check if the contract's bytecode is empty
64
0
    pub fn is_empty(&self) -> bool {
65
0
        self.0.is_empty()
66
0
    }
67
68
    /// Calculate the code root of the contract, using [`Self::root_from_code`].
69
8.77k
    pub fn root(&self) -> Bytes32 {
70
8.77k
        Self::root_from_code(self)
71
8.77k
    }
72
73
    /// Calculate the code root from a contract.
74
    ///
75
    /// <https://github.com/FuelLabs/fuel-specs/blob/master/src/identifiers/contract-id.md>
76
8.77k
    pub fn root_from_code<B>(bytes: B) -> Bytes32
77
8.77k
    where
78
8.77k
        B: AsRef<[u8]>,
79
8.77k
    {
80
8.77k
        let mut tree = BinaryMerkleTree::new();
81
8.86k
        bytes.as_ref().chunks(LEAF_SIZE).for_each(|leaf| {
82
8.86k
            // If the bytecode is not a multiple of LEAF_SIZE, the final leaf
83
8.86k
            // should be zero-padded rounding up to the nearest multiple of 8
84
8.86k
            // bytes.
85
8.86k
            let len = leaf.len();
86
8.86k
            if len == LEAF_SIZE || len % MULTIPLE == 0 {
87
7.58k
                tree.push(leaf);
88
7.58k
            } else {
89
1.28k
                let padding_size = len.next_multiple_of(MULTIPLE);
90
1.28k
                let mut padded_leaf = [PADDING_BYTE; LEAF_SIZE];
91
1.28k
                padded_leaf[0..len].clone_from_slice(leaf);
92
1.28k
                tree.push(padded_leaf[..padding_size].as_ref());
93
1.28k
            }
94
8.86k
        });
Unexecuted instantiation: _RNCINvMNtCseSMGV7FMBK4_7fuel_tx8contractNtB5_8Contract14root_from_codeRINtNtCs5vansr6XbJU_5alloc3vec3VechEE0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCINvMNtCseSMGV7FMBK4_7fuel_tx8contractNtB5_8Contract14root_from_codeRShE0Csg6P9hFxt0iW_7fuel_vm
_RNCINvMNtCseSMGV7FMBK4_7fuel_tx8contractNtB5_8Contract14root_from_codeRBC_E0B7_
Line
Count
Source
81
8.86k
        bytes.as_ref().chunks(LEAF_SIZE).for_each(|leaf| {
82
8.86k
            // If the bytecode is not a multiple of LEAF_SIZE, the final leaf
83
8.86k
            // should be zero-padded rounding up to the nearest multiple of 8
84
8.86k
            // bytes.
85
8.86k
            let len = leaf.len();
86
8.86k
            if len == LEAF_SIZE || len % MULTIPLE == 0 {
87
7.58k
                tree.push(leaf);
88
7.58k
            } else {
89
1.28k
                let padding_size = len.next_multiple_of(MULTIPLE);
90
1.28k
                let mut padded_leaf = [PADDING_BYTE; LEAF_SIZE];
91
1.28k
                padded_leaf[0..len].clone_from_slice(leaf);
92
1.28k
                tree.push(padded_leaf[..padding_size].as_ref());
93
1.28k
            }
94
8.86k
        });
Unexecuted instantiation: _RNCINvMNtCseSMGV7FMBK4_7fuel_tx8contractNtB5_8Contract14root_from_codeRINtNtCs5vansr6XbJU_5alloc3vec3VechEE0B7_
95
8.77k
96
8.77k
        tree.root().into()
97
8.77k
    }
Unexecuted instantiation: _RINvMNtCseSMGV7FMBK4_7fuel_tx8contractNtB3_8Contract14root_from_codeRINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvMNtCseSMGV7FMBK4_7fuel_tx8contractNtB3_8Contract14root_from_codeRShECsg6P9hFxt0iW_7fuel_vm
_RINvMNtCseSMGV7FMBK4_7fuel_tx8contractNtB3_8Contract14root_from_codeRBA_EB5_
Line
Count
Source
76
8.77k
    pub fn root_from_code<B>(bytes: B) -> Bytes32
77
8.77k
    where
78
8.77k
        B: AsRef<[u8]>,
79
8.77k
    {
80
8.77k
        let mut tree = BinaryMerkleTree::new();
81
8.77k
        bytes.as_ref().chunks(LEAF_SIZE).for_each(|leaf| {
82
            // If the bytecode is not a multiple of LEAF_SIZE, the final leaf
83
            // should be zero-padded rounding up to the nearest multiple of 8
84
            // bytes.
85
            let len = leaf.len();
86
            if len == LEAF_SIZE || len % MULTIPLE == 0 {
87
                tree.push(leaf);
88
            } else {
89
                let padding_size = len.next_multiple_of(MULTIPLE);
90
                let mut padded_leaf = [PADDING_BYTE; LEAF_SIZE];
91
                padded_leaf[0..len].clone_from_slice(leaf);
92
                tree.push(padded_leaf[..padding_size].as_ref());
93
            }
94
8.77k
        });
95
8.77k
96
8.77k
        tree.root().into()
97
8.77k
    }
Unexecuted instantiation: _RINvMNtCseSMGV7FMBK4_7fuel_tx8contractNtB3_8Contract14root_from_codeRINtNtCs5vansr6XbJU_5alloc3vec3VechEEB5_
98
99
    /// Calculate the root of the initial storage slots for this contract
100
8.77k
    pub fn initial_state_root<'a, I>(storage_slots: I) -> Bytes32
101
8.77k
    where
102
8.77k
        I: Iterator<Item = &'a StorageSlot>,
103
8.77k
    {
104
8.77k
        let storage_slots = storage_slots
105
8.77k
            .map(|slot| (*slot.key(), slot.value()))
Unexecuted instantiation: _RNCINvMNtCseSMGV7FMBK4_7fuel_tx8contractNtB5_8Contract18initial_state_rootINtNtNtCsd3UI3IJrzMw_4core5slice4iter4IterNtNtNtNtB7_11transaction5types7storage11StorageSlotEE0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCINvMNtCseSMGV7FMBK4_7fuel_tx8contractNtB5_8Contract18initial_state_rootINtNtNtCsd3UI3IJrzMw_4core5slice4iter4IterNtNtNtNtB7_11transaction5types7storage11StorageSlotEE0B7_
Unexecuted instantiation: _RNCINvMNtCseSMGV7FMBK4_7fuel_tx8contractNtB5_8Contract18initial_state_rootINtNtNtNtCsd3UI3IJrzMw_4core4iter7sources5empty5EmptyRNtNtNtNtB7_11transaction5types7storage11StorageSlotEE0B7_
106
8.77k
            .map(|(key, data)| (MerkleTreeKey::new(key), data));
Unexecuted instantiation: _RNCINvMNtCseSMGV7FMBK4_7fuel_tx8contractNtB5_8Contract18initial_state_rootINtNtNtCsd3UI3IJrzMw_4core5slice4iter4IterNtNtNtNtB7_11transaction5types7storage11StorageSlotEEs_0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCINvMNtCseSMGV7FMBK4_7fuel_tx8contractNtB5_8Contract18initial_state_rootINtNtNtCsd3UI3IJrzMw_4core5slice4iter4IterNtNtNtNtB7_11transaction5types7storage11StorageSlotEEs_0B7_
Unexecuted instantiation: _RNCINvMNtCseSMGV7FMBK4_7fuel_tx8contractNtB5_8Contract18initial_state_rootINtNtNtNtCsd3UI3IJrzMw_4core4iter7sources5empty5EmptyRNtNtNtNtB7_11transaction5types7storage11StorageSlotEEs_0B7_
107
8.77k
        let root = SparseMerkleTree::root_from_set(storage_slots);
108
8.77k
        root.into()
109
8.77k
    }
_RINvMNtCseSMGV7FMBK4_7fuel_tx8contractNtB3_8Contract18initial_state_rootINtNtNtCsd3UI3IJrzMw_4core5slice4iter4IterNtNtNtNtB5_11transaction5types7storage11StorageSlotEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
100
2.19k
    pub fn initial_state_root<'a, I>(storage_slots: I) -> Bytes32
101
2.19k
    where
102
2.19k
        I: Iterator<Item = &'a StorageSlot>,
103
2.19k
    {
104
2.19k
        let storage_slots = storage_slots
105
2.19k
            .map(|slot| (*slot.key(), slot.value()))
106
2.19k
            .map(|(key, data)| (MerkleTreeKey::new(key), data));
107
2.19k
        let root = SparseMerkleTree::root_from_set(storage_slots);
108
2.19k
        root.into()
109
2.19k
    }
Unexecuted instantiation: _RINvMNtCseSMGV7FMBK4_7fuel_tx8contractNtB3_8Contract18initial_state_rootINtNtNtNtCsd3UI3IJrzMw_4core4iter7sources5empty5EmptyRNtNtNtNtB5_11transaction5types7storage11StorageSlotEEB5_
_RINvMNtCseSMGV7FMBK4_7fuel_tx8contractNtB3_8Contract18initial_state_rootINtNtNtCsd3UI3IJrzMw_4core5slice4iter4IterNtNtNtNtB5_11transaction5types7storage11StorageSlotEEB5_
Line
Count
Source
100
6.57k
    pub fn initial_state_root<'a, I>(storage_slots: I) -> Bytes32
101
6.57k
    where
102
6.57k
        I: Iterator<Item = &'a StorageSlot>,
103
6.57k
    {
104
6.57k
        let storage_slots = storage_slots
105
6.57k
            .map(|slot| (*slot.key(), slot.value()))
106
6.57k
            .map(|(key, data)| (MerkleTreeKey::new(key), data));
107
6.57k
        let root = SparseMerkleTree::root_from_set(storage_slots);
108
6.57k
        root.into()
109
6.57k
    }
110
111
    /// The default state root value without any entries
112
0
    pub fn default_state_root() -> Bytes32 {
113
0
        Self::initial_state_root(iter::empty())
114
0
    }
115
116
    /// Calculate and return the contract id, provided a salt, code root and state root.
117
    ///
118
    /// <https://github.com/FuelLabs/fuel-specs/blob/master/src/identifiers/contract-id.md>
119
8.77k
    pub fn id(&self, salt: &Salt, root: &Bytes32, state_root: &Bytes32) -> ContractId {
120
8.77k
        let mut hasher = Hasher::default();
121
8.77k
122
8.77k
        hasher.input(ContractId::SEED);
123
8.77k
        hasher.input(salt);
124
8.77k
        hasher.input(root);
125
8.77k
        hasher.input(state_root);
126
8.77k
127
8.77k
        ContractId::from(*hasher.digest())
128
8.77k
    }
129
}
130
131
impl From<Vec<u8>> for Contract {
132
0
    fn from(c: Vec<u8>) -> Self {
133
0
        Self(c)
134
0
    }
135
}
136
137
impl From<&[u8]> for Contract {
138
13.1k
    fn from(c: &[u8]) -> Self {
139
13.1k
        Self(c.into())
140
13.1k
    }
141
}
142
143
impl From<&mut [u8]> for Contract {
144
0
    fn from(c: &mut [u8]) -> Self {
145
0
        Self(c.into())
146
0
    }
147
}
148
149
impl From<Contract> for Vec<u8> {
150
0
    fn from(c: Contract) -> Vec<u8> {
151
0
        c.0
152
0
    }
Unexecuted instantiation: _RNvXs2_NtCseSMGV7FMBK4_7fuel_tx8contractINtNtCs5vansr6XbJU_5alloc3vec3VechEINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_8ContractE4fromCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs2_NtCseSMGV7FMBK4_7fuel_tx8contractINtNtCs5vansr6XbJU_5alloc3vec3VechEINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_8ContractE4fromB7_
153
}
154
155
impl AsRef<[u8]> for Contract {
156
784k
    fn as_ref(&self) -> &[u8] {
157
784k
        self.0.as_ref()
158
784k
    }
159
}
160
161
impl AsMut<[u8]> for Contract {
162
0
    fn as_mut(&mut self) -> &mut [u8] {
163
0
        self.0.as_mut()
164
0
    }
165
}
166
167
impl TryFrom<&Transaction> for Contract {
168
    type Error = ValidityError;
169
170
0
    fn try_from(tx: &Transaction) -> Result<Self, Self::Error> {
171
0
        match tx {
172
0
            Transaction::Create(create) => TryFrom::try_from(create),
173
            _ => {
174
0
                Err(ValidityError::TransactionOutputContainsContractCreated { index: 0 })
175
            }
176
        }
177
0
    }
178
}
179
180
#[allow(clippy::arithmetic_side_effects, clippy::cast_possible_truncation)]
181
#[cfg(test)]
182
mod tests {
183
    use super::*;
184
    use fuel_types::{
185
        bytes::WORD_SIZE,
186
        Bytes64,
187
    };
188
    use itertools::Itertools;
189
    use quickcheck_macros::quickcheck;
190
    use rand::{
191
        rngs::StdRng,
192
        RngCore,
193
        SeedableRng,
194
    };
195
    use rstest::rstest;
196
197
    // safe-guard against breaking changes to the code root calculation for valid
198
    // sizes of bytecode (multiples of instruction size in bytes (half-word))
199
    #[rstest]
200
    fn code_root_snapshot(
201
        #[values(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100)] instructions: usize,
202
    ) {
203
        let mut rng = StdRng::seed_from_u64(100);
204
        let code_len = instructions * WORD_SIZE / 2;
205
        let mut code = alloc::vec![0u8; code_len];
206
        rng.fill_bytes(code.as_mut_slice());
207
208
        // compute root
209
        let root = Contract::root_from_code(code);
210
211
        // take root snapshot
212
        insta::with_settings!(
213
            {snapshot_suffix => format!("instructions-{instructions}")},
214
            {
215
                insta::assert_debug_snapshot!(root);
216
            }
217
        );
218
    }
219
220
    // validate code_root is always equivalent to contract.root
221
    #[quickcheck]
222
    fn contract_root_matches_code_root(instructions: u8) -> bool {
223
        let mut rng = StdRng::seed_from_u64(100);
224
        let code_len = instructions as usize * WORD_SIZE / 2;
225
        let mut code = alloc::vec![0u8; code_len];
226
        rng.fill_bytes(code.as_mut_slice());
227
        let contract = Contract::from(code.clone());
228
        // compute root
229
        let code_root = Contract::root_from_code(code);
230
        let contract_root = contract.root();
231
        code_root == contract_root
232
    }
233
234
    #[rstest]
235
    fn state_root_snapshot(
236
        #[values(Vec::new(), vec![Bytes64::new([1u8; 64])])] state_slot_bytes: Vec<
237
            Bytes64,
238
        >,
239
    ) {
240
        let slots: Vec<StorageSlot> =
241
            state_slot_bytes.iter().map(Into::into).collect_vec();
242
        let state_root = Contract::initial_state_root(&mut slots.iter());
243
        // take root snapshot
244
        insta::with_settings!(
245
            {snapshot_suffix => format!("state-root-{}", slots.len())},
246
            {
247
                insta::assert_debug_snapshot!(state_root);
248
            }
249
        );
250
    }
251
252
    #[test]
253
    fn default_state_root_snapshot() {
254
        let default_root = Contract::default_state_root();
255
        insta::assert_debug_snapshot!(default_root);
256
    }
257
258
    #[test]
259
    fn multi_leaf_state_root_snapshot() {
260
        let mut rng = StdRng::seed_from_u64(0xF00D);
261
        // 5 full leaves and a partial 6th leaf with 4 bytes of data
262
        let partial_leaf_size = 4;
263
        let code_len = 5 * LEAF_SIZE + partial_leaf_size;
264
        let mut code = alloc::vec![0u8; code_len];
265
        rng.fill_bytes(code.as_mut_slice());
266
267
        // compute root
268
        let root = Contract::root_from_code(code);
269
270
        // take root snapshot
271
        insta::with_settings!(
272
            {snapshot_suffix => "multi-leaf-state-root"},
273
            {
274
                insta::assert_debug_snapshot!(root);
275
            }
276
        );
277
    }
278
279
    #[rstest]
280
    #[case(0)]
281
    #[case(1)]
282
    #[case(8)]
283
    #[case(500)]
284
    #[case(1000)]
285
    #[case(1024)]
286
    #[case(1025)]
287
    fn partial_leaf_state_root(#[case] partial_leaf_size: usize) {
288
        let mut rng = StdRng::seed_from_u64(0xF00D);
289
        let code_len = partial_leaf_size;
290
        let mut code = alloc::vec![0u8; code_len];
291
        rng.fill_bytes(code.as_mut_slice());
292
293
        // Compute root
294
        let root = Contract::root_from_code(code.clone());
295
296
        // Compute expected root
297
        let expected_root = {
298
            let mut tree = BinaryMerkleTree::new();
299
300
            // Push partial leaf with manual padding.
301
            // We start by generating an n-byte array, where n is the code
302
            // length rounded to the nearest multiple of 8, and each byte is the
303
            // PADDING_BYTE by default. The leaf is generated by copying the
304
            // remaining data bytes into the start of this array.
305
            let sz = partial_leaf_size.next_multiple_of(8);
306
            if sz > 0 {
307
                let mut padded_leaf = vec![PADDING_BYTE; sz];
308
                padded_leaf[0..code_len].clone_from_slice(&code);
309
                tree.push(&padded_leaf);
310
            }
311
            tree.root().into()
312
        };
313
314
        assert_eq!(root, expected_root);
315
    }
316
317
    #[rstest]
318
    #[case(0)]
319
    #[case(1)]
320
    #[case(8)]
321
    #[case(500)]
322
    #[case(1000)]
323
    #[case(1024)]
324
    #[case(1025)]
325
    fn multi_leaf_state_root(#[case] partial_leaf_size: usize) {
326
        let mut rng = StdRng::seed_from_u64(0xF00D);
327
        // 3 full leaves and a partial 4th leaf
328
        let code_len = 3 * LEAF_SIZE + partial_leaf_size;
329
        let mut code = alloc::vec![0u8; code_len];
330
        rng.fill_bytes(code.as_mut_slice());
331
332
        // Compute root
333
        let root = Contract::root_from_code(code.clone());
334
335
        // Compute expected root
336
        let expected_root = {
337
            let mut tree = BinaryMerkleTree::new();
338
339
            let leaves = code.chunks(LEAF_SIZE).collect::<Vec<_>>();
340
            tree.push(leaves[0]);
341
            tree.push(leaves[1]);
342
            tree.push(leaves[2]);
343
344
            // Push partial leaf with manual padding.
345
            // We start by generating an n-byte array, where n is the code
346
            // length rounded to the nearest multiple of 8, and each byte is the
347
            // PADDING_BYTE by default. The leaf is generated by copying the
348
            // remaining data bytes into the start of this array.
349
            let sz = partial_leaf_size.next_multiple_of(8);
350
            if sz > 0 {
351
                let mut padded_leaf = vec![PADDING_BYTE; sz];
352
                padded_leaf[0..partial_leaf_size].clone_from_slice(leaves[3]);
353
                tree.push(&padded_leaf);
354
            }
355
            tree.root().into()
356
        };
357
358
        assert_eq!(root, expected_root);
359
    }
360
361
    #[test]
362
    fn empty_contract_id() {
363
        let contract = Contract::from(vec![]);
364
        let salt = Salt::zeroed();
365
        let root = contract.root();
366
        let state_root = Contract::default_state_root();
367
368
        let calculated_id = contract.id(&salt, &root, &state_root);
369
        assert_eq!(calculated_id, Contract::EMPTY_CONTRACT_ID)
370
    }
371
}
/home/marten/fuel/fuel-vm/fuel-tx/src/tx_pointer.rs
Line
Count
Source
1
use fuel_types::{
2
    bytes::WORD_SIZE,
3
    BlockHeight,
4
};
5
6
use fuel_types::canonical::{
7
    Deserialize,
8
    Serialize,
9
};
10
11
use core::{
12
    fmt,
13
    str,
14
};
15
16
#[cfg(feature = "random")]
17
use rand::{
18
    distributions::{
19
        Distribution,
20
        Standard,
21
    },
22
    Rng,
23
};
24
25
/// Identification of unspend transaction output.
26
#[derive(Debug, Default, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
27
#[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
28
0
#[derive(serde::Serialize, serde::Deserialize)]
Unexecuted instantiation: _RNvXNvXNvNtCseSMGV7FMBK4_7fuel_tx10tx_pointers_1__NtB7_9TxPointerNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB2_14___FieldVisitorNtB13_7Visitor9expecting
Unexecuted instantiation: _RNvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx10tx_pointers_1__NtBa_9TxPointerNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_9___VisitorNtB16_7Visitor9expecting
Unexecuted instantiation: _RINvXNvXNvNtCseSMGV7FMBK4_7fuel_tx10tx_pointers_1__NtB8_9TxPointerNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB14_7Visitor9visit_u64pEBa_
Unexecuted instantiation: _RINvXNvXNvNtCseSMGV7FMBK4_7fuel_tx10tx_pointers_1__NtB8_9TxPointerNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB14_7Visitor9visit_strpEBa_
Unexecuted instantiation: _RINvXNvXNvNtCseSMGV7FMBK4_7fuel_tx10tx_pointers_1__NtB8_9TxPointerNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB3_14___FieldVisitorNtB14_7Visitor11visit_bytespEBa_
Unexecuted instantiation: _RINvXs_NvXNvNtCseSMGV7FMBK4_7fuel_tx10tx_pointers_1__NtBa_9TxPointerNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB5_7___FieldB14_11deserializepEBc_
Unexecuted instantiation: _RINvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx10tx_pointers_1__NtBb_9TxPointerNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB17_7Visitor9visit_seqpEBd_
Unexecuted instantiation: _RINvXs0_NvXNvNtCseSMGV7FMBK4_7fuel_tx10tx_pointers_1__NtBb_9TxPointerNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeNtB6_9___VisitorNtB17_7Visitor9visit_mappEBd_
29
#[cfg_attr(
30
    feature = "da-compression",
31
    derive(fuel_compression::Compress, fuel_compression::Decompress)
32
)]
33
52.6k
#[derive(Deserialize, Serialize)]
_RINvXNvNtCseSMGV7FMBK4_7fuel_tx10tx_pointers0_1__NtB5_9TxPointerNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
33
6.57k
#[derive(Deserialize, Serialize)]
_RINvXNvNtCseSMGV7FMBK4_7fuel_tx10tx_pointers0_1__NtB5_9TxPointerNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
33
6.57k
#[derive(Deserialize, Serialize)]
Unexecuted instantiation: _RINvXNvNtCseSMGV7FMBK4_7fuel_tx10tx_pointers0_1__NtB5_9TxPointerNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEB7_
Unexecuted instantiation: _RINvXNvNtCseSMGV7FMBK4_7fuel_tx10tx_pointers0_1__NtB5_9TxPointerNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEB7_
_RINvXNvNtCseSMGV7FMBK4_7fuel_tx10tx_pointers1_1__NtB5_9TxPointerNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
33
13.1k
#[derive(Deserialize, Serialize)]
_RINvXNvNtCseSMGV7FMBK4_7fuel_tx10tx_pointers1_1__NtB5_9TxPointerNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
33
13.1k
#[derive(Deserialize, Serialize)]
_RNvXNvNtCseSMGV7FMBK4_7fuel_tx10tx_pointers1_1__NtB4_9TxPointerNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_static
Line
Count
Source
33
243k
#[derive(Deserialize, Serialize)]
_RNvXNvNtCseSMGV7FMBK4_7fuel_tx10tx_pointers1_1__NtB4_9TxPointerNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamic
Line
Count
Source
33
243k
#[derive(Deserialize, Serialize)]
_RINvXNvNtCseSMGV7FMBK4_7fuel_tx10tx_pointers1_1__NtB5_9TxPointerNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Line
Count
Source
33
13.1k
#[derive(Deserialize, Serialize)]
_RINvXNvNtCseSMGV7FMBK4_7fuel_tx10tx_pointers1_1__NtB5_9TxPointerNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Line
Count
Source
33
13.1k
#[derive(Deserialize, Serialize)]
34
pub struct TxPointer {
35
    /// Block height
36
    block_height: BlockHeight,
37
    /// Transaction index
38
    tx_index: u16,
39
}
40
41
impl TxPointer {
42
    pub const LEN: usize = 2 * WORD_SIZE;
43
44
2.19k
    pub const fn new(block_height: BlockHeight, tx_index: u16) -> Self {
45
2.19k
        Self {
46
2.19k
            block_height,
47
2.19k
            tx_index,
48
2.19k
        }
49
2.19k
    }
_RNvMNtCseSMGV7FMBK4_7fuel_tx10tx_pointerNtB2_9TxPointer3newCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
44
2.19k
    pub const fn new(block_height: BlockHeight, tx_index: u16) -> Self {
45
2.19k
        Self {
46
2.19k
            block_height,
47
2.19k
            tx_index,
48
2.19k
        }
49
2.19k
    }
Unexecuted instantiation: _RNvMNtCseSMGV7FMBK4_7fuel_tx10tx_pointerNtB2_9TxPointer3newB4_
50
51
0
    pub const fn block_height(&self) -> BlockHeight {
52
0
        self.block_height
53
0
    }
54
55
0
    pub const fn tx_index(&self) -> u16 {
56
0
        self.tx_index
57
0
    }
58
}
59
60
#[cfg(feature = "random")]
61
impl Distribution<TxPointer> for Standard {
62
2.19k
    fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> TxPointer {
63
2.19k
        TxPointer::new(rng.gen(), rng.gen())
64
2.19k
    }
_RINvXs_NtCseSMGV7FMBK4_7fuel_tx10tx_pointerNtNtCsaiZOB2jUGOZ_4rand13distributions8StandardINtNtBH_12distribution12DistributionNtB5_9TxPointerE6sampleNtNtNtBJ_4rngs3std6StdRngECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
62
2.19k
    fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> TxPointer {
63
2.19k
        TxPointer::new(rng.gen(), rng.gen())
64
2.19k
    }
Unexecuted instantiation: _RINvXs_NtCseSMGV7FMBK4_7fuel_tx10tx_pointerNtNtCsaiZOB2jUGOZ_4rand13distributions8StandardINtNtBH_12distribution12DistributionNtB5_9TxPointerE6samplepEB7_
65
}
66
67
impl fmt::Display for TxPointer {
68
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
69
0
        fmt::LowerHex::fmt(self, f)
70
0
    }
71
}
72
73
impl fmt::LowerHex for TxPointer {
74
0
    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
75
0
        write!(f, "{:08x}{:04x}", self.block_height, self.tx_index)
76
0
    }
77
}
78
79
impl fmt::UpperHex for TxPointer {
80
0
    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
81
0
        write!(f, "{:08X}{:04X}", self.block_height, self.tx_index)
82
0
    }
83
}
84
85
impl str::FromStr for TxPointer {
86
    type Err = &'static str;
87
88
    /// TxPointer is encoded as 12 hex characters:
89
    /// - 8 characters for block height
90
    /// - 4 characters for tx index
91
0
    fn from_str(s: &str) -> Result<Self, Self::Err> {
92
        const ERR: &str = "Invalid encoded byte in TxPointer";
93
94
0
        if s.len() != 12 || !s.is_char_boundary(8) {
95
0
            return Err(ERR)
96
0
        }
97
0
98
0
        let (block_height, tx_index) = s.split_at(8);
99
100
0
        let block_height = u32::from_str_radix(block_height, 16).map_err(|_| ERR)?;
101
0
        let tx_index = u16::from_str_radix(tx_index, 16).map_err(|_| ERR)?;
102
103
0
        Ok(Self::new(block_height.into(), tx_index))
104
0
    }
105
}
106
107
#[cfg(feature = "typescript")]
108
pub mod typescript {
109
    use super::*;
110
111
    use wasm_bindgen::prelude::*;
112
113
    use alloc::{
114
        format,
115
        string::String,
116
        vec::Vec,
117
    };
118
119
    #[wasm_bindgen]
120
    impl TxPointer {
121
        #[wasm_bindgen(constructor)]
122
        pub fn typescript_new(value: &str) -> Result<TxPointer, js_sys::Error> {
123
            use core::str::FromStr;
124
            TxPointer::from_str(value).map_err(js_sys::Error::new)
125
        }
126
127
        #[wasm_bindgen(js_name = toString)]
128
        pub fn typescript_to_string(&self) -> String {
129
            format!("{:#x}", self)
130
        }
131
132
        #[wasm_bindgen(js_name = to_bytes)]
133
        pub fn typescript_to_bytes(&self) -> Vec<u8> {
134
            use fuel_types::canonical::Serialize;
135
            <Self as Serialize>::to_bytes(self)
136
        }
137
138
        #[wasm_bindgen(js_name = from_bytes)]
139
        pub fn typescript_from_bytes(value: &[u8]) -> Result<TxPointer, js_sys::Error> {
140
            use fuel_types::canonical::Deserialize;
141
            <Self as Deserialize>::from_bytes(value)
142
                .map_err(|e| js_sys::Error::new(&format!("{:?}", e)))
143
        }
144
    }
145
}
146
147
#[test]
148
fn fmt_encode_decode() {
149
    use core::str::FromStr;
150
151
    let cases = vec![(83473, 3829)];
152
153
    for (block_height, tx_index) in cases {
154
        let tx_pointer = TxPointer::new(block_height.into(), tx_index);
155
156
        let lower = format!("{tx_pointer:x}");
157
        let upper = format!("{tx_pointer:X}");
158
159
        assert_eq!(lower, format!("{block_height:08x}{tx_index:04x}"));
160
        assert_eq!(upper, format!("{block_height:08X}{tx_index:04X}"));
161
162
        let x = TxPointer::from_str(&lower).expect("failed to decode from str");
163
        assert_eq!(tx_pointer, x);
164
165
        let x = TxPointer::from_str(&upper).expect("failed to decode from str");
166
        assert_eq!(tx_pointer, x);
167
168
        let bytes = tx_pointer.clone().to_bytes();
169
        let tx_pointer_p = TxPointer::from_bytes(&bytes).expect("failed to deserialize");
170
171
        assert_eq!(tx_pointer, tx_pointer_p);
172
    }
173
}
174
175
/// See https://github.com/FuelLabs/fuel-vm/issues/521
176
#[test]
177
fn decode_bug() {
178
    use core::str::FromStr;
179
    TxPointer::from_str("00000😎000").expect_err("Should fail on incorrect input");
180
}
/home/marten/fuel/fuel-vm/fuel-storage/src/lib.rs
Line
Count
Source
1
#![no_std]
2
#![deny(
3
    clippy::arithmetic_side_effects,
4
    clippy::cast_sign_loss,
5
    clippy::cast_possible_truncation,
6
    clippy::cast_possible_wrap,
7
    clippy::string_slice
8
)]
9
#![deny(unsafe_code)]
10
#![deny(unused_crate_dependencies)]
11
12
mod impls;
13
14
extern crate alloc;
15
16
use alloc::{
17
    borrow::{
18
        Cow,
19
        ToOwned,
20
    },
21
    vec::Vec,
22
};
23
24
/// Merkle root alias type
25
pub type MerkleRoot = [u8; 32];
26
27
/// Mappable type with `Key` and `Value`.
28
///
29
/// # Example
30
///
31
/// ```rust
32
/// use fuel_storage::Mappable;
33
/// pub struct Contract;
34
///
35
/// impl Mappable for Contract {
36
///     /// The `[u8; 32]` is a primitive type, so we can't optimize it more.
37
///     type Key = Self::OwnedKey;
38
///     type OwnedKey = [u8; 32];
39
///     /// It is optimized to use slice instead of vector.
40
///     type Value = [u8];
41
///     type OwnedValue = Vec<u8>;
42
/// }
43
/// ```
44
pub trait Mappable {
45
    /// The key type is used during interaction with the storage. In most cases, it is the
46
    /// same as `Self::OwnedKey`.
47
    type Key: ?Sized + ToOwned;
48
    /// The owned type of the `Key` retrieving from the storage.
49
    type OwnedKey: From<<Self::Key as ToOwned>::Owned> + Clone;
50
    /// The value type is used while setting the value to the storage. In most cases, it
51
    /// is the same as `Self::OwnedValue`, but it is without restriction and can be
52
    /// used for performance optimizations.
53
    type Value: ?Sized + ToOwned;
54
    /// The owned type of the `Value` retrieving from the storage.
55
    type OwnedValue: From<<Self::Value as ToOwned>::Owned> + Clone;
56
}
57
58
/// Base read storage trait for Fuel infrastructure.
59
///
60
/// Generic should implement [`Mappable`] trait with all storage type information.
61
pub trait StorageInspect<Type: Mappable> {
62
    type Error;
63
64
    /// Retrieve `Cow<Value>` such as `Key->Value`.
65
    fn get(&self, key: &Type::Key) -> Result<Option<Cow<Type::OwnedValue>>, Self::Error>;
66
67
    /// Return `true` if there is a `Key` mapping to a value in the storage.
68
    fn contains_key(&self, key: &Type::Key) -> Result<bool, Self::Error>;
69
}
70
71
/// Base storage trait for Fuel infrastructure.
72
///
73
/// Generic should implement [`Mappable`] trait with all storage type information.
74
pub trait StorageMutate<Type: Mappable>: StorageInspect<Type> {
75
    /// Append `Key->Value` mapping to the storage.
76
3.35k
    fn insert(
77
3.35k
        &mut self,
78
3.35k
        key: &Type::Key,
79
3.35k
        value: &Type::Value,
80
3.35k
    ) -> Result<(), Self::Error> {
81
3.35k
        self.replace(key, value).map(|_| ())
Unexecuted instantiation: _RNCNvYINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtB7_12EmptyStorageEINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtNtB9_16contracts_assets15ContractsAssetsE6insert0Bb_
Unexecuted instantiation: _RNCNvYINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtNtB9_6memory13MemoryStorageEINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtNtB9_16contracts_assets15ContractsAssetsE6insert0Bb_
_RNCNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtB8_16ContractsRawCodeE6insert0Ba_
Line
Count
Source
81
2.19k
        self.replace(key, value).map(|_| ())
Unexecuted instantiation: _RNCNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtB8_17UploadedBytecodesE6insert0Ba_
Unexecuted instantiation: _RNCNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtNtB8_15contracts_state14ContractsStateE6insert0Ba_
_RNCNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtNtB8_16contracts_assets15ContractsAssetsE6insert0Ba_
Line
Count
Source
81
1.16k
        self.replace(key, value).map(|_| ())
Unexecuted instantiation: _RNCNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtNtB8_9blob_data8BlobDataE6insert0Ba_
Unexecuted instantiation: _RNCNvYINtNtNtCsacfdLYFME8L_11fuel_merkle6common11storage_map10StorageMapNtNtNtBb_6binary9in_memory10NodesTableEINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateB18_E6insert0Bb_
Unexecuted instantiation: _RNCNvYINtNtNtCsacfdLYFME8L_11fuel_merkle6common11storage_map10StorageMapNtNtNtBb_6sparse9in_memory10NodesTableEINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateB18_E6insert0Bb_
82
3.35k
    }
Unexecuted instantiation: _RNvYINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtB5_12EmptyStorageEINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtNtB7_16contracts_assets15ContractsAssetsE6insertB9_
Unexecuted instantiation: _RNvYINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtNtB7_6memory13MemoryStorageEINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtNtB7_16contracts_assets15ContractsAssetsE6insertB9_
_RNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtB6_16ContractsRawCodeE6insertB8_
Line
Count
Source
76
2.19k
    fn insert(
77
2.19k
        &mut self,
78
2.19k
        key: &Type::Key,
79
2.19k
        value: &Type::Value,
80
2.19k
    ) -> Result<(), Self::Error> {
81
2.19k
        self.replace(key, value).map(|_| ())
82
2.19k
    }
Unexecuted instantiation: _RNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtB6_17UploadedBytecodesE6insertB8_
Unexecuted instantiation: _RNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtNtB6_15contracts_state14ContractsStateE6insertB8_
_RNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtNtB6_16contracts_assets15ContractsAssetsE6insertB8_
Line
Count
Source
76
1.16k
    fn insert(
77
1.16k
        &mut self,
78
1.16k
        key: &Type::Key,
79
1.16k
        value: &Type::Value,
80
1.16k
    ) -> Result<(), Self::Error> {
81
1.16k
        self.replace(key, value).map(|_| ())
82
1.16k
    }
Unexecuted instantiation: _RNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtNtB6_9blob_data8BlobDataE6insertB8_
Unexecuted instantiation: _RNvYINtNtNtCsacfdLYFME8L_11fuel_merkle6common11storage_map10StorageMapNtNtNtB9_6binary9in_memory10NodesTableEINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateB16_E6insertB9_
Unexecuted instantiation: _RNvYINtNtNtCsacfdLYFME8L_11fuel_merkle6common11storage_map10StorageMapNtNtNtB9_6sparse9in_memory10NodesTableEINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateB16_E6insertB9_
83
84
    /// Append `Key->Value` mapping to the storage.
85
    ///
86
    /// If `Key` was already mappped to a value, return the replaced value as
87
    /// `Ok(Some(Value))`. Return `Ok(None)` otherwise.
88
    fn replace(
89
        &mut self,
90
        key: &Type::Key,
91
        value: &Type::Value,
92
    ) -> Result<Option<Type::OwnedValue>, Self::Error>;
93
94
    /// Remove `Key->Value` mapping from the storage.
95
0
    fn remove(&mut self, key: &Type::Key) -> Result<(), Self::Error> {
96
0
        self.take(key).map(|_| ())
Unexecuted instantiation: _RNCNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtB8_16ContractsRawCodeE6remove0Ba_
Unexecuted instantiation: _RNCNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtB8_17UploadedBytecodesE6remove0Ba_
Unexecuted instantiation: _RNCNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtNtB8_15contracts_state14ContractsStateE6remove0Ba_
Unexecuted instantiation: _RNCNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtNtB8_16contracts_assets15ContractsAssetsE6remove0Ba_
Unexecuted instantiation: _RNCNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtNtB8_9blob_data8BlobDataE6remove0Ba_
Unexecuted instantiation: _RNCNvYINtNtNtCsacfdLYFME8L_11fuel_merkle6common11storage_map10StorageMapNtNtNtBb_6sparse9in_memory10NodesTableEINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateB18_E6remove0Bb_
97
0
    }
Unexecuted instantiation: _RNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtB6_16ContractsRawCodeE6removeB8_
Unexecuted instantiation: _RNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtB6_17UploadedBytecodesE6removeB8_
Unexecuted instantiation: _RNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtNtB6_15contracts_state14ContractsStateE6removeB8_
Unexecuted instantiation: _RNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtNtB6_16contracts_assets15ContractsAssetsE6removeB8_
Unexecuted instantiation: _RNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtNtB6_9blob_data8BlobDataE6removeB8_
Unexecuted instantiation: _RNvYINtNtNtCsacfdLYFME8L_11fuel_merkle6common11storage_map10StorageMapNtNtNtB9_6sparse9in_memory10NodesTableEINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateB16_E6removeB9_
98
99
    /// Remove `Key->Value` mapping from the storage.
100
    ///
101
    /// Return `Ok(Some(Value))` if the value was present. If the key wasn't found, return
102
    /// `Ok(None)`.
103
    fn take(&mut self, key: &Type::Key) -> Result<Option<Type::OwnedValue>, Self::Error>;
104
}
105
106
/// Base storage trait for Fuel infrastructure.
107
///
108
/// Allows checking the size of the value stored at a given key.
109
/// Checking the size of a value is a cheap operation and should not require
110
/// copying the value into a buffer.
111
pub trait StorageSize<Type: Mappable>: StorageInspect<Type> {
112
    /// Return the number of bytes stored at this key.
113
    fn size_of_value(&self, key: &Type::Key) -> Result<Option<usize>, Self::Error>;
114
}
115
116
/// Base storage trait for Fuel infrastructure.
117
///
118
/// Allows reading the raw bytes of the value stored at a given key
119
/// into a provided buffer.
120
///
121
/// This trait should skip any deserialization and simply copy the raw bytes.
122
pub trait StorageRead<Type: Mappable>: StorageInspect<Type> + StorageSize<Type> {
123
    /// Read the value stored at the given key into the provided buffer if the value
124
    /// exists.
125
    ///
126
    /// Does not perform any deserialization.
127
    ///
128
    /// Returns None if the value does not exist.
129
    /// Otherwise, returns the number of bytes read.
130
    fn read(&self, key: &Type::Key, buf: &mut [u8])
131
        -> Result<Option<usize>, Self::Error>;
132
133
    /// Same as `read` but allocates a new buffer and returns it.
134
    ///
135
    /// Checks the size of the value and allocates a buffer of that size.
136
    fn read_alloc(&self, key: &Type::Key) -> Result<Option<Vec<u8>>, Self::Error>;
137
}
138
139
/// Base storage trait for Fuel infrastructure.
140
///
141
/// Allows writing the raw bytes of the value stored to a given key
142
/// from a provided buffer.
143
///
144
/// This trait should skip any serialization and simply copy the raw bytes
145
/// to the storage.
146
pub trait StorageWrite<Type: Mappable>: StorageMutate<Type> {
147
    /// Write the bytes to the given key from the provided buffer.
148
    ///
149
    /// Does not perform any serialization.
150
    ///
151
    /// Returns the number of bytes written.
152
    fn write_bytes(&mut self, key: &Type::Key, buf: &[u8]) -> Result<usize, Self::Error>;
153
154
    /// Write the bytes to the given key from the provided buffer and
155
    /// return the previous bytes if it existed.
156
    ///
157
    /// Does not perform any serialization.
158
    ///
159
    /// Returns the number of bytes written and the previous value if it existed.
160
    fn replace_bytes(
161
        &mut self,
162
        key: &Type::Key,
163
        buf: &[u8],
164
    ) -> Result<(usize, Option<Vec<u8>>), Self::Error>;
165
166
    /// Removes a bytes from the storage and returning it without deserializing it.
167
    fn take_bytes(&mut self, key: &Type::Key) -> Result<Option<Vec<u8>>, Self::Error>;
168
}
169
170
/// Returns the merkle root for the `StorageType` per merkle `Key`. Per one storage, it is
171
/// possible to have several merkle trees under different `Key`.
172
pub trait MerkleRootStorage<Key, StorageType>: StorageInspect<StorageType>
173
where
174
    StorageType: Mappable,
175
{
176
    /// Return the merkle root of the stored `Type` in the storage.
177
    ///
178
    /// The cryptographic primitive is an arbitrary choice of the implementor and this
179
    /// trait won't impose any restrictions to that.
180
    fn root(&self, key: &Key) -> Result<MerkleRoot, Self::Error>;
181
}
182
183
/// The wrapper around the storage that supports only methods from `StorageInspect`.
184
pub struct StorageRef<'a, T: 'a + ?Sized, Type: Mappable>(
185
    &'a T,
186
    core::marker::PhantomData<Type>,
187
);
188
189
/// Helper trait for `StorageInspect` to provide user-friendly API to retrieve storage as
190
/// reference.
191
///
192
/// # Example
193
///
194
/// ```rust
195
/// use fuel_storage::{Mappable, StorageInspect, StorageAsRef};
196
///
197
/// pub struct Contracts;
198
///
199
/// impl Mappable for Contracts {
200
///     type Key = Self::OwnedKey;
201
///     type OwnedKey = [u8; 32];
202
///     type Value = [u8];
203
///     type OwnedValue = Vec<u8>;
204
/// }
205
///
206
/// pub struct Balances;
207
///
208
/// impl Mappable for Balances {
209
///     type Key = Self::OwnedKey;
210
///     type OwnedKey = u128;
211
///     type Value = Self::OwnedValue;
212
///     type OwnedValue = u64;
213
/// }
214
///
215
/// pub trait Logic: StorageInspect<Contracts> + StorageInspect<Balances> {
216
///     fn run(&self) {
217
///         // You can specify which storage do you want to call with `storage::<Type>()`
218
///         let _ = self.storage::<Contracts>().get(&[0; 32]);
219
///         let _ = self.storage::<Balances>().get(&123);
220
///     }
221
/// }
222
/// ```
223
pub trait StorageAsRef {
224
    #[inline(always)]
225
30.3k
    fn storage<Type>(&self) -> StorageRef<Self, Type>
226
30.3k
    where
227
30.3k
        Type: Mappable,
228
30.3k
    {
229
30.3k
        self.storage_as_ref()
230
30.3k
    }
Unexecuted instantiation: _RINvYINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtB6_12EmptyStorageENtCsemUD0ZWGYFx_12fuel_storage12StorageAsRef7storageNtB8_16ContractsRawCodeEBa_
Unexecuted instantiation: _RINvYINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtNtB8_6memory13MemoryStorageENtCsemUD0ZWGYFx_12fuel_storage12StorageAsRef7storageNtB8_16ContractsRawCodeEBa_
_RINvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtCsemUD0ZWGYFx_12fuel_storage12StorageAsRef7storageNtB7_16ContractsRawCodeEB9_
Line
Count
Source
225
12.3k
    fn storage<Type>(&self) -> StorageRef<Self, Type>
226
12.3k
    where
227
12.3k
        Type: Mappable,
228
12.3k
    {
229
12.3k
        self.storage_as_ref()
230
12.3k
    }
_RINvYRQNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtCsemUD0ZWGYFx_12fuel_storage12StorageAsRef7storageNtB9_16ContractsRawCodeEBb_
Line
Count
Source
225
2.19k
    fn storage<Type>(&self) -> StorageRef<Self, Type>
226
2.19k
    where
227
2.19k
        Type: Mappable,
228
2.19k
    {
229
2.19k
        self.storage_as_ref()
230
2.19k
    }
Unexecuted instantiation: _RINvYRNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtCsemUD0ZWGYFx_12fuel_storage12StorageAsRef7storageNtB8_17UploadedBytecodesEBa_
Unexecuted instantiation: _RINvYRQNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtCsemUD0ZWGYFx_12fuel_storage12StorageAsRef7storageNtB9_17UploadedBytecodesEBb_
_RINvYRNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtCsemUD0ZWGYFx_12fuel_storage12StorageAsRef7storageNtB8_16ContractsRawCodeEBa_
Line
Count
Source
225
2.19k
    fn storage<Type>(&self) -> StorageRef<Self, Type>
226
2.19k
    where
227
2.19k
        Type: Mappable,
228
2.19k
    {
229
2.19k
        self.storage_as_ref()
230
2.19k
    }
Unexecuted instantiation: _RINvYRINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtB7_12EmptyStorageENtCsemUD0ZWGYFx_12fuel_storage12StorageAsRef7storageNtNtB9_16contracts_assets15ContractsAssetsEBb_
Unexecuted instantiation: _RINvYRINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtNtB9_6memory13MemoryStorageENtCsemUD0ZWGYFx_12fuel_storage12StorageAsRef7storageNtNtB9_16contracts_assets15ContractsAssetsEBb_
_RINvYRNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtCsemUD0ZWGYFx_12fuel_storage12StorageAsRef7storageNtNtB8_16contracts_assets15ContractsAssetsEBa_
Line
Count
Source
225
13.5k
    fn storage<Type>(&self) -> StorageRef<Self, Type>
226
13.5k
    where
227
13.5k
        Type: Mappable,
228
13.5k
    {
229
13.5k
        self.storage_as_ref()
230
13.5k
    }
Unexecuted instantiation: _RINvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtCsemUD0ZWGYFx_12fuel_storage12StorageAsRef7storageNtNtB7_15contracts_state14ContractsStateEB9_
231
232
    #[inline(always)]
233
30.3k
    fn storage_as_ref<Type>(&self) -> StorageRef<Self, Type>
234
30.3k
    where
235
30.3k
        Type: Mappable,
236
30.3k
    {
237
30.3k
        StorageRef(self, Default::default())
238
30.3k
    }
Unexecuted instantiation: _RINvYINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtB6_12EmptyStorageENtCsemUD0ZWGYFx_12fuel_storage12StorageAsRef14storage_as_refNtB8_16ContractsRawCodeEBa_
Unexecuted instantiation: _RINvYINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtNtB8_6memory13MemoryStorageENtCsemUD0ZWGYFx_12fuel_storage12StorageAsRef14storage_as_refNtB8_16ContractsRawCodeEBa_
_RINvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtCsemUD0ZWGYFx_12fuel_storage12StorageAsRef14storage_as_refNtB7_16ContractsRawCodeEB9_
Line
Count
Source
233
12.3k
    fn storage_as_ref<Type>(&self) -> StorageRef<Self, Type>
234
12.3k
    where
235
12.3k
        Type: Mappable,
236
12.3k
    {
237
12.3k
        StorageRef(self, Default::default())
238
12.3k
    }
_RINvYRQNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtCsemUD0ZWGYFx_12fuel_storage12StorageAsRef14storage_as_refNtB9_16ContractsRawCodeEBb_
Line
Count
Source
233
2.19k
    fn storage_as_ref<Type>(&self) -> StorageRef<Self, Type>
234
2.19k
    where
235
2.19k
        Type: Mappable,
236
2.19k
    {
237
2.19k
        StorageRef(self, Default::default())
238
2.19k
    }
Unexecuted instantiation: _RINvYQNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtCsemUD0ZWGYFx_12fuel_storage12StorageAsRef14storage_as_refNtB8_17UploadedBytecodesEBa_
Unexecuted instantiation: _RINvYRNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtCsemUD0ZWGYFx_12fuel_storage12StorageAsRef14storage_as_refNtB8_17UploadedBytecodesEBa_
Unexecuted instantiation: _RINvYRQNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtCsemUD0ZWGYFx_12fuel_storage12StorageAsRef14storage_as_refNtB9_17UploadedBytecodesEBb_
_RINvYRNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtCsemUD0ZWGYFx_12fuel_storage12StorageAsRef14storage_as_refNtB8_16ContractsRawCodeEBa_
Line
Count
Source
233
2.19k
    fn storage_as_ref<Type>(&self) -> StorageRef<Self, Type>
234
2.19k
    where
235
2.19k
        Type: Mappable,
236
2.19k
    {
237
2.19k
        StorageRef(self, Default::default())
238
2.19k
    }
Unexecuted instantiation: _RINvYRINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtB7_12EmptyStorageENtCsemUD0ZWGYFx_12fuel_storage12StorageAsRef14storage_as_refNtNtB9_16contracts_assets15ContractsAssetsEBb_
Unexecuted instantiation: _RINvYRINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtNtB9_6memory13MemoryStorageENtCsemUD0ZWGYFx_12fuel_storage12StorageAsRef14storage_as_refNtNtB9_16contracts_assets15ContractsAssetsEBb_
_RINvYRNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtCsemUD0ZWGYFx_12fuel_storage12StorageAsRef14storage_as_refNtNtB8_16contracts_assets15ContractsAssetsEBa_
Line
Count
Source
233
13.5k
    fn storage_as_ref<Type>(&self) -> StorageRef<Self, Type>
234
13.5k
    where
235
13.5k
        Type: Mappable,
236
13.5k
    {
237
13.5k
        StorageRef(self, Default::default())
238
13.5k
    }
Unexecuted instantiation: _RINvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtCsemUD0ZWGYFx_12fuel_storage12StorageAsRef14storage_as_refNtNtB7_15contracts_state14ContractsStateEB9_
239
}
240
241
impl<T> StorageAsRef for T {}
242
243
/// The wrapper around the storage that supports methods from `StorageInspect` and
244
/// `StorageMutate`.
245
pub struct StorageMut<'a, T: 'a + ?Sized, Type: Mappable>(
246
    &'a mut T,
247
    core::marker::PhantomData<Type>,
248
);
249
250
/// Helper trait for `StorageMutate` to provide user-friendly API to retrieve storage as
251
/// mutable reference.
252
///
253
/// # Example
254
///
255
/// ```rust
256
/// use fuel_storage::{Mappable, StorageMutate, StorageInspect, StorageAsMut};
257
///
258
/// pub struct Contracts;
259
///
260
/// impl Mappable for Contracts {
261
///     type Key = Self::OwnedKey;
262
///     type OwnedKey = [u8; 32];
263
///     type Value = [u8];
264
///     type OwnedValue = Vec<u8>;
265
/// }
266
///
267
/// pub struct Balances;
268
///
269
/// impl Mappable for Balances {
270
///     type Key = Self::OwnedKey;
271
///     type OwnedKey = u128;
272
///     type Value = Self::OwnedValue;
273
///     type OwnedValue = u64;
274
/// }
275
///
276
/// pub trait Logic: StorageInspect<Contracts> + StorageMutate<Balances> {
277
///     fn run(&mut self) {
278
///         let mut self_ = self;
279
///         // You can specify which storage do you want to call with `storage::<Type>()`
280
///         let _ = self_.storage::<Balances>().insert(&123, &321);
281
///         let _ = self_.storage::<Contracts>().get(&[0; 32]);
282
///     }
283
/// }
284
/// ```
285
pub trait StorageAsMut {
286
    #[inline(always)]
287
    fn storage<Type>(&mut self) -> StorageMut<Self, Type>
288
    where
289
        Type: Mappable,
290
    {
291
        self.storage_as_mut()
292
    }
293
294
    #[inline(always)]
295
0
    fn storage_as_mut<Type>(&mut self) -> StorageMut<Self, Type>
296
0
    where
297
0
        Type: Mappable,
298
0
    {
299
0
        StorageMut(self, Default::default())
300
0
    }
Unexecuted instantiation: _RINvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtCsemUD0ZWGYFx_12fuel_storage12StorageAsMut14storage_as_mutNtB7_17UploadedBytecodesEB9_
Unexecuted instantiation: _RINvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtCsemUD0ZWGYFx_12fuel_storage12StorageAsMut14storage_as_mutNtNtB7_9blob_data8BlobDataEB9_
301
}
302
303
impl<T> StorageAsMut for T {}
/home/marten/fuel/fuel-vm/fuel-storage/src/impls.rs
Line
Count
Source
1
use crate::{
2
    Mappable,
3
    MerkleRoot,
4
    MerkleRootStorage,
5
    StorageInspect,
6
    StorageMut,
7
    StorageMutate,
8
    StorageRead,
9
    StorageRef,
10
    StorageSize,
11
    StorageWrite,
12
};
13
use alloc::{
14
    borrow::Cow,
15
    vec::Vec,
16
};
17
18
impl<'a, T: StorageInspect<Type> + ?Sized, Type: Mappable> StorageInspect<Type>
19
    for &'a T
20
{
21
    type Error = T::Error;
22
23
13.5k
    fn get(
24
13.5k
        &self,
25
13.5k
        key: &Type::Key,
26
13.5k
    ) -> Result<Option<Cow<'_, Type::OwnedValue>>, Self::Error> {
27
13.5k
        <T as StorageInspect<Type>>::get(self, key)
28
13.5k
    }
Unexecuted instantiation: _RNvXNtCsemUD0ZWGYFx_12fuel_storage5implsRNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtB4_14StorageInspectNtNtBH_9blob_data8BlobDataE3getBJ_
Unexecuted instantiation: _RNvXNtCsemUD0ZWGYFx_12fuel_storage5implsRNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate12EmptyStorageINtB4_14StorageInspectNtNtBH_9blob_data8BlobDataE3getBJ_
Unexecuted instantiation: _RNvXNtCsemUD0ZWGYFx_12fuel_storage5implsRNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtB4_14StorageInspectNtBH_17UploadedBytecodesE3getBJ_
Unexecuted instantiation: _RNvXNtCsemUD0ZWGYFx_12fuel_storage5implsRQNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtB4_14StorageInspectNtBI_17UploadedBytecodesE3getBK_
Unexecuted instantiation: _RNvXNtCsemUD0ZWGYFx_12fuel_storage5implsRINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtBG_12EmptyStorageEINtB4_14StorageInspectNtNtBI_16contracts_assets15ContractsAssetsE3getBK_
Unexecuted instantiation: _RNvXNtCsemUD0ZWGYFx_12fuel_storage5implsRINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtNtBI_6memory13MemoryStorageEINtB4_14StorageInspectNtNtBI_16contracts_assets15ContractsAssetsE3getBK_
_RNvXNtCsemUD0ZWGYFx_12fuel_storage5implsRNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtB4_14StorageInspectNtNtBH_16contracts_assets15ContractsAssetsE3getBJ_
Line
Count
Source
23
13.5k
    fn get(
24
13.5k
        &self,
25
13.5k
        key: &Type::Key,
26
13.5k
    ) -> Result<Option<Cow<'_, Type::OwnedValue>>, Self::Error> {
27
13.5k
        <T as StorageInspect<Type>>::get(self, key)
28
13.5k
    }
29
30
4.38k
    fn contains_key(&self, key: &Type::Key) -> Result<bool, Self::Error> {
31
4.38k
        <T as StorageInspect<Type>>::contains_key(self, key)
32
4.38k
    }
_RNvXNtCsemUD0ZWGYFx_12fuel_storage5implsRQNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtB4_14StorageInspectNtBI_16ContractsRawCodeE12contains_keyBK_
Line
Count
Source
30
2.19k
    fn contains_key(&self, key: &Type::Key) -> Result<bool, Self::Error> {
31
2.19k
        <T as StorageInspect<Type>>::contains_key(self, key)
32
2.19k
    }
_RNvXNtCsemUD0ZWGYFx_12fuel_storage5implsRNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtB4_14StorageInspectNtBH_16ContractsRawCodeE12contains_keyBJ_
Line
Count
Source
30
2.19k
    fn contains_key(&self, key: &Type::Key) -> Result<bool, Self::Error> {
31
2.19k
        <T as StorageInspect<Type>>::contains_key(self, key)
32
2.19k
    }
33
}
34
35
impl<'a, T: StorageInspect<Type> + ?Sized, Type: Mappable> StorageInspect<Type>
36
    for &'a mut T
37
{
38
    type Error = T::Error;
39
40
2.03k
    fn get(
41
2.03k
        &self,
42
2.03k
        key: &Type::Key,
43
2.03k
    ) -> Result<Option<Cow<'_, Type::OwnedValue>>, Self::Error> {
44
2.03k
        <T as StorageInspect<Type>>::get(self, key)
45
2.03k
    }
Unexecuted instantiation: _RNvXs_NtCsemUD0ZWGYFx_12fuel_storage5implsQNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtB6_14StorageInspectNtBJ_17UploadedBytecodesE3getBL_
Unexecuted instantiation: _RNvXs_NtCsemUD0ZWGYFx_12fuel_storage5implsQINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtBI_12EmptyStorageEINtB6_14StorageInspectNtNtBK_15contracts_state14ContractsStateE3getBM_
Unexecuted instantiation: _RNvXs_NtCsemUD0ZWGYFx_12fuel_storage5implsQINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtNtBK_6memory13MemoryStorageEINtB6_14StorageInspectNtNtBK_15contracts_state14ContractsStateE3getBM_
_RNvXs_NtCsemUD0ZWGYFx_12fuel_storage5implsQNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtB6_14StorageInspectNtNtBJ_15contracts_state14ContractsStateE3getBL_
Line
Count
Source
40
2.03k
    fn get(
41
2.03k
        &self,
42
2.03k
        key: &Type::Key,
43
2.03k
    ) -> Result<Option<Cow<'_, Type::OwnedValue>>, Self::Error> {
44
2.03k
        <T as StorageInspect<Type>>::get(self, key)
45
2.03k
    }
46
47
3.70k
    fn contains_key(&self, key: &Type::Key) -> Result<bool, Self::Error> {
48
3.70k
        <T as StorageInspect<Type>>::contains_key(self, key)
49
3.70k
    }
_RNvXs_NtCsemUD0ZWGYFx_12fuel_storage5implsQNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtB6_14StorageInspectNtBJ_16ContractsRawCodeE12contains_keyBL_
Line
Count
Source
47
2.19k
    fn contains_key(&self, key: &Type::Key) -> Result<bool, Self::Error> {
48
2.19k
        <T as StorageInspect<Type>>::contains_key(self, key)
49
2.19k
    }
_RNvXs_NtCsemUD0ZWGYFx_12fuel_storage5implsQDINtB6_12StorageWriteNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage15contracts_state14ContractsStateEp5ErrorNtNtCsd3UI3IJrzMw_4core7convert10InfallibleEL_INtB6_14StorageInspectB10_E12contains_keyB16_
Line
Count
Source
47
1.51k
    fn contains_key(&self, key: &Type::Key) -> Result<bool, Self::Error> {
48
1.51k
        <T as StorageInspect<Type>>::contains_key(self, key)
49
1.51k
    }
50
}
51
52
impl<'a, T: StorageMutate<Type> + ?Sized, Type: Mappable> StorageMutate<Type>
53
    for &'a mut T
54
{
55
    fn insert(
56
        &mut self,
57
        key: &Type::Key,
58
        value: &Type::Value,
59
    ) -> Result<(), Self::Error> {
60
        <T as StorageMutate<Type>>::insert(self, key, value)
61
    }
62
63
    fn replace(
64
        &mut self,
65
        key: &Type::Key,
66
        value: &Type::Value,
67
    ) -> Result<Option<Type::OwnedValue>, Self::Error> {
68
        <T as StorageMutate<Type>>::replace(self, key, value)
69
    }
70
71
    fn remove(&mut self, key: &Type::Key) -> Result<(), Self::Error> {
72
        <T as StorageMutate<Type>>::remove(self, key)
73
    }
74
75
    fn take(&mut self, key: &Type::Key) -> Result<Option<Type::OwnedValue>, Self::Error> {
76
        <T as StorageMutate<Type>>::take(self, key)
77
    }
78
}
79
80
impl<'a, T: StorageSize<Type> + ?Sized, Type: Mappable> StorageSize<Type> for &'a T {
81
368k
    fn size_of_value(
82
368k
        &self,
83
368k
        key: &<Type as Mappable>::Key,
84
368k
    ) -> Result<Option<usize>, Self::Error> {
85
368k
        <T as StorageSize<Type>>::size_of_value(self, key)
86
368k
    }
Unexecuted instantiation: _RNvXs1_NtCsemUD0ZWGYFx_12fuel_storage5implsRINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtBJ_12EmptyStorageEINtB7_11StorageSizeNtBL_16ContractsRawCodeE13size_of_valueBN_
Unexecuted instantiation: _RNvXs1_NtCsemUD0ZWGYFx_12fuel_storage5implsRINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtNtBL_6memory13MemoryStorageEINtB7_11StorageSizeNtBL_16ContractsRawCodeE13size_of_valueBN_
_RNvXs1_NtCsemUD0ZWGYFx_12fuel_storage5implsRNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtB7_11StorageSizeNtBK_16ContractsRawCodeE13size_of_valueBM_
Line
Count
Source
81
368k
    fn size_of_value(
82
368k
        &self,
83
368k
        key: &<Type as Mappable>::Key,
84
368k
    ) -> Result<Option<usize>, Self::Error> {
85
368k
        <T as StorageSize<Type>>::size_of_value(self, key)
86
368k
    }
Unexecuted instantiation: _RNvXs1_NtCsemUD0ZWGYFx_12fuel_storage5implsRNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtB7_11StorageSizeNtNtBK_9blob_data8BlobDataE13size_of_valueBM_
Unexecuted instantiation: _RNvXs1_NtCsemUD0ZWGYFx_12fuel_storage5implsRNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate12EmptyStorageINtB7_11StorageSizeNtNtBK_9blob_data8BlobDataE13size_of_valueBM_
87
}
88
89
impl<'a, T: StorageSize<Type> + ?Sized, Type: Mappable> StorageSize<Type> for &'a mut T {
90
12.3k
    fn size_of_value(
91
12.3k
        &self,
92
12.3k
        key: &<Type as Mappable>::Key,
93
12.3k
    ) -> Result<Option<usize>, Self::Error> {
94
12.3k
        <T as StorageSize<Type>>::size_of_value(self, key)
95
12.3k
    }
Unexecuted instantiation: _RNvXs2_NtCsemUD0ZWGYFx_12fuel_storage5implsQINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtBJ_12EmptyStorageEINtB7_11StorageSizeNtBL_16ContractsRawCodeE13size_of_valueBN_
Unexecuted instantiation: _RNvXs2_NtCsemUD0ZWGYFx_12fuel_storage5implsQINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtNtBL_6memory13MemoryStorageEINtB7_11StorageSizeNtBL_16ContractsRawCodeE13size_of_valueBN_
_RNvXs2_NtCsemUD0ZWGYFx_12fuel_storage5implsQNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageINtB7_11StorageSizeNtBK_16ContractsRawCodeE13size_of_valueBM_
Line
Count
Source
90
12.3k
    fn size_of_value(
91
12.3k
        &self,
92
12.3k
        key: &<Type as Mappable>::Key,
93
12.3k
    ) -> Result<Option<usize>, Self::Error> {
94
12.3k
        <T as StorageSize<Type>>::size_of_value(self, key)
95
12.3k
    }
96
}
97
98
impl<'a, T: StorageRead<Type> + StorageSize<Type> + ?Sized, Type: Mappable>
99
    StorageRead<Type> for &'a T
100
{
101
    fn read(
102
        &self,
103
        key: &<Type as Mappable>::Key,
104
        buf: &mut [u8],
105
    ) -> Result<Option<usize>, Self::Error> {
106
        <T as StorageRead<Type>>::read(self, key, buf)
107
    }
108
109
    fn read_alloc(
110
        &self,
111
        key: &<Type as Mappable>::Key,
112
    ) -> Result<Option<alloc::vec::Vec<u8>>, Self::Error> {
113
        <T as StorageRead<Type>>::read_alloc(self, key)
114
    }
115
}
116
117
impl<'a, T: StorageRead<Type> + StorageSize<Type> + ?Sized, Type: Mappable>
118
    StorageRead<Type> for &'a mut T
119
{
120
    fn read(
121
        &self,
122
        key: &<Type as Mappable>::Key,
123
        buf: &mut [u8],
124
    ) -> Result<Option<usize>, Self::Error> {
125
        <T as StorageRead<Type>>::read(self, key, buf)
126
    }
127
128
    fn read_alloc(
129
        &self,
130
        key: &<Type as Mappable>::Key,
131
    ) -> Result<Option<alloc::vec::Vec<u8>>, Self::Error> {
132
        <T as StorageRead<Type>>::read_alloc(self, key)
133
    }
134
}
135
136
impl<'a, T: StorageWrite<Type> + ?Sized, Type: Mappable> StorageWrite<Type>
137
    for &'a mut T
138
{
139
    fn write_bytes(&mut self, key: &Type::Key, buf: &[u8]) -> Result<usize, Self::Error> {
140
        <T as StorageWrite<Type>>::write_bytes(self, key, buf)
141
    }
142
143
    fn replace_bytes(
144
        &mut self,
145
        key: &Type::Key,
146
        buf: &[u8],
147
    ) -> Result<(usize, Option<Vec<u8>>), Self::Error> {
148
        <T as StorageWrite<Type>>::replace_bytes(self, key, buf)
149
    }
150
151
    fn take_bytes(&mut self, key: &Type::Key) -> Result<Option<Vec<u8>>, Self::Error> {
152
        <T as StorageWrite<Type>>::take_bytes(self, key)
153
    }
154
}
155
156
impl<'a, T: MerkleRootStorage<Key, Type> + ?Sized, Key, Type: Mappable>
157
    MerkleRootStorage<Key, Type> for &'a T
158
{
159
    fn root(&self, key: &Key) -> Result<MerkleRoot, Self::Error> {
160
        <T as MerkleRootStorage<Key, Type>>::root(self, key)
161
    }
162
}
163
164
impl<'a, T: MerkleRootStorage<Key, Type> + ?Sized, Key, Type: Mappable>
165
    MerkleRootStorage<Key, Type> for &'a mut T
166
{
167
    fn root(&self, key: &Key) -> Result<MerkleRoot, Self::Error> {
168
        <T as MerkleRootStorage<Key, Type>>::root(self, key)
169
    }
170
}
171
172
impl<'a, T: StorageInspect<Type>, Type: Mappable> StorageRef<'a, T, Type> {
173
    #[inline(always)]
174
13.5k
    pub fn get(
175
13.5k
        self,
176
13.5k
        key: &Type::Key,
177
13.5k
    ) -> Result<Option<Cow<'a, Type::OwnedValue>>, T::Error> {
178
13.5k
        self.0.get(key)
179
13.5k
    }
Unexecuted instantiation: _RNvMs8_NtCsemUD0ZWGYFx_12fuel_storage5implsINtB7_10StorageRefQNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtB12_17UploadedBytecodesE3getB14_
Unexecuted instantiation: _RNvMs8_NtCsemUD0ZWGYFx_12fuel_storage5implsINtB7_10StorageRefRNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtB12_17UploadedBytecodesE3getB14_
Unexecuted instantiation: _RNvMs8_NtCsemUD0ZWGYFx_12fuel_storage5implsINtB7_10StorageRefRQNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtB13_17UploadedBytecodesE3getB15_
Unexecuted instantiation: _RNvMs8_NtCsemUD0ZWGYFx_12fuel_storage5implsINtB7_10StorageRefRINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtB11_12EmptyStorageENtNtB13_16contracts_assets15ContractsAssetsE3getB15_
Unexecuted instantiation: _RNvMs8_NtCsemUD0ZWGYFx_12fuel_storage5implsINtB7_10StorageRefRINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtNtB13_6memory13MemoryStorageENtNtB13_16contracts_assets15ContractsAssetsE3getB15_
_RNvMs8_NtCsemUD0ZWGYFx_12fuel_storage5implsINtB7_10StorageRefRNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtNtB12_16contracts_assets15ContractsAssetsE3getB14_
Line
Count
Source
174
13.5k
    pub fn get(
175
13.5k
        self,
176
13.5k
        key: &Type::Key,
177
13.5k
    ) -> Result<Option<Cow<'a, Type::OwnedValue>>, T::Error> {
178
13.5k
        self.0.get(key)
179
13.5k
    }
Unexecuted instantiation: _RNvMs8_NtCsemUD0ZWGYFx_12fuel_storage5implsINtB7_10StorageRefNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtNtB11_15contracts_state14ContractsStateE3getB13_
180
181
    #[inline(always)]
182
4.38k
    pub fn contains_key(self, key: &Type::Key) -> Result<bool, T::Error> {
183
4.38k
        self.0.contains_key(key)
184
4.38k
    }
_RNvMs8_NtCsemUD0ZWGYFx_12fuel_storage5implsINtB7_10StorageRefRQNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtB13_16ContractsRawCodeE12contains_keyB15_
Line
Count
Source
182
2.19k
    pub fn contains_key(self, key: &Type::Key) -> Result<bool, T::Error> {
183
2.19k
        self.0.contains_key(key)
184
2.19k
    }
_RNvMs8_NtCsemUD0ZWGYFx_12fuel_storage5implsINtB7_10StorageRefRNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtB12_16ContractsRawCodeE12contains_keyB14_
Line
Count
Source
182
2.19k
    pub fn contains_key(self, key: &Type::Key) -> Result<bool, T::Error> {
183
2.19k
        self.0.contains_key(key)
184
2.19k
    }
185
}
186
187
impl<'a, T, Type: Mappable> StorageRef<'a, T, Type> {
188
    #[inline(always)]
189
    pub fn root<Key>(self, key: &Key) -> Result<MerkleRoot, T::Error>
190
    where
191
        T: MerkleRootStorage<Key, Type>,
192
    {
193
        self.0.root(key)
194
    }
195
}
196
197
impl<'a, T: StorageRead<Type>, Type: Mappable> StorageRef<'a, T, Type> {
198
    #[inline(always)]
199
12.3k
    pub fn read(
200
12.3k
        &self,
201
12.3k
        key: &<Type as Mappable>::Key,
202
12.3k
        buf: &mut [u8],
203
12.3k
    ) -> Result<Option<usize>, T::Error> {
204
12.3k
        self.0.read(key, buf)
205
12.3k
    }
Unexecuted instantiation: _RNvMsa_NtCsemUD0ZWGYFx_12fuel_storage5implsINtB7_10StorageRefINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtB10_12EmptyStorageENtB12_16ContractsRawCodeE4readB14_
Unexecuted instantiation: _RNvMsa_NtCsemUD0ZWGYFx_12fuel_storage5implsINtB7_10StorageRefINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtNtB12_6memory13MemoryStorageENtB12_16ContractsRawCodeE4readB14_
_RNvMsa_NtCsemUD0ZWGYFx_12fuel_storage5implsINtB7_10StorageRefNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtB11_16ContractsRawCodeE4readB13_
Line
Count
Source
199
12.3k
    pub fn read(
200
12.3k
        &self,
201
12.3k
        key: &<Type as Mappable>::Key,
202
12.3k
        buf: &mut [u8],
203
12.3k
    ) -> Result<Option<usize>, T::Error> {
204
12.3k
        self.0.read(key, buf)
205
12.3k
    }
206
207
    #[inline(always)]
208
    pub fn read_alloc(
209
        &self,
210
        key: &<Type as Mappable>::Key,
211
    ) -> Result<Option<alloc::vec::Vec<u8>>, T::Error> {
212
        self.0.read_alloc(key)
213
    }
214
}
215
216
impl<'a, T: StorageInspect<Type>, Type: Mappable> StorageMut<'a, T, Type> {
217
    #[inline(always)]
218
    pub fn get(
219
        self,
220
        key: &Type::Key,
221
    ) -> Result<Option<Cow<'a, Type::OwnedValue>>, T::Error> {
222
        // Workaround, because compiler doesn't convert the lifetime to `'a` by default.
223
        let self_: &'a T = self.0;
224
        self_.get(key)
225
    }
226
227
    #[inline(always)]
228
    pub fn contains_key(self, key: &Type::Key) -> Result<bool, T::Error> {
229
        self.0.contains_key(key)
230
    }
231
}
232
233
impl<'a, T, Type> StorageMut<'a, T, Type>
234
where
235
    T: StorageMutate<Type>,
236
    Type: Mappable,
237
{
238
    #[inline(always)]
239
0
    pub fn insert(self, key: &Type::Key, value: &Type::Value) -> Result<(), T::Error> {
240
0
        StorageMutate::insert(self.0, key, value)
241
0
    }
242
243
    #[inline(always)]
244
0
    pub fn replace(
245
0
        self,
246
0
        key: &Type::Key,
247
0
        value: &Type::Value,
248
0
    ) -> Result<Option<Type::OwnedValue>, T::Error> {
249
0
        StorageMutate::replace(self.0, key, value)
250
0
    }
251
252
    #[inline(always)]
253
    pub fn remove(self, key: &Type::Key) -> Result<(), T::Error> {
254
        StorageMutate::remove(self.0, key)
255
    }
256
257
    #[inline(always)]
258
    pub fn take(self, key: &Type::Key) -> Result<Option<Type::OwnedValue>, T::Error> {
259
        StorageMutate::take(self.0, key)
260
    }
261
}
262
263
impl<'a, T, Type: Mappable> StorageMut<'a, T, Type> {
264
    #[inline(always)]
265
    pub fn root<Key>(self, key: &Key) -> Result<MerkleRoot, T::Error>
266
    where
267
        T: MerkleRootStorage<Key, Type>,
268
    {
269
        self.0.root(key)
270
    }
271
}
272
273
impl<'a, T, Type> StorageMut<'a, T, Type>
274
where
275
    Type: Mappable,
276
    T: StorageWrite<Type>,
277
{
278
    #[inline(always)]
279
    pub fn write_bytes(
280
        &mut self,
281
        key: &Type::Key,
282
        buf: &[u8],
283
    ) -> Result<usize, T::Error> {
284
        StorageWrite::write_bytes(self.0, key, buf)
285
    }
286
287
    #[inline(always)]
288
    pub fn replace_bytes(
289
        &mut self,
290
        key: &Type::Key,
291
        buf: &[u8],
292
    ) -> Result<(usize, Option<Vec<u8>>), T::Error>
293
    where
294
        T: StorageSize<Type>,
295
    {
296
        StorageWrite::replace_bytes(self.0, key, buf)
297
    }
298
299
    #[inline(always)]
300
    pub fn take_bytes(&mut self, key: &Type::Key) -> Result<Option<Vec<u8>>, T::Error> {
301
        StorageWrite::take_bytes(self.0, key)
302
    }
303
}
/home/marten/fuel/fuel-vm/fuel-crypto/src/ed25519.rs
Line
Count
Source
1
//! ED25519 signature verification
2
3
use ed25519_dalek::Signature;
4
use fuel_types::{
5
    Bytes32,
6
    Bytes64,
7
};
8
9
use crate::Error;
10
11
/// Verify a signature against a message digest and a public key.
12
11.9k
pub fn verify(
13
11.9k
    pub_key: &Bytes32,
14
11.9k
    signature: &Bytes64,
15
11.9k
    message: &[u8],
16
11.9k
) -> Result<(), Error> {
17
11.9k
    let signature = Signature::from_bytes(signature);
18
19
11.9k
    let pub_key = ed25519_dalek::VerifyingKey::from_bytes(pub_key)
20
11.9k
        .map_err(|_| Error::InvalidPublicKey)?;
21
22
10.4k
    if pub_key.verify_strict(message, &signature).is_ok() {
23
0
        Ok(())
24
    } else {
25
10.4k
        Err(Error::InvalidSignature)
26
    }
27
11.9k
}
/home/marten/fuel/fuel-vm/fuel-crypto/src/mnemonic.rs
Line
Count
Source
1
#![cfg(all(feature = "std", feature = "random"))]
2
3
use crate::Error;
4
use coins_bip39::{
5
    English,
6
    Mnemonic,
7
};
8
use rand::Rng;
9
10
/// Generates a random mnemonic phrase given a random number generator and
11
/// the number of words to generate, `count`.
12
0
pub fn generate_mnemonic_phrase<R: Rng>(
13
0
    rng: &mut R,
14
0
    count: usize,
15
0
) -> Result<String, Error> {
16
0
    Ok(Mnemonic::<English>::new_with_count(rng, count)?.to_phrase())
17
0
}
/home/marten/fuel/fuel-vm/fuel-crypto/src/message.rs
Line
Count
Source
1
use crate::Hasher;
2
use core::{
3
    fmt,
4
    ops::Deref,
5
};
6
pub use fuel_types::Bytes32;
7
8
/// Normalized (hashed) message authenticated by a signature
9
#[derive(Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
10
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11
#[repr(transparent)]
12
pub struct Message(Bytes32);
13
14
impl Message {
15
    /// Memory length of the type in bytes.
16
    pub const LEN: usize = Bytes32::LEN;
17
18
    /// Normalize the given message by cryptographically hashing its content in
19
    /// preparation for signing.
20
0
    pub fn new<M>(message: M) -> Self
21
0
    where
22
0
        M: AsRef<[u8]>,
23
0
    {
24
0
        Self(Hasher::hash(message))
25
0
    }
26
27
    /// Construct a `Message` directly from its bytes.
28
    ///
29
    /// This constructor expects the given bytes to be a valid,
30
    /// cryptographically hashed message. No hashing is performed.
31
0
    pub fn from_bytes(bytes: [u8; Self::LEN]) -> Self {
32
0
        Self(bytes.into())
33
0
    }
34
35
    /// Construct a `Message` reference directly from a reference to its bytes.
36
    ///
37
    /// This constructor expects the given bytes to be a valid,
38
    /// cryptographically hashed message. No hashing is performed.
39
24.4k
    pub fn from_bytes_ref(bytes: &[u8; Self::LEN]) -> &Self {
40
24.4k
        // TODO: Wrap this unsafe conversion safely in `fuel_types::Bytes32`.
41
24.4k
        #[allow(unsafe_code)]
42
24.4k
        unsafe {
43
24.4k
            &*(bytes.as_ptr() as *const Self)
44
24.4k
        }
45
24.4k
    }
_RNvMNtCslMVbBbY0Npy_11fuel_crypto7messageNtB2_7Message14from_bytes_refCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
39
20.0k
    pub fn from_bytes_ref(bytes: &[u8; Self::LEN]) -> &Self {
40
20.0k
        // TODO: Wrap this unsafe conversion safely in `fuel_types::Bytes32`.
41
20.0k
        #[allow(unsafe_code)]
42
20.0k
        unsafe {
43
20.0k
            &*(bytes.as_ptr() as *const Self)
44
20.0k
        }
45
20.0k
    }
_RNvMNtCslMVbBbY0Npy_11fuel_crypto7messageNtB2_7Message14from_bytes_refCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
39
4.38k
    pub fn from_bytes_ref(bytes: &[u8; Self::LEN]) -> &Self {
40
4.38k
        // TODO: Wrap this unsafe conversion safely in `fuel_types::Bytes32`.
41
4.38k
        #[allow(unsafe_code)]
42
4.38k
        unsafe {
43
4.38k
            &*(bytes.as_ptr() as *const Self)
44
4.38k
        }
45
4.38k
    }
Unexecuted instantiation: _RNvMNtCslMVbBbY0Npy_11fuel_crypto7messageNtB2_7Message14from_bytes_refB4_
46
47
    /// Kept temporarily for backwards compatibility.
48
    #[deprecated = "Use `Message::from_bytes` instead"]
49
0
    pub fn from_bytes_unchecked(bytes: [u8; Self::LEN]) -> Self {
50
0
        Self::from_bytes(bytes)
51
0
    }
52
}
53
54
impl Deref for Message {
55
    type Target = [u8; Message::LEN];
56
57
1.50k
    fn deref(&self) -> &[u8; Message::LEN] {
58
1.50k
        self.0.deref()
59
1.50k
    }
60
}
61
62
impl AsRef<[u8]> for Message {
63
0
    fn as_ref(&self) -> &[u8] {
64
0
        self.0.as_ref()
65
0
    }
66
}
67
68
impl From<Message> for [u8; Message::LEN] {
69
0
    fn from(message: Message) -> [u8; Message::LEN] {
70
0
        message.0.into()
71
0
    }
72
}
73
74
impl From<Message> for Bytes32 {
75
0
    fn from(s: Message) -> Self {
76
0
        s.0
77
0
    }
78
}
79
80
impl From<&Hasher> for Message {
81
0
    fn from(hasher: &Hasher) -> Self {
82
0
        // Safety: `Hasher` is a cryptographic hash
83
0
        Self::from_bytes(*hasher.digest())
84
0
    }
85
}
86
87
impl From<Hasher> for Message {
88
0
    fn from(hasher: Hasher) -> Self {
89
0
        // Safety: `Hasher` is a cryptographic hash
90
0
        Self::from_bytes(*hasher.finalize())
91
0
    }
92
}
93
94
impl fmt::LowerHex for Message {
95
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
96
0
        self.0.fmt(f)
97
0
    }
98
}
99
100
impl fmt::UpperHex for Message {
101
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
102
0
        self.0.fmt(f)
103
0
    }
104
}
105
106
impl fmt::Debug for Message {
107
0
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
108
0
        self.0.fmt(f)
109
0
    }
110
}
111
112
impl fmt::Display for Message {
113
0
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
114
0
        self.0.fmt(f)
115
0
    }
116
}
117
118
#[cfg(feature = "std")]
119
impl From<&Message> for secp256k1::Message {
120
19.9k
    fn from(message: &Message) -> Self {
121
19.9k
        secp256k1::Message::from_digest_slice(&*message.0).expect("length always matches")
122
19.9k
    }
123
}
/home/marten/fuel/fuel-vm/fuel-crypto/src/hasher.rs
Line
Count
Source
1
use fuel_types::Bytes32;
2
use sha2::{
3
    digest::Update,
4
    Digest,
5
    Sha256,
6
};
7
8
use core::iter;
9
10
/// Standard hasher
11
#[derive(Debug, Default, Clone)]
12
pub struct Hasher(Sha256);
13
14
impl Hasher {
15
    /// Length of the output
16
    pub const OUTPUT_LEN: usize = Bytes32::LEN;
17
18
    /// Append data to the hasher
19
61.4k
    pub fn input<B>(&mut self, data: B)
20
61.4k
    where
21
61.4k
        B: AsRef<[u8]>,
22
61.4k
    {
23
61.4k
        sha2::Digest::update(&mut self.0, data)
24
61.4k
    }
Unexecuted instantiation: _RINvMNtCslMVbBbY0Npy_11fuel_crypto6hasherNtB3_6Hasher5inputAhj4_ECsg6P9hFxt0iW_7fuel_vm
_RINvMNtCslMVbBbY0Npy_11fuel_crypto6hasherNtB3_6Hasher5inputAhj8_ECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
19
4.38k
    pub fn input<B>(&mut self, data: B)
20
4.38k
    where
21
4.38k
        B: AsRef<[u8]>,
22
4.38k
    {
23
4.38k
        sha2::Digest::update(&mut self.0, data)
24
4.38k
    }
Unexecuted instantiation: _RINvMNtCslMVbBbY0Npy_11fuel_crypto6hasherNtB3_6Hasher5inputNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32ECsg6P9hFxt0iW_7fuel_vm
_RINvMNtCslMVbBbY0Npy_11fuel_crypto6hasherNtB3_6Hasher5inputRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
19
4.38k
    pub fn input<B>(&mut self, data: B)
20
4.38k
    where
21
4.38k
        B: AsRef<[u8]>,
22
4.38k
    {
23
4.38k
        sha2::Digest::update(&mut self.0, data)
24
4.38k
    }
_RINvMNtCslMVbBbY0Npy_11fuel_crypto6hasherNtB3_6Hasher5inputAhj4_ECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
19
8.77k
    pub fn input<B>(&mut self, data: B)
20
8.77k
    where
21
8.77k
        B: AsRef<[u8]>,
22
8.77k
    {
23
8.77k
        sha2::Digest::update(&mut self.0, data)
24
8.77k
    }
_RINvMNtCslMVbBbY0Npy_11fuel_crypto6hasherNtB3_6Hasher5inputAhj8_ECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
19
8.77k
    pub fn input<B>(&mut self, data: B)
20
8.77k
    where
21
8.77k
        B: AsRef<[u8]>,
22
8.77k
    {
23
8.77k
        sha2::Digest::update(&mut self.0, data)
24
8.77k
    }
Unexecuted instantiation: _RINvMNtCslMVbBbY0Npy_11fuel_crypto6hasherNtB3_6Hasher5inputNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32ECseSMGV7FMBK4_7fuel_tx
_RINvMNtCslMVbBbY0Npy_11fuel_crypto6hasherNtB3_6Hasher5inputRNtNtCsklA9joyWMfk_10fuel_types11array_types4SaltECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
19
8.77k
    pub fn input<B>(&mut self, data: B)
20
8.77k
    where
21
8.77k
        B: AsRef<[u8]>,
22
8.77k
    {
23
8.77k
        sha2::Digest::update(&mut self.0, data)
24
8.77k
    }
_RINvMNtCslMVbBbY0Npy_11fuel_crypto6hasherNtB3_6Hasher5inputRNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32ECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
19
17.5k
    pub fn input<B>(&mut self, data: B)
20
17.5k
    where
21
17.5k
        B: AsRef<[u8]>,
22
17.5k
    {
23
17.5k
        sha2::Digest::update(&mut self.0, data)
24
17.5k
    }
_RINvMNtCslMVbBbY0Npy_11fuel_crypto6hasherNtB3_6Hasher5inputRShECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
19
8.77k
    pub fn input<B>(&mut self, data: B)
20
8.77k
    where
21
8.77k
        B: AsRef<[u8]>,
22
8.77k
    {
23
8.77k
        sha2::Digest::update(&mut self.0, data)
24
8.77k
    }
Unexecuted instantiation: _RINvMNtCslMVbBbY0Npy_11fuel_crypto6hasherNtB3_6Hasher5inputpEB5_
25
26
    /// Consume, append data and return the hasher
27
178k
    pub fn chain<B>(self, data: B) -> Self
28
178k
    where
29
178k
        B: AsRef<[u8]>,
30
178k
    {
31
178k
        Self(self.0.chain(data))
32
178k
    }
Unexecuted instantiation: _RINvMNtCslMVbBbY0Npy_11fuel_crypto6hasherNtB3_6Hasher5chainRNtNtCsklA9joyWMfk_10fuel_types11array_types7AddressECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvMNtCslMVbBbY0Npy_11fuel_crypto6hasherNtB3_6Hasher5chainRNtNtCsklA9joyWMfk_10fuel_types11array_types5NonceECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvMNtCslMVbBbY0Npy_11fuel_crypto6hasherNtB3_6Hasher5chainAhj8_ECseSMGV7FMBK4_7fuel_tx
_RINvMNtCslMVbBbY0Npy_11fuel_crypto6hasherNtB3_6Hasher5chainRShECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
27
314
    pub fn chain<B>(self, data: B) -> Self
28
314
    where
29
314
        B: AsRef<[u8]>,
30
314
    {
31
314
        Self(self.0.chain(data))
32
314
    }
_RINvMNtCslMVbBbY0Npy_11fuel_crypto6hasherNtB3_6Hasher5chainRNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32ECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
27
88.9k
    pub fn chain<B>(self, data: B) -> Self
28
88.9k
    where
29
88.9k
        B: AsRef<[u8]>,
30
88.9k
    {
31
88.9k
        Self(self.0.chain(data))
32
88.9k
    }
_RINvMNtCslMVbBbY0Npy_11fuel_crypto6hasherNtB3_6Hasher5chainINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
27
88.9k
    pub fn chain<B>(self, data: B) -> Self
28
88.9k
    where
29
88.9k
        B: AsRef<[u8]>,
30
88.9k
    {
31
88.9k
        Self(self.0.chain(data))
32
88.9k
    }
Unexecuted instantiation: _RINvMNtCslMVbBbY0Npy_11fuel_crypto6hasherNtB3_6Hasher5chainpEB5_
33
34
    /// Consume, append the items of the iterator and return the hasher
35
0
    pub fn extend_chain<B, I>(mut self, iter: I) -> Self
36
0
    where
37
0
        B: AsRef<[u8]>,
38
0
        I: IntoIterator<Item = B>,
39
0
    {
40
0
        self.extend(iter);
41
0
42
0
        self
43
0
    }
44
45
    /// Reset the hasher to the default state
46
0
    pub fn reset(&mut self) {
47
0
        self.0.reset();
48
0
    }
49
50
    /// Hash the provided data, returning its digest
51
511k
    pub fn hash<B>(data: B) -> Bytes32
52
511k
    where
53
511k
        B: AsRef<[u8]>,
54
511k
    {
55
511k
        let mut hasher = Sha256::new();
56
511k
57
511k
        sha2::Digest::update(&mut hasher, data);
58
511k
59
511k
        <[u8; Bytes32::LEN]>::from(hasher.finalize()).into()
60
511k
    }
_RINvMNtCslMVbBbY0Npy_11fuel_crypto6hasherNtB3_6Hasher4hashAhj4_ECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
51
72.8k
    pub fn hash<B>(data: B) -> Bytes32
52
72.8k
    where
53
72.8k
        B: AsRef<[u8]>,
54
72.8k
    {
55
72.8k
        let mut hasher = Sha256::new();
56
72.8k
57
72.8k
        sha2::Digest::update(&mut hasher, data);
58
72.8k
59
72.8k
        <[u8; Bytes32::LEN]>::from(hasher.finalize()).into()
60
72.8k
    }
_RINvMNtCslMVbBbY0Npy_11fuel_crypto6hasherNtB3_6Hasher4hashRAhj8_ECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
51
2.19k
    pub fn hash<B>(data: B) -> Bytes32
52
2.19k
    where
53
2.19k
        B: AsRef<[u8]>,
54
2.19k
    {
55
2.19k
        let mut hasher = Sha256::new();
56
2.19k
57
2.19k
        sha2::Digest::update(&mut hasher, data);
58
2.19k
59
2.19k
        <[u8; Bytes32::LEN]>::from(hasher.finalize()).into()
60
2.19k
    }
_RINvMNtCslMVbBbY0Npy_11fuel_crypto6hasherNtB3_6Hasher4hashRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
51
146k
    pub fn hash<B>(data: B) -> Bytes32
52
146k
    where
53
146k
        B: AsRef<[u8]>,
54
146k
    {
55
146k
        let mut hasher = Sha256::new();
56
146k
57
146k
        sha2::Digest::update(&mut hasher, data);
58
146k
59
146k
        <[u8; Bytes32::LEN]>::from(hasher.finalize()).into()
60
146k
    }
_RINvMNtCslMVbBbY0Npy_11fuel_crypto6hasherNtB3_6Hasher4hashRINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
51
187k
    pub fn hash<B>(data: B) -> Bytes32
52
187k
    where
53
187k
        B: AsRef<[u8]>,
54
187k
    {
55
187k
        let mut hasher = Sha256::new();
56
187k
57
187k
        sha2::Digest::update(&mut hasher, data);
58
187k
59
187k
        <[u8; Bytes32::LEN]>::from(hasher.finalize()).into()
60
187k
    }
_RINvMNtCslMVbBbY0Npy_11fuel_crypto6hasherNtB3_6Hasher4hashRShECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
51
88.9k
    pub fn hash<B>(data: B) -> Bytes32
52
88.9k
    where
53
88.9k
        B: AsRef<[u8]>,
54
88.9k
    {
55
88.9k
        let mut hasher = Sha256::new();
56
88.9k
57
88.9k
        sha2::Digest::update(&mut hasher, data);
58
88.9k
59
88.9k
        <[u8; Bytes32::LEN]>::from(hasher.finalize()).into()
60
88.9k
    }
_RINvMNtCslMVbBbY0Npy_11fuel_crypto6hasherNtB3_6Hasher4hashRShEB5_
Line
Count
Source
51
13.1k
    pub fn hash<B>(data: B) -> Bytes32
52
13.1k
    where
53
13.1k
        B: AsRef<[u8]>,
54
13.1k
    {
55
13.1k
        let mut hasher = Sha256::new();
56
13.1k
57
13.1k
        sha2::Digest::update(&mut hasher, data);
58
13.1k
59
13.1k
        <[u8; Bytes32::LEN]>::from(hasher.finalize()).into()
60
13.1k
    }
61
62
    /// Consume the hasher, returning the digest
63
102k
    pub fn finalize(self) -> Bytes32 {
64
102k
        <[u8; Bytes32::LEN]>::from(self.0.finalize()).into()
65
102k
    }
66
67
    /// Return the digest without consuming the hasher
68
8.77k
    pub fn digest(&self) -> Bytes32 {
69
8.77k
        <[u8; Bytes32::LEN]>::from(self.0.clone().finalize()).into()
70
8.77k
    }
71
}
72
73
impl<B> iter::FromIterator<B> for Hasher
74
where
75
    B: AsRef<[u8]>,
76
{
77
0
    fn from_iter<T>(iter: T) -> Self
78
0
    where
79
0
        T: IntoIterator<Item = B>,
80
0
    {
81
0
        iter.into_iter().fold(Hasher::default(), Hasher::chain)
82
0
    }
83
}
84
85
impl<B> Extend<B> for Hasher
86
where
87
    B: AsRef<[u8]>,
88
{
89
0
    fn extend<T: IntoIterator<Item = B>>(&mut self, iter: T) {
90
0
        iter.into_iter().for_each(|b| self.input(b))
91
0
    }
92
}
/home/marten/fuel/fuel-vm/fuel-crypto/src/error.rs
Line
Count
Source
1
use core::convert::Infallible;
2
3
/// Crypto error variants
4
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6
pub enum Error {
7
    /// Invalid secp256k1 secret key
8
    InvalidSecretKey,
9
10
    /// Invalid secp256k1 public key
11
    InvalidPublicKey,
12
13
    /// Invalid secp256k1 signature message
14
    InvalidMessage,
15
16
    /// Invalid secp256k1 signature
17
    InvalidSignature,
18
19
    /// Coudln't sign the message
20
    FailedToSign,
21
22
    /// The provided key wasn't found
23
    KeyNotFound,
24
25
    /// The keystore isn't available or is corrupted
26
    KeystoreNotAvailable,
27
28
    /// Out of preallocated memory
29
    NotEnoughMemory,
30
31
    /// Invalid mnemonic phrase
32
    InvalidMnemonic,
33
34
    /// Bip32-related error
35
    Bip32Error,
36
}
37
38
impl From<Error> for Infallible {
39
0
    fn from(_: Error) -> Infallible {
40
0
        unreachable!()
41
    }
42
}
43
44
impl From<Infallible> for Error {
45
0
    fn from(_: Infallible) -> Error {
46
0
        unreachable!()
47
    }
48
}
49
50
#[cfg(feature = "std")]
51
mod use_std {
52
    use super::*;
53
    use coins_bip39::MnemonicError;
54
    use std::{
55
        error,
56
        fmt,
57
        io,
58
    };
59
60
    impl From<MnemonicError> for Error {
61
0
        fn from(_: MnemonicError) -> Self {
62
0
            Self::InvalidMnemonic
63
0
        }
64
    }
65
66
    impl From<coins_bip32::Bip32Error> for Error {
67
0
        fn from(_: coins_bip32::Bip32Error) -> Self {
68
0
            Self::Bip32Error
69
0
        }
70
    }
71
72
    impl fmt::Display for Error {
73
0
        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
74
0
            write!(f, "{self:?}")
75
0
        }
76
    }
77
78
    impl error::Error for Error {
79
0
        fn source(&self) -> Option<&(dyn error::Error + 'static)> {
80
0
            None
81
0
        }
82
    }
83
84
    impl From<Error> for io::Error {
85
0
        fn from(e: Error) -> io::Error {
86
0
            io::Error::new(io::ErrorKind::Other, e)
87
0
        }
88
    }
89
}
/home/marten/fuel/fuel-vm/fuel-crypto/src/secp256/signature.rs
Line
Count
Source
1
use super::backend::k1;
2
use crate::{
3
    Error,
4
    Message,
5
    PublicKey,
6
    SecretKey,
7
};
8
9
use fuel_types::Bytes64;
10
11
use core::{
12
    fmt,
13
    ops::Deref,
14
    str,
15
};
16
17
/// Compressed-form Secp256k1 signature.
18
#[derive(Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
19
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
20
#[repr(transparent)]
21
pub struct Signature(Bytes64);
22
23
impl Signature {
24
    /// Memory length of the type in bytes.
25
    pub const LEN: usize = Bytes64::LEN;
26
27
    /// Construct a `Signature` directly from its bytes.
28
    ///
29
    /// This constructor expects the given bytes to be a valid signature. No signing is
30
    /// performed.
31
4.38k
    pub fn from_bytes(bytes: [u8; Self::LEN]) -> Self {
32
4.38k
        Self(bytes.into())
33
4.38k
    }
_RNvMNtNtCslMVbBbY0Npy_11fuel_crypto7secp2569signatureNtB2_9Signature10from_bytesCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
31
4.38k
    pub fn from_bytes(bytes: [u8; Self::LEN]) -> Self {
32
4.38k
        Self(bytes.into())
33
4.38k
    }
Unexecuted instantiation: _RNvMNtNtCslMVbBbY0Npy_11fuel_crypto7secp2569signatureNtB2_9Signature10from_bytesB6_
34
35
    /// Construct a `Signature` reference directly from a reference to its bytes.
36
    ///
37
    /// This constructor expects the given bytes to be a valid signature. No signing is
38
    /// performed.
39
11.1k
    pub fn from_bytes_ref(bytes: &[u8; Self::LEN]) -> &Self {
40
11.1k
        // TODO: Wrap this unsafe conversion safely in `fuel_types::Bytes64`.
41
11.1k
        #[allow(unsafe_code)]
42
11.1k
        unsafe {
43
11.1k
            &*(bytes.as_ptr() as *const Self)
44
11.1k
        }
45
11.1k
    }
_RNvMNtNtCslMVbBbY0Npy_11fuel_crypto7secp2569signatureNtB2_9Signature14from_bytes_refCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
39
11.1k
    pub fn from_bytes_ref(bytes: &[u8; Self::LEN]) -> &Self {
40
11.1k
        // TODO: Wrap this unsafe conversion safely in `fuel_types::Bytes64`.
41
11.1k
        #[allow(unsafe_code)]
42
11.1k
        unsafe {
43
11.1k
            &*(bytes.as_ptr() as *const Self)
44
11.1k
        }
45
11.1k
    }
Unexecuted instantiation: _RNvMNtNtCslMVbBbY0Npy_11fuel_crypto7secp2569signatureNtB2_9Signature14from_bytes_refB6_
46
47
    /// Kept temporarily for backwards compatibility.
48
    #[deprecated = "Use `Signature::from_bytes` instead"]
49
0
    pub fn from_bytes_unchecked(bytes: [u8; Self::LEN]) -> Self {
50
0
        Self::from_bytes(bytes)
51
0
    }
52
}
53
54
impl Deref for Signature {
55
    type Target = [u8; Signature::LEN];
56
57
0
    fn deref(&self) -> &[u8; Signature::LEN] {
58
0
        self.0.deref()
59
0
    }
60
}
61
62
impl AsRef<[u8]> for Signature {
63
4.38k
    fn as_ref(&self) -> &[u8] {
64
4.38k
        self.0.as_ref()
65
4.38k
    }
_RNvXs0_NtNtCslMVbBbY0Npy_11fuel_crypto7secp2569signatureNtB5_9SignatureINtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
63
4.38k
    fn as_ref(&self) -> &[u8] {
64
4.38k
        self.0.as_ref()
65
4.38k
    }
Unexecuted instantiation: _RNvXs0_NtNtCslMVbBbY0Npy_11fuel_crypto7secp2569signatureNtB5_9SignatureINtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvXs0_NtNtCslMVbBbY0Npy_11fuel_crypto7secp2569signatureNtB5_9SignatureINtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refB9_
66
}
67
68
impl AsMut<[u8]> for Signature {
69
0
    fn as_mut(&mut self) -> &mut [u8] {
70
0
        self.0.as_mut()
71
0
    }
72
}
73
74
impl fmt::LowerHex for Signature {
75
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
76
0
        self.0.fmt(f)
77
0
    }
78
}
79
80
impl fmt::UpperHex for Signature {
81
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
82
0
        self.0.fmt(f)
83
0
    }
84
}
85
86
impl fmt::Debug for Signature {
87
0
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
88
0
        self.0.fmt(f)
89
0
    }
90
}
91
92
impl fmt::Display for Signature {
93
0
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
94
0
        self.0.fmt(f)
95
0
    }
96
}
97
98
impl From<Signature> for [u8; Signature::LEN] {
99
0
    fn from(salt: Signature) -> [u8; Signature::LEN] {
100
0
        salt.0.into()
101
0
    }
102
}
103
104
impl From<Signature> for Bytes64 {
105
0
    fn from(s: Signature) -> Self {
106
0
        s.0
107
0
    }
108
}
109
110
impl str::FromStr for Signature {
111
    type Err = Error;
112
113
    /// Parse a `Signature` directly from its bytes encoded as hex in a string.
114
    ///
115
    /// This constructor does not perform any signing.
116
0
    fn from_str(s: &str) -> Result<Self, Self::Err> {
117
0
        Bytes64::from_str(s)
118
0
            .map_err(|_| Error::InvalidSignature)
119
0
            .map(|s| Self::from_bytes(s.into()))
120
0
    }
121
}
122
123
/// Secp256k1 methods
124
impl Signature {
125
    /// Produce secp256k1 signature
126
4.38k
    pub fn sign(secret: &SecretKey, message: &Message) -> Self {
127
4.38k
        Self(Bytes64::from(k1::sign(secret, message)))
128
4.38k
    }
129
130
    /// Recover secp256k1 public key from a signature performed with
131
15.5k
    pub fn recover(&self, message: &Message) -> Result<PublicKey, Error> {
132
15.5k
        k1::recover(*self.0, message)
133
15.5k
    }
134
135
    /// Verify that a signature matches given public key
136
0
    pub fn verify(&self, public_key: &PublicKey, message: &Message) -> Result<(), Error> {
137
0
        k1::verify(*self.0, **public_key, message)
138
0
    }
139
}
/home/marten/fuel/fuel-vm/fuel-crypto/src/secp256/backend/r1/p256.rs
Line
Count
Source
1
//! secp256r1 (P-256) functions
2
3
#[cfg(feature = "test-helpers")]
4
use crate::secp256::signature_format::encode_signature;
5
use crate::{
6
    message::Message,
7
    secp256::signature_format::decode_signature,
8
    Error,
9
};
10
#[cfg(feature = "test-helpers")]
11
use ecdsa::RecoveryId;
12
use fuel_types::Bytes64;
13
use p256::ecdsa::VerifyingKey;
14
15
/// Sign a prehashed message. With the given key.
16
#[cfg(feature = "test-helpers")]
17
0
pub fn sign_prehashed(
18
0
    signing_key: &p256::ecdsa::SigningKey,
19
0
    message: &Message,
20
0
) -> Result<Bytes64, Error> {
21
0
    let (signature, _) = signing_key
22
0
        .sign_prehash_recoverable(&**message)
23
0
        .map_err(|_| Error::FailedToSign)?;
24
25
0
    let signature = signature.normalize_s().unwrap_or(signature);
26
0
27
0
    // TODO: this is a hack to get the recovery id. The signature should be normalized
28
0
    // before computing the recovery id, but p256 library doesn't support this, and
29
0
    // instead always computes the recovery id from non-normalized signature.
30
0
    // So instead the recovery id is determined by checking which variant matches
31
0
    // the original public key.
32
0
33
0
    let recid1 = RecoveryId::new(false, false);
34
0
    let recid2 = RecoveryId::new(true, false);
35
0
36
0
    let rec1 = VerifyingKey::recover_from_prehash(&**message, &signature, recid1);
37
0
    let rec2 = VerifyingKey::recover_from_prehash(&**message, &signature, recid2);
38
0
39
0
    let actual = signing_key.verifying_key();
40
41
0
    let recovery_id = if rec1.map(|r| r == *actual).unwrap_or(false) {
42
0
        recid1
43
0
    } else if rec2.map(|r| r == *actual).unwrap_or(false) {
44
0
        recid2
45
    } else {
46
0
        unreachable!("Invalid signature generated");
47
    };
48
49
0
    let recovery_id = recovery_id
50
0
        .try_into()
51
0
        .expect("reduced-x recovery ids are never generated");
52
0
    Ok(Bytes64::from(encode_signature(
53
0
        signature.to_bytes().into(),
54
0
        recovery_id,
55
0
    )))
56
0
}
57
58
/// Convert the public key point to its uncompressed non-prefixed representation,
59
/// i.e. 32 bytes of x coordinate and 32 bytes of y coordinate.
60
#[cfg(feature = "test-helpers")]
61
0
pub fn encode_pubkey(key: VerifyingKey) -> [u8; 64] {
62
0
    let point = key.to_encoded_point(false);
63
0
    let mut result = [0u8; 64];
64
0
    result[..32].copy_from_slice(point.x().unwrap());
65
0
    result[32..].copy_from_slice(point.y().unwrap());
66
0
    result
67
0
}
68
69
/// Recover a public key from a signature and a message digest. It assumes
70
/// a compacted signature
71
4.51k
pub fn recover(signature: &Bytes64, message: &Message) -> Result<Bytes64, Error> {
72
4.51k
    let (sig, recid) = decode_signature(**signature);
73
1.50k
    let sig =
74
4.51k
        p256::ecdsa::Signature::from_slice(&sig).map_err(|_| Error::InvalidSignature)?;
75
1.50k
    let vk = VerifyingKey::recover_from_prehash(&**message, &sig, recid.into())
76
1.50k
        .map_err(|_| Error::InvalidSignature)?;
77
948
    let point = vk.to_encoded_point(false);
78
948
    let mut raw = Bytes64::zeroed();
79
948
    raw[..32].copy_from_slice(point.x().unwrap());
80
948
    raw[32..].copy_from_slice(point.y().unwrap());
81
948
    Ok(raw)
82
4.51k
}
83
84
#[cfg(test)]
85
mod tests {
86
    use super::*;
87
88
    use p256::ecdsa::SigningKey;
89
    use rand::{
90
        rngs::StdRng,
91
        Rng,
92
        SeedableRng,
93
    };
94
95
    #[test]
96
    fn test_raw_recover() {
97
        let mut rng = &mut StdRng::seed_from_u64(1234);
98
99
        let signing_key = SigningKey::random(&mut rng);
100
        let verifying_key = signing_key.verifying_key();
101
102
        let message = Message::new([rng.gen(); 100]);
103
104
        let (signature, recovery_id) =
105
            signing_key.sign_prehash_recoverable(&*message).unwrap();
106
107
        let recovered =
108
            VerifyingKey::recover_from_prehash(&*message, &signature, recovery_id)
109
                .expect("Unable to recover the public key");
110
111
        assert_eq!(recovered, *verifying_key);
112
    }
113
114
    #[test]
115
    fn test_secp256r1_recover_from_msg() {
116
        let mut rng = &mut StdRng::seed_from_u64(1234);
117
118
        for _ in 0..100 {
119
            let signing_key = SigningKey::random(&mut rng);
120
            let verifying_key = signing_key.verifying_key();
121
122
            let message = Message::new([rng.gen(); 100]);
123
            let signature =
124
                sign_prehashed(&signing_key, &message).expect("Couldn't sign");
125
126
            let Ok(recovered) = recover(&signature, &message) else {
127
                panic!("Failed to recover public key from the message");
128
            };
129
130
            assert_eq!(*recovered, encode_pubkey(*verifying_key));
131
        }
132
    }
133
134
    #[test]
135
    fn test_signature_and_recovery_id_encoding_roundtrip() {
136
        let mut rng = &mut StdRng::seed_from_u64(1234);
137
138
        for _ in 0..100 {
139
            let message = Message::new([rng.gen(); 100]);
140
            let signing_key = SigningKey::random(&mut rng);
141
            let (signature, _) = signing_key.sign_prehash_recoverable(&*message).unwrap();
142
            let signature = signature.normalize_s().unwrap_or(signature);
143
            let signature: [u8; 64] = signature.to_bytes().into();
144
145
            let recovery_id = RecoveryId::from_byte(0).unwrap().try_into().unwrap();
146
            let encoded = encode_signature(signature, recovery_id);
147
148
            let (de_sig, de_recid) = decode_signature(encoded);
149
            assert_eq!(signature, de_sig);
150
            assert_eq!(recovery_id, de_recid);
151
152
            let recovery_id = RecoveryId::from_byte(1).unwrap().try_into().unwrap();
153
            let encoded = encode_signature(signature, recovery_id);
154
155
            let (de_sig, de_recid) = decode_signature(encoded);
156
            assert_eq!(signature, de_sig);
157
            assert_eq!(recovery_id, de_recid);
158
        }
159
    }
160
}
/home/marten/fuel/fuel-vm/fuel-crypto/src/secp256/backend/k1/secp256k1.rs
Line
Count
Source
1
use crate::{
2
    message::Message,
3
    secp256::{
4
        signature_format::{
5
            decode_signature,
6
            encode_signature,
7
            RecoveryId as SecpRecoveryId,
8
        },
9
        PublicKey,
10
    },
11
    Error,
12
};
13
14
use secp256k1::{
15
    ecdsa::{
16
        RecoverableSignature,
17
        Signature,
18
    },
19
    Secp256k1,
20
};
21
22
use crate::SecretKey;
23
24
#[cfg(feature = "random")]
25
use rand::{
26
    CryptoRng,
27
    RngCore,
28
};
29
30
lazy_static::lazy_static! {
31
    static ref CONTEXT: Secp256k1<secp256k1::All> = Secp256k1::new();
32
}
33
34
/// Generates a random secret key
35
#[cfg(feature = "random")]
36
4.38k
pub fn random_secret(rng: &mut (impl CryptoRng + RngCore)) -> SecretKey {
37
4.38k
    secp256k1::SecretKey::new(rng).into()
38
4.38k
}
_RINvNtNtNtNtCslMVbBbY0Npy_11fuel_crypto7secp2567backend2k19secp256k113random_secretNtNtNtCsaiZOB2jUGOZ_4rand4rngs3std6StdRngECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
36
4.38k
pub fn random_secret(rng: &mut (impl CryptoRng + RngCore)) -> SecretKey {
37
4.38k
    secp256k1::SecretKey::new(rng).into()
38
4.38k
}
Unexecuted instantiation: _RINvNtNtNtNtCslMVbBbY0Npy_11fuel_crypto7secp2567backend2k19secp256k113random_secretNtNtNtCsaiZOB2jUGOZ_4rand4rngs3std6StdRngECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvNtNtNtNtCslMVbBbY0Npy_11fuel_crypto7secp2567backend2k19secp256k113random_secretNtNtNtCsaiZOB2jUGOZ_4rand4rngs6thread9ThreadRngEBa_
39
40
/// Derives the public key from a given secret key
41
8.77k
pub fn public_key(secret: &SecretKey) -> PublicKey {
42
8.77k
    let sk: secp256k1::SecretKey = secret.into();
43
8.77k
    let vk = secp256k1::PublicKey::from_secret_key(&CONTEXT, &sk);
44
8.77k
    vk.into()
45
8.77k
}
46
47
/// Sign a given message and compress the `v` to the signature
48
///
49
/// The compression scheme is described in
50
/// <https://github.com/FuelLabs/fuel-specs/blob/master/src/protocol/cryptographic-primitives.md>
51
4.38k
pub fn sign(secret: &SecretKey, message: &Message) -> [u8; 64] {
52
4.38k
    let signature = CONTEXT.sign_ecdsa_recoverable(&message.into(), &secret.into());
53
4.38k
    let (recovery_id, signature) = signature.serialize_compact();
54
4.38k
55
4.38k
    // encode_signature cannot panic as we don't generate reduced-x recovery ids.
56
4.38k
    let recovery_id = SecpRecoveryId::try_from(recovery_id)
57
4.38k
        .expect("reduced-x recovery ids are never generated");
58
4.38k
    encode_signature(signature, recovery_id)
59
4.38k
}
60
61
/// Recover the public key from a signature.
62
///
63
/// It takes the signature as owned because this operation is not idempotent. The
64
/// taken signature will not be recoverable. Signatures are meant to be
65
/// single use, so this avoids unnecessary copy.
66
15.5k
pub fn recover(signature: [u8; 64], message: &Message) -> Result<PublicKey, Error> {
67
15.5k
    let (signature, recovery_id) = decode_signature(signature);
68
15.5k
    let recoverable = RecoverableSignature::from_compact(&signature, recovery_id.into())
69
15.5k
        .map_err(|_| Error::InvalidSignature)?;
70
15.5k
    let vk = CONTEXT
71
15.5k
        .recover_ecdsa(&message.into(), &recoverable)
72
15.5k
        .map_err(|_| Error::InvalidSignature)?;
73
13.6k
    Ok(PublicKey::from(vk))
74
15.5k
}
75
76
/// Verify that a signature matches given public key
77
0
pub fn verify(
78
0
    signature: [u8; 64],
79
0
    public_key: [u8; 64],
80
0
    message: &Message,
81
0
) -> Result<(), Error> {
82
0
    let (signature, _) = decode_signature(signature); // Trunactes recovery id
83
0
    let signature =
84
0
        Signature::from_compact(&signature).map_err(|_| Error::InvalidSignature)?;
85
86
0
    let mut prefixed_public_key = [0u8; 65];
87
0
    prefixed_public_key[0] = 0x04; // Uncompressed
88
0
    prefixed_public_key[1..].copy_from_slice(&public_key);
89
0
    let vk = secp256k1::PublicKey::from_slice(&prefixed_public_key)
90
0
        .map_err(|_| Error::InvalidPublicKey)?;
91
92
0
    CONTEXT
93
0
        .verify_ecdsa(&message.into(), &signature, &vk)
94
0
        .map_err(|_| Error::InvalidSignature)?;
95
0
    Ok(())
96
0
}
97
98
#[cfg(all(test, feature = "std"))]
99
mod tests {
100
    use rand::{
101
        rngs::StdRng,
102
        Rng,
103
        SeedableRng,
104
    };
105
106
    use super::*;
107
108
    #[test]
109
    fn full() {
110
        let rng = &mut StdRng::seed_from_u64(1234);
111
112
        let secret = random_secret(rng);
113
        let public = public_key(&secret);
114
115
        let message = Message::new(rng.gen::<[u8; 10]>());
116
117
        let signature = sign(&secret, &message);
118
        verify(signature, *public, &message).expect("Verification failed");
119
        let recovered = recover(signature, &message).expect("Recovery failed");
120
121
        assert_eq!(public, recovered);
122
    }
123
}
/home/marten/fuel/fuel-vm/fuel-crypto/src/secp256/backend/k1/k256.rs
Line
Count
Source
1
use crate::{
2
    message::Message,
3
    secp256::{
4
        signature_format::{
5
            decode_signature,
6
            encode_signature,
7
            RecoveryId as SecpRecoveryId,
8
        },
9
        PublicKey,
10
    },
11
    Error,
12
};
13
14
use crate::SecretKey;
15
16
use k256::{
17
    ecdsa::{
18
        RecoveryId,
19
        VerifyingKey,
20
    },
21
    EncodedPoint,
22
};
23
24
#[cfg(feature = "random")]
25
use rand::{
26
    CryptoRng,
27
    RngCore,
28
};
29
30
/// Generates a random secret key
31
#[cfg(feature = "random")]
32
0
pub fn random_secret(rng: &mut (impl CryptoRng + RngCore)) -> SecretKey {
33
0
    k256::SecretKey::random(rng).into()
34
0
}
35
36
/// Derives the public key from a given secret key
37
0
pub fn public_key(secret: &SecretKey) -> PublicKey {
38
0
    let sk: k256::SecretKey = secret.into();
39
0
    let sk: ecdsa::SigningKey<k256::Secp256k1> = sk.into();
40
0
    let vk = sk.verifying_key();
41
0
    vk.into()
42
0
}
43
44
/// Sign a given message and compress the `v` to the signature
45
///
46
/// The compression scheme is described in
47
/// <https://github.com/FuelLabs/fuel-specs/blob/master/src/protocol/cryptographic-primitives.md>
48
0
pub fn sign(secret: &SecretKey, message: &Message) -> [u8; 64] {
49
0
    let sk: k256::SecretKey = secret.into();
50
0
    let sk: ecdsa::SigningKey<k256::Secp256k1> = sk.into();
51
0
    let (signature, _recid) = sk
52
0
        .sign_prehash_recoverable(&**message)
53
0
        .expect("Infallible signature operation");
54
0
55
0
    // TODO: this is a hack to get the recovery id. The signature should be normalized
56
0
    // before computing the recovery id, but k256 library doesn't support this, and
57
0
    // instead always computes the recovery id from non-normalized signature.
58
0
    // So instead the recovery id is determined by checking which variant matches
59
0
    // the original public key.
60
0
61
0
    let recid1 = RecoveryId::new(false, false);
62
0
    let recid2 = RecoveryId::new(true, false);
63
0
64
0
    let rec1 = VerifyingKey::recover_from_prehash(&**message, &signature, recid1);
65
0
    let rec2 = VerifyingKey::recover_from_prehash(&**message, &signature, recid2);
66
0
67
0
    let actual = sk.verifying_key();
68
69
0
    let recovery_id = if rec1.map(|r| r == *actual).unwrap_or(false) {
70
0
        recid1
71
0
    } else if rec2.map(|r| r == *actual).unwrap_or(false) {
72
0
        recid2
73
    } else {
74
0
        unreachable!("Invalid signature generated");
75
    };
76
77
0
    let recovery_id = SecpRecoveryId::try_from(recovery_id)
78
0
        .expect("reduced-x recovery ids are never generated");
79
0
    encode_signature(signature.to_bytes().into(), recovery_id)
80
0
}
81
82
/// Recover the public key from a signature.
83
///
84
/// It takes the signature as owned because this operation is not idempotent. The
85
/// taken signature will not be recoverable. Signatures are meant to be
86
/// single use, so this avoids unnecessary copy.
87
0
pub fn recover(signature: [u8; 64], message: &Message) -> Result<PublicKey, Error> {
88
0
    let (sig, recid) = decode_signature(signature);
89
0
    let sig =
90
0
        k256::ecdsa::Signature::from_slice(&sig).map_err(|_| Error::InvalidSignature)?;
91
0
    let vk = VerifyingKey::recover_from_prehash(&**message, &sig, recid.into())
92
0
        .map_err(|_| Error::InvalidSignature)?;
93
0
    Ok(PublicKey::from(&vk))
94
0
}
95
96
/// Verify that a signature matches given public key
97
///
98
/// It takes the signature as owned because this operation is not idempotent. The
99
/// taken signature will not be recoverable. Signatures are meant to be
100
/// single use, so this avoids unnecessary copy.
101
0
pub fn verify(
102
0
    signature: [u8; 64],
103
0
    public_key: [u8; 64],
104
0
    message: &Message,
105
0
) -> Result<(), Error> {
106
    use ecdsa::signature::hazmat::PrehashVerifier;
107
108
0
    let vk = VerifyingKey::from_encoded_point(&EncodedPoint::from_untagged_bytes(
109
0
        &public_key.into(),
110
0
    ))
111
0
    .map_err(|_| Error::InvalidPublicKey)?;
112
113
0
    let (sig, _) = decode_signature(signature);
114
0
    let sig =
115
0
        k256::ecdsa::Signature::from_slice(&sig).map_err(|_| Error::InvalidSignature)?;
116
117
0
    vk.verify_prehash(&**message, &sig)
118
0
        .map_err(|_| Error::InvalidSignature)?;
119
0
    Ok(())
120
0
}
121
122
#[cfg(test)]
123
mod tests {
124
    use fuel_types::Bytes32;
125
    #[cfg(feature = "std")]
126
    use rand::{
127
        rngs::StdRng,
128
        Rng,
129
        SeedableRng,
130
    };
131
132
    use super::*;
133
134
    #[cfg(feature = "std")]
135
    #[test]
136
    fn full() {
137
        let rng = &mut StdRng::seed_from_u64(1234);
138
139
        let secret = random_secret(rng);
140
        let public = public_key(&secret);
141
142
        let message = Message::new(rng.gen::<[u8; 10]>());
143
144
        let signature = sign(&secret, &message);
145
        verify(signature, *public, &message).expect("Verification failed");
146
        let recovered = recover(signature, &message).expect("Recovery failed");
147
148
        assert_eq!(public, recovered);
149
    }
150
151
    #[test]
152
    fn no_std() {
153
        let raw_secret: [u8; 32] = [
154
            0x99, 0xe8, 0x7b, 0xe, 0x91, 0x58, 0x53, 0x1e, 0xee, 0xb5, 0x3, 0xff, 0x15,
155
            0x26, 0x6e, 0x2b, 0x23, 0xc2, 0xa2, 0x50, 0x7b, 0x13, 0x8c, 0x9d, 0x1b, 0x1f,
156
            0x2a, 0xb4, 0x58, 0xdf, 0x2d, 0x6,
157
        ];
158
        let secret = SecretKey::try_from(Bytes32::from(raw_secret)).unwrap();
159
        let public = public_key(&secret);
160
161
        let message = Message::new(b"Every secret creates a potential failure point.");
162
163
        let signature = sign(&secret, &message);
164
        verify(signature, *public, &message).expect("Verification failed");
165
        let recovered = recover(signature, &message).expect("Recovery failed");
166
167
        assert_eq!(public, recovered);
168
    }
169
}
/home/marten/fuel/fuel-vm/fuel-crypto/src/secp256/secret.rs
Line
Count
Source
1
use fuel_types::Bytes32;
2
3
use core::{
4
    fmt,
5
    ops::Deref,
6
    str,
7
};
8
9
use zeroize::Zeroize;
10
11
use crate::{
12
    secp256::PublicKey,
13
    Error,
14
};
15
16
#[cfg(feature = "std")]
17
use coins_bip32::path::DerivationPath;
18
19
#[cfg(feature = "std")]
20
use coins_bip39::{
21
    English,
22
    Mnemonic,
23
};
24
25
#[cfg(feature = "random")]
26
use rand::{
27
    CryptoRng,
28
    RngCore,
29
};
30
31
/// Asymmetric secret key, guaranteed to be valid by construction
32
0
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Zeroize)]
33
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
34
#[repr(transparent)]
35
pub struct SecretKey(Bytes32);
36
37
impl SecretKey {
38
    /// Memory length of the type
39
    pub const LEN: usize = Bytes32::LEN;
40
}
41
42
impl Deref for SecretKey {
43
    type Target = [u8; SecretKey::LEN];
44
45
0
    fn deref(&self) -> &[u8; SecretKey::LEN] {
46
0
        self.0.deref()
47
0
    }
48
}
49
50
impl AsRef<[u8]> for SecretKey {
51
13.1k
    fn as_ref(&self) -> &[u8] {
52
13.1k
        self.0.as_ref()
53
13.1k
    }
54
}
55
56
impl From<SecretKey> for [u8; SecretKey::LEN] {
57
0
    fn from(salt: SecretKey) -> [u8; SecretKey::LEN] {
58
0
        salt.0.into()
59
0
    }
60
}
61
62
impl fmt::LowerHex for SecretKey {
63
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
64
0
        self.0.fmt(f)
65
0
    }
66
}
67
68
impl fmt::UpperHex for SecretKey {
69
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
70
0
        self.0.fmt(f)
71
0
    }
72
}
73
74
impl fmt::Debug for SecretKey {
75
0
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
76
0
        self.0.fmt(f)
77
0
    }
78
}
79
80
impl fmt::Display for SecretKey {
81
0
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
82
0
        self.0.fmt(f)
83
0
    }
84
}
85
86
impl From<::k256::SecretKey> for SecretKey {
87
0
    fn from(s: ::k256::SecretKey) -> Self {
88
0
        let mut raw_bytes = [0u8; Self::LEN];
89
0
        raw_bytes.copy_from_slice(&s.to_bytes());
90
0
        Self(Bytes32::from(raw_bytes))
91
0
    }
92
}
93
94
#[cfg(feature = "std")]
95
impl From<::secp256k1::SecretKey> for SecretKey {
96
4.38k
    fn from(s: ::secp256k1::SecretKey) -> Self {
97
4.38k
        let mut raw_bytes = [0u8; Self::LEN];
98
4.38k
        raw_bytes.copy_from_slice(s.as_ref());
99
4.38k
        Self(Bytes32::from(raw_bytes))
100
4.38k
    }
101
}
102
103
impl From<&SecretKey> for ::k256::SecretKey {
104
0
    fn from(sk: &SecretKey) -> Self {
105
0
        ::k256::SecretKey::from_bytes(&(*sk.0).into())
106
0
            .expect("SecretKey is guaranteed to be valid")
107
0
    }
108
}
109
110
#[cfg(feature = "std")]
111
impl From<&SecretKey> for ::secp256k1::SecretKey {
112
13.1k
    fn from(sk: &SecretKey) -> Self {
113
13.1k
        ::secp256k1::SecretKey::from_slice(sk.as_ref())
114
13.1k
            .expect("SecretKey is guaranteed to be valid")
115
13.1k
    }
116
}
117
118
#[cfg(all(feature = "random", feature = "test-helpers"))]
119
impl Default for SecretKey {
120
    /// Creates a new random secret using rand::thread_rng()
121
0
    fn default() -> Self {
122
0
        let mut rng = rand::thread_rng();
123
0
        SecretKey::random(&mut rng)
124
0
    }
125
}
126
127
#[cfg(feature = "std")]
128
pub type W = English;
129
130
impl SecretKey {
131
    /// Create a new random secret
132
    #[cfg(feature = "random")]
133
4.38k
    pub fn random(rng: &mut (impl CryptoRng + RngCore)) -> Self {
134
4.38k
        super::backend::k1::random_secret(rng)
135
4.38k
    }
_RINvMsb_NtNtCslMVbBbY0Npy_11fuel_crypto7secp2566secretNtB6_9SecretKey6randomNtNtNtCsaiZOB2jUGOZ_4rand4rngs3std6StdRngECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
133
4.38k
    pub fn random(rng: &mut (impl CryptoRng + RngCore)) -> Self {
134
4.38k
        super::backend::k1::random_secret(rng)
135
4.38k
    }
Unexecuted instantiation: _RINvMsb_NtNtCslMVbBbY0Npy_11fuel_crypto7secp2566secretNtB6_9SecretKey6randomNtNtNtCsaiZOB2jUGOZ_4rand4rngs3std6StdRngECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvMsb_NtNtCslMVbBbY0Npy_11fuel_crypto7secp2566secretNtB6_9SecretKey6randomNtNtNtCsaiZOB2jUGOZ_4rand4rngs6thread9ThreadRngEBa_
136
137
    /// Generate a new secret key from a mnemonic phrase and its derivation path.
138
    /// Both are passed as `&str`. If you want to manually create a `DerivationPath`
139
    /// and `Mnemonic`, use [`SecretKey::new_from_mnemonic`].
140
    /// The derivation path is a list of integers, each representing a child index.
141
    #[cfg(feature = "std")]
142
0
    pub fn new_from_mnemonic_phrase_with_path(
143
0
        phrase: &str,
144
0
        path: &str,
145
0
    ) -> Result<Self, Error> {
146
        use core::str::FromStr;
147
148
0
        let mnemonic = Mnemonic::<W>::new_from_phrase(phrase)?;
149
0
        let path = DerivationPath::from_str(path)?;
150
0
        Self::new_from_mnemonic(path, mnemonic)
151
0
    }
152
153
    /// Generate a new secret key from a `DerivationPath` and `Mnemonic`.
154
    /// If you want to pass strings instead, use
155
    /// [`SecretKey::new_from_mnemonic_phrase_with_path`].
156
    #[cfg(feature = "std")]
157
0
    pub fn new_from_mnemonic(d: DerivationPath, m: Mnemonic<W>) -> Result<Self, Error> {
158
0
        let derived_priv_key = m.derive_key(d, None)?;
159
0
        let key: &coins_bip32::prelude::SigningKey = derived_priv_key.as_ref();
160
0
        let bytes: [u8; Self::LEN] = key.to_bytes().into();
161
0
        Ok(SecretKey(Bytes32::from(bytes)))
162
0
    }
163
164
    /// Return the curve representation of this secret.
165
8.77k
    pub fn public_key(&self) -> PublicKey {
166
8.77k
        crate::secp256::backend::k1::public_key(self)
167
8.77k
    }
168
}
169
170
impl TryFrom<Bytes32> for SecretKey {
171
    type Error = Error;
172
173
0
    fn try_from(b: Bytes32) -> Result<Self, Self::Error> {
174
0
        match k256::SecretKey::from_bytes((&*b).into()) {
175
0
            Ok(_) => Ok(Self(b)),
176
0
            Err(_) => Err(Error::InvalidSecretKey),
177
        }
178
0
    }
179
}
180
181
impl TryFrom<&[u8]> for SecretKey {
182
    type Error = Error;
183
184
0
    fn try_from(slice: &[u8]) -> Result<Self, Self::Error> {
185
0
        Bytes32::try_from(slice)
186
0
            .map_err(|_| Error::InvalidSecretKey)
187
0
            .and_then(SecretKey::try_from)
188
0
    }
189
}
190
191
impl str::FromStr for SecretKey {
192
    type Err = Error;
193
194
0
    fn from_str(s: &str) -> Result<Self, Self::Err> {
195
0
        Bytes32::from_str(s)
196
0
            .map_err(|_| Error::InvalidSecretKey)
197
0
            .and_then(SecretKey::try_from)
198
0
    }
199
}
200
201
#[cfg(test)]
202
#[allow(non_snake_case)]
203
mod tests {
204
    #[cfg(feature = "random")]
205
    #[test]
206
    fn default__yields_valid_secret() {
207
        use super::SecretKey;
208
        let _ = SecretKey::default();
209
    }
210
}
/home/marten/fuel/fuel-vm/fuel-crypto/src/secp256/public.rs
Line
Count
Source
1
use crate::{
2
    hasher::Hasher,
3
    secp256::SecretKey,
4
    Error,
5
};
6
use core::{
7
    fmt,
8
    ops::Deref,
9
};
10
11
use k256::ecdsa::VerifyingKey;
12
13
use core::str;
14
15
use fuel_types::{
16
    Bytes32,
17
    Bytes64,
18
};
19
use k256::elliptic_curve::sec1::ToEncodedPoint;
20
21
/// Asymmetric secp256k1 public key, i.e. verifying key, in uncompressed form.
22
/// <https://github.com/FuelLabs/fuel-specs/blob/master/src/protocol/cryptographic-primitives.md#ecdsa-public-key-cryptography>
23
#[derive(Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
24
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
25
#[repr(transparent)]
26
pub struct PublicKey(Bytes64);
27
28
impl PublicKey {
29
    /// Memory length of the type in bytes.
30
    pub const LEN: usize = Bytes64::LEN;
31
32
    /// Cryptographic hash of the public key.
33
13.1k
    pub fn hash(&self) -> Bytes32 {
34
13.1k
        Hasher::hash(self.as_ref())
35
13.1k
    }
36
}
37
38
impl Deref for PublicKey {
39
    type Target = [u8; PublicKey::LEN];
40
41
9.28k
    fn deref(&self) -> &[u8; PublicKey::LEN] {
42
9.28k
        self.0.deref()
43
9.28k
    }
_RNvXs_NtNtCslMVbBbY0Npy_11fuel_crypto7secp2566publicNtB4_9PublicKeyNtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
41
9.28k
    fn deref(&self) -> &[u8; PublicKey::LEN] {
42
9.28k
        self.0.deref()
43
9.28k
    }
Unexecuted instantiation: _RNvXs_NtNtCslMVbBbY0Npy_11fuel_crypto7secp2566publicNtB4_9PublicKeyNtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB8_
44
}
45
46
impl AsRef<[u8]> for PublicKey {
47
13.1k
    fn as_ref(&self) -> &[u8] {
48
13.1k
        self.0.as_ref()
49
13.1k
    }
50
}
51
52
impl AsMut<[u8]> for PublicKey {
53
0
    fn as_mut(&mut self) -> &mut [u8] {
54
0
        self.0.as_mut()
55
0
    }
56
}
57
58
impl From<PublicKey> for [u8; PublicKey::LEN] {
59
0
    fn from(pk: PublicKey) -> [u8; PublicKey::LEN] {
60
0
        pk.0.into()
61
0
    }
62
}
63
64
impl fmt::LowerHex for PublicKey {
65
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
66
0
        self.0.fmt(f)
67
0
    }
68
}
69
70
impl fmt::UpperHex for PublicKey {
71
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
72
0
        self.0.fmt(f)
73
0
    }
74
}
75
76
impl fmt::Debug for PublicKey {
77
0
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
78
0
        self.0.fmt(f)
79
0
    }
80
}
81
82
impl fmt::Display for PublicKey {
83
0
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
84
0
        self.0.fmt(f)
85
0
    }
86
}
87
88
impl From<k256::PublicKey> for PublicKey {
89
0
    fn from(key: k256::PublicKey) -> Self {
90
0
        let point = key.to_encoded_point(false);
91
0
        let mut raw = Bytes64::zeroed();
92
0
        raw[..32].copy_from_slice(point.x().unwrap());
93
0
        raw[32..].copy_from_slice(point.y().unwrap());
94
0
        Self(raw)
95
0
    }
96
}
97
98
impl From<&ecdsa::VerifyingKey<k256::Secp256k1>> for PublicKey {
99
0
    fn from(vk: &ecdsa::VerifyingKey<k256::Secp256k1>) -> Self {
100
0
        let vk: k256::PublicKey = vk.into();
101
0
        vk.into()
102
0
    }
103
}
104
105
#[cfg(feature = "std")]
106
impl From<secp256k1::PublicKey> for PublicKey {
107
22.4k
    fn from(key: secp256k1::PublicKey) -> Self {
108
22.4k
        let key_bytes = key.serialize_uncompressed();
109
22.4k
        let mut raw = Bytes64::zeroed();
110
22.4k
        // Remove leading identifier byte
111
22.4k
        raw.copy_from_slice(&key_bytes[1..]);
112
22.4k
        Self(raw)
113
22.4k
    }
114
}
115
116
impl TryFrom<Bytes64> for PublicKey {
117
    type Error = Error;
118
119
0
    fn try_from(b: Bytes64) -> Result<Self, Self::Error> {
120
0
        match VerifyingKey::from_sec1_bytes(&*b) {
121
0
            Ok(_) => Ok(Self(b)),
122
0
            Err(_) => Err(Error::InvalidPublicKey),
123
        }
124
0
    }
125
}
126
127
impl TryFrom<&[u8]> for PublicKey {
128
    type Error = Error;
129
130
0
    fn try_from(slice: &[u8]) -> Result<Self, Self::Error> {
131
0
        Bytes64::try_from(slice)
132
0
            .map_err(|_| Error::InvalidPublicKey)
133
0
            .and_then(PublicKey::try_from)
134
0
    }
135
}
136
137
impl From<&SecretKey> for PublicKey {
138
4.38k
    fn from(s: &SecretKey) -> PublicKey {
139
4.38k
        s.public_key()
140
4.38k
    }
141
}
142
143
impl str::FromStr for PublicKey {
144
    type Err = Error;
145
146
0
    fn from_str(s: &str) -> Result<Self, Self::Err> {
147
0
        Bytes64::from_str(s)
148
0
            .map_err(|_| Error::InvalidPublicKey)
149
0
            .and_then(PublicKey::try_from)
150
0
    }
151
}
/home/marten/fuel/fuel-vm/fuel-crypto/src/secp256/signature_format.rs
Line
Count
Source
1
//! Utility functions common for secp256k1 and secp256r1
2
3
/// Recovery id, used to encode the y parity of the public key
4
/// in the signature.
5
///
6
/// Guaranteed to be valid by construction. Only encodes the y parity,
7
/// and rejects reduced-x recovery ids.
8
#[derive(Debug, Copy, Clone, PartialEq)]
9
pub struct RecoveryId {
10
    is_y_odd: bool,
11
}
12
13
impl From<RecoveryId> for k256::ecdsa::RecoveryId {
14
1.50k
    fn from(recid: RecoveryId) -> Self {
15
1.50k
        k256::ecdsa::RecoveryId::new(recid.is_y_odd, false)
16
1.50k
    }
17
}
18
impl TryFrom<ecdsa::RecoveryId> for RecoveryId {
19
    type Error = ();
20
21
0
    fn try_from(recid: ecdsa::RecoveryId) -> Result<Self, Self::Error> {
22
0
        if recid.is_x_reduced() {
23
0
            return Err(())
24
0
        }
25
0
26
0
        Ok(Self {
27
0
            is_y_odd: recid.is_y_odd(),
28
0
        })
29
0
    }
30
}
31
32
#[cfg(feature = "std")]
33
impl From<RecoveryId> for secp256k1::ecdsa::RecoveryId {
34
15.5k
    fn from(recid: RecoveryId) -> Self {
35
15.5k
        secp256k1::ecdsa::RecoveryId::from_i32(recid.is_y_odd as i32)
36
15.5k
            .expect("0 and 1 are always valid recovery ids")
37
15.5k
    }
38
}
39
40
#[cfg(feature = "std")]
41
impl TryFrom<secp256k1::ecdsa::RecoveryId> for RecoveryId {
42
    type Error = ();
43
44
4.38k
    fn try_from(recid: secp256k1::ecdsa::RecoveryId) -> Result<Self, Self::Error> {
45
4.38k
        match recid.to_i32() {
46
3.10k
            0 => Ok(Self { is_y_odd: false }),
47
1.28k
            1 => Ok(Self { is_y_odd: true }),
48
0
            _ => Err(()),
49
        }
50
4.38k
    }
51
}
52
53
/// Combines recovery id with the signature bytes. See the following link for explanation.
54
/// https://github.com/FuelLabs/fuel-specs/blob/master/src/protocol/cryptographic-primitives.md#ecdsa-public-key-cryptography
55
/// Panics if the highest bit of byte at index 32 is set, as this indicates non-normalized
56
/// signature. Panics if the recovery id is in reduced-x form.
57
4.38k
pub fn encode_signature(mut signature: [u8; 64], recovery_id: RecoveryId) -> [u8; 64] {
58
4.38k
    assert!(signature[32] >> 7 == 0, "Non-normalized signature");
59
4.38k
    let v = recovery_id.is_y_odd as u8;
60
4.38k
61
4.38k
    signature[32] = (v << 7) | (signature[32] & 0x7f);
62
4.38k
    signature
63
4.38k
}
64
65
/// Separates recovery id from the signature bytes. See the following link for
66
/// explanation. https://github.com/FuelLabs/fuel-specs/blob/master/src/protocol/cryptographic-primitives.md#ecdsa-public-key-cryptography
67
20.0k
pub fn decode_signature(mut signature: [u8; 64]) -> ([u8; 64], RecoveryId) {
68
20.0k
    let is_y_odd = (signature[32] & 0x80) != 0;
69
20.0k
    signature[32] &= 0x7f;
70
20.0k
    (signature, RecoveryId { is_y_odd })
71
20.0k
}
72
73
#[cfg(all(test, feature = "std"))]
74
mod tests {
75
    use rand::{
76
        rngs::StdRng,
77
        SeedableRng,
78
    };
79
80
    use crate::{
81
        Message,
82
        SecretKey,
83
        Signature,
84
    };
85
86
    use super::*;
87
88
    #[test]
89
    fn signature_roundtrip() {
90
        let rng = &mut StdRng::seed_from_u64(1234);
91
92
        let message = Message::new("Hello, world!");
93
        let secret = SecretKey::random(rng);
94
        let signature = Signature::sign(&secret, &message);
95
96
        let (decoded, recovery_id) = decode_signature(*signature);
97
        let encoded = encode_signature(decoded, recovery_id);
98
99
        assert_eq!(*signature, encoded);
100
    }
101
}
/home/marten/fuel/fuel-vm/fuel-vm/fuzz/src/lib.rs
Line
Count
Source
1
use fuel_vm::fuel_asm::op;
2
use fuel_vm::fuel_asm::{Instruction, InvalidOpcode};
3
use fuel_vm::fuel_types::Word;
4
use fuel_vm::prelude::field::Script;
5
use fuel_vm::prelude::*;
6
7
use fuel_vm::util::test_helpers::TestBuilder;
8
use fuel_vm::{fuel_asm, script_with_data_offset};
9
use fuel_vm::fuel_types::canonical::Serialize;
10
use std::ops::Range;
11
12
/// Magic value used as separator between fuzz data components in corpus files.
13
const MAGIC_VALUE_SEPARATOR: [u8; 8] = [0x00u8, 0xAD, 0xBE, 0xEF, 0x55, 0x66, 0xCE, 0xAA];
14
15
#[derive(Debug, Eq, PartialEq)]
16
pub struct FuzzData {
17
    pub program: Vec<u8>,
18
    pub sub_program: Vec<u8>,
19
    pub script_data: Vec<u8>,
20
}
21
22
0
pub fn encode(data: &FuzzData) -> Vec<u8> {
23
0
    let separator: Vec<u8> = MAGIC_VALUE_SEPARATOR.into();
24
0
    data.program.iter()
25
0
        .copied()
26
0
        .chain(separator.iter().copied())
27
0
        .chain(data.script_data.iter().copied())
28
0
        .chain(separator.iter().copied())
29
0
        .chain(data.sub_program.iter().copied())
30
0
        .collect()
31
0
}
32
33
2.22k
fn split_by_separator(data: &[u8], separator: &[u8]) -> Vec<Range<usize>> {
34
2.22k
    let separator_len = separator.len();
35
2.22k
36
2.22k
    let mut last: usize = 0;
37
2.22k
38
2.22k
    let mut result: Vec<_> = data
39
2.22k
        .windows(separator_len)
40
2.22k
        .enumerate()
41
1.66M
        .filter_map(|(i, window)| {
42
1.66M
            if window == separator {
43
5.18k
                let option = Some(last..i);
44
5.18k
                last = i + separator_len;
45
5.18k
                return option;
46
            } else {
47
1.66M
                None
48
            }
49
1.66M
        })
50
2.22k
        .collect();
51
2.22k
52
2.22k
    result.push(last..data.len());
53
2.22k
54
2.22k
    result
55
2.22k
}
56
57
2.22k
pub fn decode(data: &[u8]) -> Option<FuzzData> {
58
2.22k
    let x = split_by_separator(data, &MAGIC_VALUE_SEPARATOR);
59
2.22k
    if x.len() != 3 {
60
34
        return None;
61
2.19k
    }
62
2.19k
    Some(FuzzData {
63
2.19k
        program: data[x[0].clone()].to_vec(),
64
2.19k
        script_data: data[x[1].clone()].to_vec(),
65
2.19k
        sub_program: data[x[2].clone()].to_vec(),
66
2.19k
    })
67
2.22k
}
68
0
pub fn decode_instructions(bytes: &[u8]) -> Option<Vec<Instruction>> {
69
0
    let instructions: Vec<_> = fuel_vm::fuel_asm::from_bytes(bytes.iter().cloned())
70
0
        .flat_map(|i: Result<Instruction, InvalidOpcode>| i.ok())
71
0
        .collect();
72
0
    return Some(instructions);
73
0
}
74
75
pub struct ExecuteResult {
76
    pub success: bool,
77
    pub gas_used: u64,
78
}
79
80
2.19k
pub fn execute(data: FuzzData) -> ExecuteResult {
81
2.19k
    let gas_limit = 1_000_000;
82
2.19k
    let asset_id: AssetId = AssetId::new([
83
2.19k
        0xFA, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
84
2.19k
        1, 1, 1, 1, 1, 1,
85
2.19k
    ]);
86
2.19k
87
2.19k
    let mut test_context = TestBuilder::new(2322u64);
88
2.19k
    let subcontract: Vec<_> = [
89
2.19k
        // Pass some data to fuzzer
90
2.19k
        op::addi(
91
2.19k
            0x10,
92
2.19k
            fuel_asm::RegId::FP,
93
2.19k
            CallFrame::b_offset() as Immediate12,
94
2.19k
        ),
95
2.19k
        fuel_vm::fuel_asm::op::lw(0x10, 0x10, 0), // load address word
96
2.19k
    ]
97
2.19k
    .iter()
98
2.19k
    .copied()
99
2.19k
    .flat_map(Instruction::to_bytes)
100
2.19k
    .chain(data.sub_program.iter().copied())
101
2.19k
    .collect::<Vec<u8>>();
102
2.19k
103
2.19k
    let contract_id = test_context
104
2.19k
        .setup_contract_bytes(subcontract.clone(), None, None)
105
2.19k
        .contract_id;
106
2.19k
107
2.19k
    let max_program_length = 2usize.pow(18)
108
2.19k
        - test_context.get_tx_params().tx_offset()
109
2.19k
        - <fuel_vm::prelude::Script as Script>::script_offset_static();
110
2.19k
111
2.19k
    let actual_program = &data.program[..max_program_length.min(data.program.len())];
112
2.19k
113
2.19k
    let (script_ops, script_data_offset): (Vec<u8>, Immediate18) = script_with_data_offset!(
114
2.19k
        script_data_offset,
115
2.19k
        actual_program.to_vec(),
116
2.19k
        test_context.get_tx_params().tx_offset()
117
2.19k
    );
118
2.19k
119
2.19k
    let call = Call::new(contract_id, 0, script_data_offset as Word).to_bytes();
120
2.19k
    let script_data: [&[u8]; 2] = [asset_id.as_ref(), call.as_slice()];
121
2.19k
122
2.19k
    // Provide an asset id and the contract_id
123
2.19k
    let script_data: Vec<u8> = script_data.iter().copied().flatten().copied().collect();
124
2.19k
125
2.19k
    let script_data = script_data
126
2.19k
        .iter()
127
2.19k
        .chain(data.script_data.iter())
128
2.19k
        .copied()
129
2.19k
        .collect::<Vec<_>>();
130
2.19k
131
2.19k
    let transfer_tx = test_context
132
2.19k
        .start_script_bytes(script_ops.iter().copied().collect(), script_data)
133
2.19k
        .script_gas_limit(gas_limit)
134
2.19k
        .gas_price(0)
135
2.19k
        .coin_input(asset_id, 1000)
136
2.19k
        .contract_input(contract_id)
137
2.19k
        .contract_output(&contract_id)
138
2.19k
        .change_output(asset_id)
139
2.19k
        .execute();
140
2.19k
141
2.19k
    let gas_used: u64 = *transfer_tx
142
2.19k
        .receipts()
143
2.19k
        .iter()
144
924k
        .filter_map(|recipt| match recipt {
145
2.19k
            Receipt::ScriptResult { gas_used, .. } => Some(gas_used),
146
922k
            _ => None,
147
924k
        })
148
2.19k
        .next()
149
2.19k
        .unwrap();
150
2.19k
151
2.19k
    ExecuteResult {
152
2.19k
        success: !transfer_tx.should_revert(),
153
2.19k
        gas_used,
154
2.19k
    }
155
2.19k
}
/home/marten/fuel/fuel-vm/fuel-vm/src/backtrace.rs
Line
Count
Source
1
//! Backtrace implementation to track script errors.
2
//!
3
//! As of the moment, doesn't support predicates.
4
5
use alloc::{
6
    borrow::ToOwned,
7
    vec::Vec,
8
};
9
10
use crate::{
11
    call::CallFrame,
12
    consts::*,
13
    interpreter::{
14
        InitialBalances,
15
        Interpreter,
16
    },
17
};
18
use derivative::Derivative;
19
20
use crate::interpreter::{
21
    Memory,
22
    MemoryInstance,
23
};
24
use fuel_tx::ScriptExecutionResult;
25
use fuel_types::{
26
    ContractId,
27
    Word,
28
};
29
30
#[derive(Derivative)]
31
0
#[derivative(Debug)]
32
0
/// Runtime description derived from a VM error.
33
0
pub struct Backtrace {
34
0
    call_stack: Vec<CallFrame>,
35
0
    contract: ContractId,
36
0
    registers: [Word; VM_REGISTER_COUNT],
37
0
    memory: MemoryInstance,
38
0
    result: ScriptExecutionResult,
39
0
    initial_balances: InitialBalances,
40
0
}
41
42
impl Backtrace {
43
    /// Create a backtrace from a vm instance and instruction result.
44
    ///
45
    /// This isn't copy-free and shouldn't be provided by default.
46
0
    pub fn from_vm_error<M, S, Tx, Ecal>(
47
0
        vm: &Interpreter<M, S, Tx, Ecal>,
48
0
        result: ScriptExecutionResult,
49
0
    ) -> Self
50
0
    where
51
0
        M: Memory,
52
0
    {
53
0
        let call_stack = vm.call_stack().to_owned();
54
0
        let contract = vm.internal_contract().unwrap_or_default();
55
0
        let memory = vm.memory().clone();
56
0
        let initial_balances = vm.initial_balances().clone();
57
0
        let mut registers = [0; VM_REGISTER_COUNT];
58
0
59
0
        registers.copy_from_slice(vm.registers());
60
0
61
0
        Self {
62
0
            call_stack,
63
0
            contract,
64
0
            registers,
65
0
            memory,
66
0
            result,
67
0
            initial_balances,
68
0
        }
69
0
    }
70
71
    /// Call stack of the VM when the error occurred.
72
0
    pub fn call_stack(&self) -> &[CallFrame] {
73
0
        self.call_stack.as_slice()
74
0
    }
75
76
    /// Last contract of the context when the error occurred.
77
0
    pub const fn contract(&self) -> &ContractId {
78
0
        &self.contract
79
0
    }
80
81
    /// Register set when the error occurred.
82
0
    pub const fn registers(&self) -> &[Word] {
83
0
        &self.registers
84
0
    }
85
86
    /// Memory of the VM when the error occurred.
87
0
    pub fn memory(&self) -> &MemoryInstance {
88
0
        &self.memory
89
0
    }
90
91
    /// [`ScriptExecutionResult`] of the error that caused this backtrace.
92
0
    pub const fn result(&self) -> &ScriptExecutionResult {
93
0
        &self.result
94
0
    }
95
96
    /// The initial balances.
97
0
    pub const fn initial_balances(&self) -> &InitialBalances {
98
0
        &self.initial_balances
99
0
    }
100
101
    /// Expose the internal attributes of the backtrace.
102
0
    pub fn into_inner(
103
0
        self,
104
0
    ) -> (
105
0
        Vec<CallFrame>,
106
0
        ContractId,
107
0
        [Word; VM_REGISTER_COUNT],
108
0
        MemoryInstance,
109
0
        ScriptExecutionResult,
110
0
        InitialBalances,
111
0
    ) {
112
0
        let Self {
113
0
            call_stack,
114
0
            contract,
115
0
            registers,
116
0
            memory,
117
0
            result,
118
0
            initial_balances,
119
0
        } = self;
120
0
121
0
        (
122
0
            call_stack,
123
0
            contract,
124
0
            registers,
125
0
            memory,
126
0
            result,
127
0
            initial_balances,
128
0
        )
129
0
    }
130
}
/home/marten/fuel/fuel-vm/fuel-vm/src/constraints/reg_key.rs
Line
Count
Source
1
//! Utilities for accessing register values and proving at compile time that
2
//! the register index is valid.
3
//!
4
//! This module also provides utilities for mutably accessing multiple registers.
5
use core::ops::{
6
    Deref,
7
    DerefMut,
8
};
9
10
use fuel_asm::{
11
    PanicReason,
12
    RegId,
13
    RegisterId,
14
    Word,
15
};
16
17
use crate::consts::{
18
    VM_REGISTER_COUNT,
19
    VM_REGISTER_PROGRAM_COUNT,
20
    VM_REGISTER_SYSTEM_COUNT,
21
};
22
23
#[cfg(test)]
24
mod tests;
25
26
#[derive(Debug, PartialEq, Eq)]
27
/// Mutable reference to a register value at a given index.
28
pub struct RegMut<'r, const INDEX: u8>(&'r mut Word);
29
30
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
31
/// Immutable reference to a register value at a given index.
32
pub struct Reg<'r, const INDEX: u8>(&'r Word);
33
34
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
35
/// A key to a writable register that is within
36
/// the bounds of the writable registers.
37
pub struct WriteRegKey(usize);
38
39
impl WriteRegKey {
40
    /// Create a new writable register key if the index is within the bounds
41
    /// of the writable registers.
42
237M
    pub fn new(k: impl Into<usize>) -> Result<Self, PanicReason> {
43
237M
        let k = k.into();
44
237M
        is_register_writable(&k)?;
45
237M
        Ok(Self(k))
46
237M
    }
47
48
    /// Translate this key from an absolute register index
49
    /// to a program register index.
50
    ///
51
    /// This subtracts the number of system registers from the key.
52
    #[allow(clippy::arithmetic_side_effects)] // Safety: checked in constructor
53
237M
    fn translate(self) -> usize {
54
237M
        self.0 - VM_REGISTER_SYSTEM_COUNT
55
237M
    }
56
}
57
58
/// Check that the register is above the system registers and below the total
59
/// number of registers.
60
237M
pub(crate) fn is_register_writable(r: &RegisterId) -> Result<(), PanicReason> {
61
    const W_USIZE: usize = RegId::WRITABLE.to_u8() as usize;
62
    const RANGE: core::ops::Range<usize> = W_USIZE..(W_USIZE + VM_REGISTER_PROGRAM_COUNT);
63
237M
    if RANGE.contains(r) {
64
237M
        Ok(())
65
    } else {
66
101
        Err(PanicReason::ReservedRegisterNotWritable)
67
    }
68
237M
}
69
70
impl<'r, const INDEX: u8> RegMut<'r, INDEX> {
71
    /// Create a new mutable register reference.
72
0
    pub fn new(reg: &'r mut Word) -> Self {
73
0
        Self(reg)
74
0
    }
75
}
76
77
impl<'r, const INDEX: u8> Reg<'r, INDEX> {
78
    /// Create a new immutable register reference.
79
0
    pub fn new(reg: &'r Word) -> Self {
80
0
        Self(reg)
81
0
    }
82
}
83
84
impl<const INDEX: u8> Deref for Reg<'_, INDEX> {
85
    type Target = Word;
86
87
108M
    fn deref(&self) -> &Self::Target {
88
108M
        self.0
89
108M
    }
_RNvXs1_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_3RegKh7_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB9_
Line
Count
Source
87
22.7M
    fn deref(&self) -> &Self::Target {
88
22.7M
        self.0
89
22.7M
    }
_RNvXs1_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_3RegKh6_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB9_
Line
Count
Source
87
120k
    fn deref(&self) -> &Self::Target {
88
120k
        self.0
89
120k
    }
_RNvXs1_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_3RegKhc_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB9_
Line
Count
Source
87
61.9M
    fn deref(&self) -> &Self::Target {
88
61.9M
        self.0
89
61.9M
    }
_RNvXs1_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_3RegKh3_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB9_
Line
Count
Source
87
10
    fn deref(&self) -> &Self::Target {
88
10
        self.0
89
10
    }
_RNvXs1_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_3RegKh5_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB9_
Line
Count
Source
87
898k
    fn deref(&self) -> &Self::Target {
88
898k
        self.0
89
898k
    }
_RNvXs1_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_3RegKh4_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB9_
Line
Count
Source
87
22.3M
    fn deref(&self) -> &Self::Target {
88
22.3M
        self.0
89
22.3M
    }
_RNvXs1_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_3RegKhf_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB9_
Line
Count
Source
87
68
    fn deref(&self) -> &Self::Target {
88
68
        self.0
89
68
    }
90
}
91
92
impl<const INDEX: u8> Deref for RegMut<'_, INDEX> {
93
    type Target = Word;
94
95
2.29G
    fn deref(&self) -> &Self::Target {
96
2.29G
        self.0
97
2.29G
    }
_RNvXs2_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKh4_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB9_
Line
Count
Source
95
965k
    fn deref(&self) -> &Self::Target {
96
965k
        self.0
97
965k
    }
_RNvXs2_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKh5_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB9_
Line
Count
Source
95
22.9M
    fn deref(&self) -> &Self::Target {
96
22.9M
        self.0
97
22.9M
    }
_RNvXs2_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKh3_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB9_
Line
Count
Source
95
327M
    fn deref(&self) -> &Self::Target {
96
327M
        self.0
97
327M
    }
_RNvXs2_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKha_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB9_
Line
Count
Source
95
1.16G
    fn deref(&self) -> &Self::Target {
96
1.16G
        self.0
97
1.16G
    }
_RNvXs2_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKh9_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB9_
Line
Count
Source
95
776M
    fn deref(&self) -> &Self::Target {
96
776M
        self.0
97
776M
    }
_RNvXs2_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKh6_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB9_
Line
Count
Source
95
24.7k
    fn deref(&self) -> &Self::Target {
96
24.7k
        self.0
97
24.7k
    }
_RNvXs2_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKhc_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB9_
Line
Count
Source
95
12.3k
    fn deref(&self) -> &Self::Target {
96
12.3k
        self.0
97
12.3k
    }
_RNvXs2_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKh7_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB9_
Line
Count
Source
95
898k
    fn deref(&self) -> &Self::Target {
96
898k
        self.0
97
898k
    }
98
}
99
100
impl<const INDEX: u8> DerefMut for RegMut<'_, INDEX> {
101
1.55G
    fn deref_mut(&mut self) -> &mut Self::Target {
102
1.55G
        self.0
103
1.55G
    }
_RNvXs3_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKh2_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB9_
Line
Count
Source
101
182M
    fn deref_mut(&mut self) -> &mut Self::Target {
102
182M
        self.0
103
182M
    }
_RNvXs3_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKh8_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB9_
Line
Count
Source
101
182M
    fn deref_mut(&mut self) -> &mut Self::Target {
102
182M
        self.0
103
182M
    }
_RNvXs3_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKh5_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB9_
Line
Count
Source
101
22.7M
    fn deref_mut(&mut self) -> &mut Self::Target {
102
22.7M
        self.0
103
22.7M
    }
_RNvXs3_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKh4_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB9_
Line
Count
Source
101
442k
    fn deref_mut(&mut self) -> &mut Self::Target {
102
442k
        self.0
103
442k
    }
_RNvXs3_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKh6_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB9_
Line
Count
Source
101
23.6k
    fn deref_mut(&mut self) -> &mut Self::Target {
102
23.6k
        self.0
103
23.6k
    }
_RNvXs3_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKh3_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB9_
Line
Count
Source
101
387M
    fn deref_mut(&mut self) -> &mut Self::Target {
102
387M
        self.0
103
387M
    }
_RNvXs3_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKha_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB9_
Line
Count
Source
101
388M
    fn deref_mut(&mut self) -> &mut Self::Target {
102
388M
        self.0
103
388M
    }
_RNvXs3_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKhb_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB9_
Line
Count
Source
101
12.3k
    fn deref_mut(&mut self) -> &mut Self::Target {
102
12.3k
        self.0
103
12.3k
    }
_RNvXs3_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKhc_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB9_
Line
Count
Source
101
12.3k
    fn deref_mut(&mut self) -> &mut Self::Target {
102
12.3k
        self.0
103
12.3k
    }
_RNvXs3_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKhf_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB9_
Line
Count
Source
101
595k
    fn deref_mut(&mut self) -> &mut Self::Target {
102
595k
        self.0
103
595k
    }
_RNvXs3_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKh9_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB9_
Line
Count
Source
101
388M
    fn deref_mut(&mut self) -> &mut Self::Target {
102
388M
        self.0
103
388M
    }
_RNvXs3_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKh7_ENtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB9_
Line
Count
Source
101
898k
    fn deref_mut(&mut self) -> &mut Self::Target {
102
898k
        self.0
103
898k
    }
104
}
105
106
impl<'a, const INDEX: u8> From<RegMut<'a, INDEX>> for Reg<'a, INDEX> {
107
86.7k
    fn from(reg: RegMut<'a, INDEX>) -> Self {
108
86.7k
        Self(reg.0)
109
86.7k
    }
_RNvXs4_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_3RegKhf_EINtNtCsd3UI3IJrzMw_4core7convert4FromINtB5_6RegMutKB11_EE4fromB9_
Line
Count
Source
107
27
    fn from(reg: RegMut<'a, INDEX>) -> Self {
108
27
        Self(reg.0)
109
27
    }
_RNvXs4_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_3RegKh7_EINtNtCsd3UI3IJrzMw_4core7convert4FromINtB5_6RegMutKB11_EE4fromB9_
Line
Count
Source
107
12.3k
    fn from(reg: RegMut<'a, INDEX>) -> Self {
108
12.3k
        Self(reg.0)
109
12.3k
    }
_RNvXs4_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_3RegKh0_EINtNtCsd3UI3IJrzMw_4core7convert4FromINtB5_6RegMutKB11_EE4fromB9_
Line
Count
Source
107
12.3k
    fn from(reg: RegMut<'a, INDEX>) -> Self {
108
12.3k
        Self(reg.0)
109
12.3k
    }
_RNvXs4_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_3RegKh1_EINtNtCsd3UI3IJrzMw_4core7convert4FromINtB5_6RegMutKB11_EE4fromB9_
Line
Count
Source
107
12.3k
    fn from(reg: RegMut<'a, INDEX>) -> Self {
108
12.3k
        Self(reg.0)
109
12.3k
    }
_RNvXs4_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_3RegKh2_EINtNtCsd3UI3IJrzMw_4core7convert4FromINtB5_6RegMutKB11_EE4fromB9_
Line
Count
Source
107
12.3k
    fn from(reg: RegMut<'a, INDEX>) -> Self {
108
12.3k
        Self(reg.0)
109
12.3k
    }
_RNvXs4_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_3RegKh8_EINtNtCsd3UI3IJrzMw_4core7convert4FromINtB5_6RegMutKB11_EE4fromB9_
Line
Count
Source
107
12.3k
    fn from(reg: RegMut<'a, INDEX>) -> Self {
108
12.3k
        Self(reg.0)
109
12.3k
    }
_RNvXs4_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_3RegKhd_EINtNtCsd3UI3IJrzMw_4core7convert4FromINtB5_6RegMutKB11_EE4fromB9_
Line
Count
Source
107
12.3k
    fn from(reg: RegMut<'a, INDEX>) -> Self {
108
12.3k
        Self(reg.0)
109
12.3k
    }
_RNvXs4_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_3RegKhe_EINtNtCsd3UI3IJrzMw_4core7convert4FromINtB5_6RegMutKB11_EE4fromB9_
Line
Count
Source
107
12.3k
    fn from(reg: RegMut<'a, INDEX>) -> Self {
108
12.3k
        Self(reg.0)
109
12.3k
    }
110
}
111
112
impl<'r, const INDEX: u8> RegMut<'r, INDEX> {
113
    /// Re-borrow the register as an immutable reference.
114
1.39G
    pub fn as_ref(&self) -> Reg<INDEX> {
115
1.39G
        Reg(self.0)
116
1.39G
    }
_RNvMs5_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKhf_E6as_refB9_
Line
Count
Source
114
87.8M
    pub fn as_ref(&self) -> Reg<INDEX> {
115
87.8M
        Reg(self.0)
116
87.8M
    }
_RNvMs5_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKh7_E6as_refB9_
Line
Count
Source
114
22.9M
    pub fn as_ref(&self) -> Reg<INDEX> {
115
22.9M
        Reg(self.0)
116
22.9M
    }
_RNvMs5_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKh6_E6as_refB9_
Line
Count
Source
114
1.52M
    pub fn as_ref(&self) -> Reg<INDEX> {
115
1.52M
        Reg(self.0)
116
1.52M
    }
_RNvMs5_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKhc_E6as_refB9_
Line
Count
Source
114
481M
    pub fn as_ref(&self) -> Reg<INDEX> {
115
481M
        Reg(self.0)
116
481M
    }
_RNvMs5_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKh3_E6as_refB9_
Line
Count
Source
114
388M
    pub fn as_ref(&self) -> Reg<INDEX> {
115
388M
        Reg(self.0)
116
388M
    }
_RNvMs5_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKh5_E6as_refB9_
Line
Count
Source
114
911k
    pub fn as_ref(&self) -> Reg<INDEX> {
115
911k
        Reg(self.0)
116
911k
    }
_RNvMs5_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKh4_E6as_refB9_
Line
Count
Source
114
22.3M
    pub fn as_ref(&self) -> Reg<INDEX> {
115
22.3M
        Reg(self.0)
116
22.3M
    }
_RNvMs5_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKhb_E6as_refB9_
Line
Count
Source
114
12.3k
    pub fn as_ref(&self) -> Reg<INDEX> {
115
12.3k
        Reg(self.0)
116
12.3k
    }
_RNvMs5_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKha_E6as_refB9_
Line
Count
Source
114
388M
    pub fn as_ref(&self) -> Reg<INDEX> {
115
388M
        Reg(self.0)
116
388M
    }
_RNvMs5_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKh9_E6as_refB9_
Line
Count
Source
114
12.3k
    pub fn as_ref(&self) -> Reg<INDEX> {
115
12.3k
        Reg(self.0)
116
12.3k
    }
117
}
118
119
impl<'r, const INDEX: u8> RegMut<'r, INDEX> {
120
    /// Re-borrow the register as a mutable reference.
121
26.4M
    pub fn as_mut(&mut self) -> RegMut<INDEX> {
122
26.4M
        RegMut(self.0)
123
26.4M
    }
_RNvMs6_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKha_E6as_mutB9_
Line
Count
Source
121
26.3M
    pub fn as_mut(&mut self) -> RegMut<INDEX> {
122
26.3M
        RegMut(self.0)
123
26.3M
    }
_RNvMs6_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKh9_E6as_mutB9_
Line
Count
Source
121
12.5k
    pub fn as_mut(&mut self) -> RegMut<INDEX> {
122
12.5k
        RegMut(self.0)
123
12.5k
    }
_RNvMs6_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyINtB5_6RegMutKh6_E6as_mutB9_
Line
Count
Source
121
12.3k
    pub fn as_mut(&mut self) -> RegMut<INDEX> {
122
12.3k
        RegMut(self.0)
123
12.3k
    }
124
}
125
126
macro_rules! impl_keys {
127
    ( $($i:ident, $f:ident $(,$f_mut:ident)?)* ) => {
128
        $(
129
            #[doc = "Register index key for use with Reg and RegMut."]
130
            pub const $i: u8 = RegId::$i.to_u8();
131
        )*
132
        #[doc = "Get register reference by name."]
133
        pub trait GetReg {
134
        $(
135
            #[doc = "Get register reference for this key."]
136
            fn $f(&self) -> Reg<'_, $i>;
137
        )*
138
        }
139
        #[doc = "Get register mutable reference by name."]
140
        pub trait GetRegMut {
141
        $(
142
            $(
143
            #[doc = "Get mutable register reference for this key."]
144
            fn $f_mut(&mut self) -> RegMut<'_, $i>;
145
            )?
146
        )*
147
        }
148
        impl GetReg for [Word; VM_REGISTER_COUNT] {
149
        $(
150
34.8k
            fn $f(&self) -> Reg<'_, $i> {
151
34.8k
                Reg(&self[$i as usize])
152
34.8k
            }
_RNvXsA_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_6GetReg2fpB9_
Line
Count
Source
150
34.8k
            fn $f(&self) -> Reg<'_, $i> {
151
34.8k
                Reg(&self[$i as usize])
152
34.8k
            }
_RNvXsA_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_6GetReg2pcB9_
Line
Count
Source
150
10
            fn $f(&self) -> Reg<'_, $i> {
151
10
                Reg(&self[$i as usize])
152
10
            }
_RNvXsA_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_6GetReg2isB9_
Line
Count
Source
150
10
            fn $f(&self) -> Reg<'_, $i> {
151
10
                Reg(&self[$i as usize])
152
10
            }
Unexecuted instantiation: _RNvXsA_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_6GetReg4zeroB9_
Unexecuted instantiation: _RNvXsA_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_6GetReg3oneB9_
Unexecuted instantiation: _RNvXsA_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_6GetReg2ofB9_
Unexecuted instantiation: _RNvXsA_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_6GetReg3sspB9_
Unexecuted instantiation: _RNvXsA_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_6GetReg2spB9_
Unexecuted instantiation: _RNvXsA_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_6GetReg2hpB9_
Unexecuted instantiation: _RNvXsA_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_6GetReg3errB9_
Unexecuted instantiation: _RNvXsA_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_6GetReg4ggasB9_
Unexecuted instantiation: _RNvXsA_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_6GetReg4cgasB9_
Unexecuted instantiation: _RNvXsA_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_6GetReg3balB9_
Unexecuted instantiation: _RNvXsA_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_6GetReg3retB9_
Unexecuted instantiation: _RNvXsA_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_6GetReg4retlB9_
Unexecuted instantiation: _RNvXsA_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_6GetReg4flagB9_
153
        )*
154
        }
155
        impl GetRegMut for [Word; VM_REGISTER_COUNT] {
156
        $(
157
            $(
158
21.2M
            fn $f_mut(&mut self) -> RegMut<'_, $i> {
159
21.2M
                RegMut(&mut self[$i as usize])
160
21.2M
            }
_RNvXsB_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_9GetRegMut6pc_mutB9_
Line
Count
Source
158
21.2M
            fn $f_mut(&mut self) -> RegMut<'_, $i> {
159
21.2M
                RegMut(&mut self[$i as usize])
160
21.2M
            }
_RNvXsB_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_9GetRegMut6fp_mutB9_
Line
Count
Source
158
11.3k
            fn $f_mut(&mut self) -> RegMut<'_, $i> {
159
11.3k
                RegMut(&mut self[$i as usize])
160
11.3k
            }
Unexecuted instantiation: _RNvXsB_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_9GetRegMut6of_mutB9_
Unexecuted instantiation: _RNvXsB_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_9GetRegMut7ssp_mutB9_
Unexecuted instantiation: _RNvXsB_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_9GetRegMut6sp_mutB9_
Unexecuted instantiation: _RNvXsB_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_9GetRegMut6hp_mutB9_
Unexecuted instantiation: _RNvXsB_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_9GetRegMut7err_mutB9_
Unexecuted instantiation: _RNvXsB_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_9GetRegMut8ggas_mutB9_
Unexecuted instantiation: _RNvXsB_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_9GetRegMut8cgas_mutB9_
Unexecuted instantiation: _RNvXsB_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_9GetRegMut7bal_mutB9_
Unexecuted instantiation: _RNvXsB_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_9GetRegMut6is_mutB9_
Unexecuted instantiation: _RNvXsB_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_9GetRegMut7ret_mutB9_
Unexecuted instantiation: _RNvXsB_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_9GetRegMut8retl_mutB9_
Unexecuted instantiation: _RNvXsB_NtNtCsg6P9hFxt0iW_7fuel_vm11constraints7reg_keyAyj40_NtB5_9GetRegMut8flag_mutB9_
161
            )?
162
        )*
163
        }
164
    };
165
}
166
167
impl_keys! {
168
    ZERO, zero
169
    ONE, one
170
    OF, of, of_mut
171
    PC, pc, pc_mut
172
    SSP, ssp, ssp_mut
173
    SP, sp, sp_mut
174
    FP, fp, fp_mut
175
    HP, hp, hp_mut
176
    ERR, err, err_mut
177
    GGAS, ggas, ggas_mut
178
    CGAS, cgas, cgas_mut
179
    BAL, bal, bal_mut
180
    IS, is, is_mut
181
    RET, ret, ret_mut
182
    RETL, retl, retl_mut
183
    FLAG, flag, flag_mut
184
}
185
186
/// The set of system registers split into
187
/// individual mutable references.
188
pub(crate) struct SystemRegisters<'a> {
189
    pub(crate) zero: RegMut<'a, ZERO>,
190
    pub(crate) one: RegMut<'a, ONE>,
191
    pub(crate) of: RegMut<'a, OF>,
192
    pub(crate) pc: RegMut<'a, PC>,
193
    pub(crate) ssp: RegMut<'a, SSP>,
194
    pub(crate) sp: RegMut<'a, SP>,
195
    pub(crate) fp: RegMut<'a, FP>,
196
    pub(crate) hp: RegMut<'a, HP>,
197
    pub(crate) err: RegMut<'a, ERR>,
198
    pub(crate) ggas: RegMut<'a, GGAS>,
199
    pub(crate) cgas: RegMut<'a, CGAS>,
200
    pub(crate) bal: RegMut<'a, BAL>,
201
    pub(crate) is: RegMut<'a, IS>,
202
    pub(crate) ret: RegMut<'a, RET>,
203
    pub(crate) retl: RegMut<'a, RETL>,
204
    pub(crate) flag: RegMut<'a, FLAG>,
205
}
206
207
/// Same as `SystemRegisters` but with immutable references.
208
pub(crate) struct SystemRegistersRef<'a> {
209
    pub(crate) zero: Reg<'a, ZERO>,
210
    pub(crate) one: Reg<'a, ONE>,
211
    pub(crate) of: Reg<'a, OF>,
212
    pub(crate) pc: Reg<'a, PC>,
213
    pub(crate) ssp: Reg<'a, SSP>,
214
    pub(crate) sp: Reg<'a, SP>,
215
    pub(crate) fp: Reg<'a, FP>,
216
    pub(crate) hp: Reg<'a, HP>,
217
    pub(crate) err: Reg<'a, ERR>,
218
    pub(crate) ggas: Reg<'a, GGAS>,
219
    pub(crate) cgas: Reg<'a, CGAS>,
220
    pub(crate) bal: Reg<'a, BAL>,
221
    pub(crate) is: Reg<'a, IS>,
222
    pub(crate) ret: Reg<'a, RET>,
223
    pub(crate) retl: Reg<'a, RETL>,
224
    pub(crate) flag: Reg<'a, FLAG>,
225
}
226
227
/// The set of program registers split from the system registers.
228
pub(crate) struct ProgramRegisters<'a>(pub &'a mut [Word; VM_REGISTER_PROGRAM_COUNT]);
229
230
/// Same as `ProgramRegisters` but with immutable references.
231
pub(crate) struct ProgramRegistersRef<'a>(pub &'a [Word; VM_REGISTER_PROGRAM_COUNT]);
232
233
/// Split the registers into system and program registers.
234
///
235
/// This allows multiple mutable references to registers.
236
754M
pub(crate) fn split_registers(
237
754M
    registers: &mut [Word; VM_REGISTER_COUNT],
238
754M
) -> (SystemRegisters<'_>, ProgramRegisters<'_>) {
239
754M
    let [zero, one, of, pc, ssp, sp, fp, hp, err, ggas, cgas, bal, is, ret, retl, flag, rest @ ..] =
240
754M
        registers;
241
754M
    let r = SystemRegisters {
242
754M
        zero: RegMut(zero),
243
754M
        one: RegMut(one),
244
754M
        of: RegMut(of),
245
754M
        pc: RegMut(pc),
246
754M
        ssp: RegMut(ssp),
247
754M
        sp: RegMut(sp),
248
754M
        fp: RegMut(fp),
249
754M
        hp: RegMut(hp),
250
754M
        err: RegMut(err),
251
754M
        ggas: RegMut(ggas),
252
754M
        cgas: RegMut(cgas),
253
754M
        bal: RegMut(bal),
254
754M
        is: RegMut(is),
255
754M
        ret: RegMut(ret),
256
754M
        retl: RegMut(retl),
257
754M
        flag: RegMut(flag),
258
754M
    };
259
754M
    (r, ProgramRegisters(rest))
260
754M
}
261
262
/// Copy the system and program registers into a single array.
263
12.3k
pub(crate) fn copy_registers(
264
12.3k
    system_registers: &SystemRegistersRef<'_>,
265
12.3k
    program_registers: &ProgramRegistersRef<'_>,
266
12.3k
) -> [Word; VM_REGISTER_COUNT] {
267
12.3k
    let mut out = [0u64; VM_REGISTER_COUNT];
268
12.3k
    out[..VM_REGISTER_SYSTEM_COUNT]
269
12.3k
        .copy_from_slice(&<[Word; VM_REGISTER_SYSTEM_COUNT]>::from(system_registers));
270
12.3k
    out[VM_REGISTER_SYSTEM_COUNT..].copy_from_slice(program_registers.0);
271
12.3k
    out
272
12.3k
}
273
274
impl<'r> ProgramRegisters<'r> {
275
    /// Get two mutable references to program registers.
276
    /// Note they cannot be the same register.
277
2.04k
    pub fn get_mut_two(
278
2.04k
        &mut self,
279
2.04k
        a: WriteRegKey,
280
2.04k
        b: WriteRegKey,
281
2.04k
    ) -> Option<(&mut Word, &mut Word)> {
282
2.04k
        if a == b {
283
            // Cannot mutably borrow the same register twice.
284
2
            return None
285
2.04k
        }
286
2.04k
287
2.04k
        // Order registers
288
2.04k
        let swap = a > b;
289
2.04k
        let (a, b) = if swap { (b, a) } else { (a, b) };
290
291
        // Translate the absolute register indices to a program register indeces.
292
2.04k
        let a = a.translate();
293
2.04k
294
2.04k
        // Subtract a + 1 because because we split the array at `a`.
295
2.04k
        let b = b
296
2.04k
            .translate()
297
2.04k
            .checked_sub(a.saturating_add(1))
298
2.04k
            .expect("Cannot underflow as the values are ordered");
299
300
        // Split the array at the first register which is a.
301
2.04k
        let [i, rest @ ..] = &mut self.0[a..] else {
302
0
            return None
303
        };
304
305
        // Translate the higher absolute register index to a program register index.
306
        // Get the `b` register.
307
2.04k
        let j = &mut rest[b];
308
2.04k
309
2.04k
        Some(if swap { (j, i) } else { (i, j) })
310
2.04k
    }
311
}
312
313
impl<'a> From<&'a SystemRegisters<'_>> for SystemRegistersRef<'a> {
314
0
    fn from(value: &'a SystemRegisters<'_>) -> Self {
315
0
        Self {
316
0
            zero: Reg(value.zero.0),
317
0
            one: Reg(value.one.0),
318
0
            of: Reg(value.of.0),
319
0
            pc: Reg(value.pc.0),
320
0
            ssp: Reg(value.ssp.0),
321
0
            sp: Reg(value.sp.0),
322
0
            fp: Reg(value.fp.0),
323
0
            hp: Reg(value.hp.0),
324
0
            err: Reg(value.err.0),
325
0
            ggas: Reg(value.ggas.0),
326
0
            cgas: Reg(value.cgas.0),
327
0
            bal: Reg(value.bal.0),
328
0
            is: Reg(value.is.0),
329
0
            ret: Reg(value.ret.0),
330
0
            retl: Reg(value.retl.0),
331
0
            flag: Reg(value.flag.0),
332
0
        }
333
0
    }
334
}
335
336
impl<'a> From<SystemRegisters<'a>> for SystemRegistersRef<'a> {
337
0
    fn from(value: SystemRegisters<'a>) -> Self {
338
0
        Self {
339
0
            zero: Reg(value.zero.0),
340
0
            one: Reg(value.one.0),
341
0
            of: Reg(value.of.0),
342
0
            pc: Reg(value.pc.0),
343
0
            ssp: Reg(value.ssp.0),
344
0
            sp: Reg(value.sp.0),
345
0
            fp: Reg(value.fp.0),
346
0
            hp: Reg(value.hp.0),
347
0
            err: Reg(value.err.0),
348
0
            ggas: Reg(value.ggas.0),
349
0
            cgas: Reg(value.cgas.0),
350
0
            bal: Reg(value.bal.0),
351
0
            is: Reg(value.is.0),
352
0
            ret: Reg(value.ret.0),
353
0
            retl: Reg(value.retl.0),
354
0
            flag: Reg(value.flag.0),
355
0
        }
356
0
    }
357
}
358
359
impl<'a> From<&'a ProgramRegisters<'_>> for ProgramRegistersRef<'a> {
360
0
    fn from(value: &'a ProgramRegisters<'_>) -> Self {
361
0
        Self(value.0)
362
0
    }
363
}
364
365
impl<'a> From<ProgramRegisters<'a>> for ProgramRegistersRef<'a> {
366
12.3k
    fn from(value: ProgramRegisters<'a>) -> Self {
367
12.3k
        Self(value.0)
368
12.3k
    }
369
}
370
371
impl TryFrom<RegisterId> for WriteRegKey {
372
    type Error = PanicReason;
373
374
237M
    fn try_from(r: RegisterId) -> Result<Self, Self::Error> {
375
237M
        Self::new(r)
376
237M
    }
377
}
378
379
impl core::ops::Index<WriteRegKey> for ProgramRegisters<'_> {
380
    type Output = Word;
381
382
0
    fn index(&self, index: WriteRegKey) -> &Self::Output {
383
0
        &self.0[index.translate()]
384
0
    }
385
}
386
387
impl core::ops::IndexMut<WriteRegKey> for ProgramRegisters<'_> {
388
237M
    fn index_mut(&mut self, index: WriteRegKey) -> &mut Self::Output {
389
237M
        &mut self.0[index.translate()]
390
237M
    }
391
}
392
393
impl<'a> From<&SystemRegistersRef<'a>> for [Word; VM_REGISTER_SYSTEM_COUNT] {
394
12.3k
    fn from(value: &SystemRegistersRef<'a>) -> Self {
395
12.3k
        let SystemRegistersRef {
396
12.3k
            zero,
397
12.3k
            one,
398
12.3k
            of,
399
12.3k
            pc,
400
12.3k
            ssp,
401
12.3k
            sp,
402
12.3k
            fp,
403
12.3k
            hp,
404
12.3k
            err,
405
12.3k
            ggas,
406
12.3k
            cgas,
407
12.3k
            bal,
408
12.3k
            is,
409
12.3k
            ret,
410
12.3k
            retl,
411
12.3k
            flag,
412
12.3k
        } = value;
413
12.3k
        [
414
12.3k
            *zero.0, *one.0, *of.0, *pc.0, *ssp.0, *sp.0, *fp.0, *hp.0, *err.0, *ggas.0,
415
12.3k
            *cgas.0, *bal.0, *is.0, *ret.0, *retl.0, *flag.0,
416
12.3k
        ]
417
12.3k
    }
418
}
419
420
#[derive(Debug, Clone, Copy)]
421
pub(crate) enum ProgramRegistersSegment {
422
    /// Registers 16..40
423
    Low,
424
    /// Registers 40..64
425
    High,
426
}
427
428
impl<'r> ProgramRegisters<'r> {
429
    /// Returns the registers corresponding to the segment, always 24 elements.
430
4.46M
    pub(crate) fn segment(&self, segment: ProgramRegistersSegment) -> &[Word] {
431
4.46M
        match segment {
432
805k
            ProgramRegistersSegment::Low => &self.0[..24],
433
3.66M
            ProgramRegistersSegment::High => &self.0[24..],
434
        }
435
4.46M
    }
436
437
    /// Returns the registers corresponding to the segment, always 24 elements.
438
436k
    pub(crate) fn segment_mut(
439
436k
        &mut self,
440
436k
        segment: ProgramRegistersSegment,
441
436k
    ) -> &mut [Word] {
442
436k
        match segment {
443
276k
            ProgramRegistersSegment::Low => &mut self.0[..24],
444
159k
            ProgramRegistersSegment::High => &mut self.0[24..],
445
        }
446
436k
    }
447
}
/home/marten/fuel/fuel-vm/fuel-vm/src/util.rs
Line
Count
Source
1
//! FuelVM utilities
2
3
/// A utility macro for writing scripts with the data offset included. Since the
4
/// script data offset depends on the length of the script, this macro will
5
/// evaluate the length and then rewrite the resultant script output with the
6
/// correct offset (using the offset parameter).
7
///
8
/// # Example
9
///
10
/// ```
11
/// use fuel_asm::{op, RegId};
12
/// use fuel_types::{Immediate18, Word, canonical::Serialize};
13
/// use fuel_vm::prelude::{Call, TxParameters, ContractId, Opcode};
14
/// use fuel_vm::script_with_data_offset;
15
/// use itertools::Itertools;
16
///
17
/// // Example of making a contract call script using script_data for the call info and asset id.
18
/// let contract_id = ContractId::from([0x11; 32]);
19
/// let call = Call::new(contract_id, 0, 0).to_bytes();
20
/// let asset_id = [0x00; 32];
21
/// let transfer_amount: Word = 100;
22
/// let gas_to_forward = 100_000;
23
/// let script_data = [call.as_ref(), asset_id.as_ref()]
24
///     .into_iter()
25
///     .flatten()
26
///     .copied()
27
///     .collect_vec();
28
///
29
/// // Use the macro since we don't know the exact offset for script_data.
30
/// let (script, data_offset) = script_with_data_offset!(
31
///     data_offset,
32
///     vec![
33
///         // use data_offset to reference the location of the call bytes inside script_data
34
///         op::movi(0x10, data_offset),
35
///         op::movi(0x11, transfer_amount as Immediate18),
36
///         // use data_offset again to reference the location of the asset id inside of script data
37
///         op::movi(0x12, data_offset + call.len() as Immediate18),
38
///         op::movi(0x13, gas_to_forward as Immediate18),
39
///         op::call(0x10, 0x11, 0x12, 0x13),
40
///         op::ret(RegId::ONE),
41
///     ],
42
///     TxParameters::DEFAULT.tx_offset()
43
/// );
44
/// ```
45
#[cfg(feature = "alloc")]
46
#[macro_export]
47
macro_rules! script_with_data_offset {
48
    ($offset:ident, $script:expr, $tx_offset:expr) => {{
49
        let $offset = {
50
            // first set offset to 0 before evaluating script expression
51
            let $offset = {
52
                use $crate::prelude::Immediate18;
53
                0 as Immediate18
54
            };
55
            // evaluate script expression with zeroed data offset to get the script length
56
            let script_bytes: $crate::alloc::vec::Vec<u8> =
57
                ::core::iter::IntoIterator::into_iter({ $script }).collect();
58
            // compute the script data offset within the VM memory given the script length
59
            {
60
                use $crate::{
61
                    fuel_tx::{
62
                        field::Script as ScriptField,
63
                        Script,
64
                    },
65
                    fuel_types::bytes::padded_len,
66
                    prelude::Immediate18,
67
                };
68
                let value: Immediate18 = $tx_offset
69
                    .saturating_add(Script::script_offset_static())
70
                    .saturating_add(
71
                        padded_len(script_bytes.as_slice()).unwrap_or(usize::MAX),
72
                    )
73
                    .try_into()
74
                    .expect("script data offset is too large");
75
                value
76
            }
77
        };
78
        // re-evaluate and return the finalized script with the correct data offset length
79
        // set.
80
        ($script, $offset)
81
    }};
82
}
83
84
#[allow(missing_docs)]
85
#[cfg(feature = "random")]
86
#[cfg(any(test, feature = "test-helpers"))]
87
/// Testing utilities
88
pub mod test_helpers {
89
    use alloc::{
90
        vec,
91
        vec::Vec,
92
    };
93
94
    use crate::{
95
        checked_transaction::{
96
            builder::TransactionBuilderExt,
97
            Checked,
98
            IntoChecked,
99
        },
100
        interpreter::Memory,
101
        memory_client::MemoryClient,
102
        state::StateTransition,
103
        storage::{
104
            ContractsAssetsStorage,
105
            MemoryStorage,
106
        },
107
        transactor::Transactor,
108
    };
109
    use anyhow::anyhow;
110
111
    use crate::{
112
        interpreter::{
113
            CheckedMetadata,
114
            ExecutableTransaction,
115
            InterpreterParams,
116
            MemoryInstance,
117
        },
118
        prelude::{
119
            Backtrace,
120
            Call,
121
        },
122
    };
123
    use fuel_asm::{
124
        op,
125
        GTFArgs,
126
        Instruction,
127
        PanicReason,
128
        RegId,
129
    };
130
    use fuel_tx::{
131
        field::{
132
            Outputs,
133
            ReceiptsRoot,
134
        },
135
        BlobBody,
136
        BlobIdExt,
137
        ConsensusParameters,
138
        Contract,
139
        ContractParameters,
140
        Create,
141
        FeeParameters,
142
        Finalizable,
143
        GasCosts,
144
        Input,
145
        Output,
146
        PredicateParameters,
147
        Receipt,
148
        Script,
149
        ScriptParameters,
150
        StorageSlot,
151
        Transaction,
152
        TransactionBuilder,
153
        TxParameters,
154
        Witness,
155
    };
156
    use fuel_types::{
157
        canonical::{
158
            Deserialize,
159
            Serialize,
160
        },
161
        Address,
162
        AssetId,
163
        BlobId,
164
        BlockHeight,
165
        ChainId,
166
        ContractId,
167
        Immediate12,
168
        Salt,
169
        Word,
170
    };
171
    use itertools::Itertools;
172
    use rand::{
173
        prelude::StdRng,
174
        Rng,
175
        SeedableRng,
176
    };
177
178
    pub struct CreatedContract {
179
        pub tx: Create,
180
        pub contract_id: ContractId,
181
        pub salt: Salt,
182
    }
183
184
    pub struct TestBuilder {
185
        pub rng: StdRng,
186
        gas_price: Word,
187
        max_fee_limit: Word,
188
        script_gas_limit: Word,
189
        builder: TransactionBuilder<Script>,
190
        storage: MemoryStorage,
191
        block_height: BlockHeight,
192
        consensus_params: ConsensusParameters,
193
    }
194
195
    impl TestBuilder {
196
2.19k
        pub fn new(seed: u64) -> Self {
197
2.19k
            let bytecode = core::iter::once(op::ret(RegId::ONE)).collect();
198
2.19k
            TestBuilder {
199
2.19k
                rng: StdRng::seed_from_u64(seed),
200
2.19k
                gas_price: 0,
201
2.19k
                max_fee_limit: 0,
202
2.19k
                script_gas_limit: 100,
203
2.19k
                builder: TransactionBuilder::script(bytecode, vec![]),
204
2.19k
                storage: MemoryStorage::default(),
205
2.19k
                block_height: Default::default(),
206
2.19k
                consensus_params: ConsensusParameters::standard(),
207
2.19k
            }
208
2.19k
        }
209
210
0
        pub fn get_block_height(&self) -> BlockHeight {
211
0
            self.block_height
212
0
        }
213
214
2.19k
        pub fn start_script_bytes(
215
2.19k
            &mut self,
216
2.19k
            script: Vec<u8>,
217
2.19k
            script_data: Vec<u8>,
218
2.19k
        ) -> &mut Self {
219
2.19k
            self.start_script_inner(script, script_data)
220
2.19k
        }
221
222
0
        pub fn start_script(
223
0
            &mut self,
224
0
            script: Vec<Instruction>,
225
0
            script_data: Vec<u8>,
226
0
        ) -> &mut Self {
227
0
            let script = script.into_iter().collect();
228
0
            self.start_script_inner(script, script_data)
229
0
        }
230
231
2.19k
        fn start_script_inner(
232
2.19k
            &mut self,
233
2.19k
            script: Vec<u8>,
234
2.19k
            script_data: Vec<u8>,
235
2.19k
        ) -> &mut Self {
236
2.19k
            self.builder = TransactionBuilder::script(script, script_data);
237
2.19k
            self.builder.script_gas_limit(self.script_gas_limit);
238
2.19k
            self
239
2.19k
        }
240
241
2.19k
        pub fn gas_price(&mut self, price: Word) -> &mut TestBuilder {
242
2.19k
            self.gas_price = price;
243
2.19k
            self
244
2.19k
        }
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm4util12test_helpersNtB2_11TestBuilder9gas_priceCs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
241
2.19k
        pub fn gas_price(&mut self, price: Word) -> &mut TestBuilder {
242
2.19k
            self.gas_price = price;
243
2.19k
            self
244
2.19k
        }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm4util12test_helpersNtB2_11TestBuilder9gas_priceB6_
245
246
0
        pub fn max_fee_limit(&mut self, max_fee_limit: Word) -> &mut TestBuilder {
247
0
            self.max_fee_limit = max_fee_limit;
248
0
            self
249
0
        }
250
251
2.19k
        pub fn script_gas_limit(&mut self, limit: Word) -> &mut TestBuilder {
252
2.19k
            self.builder.script_gas_limit(limit);
253
2.19k
            self.script_gas_limit = limit;
254
2.19k
            self
255
2.19k
        }
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm4util12test_helpersNtB2_11TestBuilder16script_gas_limitCs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
251
2.19k
        pub fn script_gas_limit(&mut self, limit: Word) -> &mut TestBuilder {
252
2.19k
            self.builder.script_gas_limit(limit);
253
2.19k
            self.script_gas_limit = limit;
254
2.19k
            self
255
2.19k
        }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm4util12test_helpersNtB2_11TestBuilder16script_gas_limitB6_
256
257
2.19k
        pub fn change_output(&mut self, asset_id: AssetId) -> &mut TestBuilder {
258
2.19k
            self.builder
259
2.19k
                .add_output(Output::change(self.rng.gen(), 0, asset_id));
260
2.19k
            self
261
2.19k
        }
262
263
0
        pub fn coin_output(
264
0
            &mut self,
265
0
            asset_id: AssetId,
266
0
            amount: Word,
267
0
        ) -> &mut TestBuilder {
268
0
            self.builder
269
0
                .add_output(Output::coin(self.rng.gen(), amount, asset_id));
270
0
            self
271
0
        }
272
273
0
        pub fn variable_output(&mut self, asset_id: AssetId) -> &mut TestBuilder {
274
0
            self.builder
275
0
                .add_output(Output::variable(Address::zeroed(), 0, asset_id));
276
0
            self
277
0
        }
278
279
2.19k
        pub fn contract_output(&mut self, id: &ContractId) -> &mut TestBuilder {
280
2.19k
            let input_idx = self
281
2.19k
                .builder
282
2.19k
                .inputs()
283
2.19k
                .iter()
284
4.38k
                .find_position(|input| matches!(input, Input::Contract(contract) if &contract.contract_id == id))
285
2.19k
                .expect("expected contract input with matching contract id");
286
2.19k
287
2.19k
            self.builder.add_output(Output::contract(
288
2.19k
                u16::try_from(input_idx.0).expect("The input index is more than allowed"),
289
2.19k
                self.rng.gen(),
290
2.19k
                self.rng.gen(),
291
2.19k
            ));
292
2.19k
293
2.19k
            self
294
2.19k
        }
295
296
2.19k
        pub fn coin_input(
297
2.19k
            &mut self,
298
2.19k
            asset_id: AssetId,
299
2.19k
            amount: Word,
300
2.19k
        ) -> &mut TestBuilder {
301
2.19k
            self.builder.add_unsigned_coin_input(
302
2.19k
                fuel_crypto::SecretKey::random(&mut self.rng),
303
2.19k
                self.rng.gen(),
304
2.19k
                amount,
305
2.19k
                asset_id,
306
2.19k
                Default::default(),
307
2.19k
            );
308
2.19k
            self
309
2.19k
        }
310
311
0
        pub fn fee_input(&mut self) -> &mut TestBuilder {
312
0
            self.builder.add_fee_input();
313
0
            self
314
0
        }
315
316
2.19k
        pub fn contract_input(&mut self, contract_id: ContractId) -> &mut TestBuilder {
317
2.19k
            self.builder.add_input(Input::contract(
318
2.19k
                self.rng.gen(),
319
2.19k
                self.rng.gen(),
320
2.19k
                self.rng.gen(),
321
2.19k
                self.rng.gen(),
322
2.19k
                contract_id,
323
2.19k
            ));
324
2.19k
            self
325
2.19k
        }
326
327
0
        pub fn witness(&mut self, witness: Witness) -> &mut TestBuilder {
328
0
            self.builder.add_witness(witness);
329
0
            self
330
0
        }
331
332
0
        pub fn storage(&mut self, storage: MemoryStorage) -> &mut TestBuilder {
333
0
            self.storage = storage;
334
0
            self
335
0
        }
336
337
0
        pub fn block_height(&mut self, block_height: BlockHeight) -> &mut TestBuilder {
338
0
            self.block_height = block_height;
339
0
            self
340
0
        }
341
342
0
        pub fn with_fee_params(&mut self, fee_params: FeeParameters) -> &mut TestBuilder {
343
0
            self.consensus_params.set_fee_params(fee_params);
344
0
            self
345
0
        }
346
347
0
        pub fn with_free_gas_costs(&mut self) -> &mut TestBuilder {
348
0
            let gas_costs = GasCosts::free();
349
0
            self.consensus_params.set_gas_costs(gas_costs);
350
0
            self
351
0
        }
352
353
0
        pub fn base_asset_id(&mut self, base_asset_id: AssetId) -> &mut TestBuilder {
354
0
            self.consensus_params.set_base_asset_id(base_asset_id);
355
0
            self
356
0
        }
357
358
2.19k
        pub fn build(&mut self) -> Checked<Script> {
359
2.19k
            self.builder.max_fee_limit(self.max_fee_limit);
360
2.19k
            self.builder.with_tx_params(*self.get_tx_params());
361
2.19k
            self.builder
362
2.19k
                .with_contract_params(*self.get_contract_params());
363
2.19k
            self.builder
364
2.19k
                .with_predicate_params(*self.get_predicate_params());
365
2.19k
            self.builder.with_script_params(*self.get_script_params());
366
2.19k
            self.builder.with_fee_params(*self.get_fee_params());
367
2.19k
            self.builder.with_base_asset_id(*self.get_base_asset_id());
368
2.19k
            self.builder
369
2.19k
                .finalize_checked_with_storage(self.block_height, &self.storage)
370
2.19k
        }
371
372
10.9k
        pub fn get_tx_params(&self) -> &TxParameters {
373
10.9k
            self.consensus_params.tx_params()
374
10.9k
        }
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm4util12test_helpersNtB2_11TestBuilder13get_tx_paramsCs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
372
4.38k
        pub fn get_tx_params(&self) -> &TxParameters {
373
4.38k
            self.consensus_params.tx_params()
374
4.38k
        }
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm4util12test_helpersNtB2_11TestBuilder13get_tx_paramsB6_
Line
Count
Source
372
6.57k
        pub fn get_tx_params(&self) -> &TxParameters {
373
6.57k
            self.consensus_params.tx_params()
374
6.57k
        }
375
376
2.19k
        pub fn get_predicate_params(&self) -> &PredicateParameters {
377
2.19k
            self.consensus_params.predicate_params()
378
2.19k
        }
379
380
2.19k
        pub fn get_script_params(&self) -> &ScriptParameters {
381
2.19k
            self.consensus_params.script_params()
382
2.19k
        }
383
384
2.19k
        pub fn get_contract_params(&self) -> &ContractParameters {
385
2.19k
            self.consensus_params.contract_params()
386
2.19k
        }
387
388
2.19k
        pub fn get_fee_params(&self) -> &FeeParameters {
389
2.19k
            self.consensus_params.fee_params()
390
2.19k
        }
391
392
2.19k
        pub fn get_base_asset_id(&self) -> &AssetId {
393
2.19k
            self.consensus_params.base_asset_id()
394
2.19k
        }
395
396
0
        pub fn get_block_gas_limit(&self) -> u64 {
397
0
            self.consensus_params.block_gas_limit()
398
0
        }
399
400
0
        pub fn get_block_transaction_size_limit(&self) -> u64 {
401
0
            self.consensus_params.block_transaction_size_limit()
402
0
        }
403
404
0
        pub fn get_privileged_address(&self) -> &Address {
405
0
            self.consensus_params.privileged_address()
406
0
        }
407
408
0
        pub fn get_chain_id(&self) -> ChainId {
409
0
            self.consensus_params.chain_id()
410
0
        }
411
412
0
        pub fn get_gas_costs(&self) -> &GasCosts {
413
0
            self.consensus_params.gas_costs()
414
0
        }
415
416
0
        pub fn build_get_balance_tx(
417
0
            contract_id: &ContractId,
418
0
            asset_id: &AssetId,
419
0
            tx_offset: usize,
420
0
        ) -> Checked<Script> {
421
0
            let (script, _) = script_with_data_offset!(
422
0
                data_offset,
423
0
                vec![
424
0
                    op::movi(0x11, data_offset),
425
0
                    op::addi(
426
0
                        0x12,
427
0
                        0x11,
428
0
                        Immediate12::try_from(AssetId::LEN)
429
0
                            .expect("`AssetId::LEN` is 32 bytes")
430
0
                    ),
431
0
                    op::bal(0x10, 0x11, 0x12),
432
0
                    op::log(0x10, RegId::ZERO, RegId::ZERO, RegId::ZERO),
433
0
                    op::ret(RegId::ONE),
434
0
                ],
435
0
                tx_offset
436
0
            );
437
0
438
0
            let script_data: Vec<u8> = [asset_id.as_ref(), contract_id.as_ref()]
439
0
                .into_iter()
440
0
                .flatten()
441
0
                .copied()
442
0
                .collect();
443
0
444
0
            TestBuilder::new(2322u64)
445
0
                .start_script(script, script_data)
446
0
                .gas_price(0)
447
0
                .script_gas_limit(1_000_000)
448
0
                .contract_input(*contract_id)
449
0
                .fee_input()
450
0
                .contract_output(contract_id)
451
0
                .build()
452
0
        }
453
454
2.19k
        pub fn setup_contract_bytes(
455
2.19k
            &mut self,
456
2.19k
            contract: Vec<u8>,
457
2.19k
            initial_balance: Option<(AssetId, Word)>,
458
2.19k
            initial_state: Option<Vec<StorageSlot>>,
459
2.19k
        ) -> CreatedContract {
460
2.19k
            self.setup_contract_inner(contract, initial_balance, initial_state)
461
2.19k
        }
462
463
0
        pub fn setup_contract(
464
0
            &mut self,
465
0
            contract: Vec<Instruction>,
466
0
            initial_balance: Option<(AssetId, Word)>,
467
0
            initial_state: Option<Vec<StorageSlot>>,
468
0
        ) -> CreatedContract {
469
0
            let contract = contract.into_iter().collect();
470
0
471
0
            self.setup_contract_inner(contract, initial_balance, initial_state)
472
0
        }
473
474
2.19k
        fn setup_contract_inner(
475
2.19k
            &mut self,
476
2.19k
            contract: Vec<u8>,
477
2.19k
            initial_balance: Option<(AssetId, Word)>,
478
2.19k
            initial_state: Option<Vec<StorageSlot>>,
479
2.19k
        ) -> CreatedContract {
480
2.19k
            let storage_slots = initial_state.unwrap_or_default();
481
2.19k
482
2.19k
            let salt: Salt = self.rng.gen();
483
2.19k
            let program: Witness = contract.into();
484
2.19k
            let storage_root = Contract::initial_state_root(storage_slots.iter());
485
2.19k
            let contract = Contract::from(program.as_ref());
486
2.19k
            let contract_root = contract.root();
487
2.19k
            let contract_id = contract.id(&salt, &contract_root, &storage_root);
488
2.19k
489
2.19k
            let tx = TransactionBuilder::create(program, salt, storage_slots)
490
2.19k
                .max_fee_limit(self.max_fee_limit)
491
2.19k
                .maturity(Default::default())
492
2.19k
                .add_fee_input()
493
2.19k
                .add_contract_created()
494
2.19k
                .finalize()
495
2.19k
                .into_checked(self.block_height, &self.consensus_params)
496
2.19k
                .expect("failed to check tx");
497
2.19k
498
2.19k
            // setup a contract in current test state
499
2.19k
            let state = self
500
2.19k
                .deploy(tx)
501
2.19k
                .expect("Expected vm execution to be successful");
502
503
            // set initial contract balance
504
2.19k
            if let Some((asset_id, amount)) = initial_balance {
505
0
                self.storage
506
0
                    .contract_asset_id_balance_insert(&contract_id, &asset_id, amount)
507
0
                    .unwrap();
508
2.19k
            }
509
510
2.19k
            CreatedContract {
511
2.19k
                tx: state.tx().clone(),
512
2.19k
                contract_id,
513
2.19k
                salt,
514
2.19k
            }
515
2.19k
        }
516
517
0
        pub fn setup_blob(&mut self, data: Vec<u8>) {
518
0
            let id = BlobId::compute(data.as_slice());
519
0
520
0
            let tx = TransactionBuilder::blob(BlobBody {
521
0
                id,
522
0
                witness_index: 0,
523
0
            })
524
0
            .add_witness(data.into())
525
0
            .max_fee_limit(self.max_fee_limit)
526
0
            .maturity(Default::default())
527
0
            .add_fee_input()
528
0
            .finalize()
529
0
            .into_checked(self.block_height, &self.consensus_params)
530
0
            .expect("failed to check tx");
531
0
532
0
            let interpreter_params =
533
0
                InterpreterParams::new(self.gas_price, &self.consensus_params);
534
0
            let mut transactor = Transactor::<_, _, _>::new(
535
0
                MemoryInstance::new(),
536
0
                self.storage.clone(),
537
0
                interpreter_params,
538
0
            );
539
0
540
0
            self.execute_tx_inner(&mut transactor, tx)
541
0
                .expect("Expected vm execution to be successful");
542
0
        }
543
544
4.38k
        fn execute_tx_inner<M, Tx, Ecal>(
545
4.38k
            &mut self,
546
4.38k
            transactor: &mut Transactor<M, MemoryStorage, Tx, Ecal>,
547
4.38k
            checked: Checked<Tx>,
548
4.38k
        ) -> anyhow::Result<StateTransition<Tx>>
549
4.38k
        where
550
4.38k
            M: Memory,
551
4.38k
            Tx: ExecutableTransaction,
552
4.38k
            <Tx as IntoChecked>::Metadata: CheckedMetadata,
553
4.38k
            Ecal: crate::interpreter::EcalHandler,
554
4.38k
        {
555
4.38k
            self.storage.set_block_height(self.block_height);
556
4.38k
557
4.38k
            transactor.transact(checked);
558
4.38k
559
4.38k
            let storage = transactor.as_mut().clone();
560
561
4.38k
            if let Some(e) = transactor.error() {
562
0
                return Err(anyhow!("{:?}", e));
563
4.38k
            }
564
4.38k
            let is_reverted = transactor.is_reverted();
565
4.38k
566
4.38k
            let state = transactor.to_owned_state_transition().unwrap();
567
4.38k
568
4.38k
            let interpreter = transactor.interpreter();
569
4.38k
570
4.38k
            // verify serialized tx == referenced tx
571
4.38k
            let transaction: Transaction = interpreter.transaction().clone().into();
572
4.38k
            let tx_offset = self.get_tx_params().tx_offset();
573
4.38k
            let mut tx_mem = interpreter
574
4.38k
                .memory()
575
4.38k
                .read(tx_offset, transaction.size())
576
4.38k
                .unwrap();
577
4.38k
            let mut deser_tx = Transaction::decode(&mut tx_mem).unwrap();
578
579
            // Patch the tx with correct receipts root
580
4.38k
            if let Transaction::Script(ref mut s) = deser_tx {
581
2.19k
                *s.receipts_root_mut() = interpreter.compute_receipts_root();
582
2.19k
            }
583
584
4.38k
            assert_eq!(deser_tx, transaction);
585
4.38k
            if is_reverted {
586
2.16k
                return Ok(state);
587
2.22k
            }
588
2.22k
589
2.22k
            // save storage between client instances
590
2.22k
            self.storage = storage;
591
2.22k
592
2.22k
            Ok(state)
593
4.38k
        }
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm4util12test_helpersNtB3_11TestBuilder16execute_tx_innerNtNtNtB7_11interpreter6memory14MemoryInstanceINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2a_4blob8BlobBodyNtB3G_12BlobMetadataENtB1q_16NotSupportedEcalEB7_
_RINvMNtNtCsg6P9hFxt0iW_7fuel_vm4util12test_helpersNtB3_11TestBuilder16execute_tx_innerNtNtNtB7_11interpreter6memory14MemoryInstanceINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2a_6create10CreateBodyNtB3G_14CreateMetadataENtB1q_16NotSupportedEcalEB7_
Line
Count
Source
544
2.19k
        fn execute_tx_inner<M, Tx, Ecal>(
545
2.19k
            &mut self,
546
2.19k
            transactor: &mut Transactor<M, MemoryStorage, Tx, Ecal>,
547
2.19k
            checked: Checked<Tx>,
548
2.19k
        ) -> anyhow::Result<StateTransition<Tx>>
549
2.19k
        where
550
2.19k
            M: Memory,
551
2.19k
            Tx: ExecutableTransaction,
552
2.19k
            <Tx as IntoChecked>::Metadata: CheckedMetadata,
553
2.19k
            Ecal: crate::interpreter::EcalHandler,
554
2.19k
        {
555
2.19k
            self.storage.set_block_height(self.block_height);
556
2.19k
557
2.19k
            transactor.transact(checked);
558
2.19k
559
2.19k
            let storage = transactor.as_mut().clone();
560
561
2.19k
            if let Some(e) = transactor.error() {
562
0
                return Err(anyhow!("{:?}", e));
563
2.19k
            }
564
2.19k
            let is_reverted = transactor.is_reverted();
565
2.19k
566
2.19k
            let state = transactor.to_owned_state_transition().unwrap();
567
2.19k
568
2.19k
            let interpreter = transactor.interpreter();
569
2.19k
570
2.19k
            // verify serialized tx == referenced tx
571
2.19k
            let transaction: Transaction = interpreter.transaction().clone().into();
572
2.19k
            let tx_offset = self.get_tx_params().tx_offset();
573
2.19k
            let mut tx_mem = interpreter
574
2.19k
                .memory()
575
2.19k
                .read(tx_offset, transaction.size())
576
2.19k
                .unwrap();
577
2.19k
            let mut deser_tx = Transaction::decode(&mut tx_mem).unwrap();
578
579
            // Patch the tx with correct receipts root
580
2.19k
            if let Transaction::Script(ref mut s) = deser_tx {
581
0
                *s.receipts_root_mut() = interpreter.compute_receipts_root();
582
2.19k
            }
583
584
2.19k
            assert_eq!(deser_tx, transaction);
585
2.19k
            if is_reverted {
586
0
                return Ok(state);
587
2.19k
            }
588
2.19k
589
2.19k
            // save storage between client instances
590
2.19k
            self.storage = storage;
591
2.19k
592
2.19k
            Ok(state)
593
2.19k
        }
_RINvMNtNtCsg6P9hFxt0iW_7fuel_vm4util12test_helpersNtB3_11TestBuilder16execute_tx_innerNtNtNtB7_11interpreter6memory14MemoryInstanceINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2a_6script10ScriptBodyNtB3G_14ScriptMetadataENtB1q_16NotSupportedEcalEB7_
Line
Count
Source
544
2.19k
        fn execute_tx_inner<M, Tx, Ecal>(
545
2.19k
            &mut self,
546
2.19k
            transactor: &mut Transactor<M, MemoryStorage, Tx, Ecal>,
547
2.19k
            checked: Checked<Tx>,
548
2.19k
        ) -> anyhow::Result<StateTransition<Tx>>
549
2.19k
        where
550
2.19k
            M: Memory,
551
2.19k
            Tx: ExecutableTransaction,
552
2.19k
            <Tx as IntoChecked>::Metadata: CheckedMetadata,
553
2.19k
            Ecal: crate::interpreter::EcalHandler,
554
2.19k
        {
555
2.19k
            self.storage.set_block_height(self.block_height);
556
2.19k
557
2.19k
            transactor.transact(checked);
558
2.19k
559
2.19k
            let storage = transactor.as_mut().clone();
560
561
2.19k
            if let Some(e) = transactor.error() {
562
0
                return Err(anyhow!("{:?}", e));
563
2.19k
            }
564
2.19k
            let is_reverted = transactor.is_reverted();
565
2.19k
566
2.19k
            let state = transactor.to_owned_state_transition().unwrap();
567
2.19k
568
2.19k
            let interpreter = transactor.interpreter();
569
2.19k
570
2.19k
            // verify serialized tx == referenced tx
571
2.19k
            let transaction: Transaction = interpreter.transaction().clone().into();
572
2.19k
            let tx_offset = self.get_tx_params().tx_offset();
573
2.19k
            let mut tx_mem = interpreter
574
2.19k
                .memory()
575
2.19k
                .read(tx_offset, transaction.size())
576
2.19k
                .unwrap();
577
2.19k
            let mut deser_tx = Transaction::decode(&mut tx_mem).unwrap();
578
579
            // Patch the tx with correct receipts root
580
2.19k
            if let Transaction::Script(ref mut s) = deser_tx {
581
2.19k
                *s.receipts_root_mut() = interpreter.compute_receipts_root();
582
2.19k
            }
583
584
2.19k
            assert_eq!(deser_tx, transaction);
585
2.19k
            if is_reverted {
586
2.16k
                return Ok(state);
587
27
            }
588
27
589
27
            // save storage between client instances
590
27
            self.storage = storage;
591
27
592
27
            Ok(state)
593
2.19k
        }
594
595
2.19k
        pub fn deploy(
596
2.19k
            &mut self,
597
2.19k
            checked: Checked<Create>,
598
2.19k
        ) -> anyhow::Result<StateTransition<Create>> {
599
2.19k
            let interpreter_params =
600
2.19k
                InterpreterParams::new(self.gas_price, &self.consensus_params);
601
2.19k
            let mut transactor = Transactor::<_, _, _>::new(
602
2.19k
                MemoryInstance::new(),
603
2.19k
                self.storage.clone(),
604
2.19k
                interpreter_params,
605
2.19k
            );
606
2.19k
607
2.19k
            self.execute_tx_inner(&mut transactor, checked)
608
2.19k
        }
609
610
2.19k
        pub fn execute_tx(
611
2.19k
            &mut self,
612
2.19k
            checked: Checked<Script>,
613
2.19k
        ) -> anyhow::Result<StateTransition<Script>> {
614
2.19k
            let interpreter_params =
615
2.19k
                InterpreterParams::new(self.gas_price, &self.consensus_params);
616
2.19k
            let mut transactor = Transactor::<_, _, _>::new(
617
2.19k
                MemoryInstance::new(),
618
2.19k
                self.storage.clone(),
619
2.19k
                interpreter_params,
620
2.19k
            );
621
2.19k
622
2.19k
            self.execute_tx_inner(&mut transactor, checked)
623
2.19k
        }
624
625
0
        pub fn execute_tx_with_backtrace(
626
0
            &mut self,
627
0
            checked: Checked<Script>,
628
0
            gas_price: u64,
629
0
        ) -> anyhow::Result<(StateTransition<Script>, Option<Backtrace>)> {
630
0
            let interpreter_params =
631
0
                InterpreterParams::new(gas_price, &self.consensus_params);
632
0
            let mut transactor = Transactor::<_, _, _>::new(
633
0
                MemoryInstance::new(),
634
0
                self.storage.clone(),
635
0
                interpreter_params,
636
0
            );
637
638
0
            let state = self.execute_tx_inner(&mut transactor, checked)?;
639
0
            let backtrace = transactor.backtrace();
640
0
641
0
            Ok((state, backtrace))
642
0
        }
643
644
        /// Build test tx and execute it
645
2.19k
        pub fn execute(&mut self) -> StateTransition<Script> {
646
2.19k
            let tx = self.build();
647
2.19k
648
2.19k
            self.execute_tx(tx)
649
2.19k
                .expect("expected successful vm execution")
650
2.19k
        }
651
652
0
        pub fn get_storage(&self) -> &MemoryStorage {
653
0
            &self.storage
654
0
        }
655
656
0
        pub fn execute_get_outputs(&mut self) -> Vec<Output> {
657
0
            self.execute().tx().outputs().to_vec()
658
0
        }
659
660
0
        pub fn execute_get_change(&mut self, find_asset_id: AssetId) -> Word {
661
0
            let outputs = self.execute_get_outputs();
662
0
            find_change(outputs, find_asset_id)
663
0
        }
664
665
0
        pub fn get_contract_balance(
666
0
            &mut self,
667
0
            contract_id: &ContractId,
668
0
            asset_id: &AssetId,
669
0
        ) -> Word {
670
0
            let tx = TestBuilder::build_get_balance_tx(
671
0
                contract_id,
672
0
                asset_id,
673
0
                self.consensus_params.tx_params().tx_offset(),
674
0
            );
675
0
            let state = self
676
0
                .execute_tx(tx)
677
0
                .expect("expected successful vm execution in this context");
678
0
            let receipts = state.receipts();
679
0
            receipts[0].ra().expect("Balance expected")
680
0
        }
681
    }
682
683
0
    pub fn check_expected_reason_for_instructions(
684
0
        instructions: Vec<Instruction>,
685
0
        expected_reason: PanicReason,
686
0
    ) {
687
0
        let client = MemoryClient::default();
688
0
689
0
        check_expected_reason_for_instructions_with_client(
690
0
            client,
691
0
            instructions,
692
0
            expected_reason,
693
0
        );
694
0
    }
695
696
0
    pub fn check_expected_reason_for_instructions_with_client<M>(
697
0
        mut client: MemoryClient<M>,
698
0
        instructions: Vec<Instruction>,
699
0
        expected_reason: PanicReason,
700
0
    ) where
701
0
        M: Memory,
702
0
    {
703
0
        let tx_params = TxParameters::default().with_max_gas_per_tx(Word::MAX / 2);
704
0
        // The gas should be huge enough to cover the execution but still much less than
705
0
        // `MAX_GAS_PER_TX`.
706
0
        let gas_limit = tx_params.max_gas_per_tx() / 2;
707
0
        let maturity = Default::default();
708
0
        let height = Default::default();
709
0
        let zero_fee_limit = 0;
710
0
711
0
        // setup contract with state tests
712
0
        let contract: Witness = instructions.into_iter().collect::<Vec<u8>>().into();
713
0
        let salt = Default::default();
714
0
        let code_root = Contract::root_from_code(contract.as_ref());
715
0
        let storage_slots = vec![];
716
0
        let state_root = Contract::initial_state_root(storage_slots.iter());
717
0
        let contract_id =
718
0
            Contract::from(contract.as_ref()).id(&salt, &code_root, &state_root);
719
0
720
0
        let contract_deployer = TransactionBuilder::create(contract, salt, storage_slots)
721
0
            .max_fee_limit(zero_fee_limit)
722
0
            .with_tx_params(tx_params)
723
0
            .add_fee_input()
724
0
            .add_contract_created()
725
0
            .finalize_checked(height);
726
0
727
0
        client
728
0
            .deploy(contract_deployer)
729
0
            .expect("valid contract deployment");
730
0
731
0
        // call deployed contract
732
0
        let script = [
733
0
            // load call data to 0x10
734
0
            op::gtf(0x10, 0x0, Immediate12::from(GTFArgs::ScriptData)),
735
0
            // call the transfer contract
736
0
            op::call(0x10, RegId::ZERO, RegId::ZERO, RegId::CGAS),
737
0
            op::ret(RegId::ONE),
738
0
        ]
739
0
        .into_iter()
740
0
        .collect();
741
0
        let script_data: Vec<u8> = [Call::new(contract_id, 0, 0).to_bytes().as_slice()]
742
0
            .into_iter()
743
0
            .flatten()
744
0
            .copied()
745
0
            .collect();
746
0
747
0
        let tx_deploy_loader = TransactionBuilder::script(script, script_data)
748
0
            .max_fee_limit(zero_fee_limit)
749
0
            .script_gas_limit(gas_limit)
750
0
            .maturity(maturity)
751
0
            .with_tx_params(tx_params)
752
0
            .add_input(Input::contract(
753
0
                Default::default(),
754
0
                Default::default(),
755
0
                Default::default(),
756
0
                Default::default(),
757
0
                contract_id,
758
0
            ))
759
0
            .add_fee_input()
760
0
            .add_output(Output::contract(0, Default::default(), Default::default()))
761
0
            .finalize_checked(height);
762
0
763
0
        check_reason_for_transaction(client, tx_deploy_loader, expected_reason);
764
0
    }
765
766
0
    pub fn check_reason_for_transaction<M>(
767
0
        mut client: MemoryClient<M>,
768
0
        checked_tx: Checked<Script>,
769
0
        expected_reason: PanicReason,
770
0
    ) where
771
0
        M: Memory,
772
0
    {
773
0
        let receipts = client.transact(checked_tx);
774
0
775
0
        let panic_found = receipts.iter().any(|receipt| {
776
0
            if let Receipt::Panic { id: _, reason, .. } = receipt {
777
0
                assert_eq!(
778
0
                    &expected_reason,
779
0
                    reason.reason(),
780
0
                    "Expected {}, found {}",
781
0
                    expected_reason,
782
0
                    reason.reason()
783
                );
784
0
                true
785
            } else {
786
0
                false
787
            }
788
0
        });
789
0
790
0
        if !panic_found {
791
0
            panic!("Script should have panicked");
792
0
        }
793
0
    }
794
795
0
    pub fn find_change(outputs: Vec<Output>, find_asset_id: AssetId) -> Word {
796
0
        let change = outputs.into_iter().find_map(|output| {
797
            if let Output::Change {
798
0
                amount, asset_id, ..
799
0
            } = output
800
            {
801
0
                if asset_id == find_asset_id {
802
0
                    Some(amount)
803
                } else {
804
0
                    None
805
                }
806
            } else {
807
0
                None
808
            }
809
0
        });
810
0
        change.unwrap_or_else(|| {
811
0
            panic!("no change matching asset ID {:x} was found", &find_asset_id)
812
0
        })
813
0
    }
814
}
815
816
#[allow(missing_docs)]
817
#[cfg(all(
818
    feature = "profile-gas",
819
    feature = "std",
820
    any(test, feature = "test-helpers")
821
))]
822
/// Gas testing utilities
823
pub mod gas_profiling {
824
    use crate::prelude::*;
825
826
    use std::sync::{
827
        Arc,
828
        Mutex,
829
    };
830
831
    #[derive(Clone)]
832
    pub struct GasProfiler {
833
        data: Arc<Mutex<Option<ProfilingData>>>,
834
    }
835
836
    impl Default for GasProfiler {
837
        fn default() -> Self {
838
            Self {
839
                data: Arc::new(Mutex::new(None)),
840
            }
841
        }
842
    }
843
844
    impl ProfileReceiver for GasProfiler {
845
        fn on_transaction(
846
            &mut self,
847
            _state: Result<&ProgramState, InterpreterError<String>>,
848
            data: &ProfilingData,
849
        ) {
850
            let mut guard = self.data.lock().unwrap();
851
            *guard = Some(data.clone());
852
        }
853
    }
854
855
    impl GasProfiler {
856
        pub fn data(&self) -> Option<ProfilingData> {
857
            self.data.lock().ok().and_then(|g| g.as_ref().cloned())
858
        }
859
860
        pub fn total_gas(&self) -> Word {
861
            self.data()
862
                .map(|d| {
863
                    d.gas()
864
                        .iter()
865
                        .map(|(_, gas)| gas)
866
                        .copied()
867
                        .reduce(Word::saturating_add)
868
                        .unwrap_or_default()
869
                })
870
                .unwrap_or_default()
871
        }
872
    }
873
}
/home/marten/fuel/fuel-vm/fuel-vm/src/predicate.rs
Line
Count
Source
1
//! Predicate representations with required data to be executed during VM runtime
2
3
use fuel_tx::field;
4
5
use crate::interpreter::MemoryRange;
6
7
/// Runtime representation of a predicate
8
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
9
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10
pub struct RuntimePredicate {
11
    range: MemoryRange,
12
    idx: usize,
13
}
14
15
impl RuntimePredicate {
16
    /// Empty predicate for testing
17
    #[cfg(test)]
18
    pub const fn empty() -> Self {
19
        Self {
20
            range: MemoryRange::new(0, 0),
21
            idx: 0,
22
        }
23
    }
24
25
    /// Memory slice with the program representation of the predicate
26
0
    pub const fn program(&self) -> &MemoryRange {
27
0
        &self.range
28
0
    }
29
30
    /// Index of the transaction input that maps to this predicate
31
0
    pub const fn idx(&self) -> usize {
32
0
        self.idx
33
0
    }
34
35
    /// Create a new runtime predicate from a transaction, given the input index
36
    ///
37
    /// Return `None` if the tx input doesn't map to an input with a predicate
38
6.57k
    pub fn from_tx<T>(tx: &T, tx_offset: usize, idx: usize) -> Option<Self>
39
6.57k
    where
40
6.57k
        T: field::Inputs,
41
6.57k
    {
42
6.57k
        let (ofs, len) = tx.inputs_predicate_offset_at(idx)?;
43
0
        let addr = ofs.saturating_add(tx_offset);
44
0
        Some(Self {
45
0
            range: MemoryRange::new(addr, len),
46
0
            idx,
47
0
        })
48
6.57k
    }
Unexecuted instantiation: _RINvMNtCsg6P9hFxt0iW_7fuel_vm9predicateNtB3_16RuntimePredicate7from_txINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1b_4blob8BlobBodyNtB2H_12BlobMetadataEEB5_
_RINvMNtCsg6P9hFxt0iW_7fuel_vm9predicateNtB3_16RuntimePredicate7from_txINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1b_6create10CreateBodyNtB2H_14CreateMetadataEEB5_
Line
Count
Source
38
2.19k
    pub fn from_tx<T>(tx: &T, tx_offset: usize, idx: usize) -> Option<Self>
39
2.19k
    where
40
2.19k
        T: field::Inputs,
41
2.19k
    {
42
2.19k
        let (ofs, len) = tx.inputs_predicate_offset_at(idx)?;
43
0
        let addr = ofs.saturating_add(tx_offset);
44
0
        Some(Self {
45
0
            range: MemoryRange::new(addr, len),
46
0
            idx,
47
0
        })
48
2.19k
    }
_RINvMNtCsg6P9hFxt0iW_7fuel_vm9predicateNtB3_16RuntimePredicate7from_txINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1b_6script10ScriptBodyNtB2H_14ScriptMetadataEEB5_
Line
Count
Source
38
4.38k
    pub fn from_tx<T>(tx: &T, tx_offset: usize, idx: usize) -> Option<Self>
39
4.38k
    where
40
4.38k
        T: field::Inputs,
41
4.38k
    {
42
4.38k
        let (ofs, len) = tx.inputs_predicate_offset_at(idx)?;
43
0
        let addr = ofs.saturating_add(tx_offset);
44
0
        Some(Self {
45
0
            range: MemoryRange::new(addr, len),
46
0
            idx,
47
0
        })
48
4.38k
    }
Unexecuted instantiation: _RINvMNtCsg6P9hFxt0iW_7fuel_vm9predicateNtB3_16RuntimePredicate7from_txINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1b_6upload10UploadBodyNtB2H_14UploadMetadataEEB5_
Unexecuted instantiation: _RINvMNtCsg6P9hFxt0iW_7fuel_vm9predicateNtB3_16RuntimePredicate7from_txINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1b_7upgrade11UpgradeBodyNtB2H_15UpgradeMetadataEEB5_
49
}
50
51
#[allow(clippy::cast_possible_truncation)]
52
#[cfg(test)]
53
mod tests {
54
    use alloc::{
55
        vec,
56
        vec::Vec,
57
    };
58
    use core::iter;
59
    use fuel_asm::op;
60
    use fuel_tx::{
61
        field::ScriptGasLimit,
62
        TransactionBuilder,
63
    };
64
    use fuel_types::bytes;
65
    use rand::{
66
        rngs::StdRng,
67
        Rng,
68
        SeedableRng,
69
    };
70
71
    use crate::{
72
        checked_transaction::{
73
            CheckPredicateParams,
74
            EstimatePredicates,
75
        },
76
        constraints::reg_key::{
77
            HP,
78
            IS,
79
            ONE,
80
            SSP,
81
            ZERO,
82
        },
83
        error::PredicateVerificationFailed,
84
        interpreter::InterpreterParams,
85
        prelude::{
86
            predicates::check_predicates,
87
            *,
88
        },
89
        storage::{
90
            predicate::empty_predicate_storage,
91
            BlobData,
92
        },
93
    };
94
95
    #[test]
96
    fn from_tx_works() {
97
        let rng = &mut StdRng::seed_from_u64(2322u64);
98
99
        let height = 1.into();
100
101
        #[rustfmt::skip]
102
        let predicate: Vec<u8> = vec![
103
            op::addi(0x10, 0x00, 0x01),
104
            op::addi(0x10, 0x10, 0x01),
105
            op::ret(0x01),
106
        ].into_iter().collect();
107
108
        let predicate_data = b"If people do not believe that mathematics is simple, it is only because they do not realize how complicated life is.".to_vec();
109
110
        let owner = (*Contract::root_from_code(&predicate)).into();
111
        let a = Input::coin_predicate(
112
            rng.gen(),
113
            owner,
114
            rng.gen(),
115
            rng.gen(),
116
            rng.gen(),
117
            0,
118
            predicate.clone(),
119
            predicate_data.clone(),
120
        );
121
122
        let b = Input::message_coin_predicate(
123
            rng.gen(),
124
            rng.gen(),
125
            rng.gen(),
126
            rng.gen(),
127
            0,
128
            predicate.clone(),
129
            predicate_data.clone(),
130
        );
131
132
        let c = Input::message_data_predicate(
133
            rng.gen(),
134
            rng.gen(),
135
            rng.gen(),
136
            rng.gen(),
137
            0,
138
            vec![0xff; 10],
139
            predicate.clone(),
140
            predicate_data,
141
        );
142
143
        let inputs = vec![a, b, c];
144
145
        for i in inputs {
146
            let tx = TransactionBuilder::script(vec![], vec![])
147
                .add_input(i)
148
                .add_fee_input()
149
                .finalize_checked_basic(height);
150
151
            // assert invalid idx wont panic
152
            let idx = 1;
153
            let tx_offset = TxParameters::DEFAULT.tx_offset();
154
            let runtime = RuntimePredicate::from_tx(tx.as_ref(), tx_offset, idx);
155
156
            assert!(runtime.is_none());
157
158
            // fetch the input predicate
159
            let idx = 0;
160
            let runtime = RuntimePredicate::from_tx(tx.as_ref(), tx_offset, idx)
161
                .expect("failed to generate predicate from valid tx");
162
163
            assert_eq!(idx, runtime.idx());
164
165
            let mut interpreter = Interpreter::<_, _, _>::with_storage(
166
                MemoryInstance::new(),
167
                empty_predicate_storage(),
168
                InterpreterParams::default(),
169
            );
170
171
            assert!(interpreter
172
                .init_predicate(
173
                    Context::PredicateVerification {
174
                        program: RuntimePredicate::empty(),
175
                    },
176
                    tx.transaction().clone(),
177
                    *tx.transaction().script_gas_limit(),
178
                )
179
                .is_ok());
180
181
            let pad = bytes::padded_len(&predicate).unwrap() - predicate.len();
182
183
            // assert we are testing an edge case
184
            assert_ne!(0, pad);
185
186
            let padded_predicate: Vec<u8> = predicate
187
                .iter()
188
                .copied()
189
                .chain(iter::repeat(0u8).take(pad))
190
                .collect();
191
192
            let program = runtime.program();
193
            let program = &interpreter.memory()[program.usizes()];
194
195
            // assert the program in the vm memory is the same of the input
196
            assert_eq!(program, &padded_predicate);
197
        }
198
    }
199
200
    fn assert_inputs_are_validated_for_predicates(
201
        inputs: Vec<(
202
            Vec<Instruction>,
203
            bool,
204
            Result<(), PredicateVerificationFailed>,
205
        )>,
206
        blob: Vec<Instruction>,
207
    ) {
208
        let rng = &mut StdRng::seed_from_u64(2322u64);
209
210
        let height = 1.into();
211
        let predicate_data =
212
            b"If you think it's simple, then you have misunderstood the problem."
213
                .to_vec();
214
215
        let mut storage = MemoryStorage::new(Default::default(), Default::default());
216
217
        let blob_id = BlobId::zeroed();
218
        let blob: Vec<u8> = blob.into_iter().collect();
219
        storage
220
            .storage_as_mut::<BlobData>()
221
            .insert(&blob_id, &blob)
222
            .unwrap();
223
224
        macro_rules! predicate_input {
225
            ($predicate:expr) => {{
226
                let predicate: Vec<u8> = $predicate.into_iter().collect();
227
                let owner = Input::predicate_owner(&predicate);
228
                [
229
                    Input::coin_predicate(
230
                        rng.gen(),
231
                        owner,
232
                        rng.gen(),
233
                        rng.gen(),
234
                        rng.gen(),
235
                        0,
236
                        predicate.clone(),
237
                        predicate_data.clone(),
238
                    ),
239
                    Input::message_coin_predicate(
240
                        rng.gen(),
241
                        owner,
242
                        rng.gen(),
243
                        rng.gen(),
244
                        0,
245
                        predicate.clone(),
246
                        predicate_data.clone(),
247
                    ),
248
                    Input::message_data_predicate(
249
                        rng.gen(),
250
                        owner,
251
                        rng.gen(),
252
                        rng.gen(),
253
                        0,
254
                        vec![rng.gen(); rng.gen_range(1..100)],
255
                        predicate.clone(),
256
                        predicate_data.clone(),
257
                    ),
258
                ]
259
            }};
260
        }
261
262
        for (i, (input_predicate, correct_gas, expected)) in
263
            inputs.into_iter().enumerate()
264
        {
265
            let input_group = predicate_input!(input_predicate);
266
            for mut input in input_group {
267
                if !correct_gas {
268
                    input.set_predicate_gas_used(1234);
269
                }
270
271
                let mut script = TransactionBuilder::script(
272
                    [op::ret(0x01)].into_iter().collect(),
273
                    vec![],
274
                )
275
                .add_input(input)
276
                .add_fee_input()
277
                .finalize();
278
279
                if correct_gas {
280
                    script
281
                        .estimate_predicates(
282
                            &CheckPredicateParams::default(),
283
                            MemoryInstance::new(),
284
                            &storage,
285
                        )
286
                        .unwrap();
287
                }
288
289
                let tx = script
290
                    .into_checked_basic(height, &Default::default())
291
                    .unwrap();
292
293
                let result = check_predicates(
294
                    &tx,
295
                    &CheckPredicateParams::default(),
296
                    MemoryInstance::new(),
297
                    &storage,
298
                );
299
300
                assert_eq!(result.map(|_| ()), expected, "failed at input {}", i);
301
            }
302
        }
303
    }
304
305
    /// Verifies the runtime predicate validation rules outlined in the spec are actually
306
    /// validated https://github.com/FuelLabs/fuel-specs/blob/master/src/fuel-vm/index.md#predicate-verification
307
    #[test]
308
    fn inputs_are_validated_for_good_predicate_inputs() {
309
        const CORRECT_GAS: bool = true;
310
        let good_blob = vec![op::noop(), op::ret(0x01)];
311
312
        let inputs = vec![
313
            (
314
                // A valid predicate
315
                vec![
316
                    op::addi(0x10, 0x00, 0x01),
317
                    op::addi(0x10, 0x10, 0x01),
318
                    op::ret(0x01),
319
                ],
320
                CORRECT_GAS,
321
                Ok(()),
322
            ),
323
            (
324
                // Use `LDC` with mode `1` to load the blob into the predicate.
325
                vec![
326
                    // Allocate 32 byte on the heap.
327
                    op::movi(0x10, 32),
328
                    op::aloc(0x10),
329
                    // This will be our zeroed blob id
330
                    op::move_(0x10, HP),
331
                    // Store the size of the blob
332
                    op::bsiz(0x11, 0x10),
333
                    // Store start of the blob code
334
                    op::move_(0x12, SSP),
335
                    // Subtract the start of the code from the end of the code
336
                    op::sub(0x12, 0x12, IS),
337
                    // Divide the code by the instruction size to get the number of
338
                    // instructions
339
                    op::divi(0x12, 0x12, Instruction::SIZE as u16),
340
                    // Load the blob by `0x10` ID with the `0x11` size
341
                    op::ldc(0x10, ZERO, 0x11, 1),
342
                    // Jump to a new code location
343
                    op::jmp(0x12),
344
                ],
345
                CORRECT_GAS,
346
                Ok(()),
347
            ),
348
            (
349
                // Use `LDC` with mode `2` to load the part of the predicate from the
350
                // transaction.
351
                vec![
352
                    // Skip the return opcodes. One of two opcodes is a good opcode that
353
                    // returns `0x1`. This opcode is our source for the `LDC`
354
                    // opcode. We will copy return good opcode to the end
355
                    // of the `ssp` via `LDC`. And jump there to
356
                    // return `true` from the predicate.
357
                    op::jmpf(ZERO, 2),
358
                    // Bad return opcode that we want to skip.
359
                    op::ret(0x0),
360
                    // Good return opcode that we want to use for the `LDC`.
361
                    op::ret(0x1),
362
                    // Take the start of the code and move it for 2 opcodes to get the
363
                    // desired opcode to copy.
364
                    op::move_(0x10, IS),
365
                    // We don't need to copy `jmpf` and bad `ret` opcodes via `LDC`.
366
                    op::addi(0x10, 0x10, 2 * Instruction::SIZE as u16),
367
                    // Store end of the code
368
                    op::move_(0x12, SSP),
369
                    // Subtract the start of the code from the end of the code
370
                    op::sub(0x12, 0x12, IS),
371
                    // Divide the code by the instruction size to get the number of
372
                    // instructions
373
                    op::divi(0x12, 0x12, Instruction::SIZE as u16),
374
                    // We want to load only on good `ret` opcode.
375
                    op::movi(0x11, Instruction::SIZE as u32),
376
                    // Load the code from the memory address `0x10` with the `0x11` size
377
                    op::ldc(0x10, ZERO, 0x11, 2),
378
                    // Jump to a new code location
379
                    op::jmp(0x12),
380
                ],
381
                CORRECT_GAS,
382
                Ok(()),
383
            ),
384
        ];
385
386
        assert_inputs_are_validated_for_predicates(inputs, good_blob)
387
    }
388
389
    #[test]
390
    fn inputs_are_validated_for_bad_predicate_inputs() {
391
        const CORRECT_GAS: bool = true;
392
        const INCORRECT_GAS: bool = false;
393
394
        let bad_blob = vec![op::noop(), op::ret(0x00)];
395
396
        let inputs = vec![
397
            (
398
                // A valid predicate, but gas amount mismatches
399
                vec![
400
                    op::addi(0x10, 0x00, 0x01),
401
                    op::addi(0x10, 0x10, 0x01),
402
                    op::ret(0x01),
403
                ],
404
                INCORRECT_GAS,
405
                Err(PredicateVerificationFailed::GasMismatch),
406
            ),
407
            (
408
                // Returning an invalid value
409
                vec![op::ret(0x0)],
410
                CORRECT_GAS,
411
                Err(PredicateVerificationFailed::Panic(
412
                    PanicReason::PredicateReturnedNonOne,
413
                )),
414
            ),
415
            (
416
                // Using a contract instruction
417
                vec![op::time(0x20, 0x1), op::ret(0x1)],
418
                CORRECT_GAS,
419
                Err(PredicateVerificationFailed::PanicInstruction(
420
                    PanicInstruction::error(
421
                        PanicReason::ContractInstructionNotAllowed,
422
                        op::time(0x20, 0x1).into(),
423
                    ),
424
                )),
425
            ),
426
            (
427
                // Using a contract instruction
428
                vec![op::ldc(ONE, ONE, ONE, 0)],
429
                CORRECT_GAS,
430
                Err(PredicateVerificationFailed::PanicInstruction(
431
                    PanicInstruction::error(
432
                        PanicReason::ContractInstructionNotAllowed,
433
                        op::ldc(ONE, ONE, ONE, 0).into(),
434
                    ),
435
                )),
436
            ),
437
            (
438
                // Use `LDC` with mode `1` to load the blob into the predicate.
439
                vec![
440
                    // Allocate 32 byte on the heap.
441
                    op::movi(0x10, 32),
442
                    op::aloc(0x10),
443
                    // This will be our zeroed blob id
444
                    op::move_(0x10, HP),
445
                    // Store the size of the blob
446
                    op::bsiz(0x11, 0x10),
447
                    // Store start of the blob code
448
                    op::move_(0x12, SSP),
449
                    // Subtract the start of the code from the end of the code
450
                    op::sub(0x12, 0x12, IS),
451
                    // Divide the code by the instruction size to get the number of
452
                    // instructions
453
                    op::divi(0x12, 0x12, Instruction::SIZE as u16),
454
                    // Load the blob by `0x10` ID with the `0x11` size
455
                    op::ldc(0x10, ZERO, 0x11, 1),
456
                    // Jump to a new code location
457
                    op::jmp(0x12),
458
                ],
459
                CORRECT_GAS,
460
                Err(PredicateVerificationFailed::Panic(
461
                    PanicReason::PredicateReturnedNonOne,
462
                )),
463
            ),
464
            (
465
                // Use `LDC` with mode `2` to load the part of the predicate from the
466
                // transaction.
467
                vec![
468
                    // Skip the return opcodes. One of two opcodes is a bad opcode that
469
                    // returns `0x0`. This opcode is our source for the `LDC`
470
                    // opcode. We will copy return bad opcode to the end
471
                    // of the `ssp` via `LDC`. And jump there to
472
                    // return `false` from the predicate adn fail.
473
                    op::jmpf(ZERO, 2),
474
                    // Good return opcode that we want to skip.
475
                    op::ret(0x1),
476
                    // Bad return opcode that we want to use for the `LDC`.
477
                    op::ret(0x0),
478
                    // Take the start of the code and move it for 2 opcodes to get the
479
                    // desired opcode to copy.
480
                    op::move_(0x10, IS),
481
                    // We don't need to copy `jmpf` and bad `ret` opcodes via `LDC`.
482
                    op::addi(0x10, 0x10, 2 * Instruction::SIZE as u16),
483
                    // Store end of the code
484
                    op::move_(0x12, SSP),
485
                    // Subtract the start of the code from the end of the code
486
                    op::sub(0x12, 0x12, IS),
487
                    // Divide the code by the instruction size to get the number of
488
                    // instructions
489
                    op::divi(0x12, 0x12, Instruction::SIZE as u16),
490
                    // We want to load only on bad `ret` opcode.
491
                    op::movi(0x11, Instruction::SIZE as u32),
492
                    // Load the code from the memory address `0x10` with the `0x11` size
493
                    op::ldc(0x10, ZERO, 0x11, 2),
494
                    // Jump to a new code location
495
                    op::jmp(0x12),
496
                ],
497
                CORRECT_GAS,
498
                Err(PredicateVerificationFailed::Panic(
499
                    PanicReason::PredicateReturnedNonOne,
500
                )),
501
            ),
502
        ];
503
504
        assert_inputs_are_validated_for_predicates(inputs, bad_blob)
505
    }
506
}
/home/marten/fuel/fuel-vm/fuel-vm/src/crypto.rs
Line
Count
Source
1
//! Crypto implementations for the instructions
2
3
use fuel_merkle::binary::root_calculator::MerkleRootCalculator as MerkleTree;
4
use fuel_types::Bytes32;
5
6
/// Calculate a binary merkle root with in-memory storage
7
0
pub fn ephemeral_merkle_root<L, I>(leaves: I) -> Bytes32
8
0
where
9
0
    L: AsRef<[u8]>,
10
0
    I: Iterator<Item = L> + ExactSizeIterator,
11
0
{
12
0
    let mut tree = MerkleTree::new();
13
0
    leaves.for_each(|l| tree.push(l.as_ref()));
14
0
    tree.root().into()
15
0
}
16
17
#[test]
18
#[cfg(feature = "random")]
19
fn ephemeral_merkle_root_returns_the_expected_root() {
20
    use fuel_crypto::Hasher;
21
    use rand::{
22
        rngs::StdRng,
23
        Rng,
24
        SeedableRng,
25
    };
26
27
    use alloc::{
28
        vec,
29
        vec::Vec,
30
    };
31
32
    use crate::prelude::*;
33
34
    let mut rng = StdRng::seed_from_u64(2322u64);
35
36
    const LEAF_PREFIX: u8 = 0x00;
37
    const NODE_PREFIX: u8 = 0x01;
38
39
    // Test for 0 leaves
40
    //
41
    // Expected root is `h()`
42
    let empty: Vec<Address> = vec![];
43
44
    let root = ephemeral_merkle_root(empty.iter());
45
    let empty = Hasher::default().digest();
46
47
    assert_eq!(empty, root);
48
49
    // Test for 5 leaves
50
    let a: Address = rng.gen();
51
    let b: Address = rng.gen();
52
    let c: Address = rng.gen();
53
    let d: Address = rng.gen();
54
    let e: Address = rng.gen();
55
56
    let initial = [a, b, c, d, e];
57
58
    let a = Hasher::default().chain([LEAF_PREFIX]).chain(a).digest();
59
    let b = Hasher::default().chain([LEAF_PREFIX]).chain(b).digest();
60
    let c = Hasher::default().chain([LEAF_PREFIX]).chain(c).digest();
61
    let d = Hasher::default().chain([LEAF_PREFIX]).chain(d).digest();
62
    let e = Hasher::default().chain([LEAF_PREFIX]).chain(e).digest();
63
64
    let a = Hasher::default()
65
        .chain([NODE_PREFIX])
66
        .extend_chain([a, b])
67
        .digest();
68
    let b = Hasher::default()
69
        .chain([NODE_PREFIX])
70
        .extend_chain([c, d])
71
        .digest();
72
    let c = e;
73
74
    let a = Hasher::default()
75
        .chain([NODE_PREFIX])
76
        .extend_chain([a, b])
77
        .digest();
78
    let b = c;
79
80
    let root = Hasher::default()
81
        .chain([NODE_PREFIX])
82
        .extend_chain([a, b])
83
        .digest();
84
    let root_p = ephemeral_merkle_root(initial.iter());
85
86
    assert_eq!(root, root_p);
87
}
/home/marten/fuel/fuel-vm/fuel-vm/src/convert.rs
Line
Count
Source
1
/// Converts value to usize is a way that's consistet on 32-bit and 64-bit platforms.
2
10.4M
pub(crate) fn to_usize(value: u64) -> Option<usize> {
3
10.4M
    usize::try_from(u32::try_from(value).ok()?).ok()
4
10.4M
}
/home/marten/fuel/fuel-vm/fuel-vm/src/storage.rs
Line
Count
Source
1
//! Storage backend implementations.
2
3
use fuel_storage::Mappable;
4
use fuel_tx::Contract;
5
use fuel_types::{
6
    Bytes32,
7
    ContractId,
8
};
9
10
mod blob_data;
11
mod contracts_assets;
12
mod contracts_state;
13
mod interpreter;
14
#[cfg(feature = "test-helpers")]
15
mod memory;
16
pub mod predicate;
17
18
pub use blob_data::{
19
    BlobBytes,
20
    BlobData,
21
};
22
pub use contracts_assets::{
23
    ContractsAssetKey,
24
    ContractsAssets,
25
};
26
pub use contracts_state::{
27
    ContractsState,
28
    ContractsStateData,
29
    ContractsStateKey,
30
};
31
pub use interpreter::{
32
    ContractsAssetsStorage,
33
    InterpreterStorage,
34
};
35
#[cfg(feature = "test-helpers")]
36
pub use memory::MemoryStorage;
37
38
#[cfg(feature = "alloc")]
39
use alloc::vec::Vec;
40
41
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
42
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
43
/// The uploaded bytecode can be in two states: fully uploaded or partially uploaded.
44
pub enum UploadedBytecode {
45
    /// The bytecode is partially uploaded.
46
    Uncompleted {
47
        /// The cumulative bytecode of `uploaded_subsections_number` parts.
48
        bytecode: Vec<u8>,
49
        /// The number of already included subsections of the bytecode.
50
        uploaded_subsections_number: u16,
51
    },
52
    /// The bytecode is fully uploaded and ready to be used.
53
    Completed(Vec<u8>),
54
}
55
56
/// The storage table for uploaded bytecode.
57
pub struct UploadedBytecodes;
58
59
impl Mappable for UploadedBytecodes {
60
    /// The key is a Merkle root of the bytecode.
61
    type Key = Self::OwnedKey;
62
    type OwnedKey = Bytes32;
63
    type OwnedValue = UploadedBytecode;
64
    type Value = Self::OwnedValue;
65
}
66
67
/// The storage table for contract's raw byte code.
68
pub struct ContractsRawCode;
69
70
impl Mappable for ContractsRawCode {
71
    type Key = Self::OwnedKey;
72
    type OwnedKey = ContractId;
73
    type OwnedValue = Contract;
74
    type Value = [u8];
75
}
76
77
/// The macro defines a new type of double storage key. It is a merge of the two
78
/// types into one general type that represents the storage key of some entity.
79
///
80
/// Both types are represented by one big array. It is done from the performance
81
/// perspective to minimize the number of copies. The current code doesn't use
82
/// consumed values and uses it in most cases as on big key(except tests, which
83
/// require access to sub-keys). But in the future, we may change the layout of the
84
/// fields based on the performance measurements/new business logic.
85
#[macro_export]
86
macro_rules! double_key {
87
    (
88
        $i:ident, $first:ident, $first_getter:ident, $second:ident, $second_getter:ident
89
    ) => {
90
        #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
91
        /// The FuelVM storage double key.
92
        pub struct $i([u8; { $first::LEN + $second::LEN }]);
93
94
        impl Default for $i {
95
32.8k
            fn default() -> Self {
96
32.8k
                Self([0; { Self::second_end() }])
97
32.8k
            }
_RNvXs_NtNtCsg6P9hFxt0iW_7fuel_vm7storage16contracts_assetsNtB4_17ContractsAssetKeyNtNtCsd3UI3IJrzMw_4core7default7Default7defaultB8_
Line
Count
Source
95
27.1k
            fn default() -> Self {
96
27.1k
                Self([0; { Self::second_end() }])
97
27.1k
            }
_RNvXs8_NtNtCsg6P9hFxt0iW_7fuel_vm7storage15contracts_stateNtB5_17ContractsStateKeyNtNtCsd3UI3IJrzMw_4core7default7Default7defaultB9_
Line
Count
Source
95
5.65k
            fn default() -> Self {
96
5.65k
                Self([0; { Self::second_end() }])
97
5.65k
            }
98
        }
99
100
        impl $i {
101
            /// The length of the underlying array.
102
            pub const LEN: usize = $first::LEN + $second::LEN;
103
104
            /// Create a new instance of the double storage key from references.
105
32.8k
            pub fn new(first: &$first, second: &$second) -> Self {
106
32.8k
                let mut default = Self::default();
107
32.8k
                default.0[0..Self::first_end()].copy_from_slice(first.as_ref());
108
32.8k
                default.0[Self::first_end()..Self::second_end()]
109
32.8k
                    .copy_from_slice(second.as_ref());
110
32.8k
                default
111
32.8k
            }
_RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm7storage16contracts_assetsNtB5_17ContractsAssetKey3new
Line
Count
Source
105
27.1k
            pub fn new(first: &$first, second: &$second) -> Self {
106
27.1k
                let mut default = Self::default();
107
27.1k
                default.0[0..Self::first_end()].copy_from_slice(first.as_ref());
108
27.1k
                default.0[Self::first_end()..Self::second_end()]
109
27.1k
                    .copy_from_slice(second.as_ref());
110
27.1k
                default
111
27.1k
            }
_RNvMs9_NtNtCsg6P9hFxt0iW_7fuel_vm7storage15contracts_stateNtB5_17ContractsStateKey3new
Line
Count
Source
105
5.65k
            pub fn new(first: &$first, second: &$second) -> Self {
106
5.65k
                let mut default = Self::default();
107
5.65k
                default.0[0..Self::first_end()].copy_from_slice(first.as_ref());
108
5.65k
                default.0[Self::first_end()..Self::second_end()]
109
5.65k
                    .copy_from_slice(second.as_ref());
110
5.65k
                default
111
5.65k
            }
112
113
            /// Creates a new instance of double storage key from the array.
114
0
            pub fn from_array(array: [u8; { $first::LEN + $second::LEN }]) -> Self {
115
0
                Self(array)
116
0
            }
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm7storage16contracts_assetsNtB5_17ContractsAssetKey10from_arrayB9_
Unexecuted instantiation: _RNvMs9_NtNtCsg6P9hFxt0iW_7fuel_vm7storage15contracts_stateNtB5_17ContractsStateKey10from_arrayB9_
117
118
            /// Creates a new instance of double storage key from the slice.
119
0
            pub fn from_slice(
120
0
                slice: &[u8],
121
0
            ) -> Result<Self, core::array::TryFromSliceError> {
122
0
                Ok(Self(slice.try_into()?))
123
0
            }
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm7storage16contracts_assetsNtB5_17ContractsAssetKey10from_sliceB9_
Unexecuted instantiation: _RNvMs9_NtNtCsg6P9hFxt0iW_7fuel_vm7storage15contracts_stateNtB5_17ContractsStateKey10from_sliceB9_
124
125
            /// Returns the reference to the first sub-key.
126
3.14k
            pub fn $first_getter(&self) -> &$first {
127
3.14k
                $first::from_bytes_ref(
128
3.14k
                    (&self.0[0..Self::first_end()])
129
3.14k
                        .try_into()
130
3.14k
                        .expect("0..first_end() < first_end() + second_end()"),
131
3.14k
                )
132
3.14k
            }
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm7storage16contracts_assetsNtB5_17ContractsAssetKey11contract_id
_RNvMs9_NtNtCsg6P9hFxt0iW_7fuel_vm7storage15contracts_stateNtB5_17ContractsStateKey11contract_id
Line
Count
Source
126
3.14k
            pub fn $first_getter(&self) -> &$first {
127
3.14k
                $first::from_bytes_ref(
128
3.14k
                    (&self.0[0..Self::first_end()])
129
3.14k
                        .try_into()
130
3.14k
                        .expect("0..first_end() < first_end() + second_end()"),
131
3.14k
                )
132
3.14k
            }
133
134
            /// Returns the reference to the second sub-key.
135
3.14k
            pub fn $second_getter(&self) -> &$second {
136
3.14k
                $second::from_bytes_ref(
137
3.14k
                    (&self.0[Self::first_end()..Self::second_end()])
138
3.14k
                        .try_into()
139
3.14k
                        .expect("first_end()..second_end() < first_end() + second_end()"),
140
3.14k
                )
141
3.14k
            }
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm7storage16contracts_assetsNtB5_17ContractsAssetKey8asset_id
_RNvMs9_NtNtCsg6P9hFxt0iW_7fuel_vm7storage15contracts_stateNtB5_17ContractsStateKey9state_key
Line
Count
Source
135
3.14k
            pub fn $second_getter(&self) -> &$second {
136
3.14k
                $second::from_bytes_ref(
137
3.14k
                    (&self.0[Self::first_end()..Self::second_end()])
138
3.14k
                        .try_into()
139
3.14k
                        .expect("first_end()..second_end() < first_end() + second_end()"),
140
3.14k
                )
141
3.14k
            }
142
143
71.9k
            const fn first_end() -> usize {
144
71.9k
                $first::LEN
145
71.9k
            }
_RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm7storage16contracts_assetsNtB5_17ContractsAssetKey9first_endB9_
Line
Count
Source
143
54.3k
            const fn first_end() -> usize {
144
54.3k
                $first::LEN
145
54.3k
            }
_RNvMs9_NtNtCsg6P9hFxt0iW_7fuel_vm7storage15contracts_stateNtB5_17ContractsStateKey9first_endB9_
Line
Count
Source
143
17.6k
            const fn first_end() -> usize {
144
17.6k
                $first::LEN
145
17.6k
            }
146
147
35.9k
            const fn second_end() -> usize {
148
35.9k
                $first::LEN + $second::LEN
149
35.9k
            }
_RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm7storage16contracts_assetsNtB5_17ContractsAssetKey10second_endB9_
Line
Count
Source
147
27.1k
            const fn second_end() -> usize {
148
27.1k
                $first::LEN + $second::LEN
149
27.1k
            }
_RNvMs9_NtNtCsg6P9hFxt0iW_7fuel_vm7storage15contracts_stateNtB5_17ContractsStateKey10second_endB9_
Line
Count
Source
147
8.80k
            const fn second_end() -> usize {
148
8.80k
                $first::LEN + $second::LEN
149
8.80k
            }
150
        }
151
152
        impl From<(&$first, &$second)> for $i {
153
32.8k
            fn from(pair: (&$first, &$second)) -> Self {
154
32.8k
                Self::new(pair.0, pair.1)
155
32.8k
            }
_RNvXs1_NtNtCsg6P9hFxt0iW_7fuel_vm7storage16contracts_assetsNtB5_17ContractsAssetKeyINtNtCsd3UI3IJrzMw_4core7convert4FromTRNtNtCsklA9joyWMfk_10fuel_types11array_types10ContractIdRNtB1Y_7AssetIdEE4from
Line
Count
Source
153
27.1k
            fn from(pair: (&$first, &$second)) -> Self {
154
27.1k
                Self::new(pair.0, pair.1)
155
27.1k
            }
_RNvXsa_NtNtCsg6P9hFxt0iW_7fuel_vm7storage15contracts_stateNtB5_17ContractsStateKeyINtNtCsd3UI3IJrzMw_4core7convert4FromTRNtNtCsklA9joyWMfk_10fuel_types11array_types10ContractIdRNtB1X_7Bytes32EE4from
Line
Count
Source
153
5.65k
            fn from(pair: (&$first, &$second)) -> Self {
154
5.65k
                Self::new(pair.0, pair.1)
155
5.65k
            }
156
        }
157
158
        impl AsRef<[u8]> for $i {
159
0
            fn as_ref(&self) -> &[u8] {
160
0
                self.0.as_ref()
161
0
            }
Unexecuted instantiation: _RNvXs2_NtNtCsg6P9hFxt0iW_7fuel_vm7storage16contracts_assetsNtB5_17ContractsAssetKeyINtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refB9_
Unexecuted instantiation: _RNvXsb_NtNtCsg6P9hFxt0iW_7fuel_vm7storage15contracts_stateNtB5_17ContractsStateKeyINtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refB9_
162
        }
163
164
        impl From<$i> for ($first, $second) {
165
0
            fn from(key: $i) -> ($first, $second) {
166
0
                let first = &key.0[0..$i::first_end()];
167
0
                let second = &key.0[$i::first_end()..$i::second_end()];
168
0
                let first = first.try_into().unwrap();
169
0
                let second = second.try_into().unwrap();
170
0
                (first, second)
171
0
            }
Unexecuted instantiation: _RNvXs3_NtNtCsg6P9hFxt0iW_7fuel_vm7storage16contracts_assetsTNtNtCsklA9joyWMfk_10fuel_types11array_types10ContractIdNtBY_7AssetIdEINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_17ContractsAssetKeyE4from
Unexecuted instantiation: _RNvXsc_NtNtCsg6P9hFxt0iW_7fuel_vm7storage15contracts_stateTNtNtCsklA9joyWMfk_10fuel_types11array_types10ContractIdNtBX_7Bytes32EINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_17ContractsStateKeyE4from
172
        }
173
174
        impl From<$i> for [u8; { $first::LEN + $second::LEN }] {
175
0
            fn from(key: $i) -> [u8; { $first::LEN + $second::LEN }] {
176
0
                key.0
177
0
            }
Unexecuted instantiation: _RNvXs4_NtNtCsg6P9hFxt0iW_7fuel_vm7storage16contracts_assetsAhj40_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_17ContractsAssetKeyE4fromB9_
Unexecuted instantiation: _RNvXsd_NtNtCsg6P9hFxt0iW_7fuel_vm7storage15contracts_stateAhj40_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_17ContractsStateKeyE4fromB9_
178
        }
179
180
        impl TryFrom<&[u8]> for $i {
181
            type Error = core::array::TryFromSliceError;
182
183
0
            fn try_from(slice: &[u8]) -> Result<Self, Self::Error> {
184
0
                $i::from_slice(slice)
185
0
            }
Unexecuted instantiation: _RNvXs5_NtNtCsg6P9hFxt0iW_7fuel_vm7storage16contracts_assetsNtB5_17ContractsAssetKeyINtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_fromB9_
Unexecuted instantiation: _RNvXse_NtNtCsg6P9hFxt0iW_7fuel_vm7storage15contracts_stateNtB5_17ContractsStateKeyINtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_fromB9_
186
        }
187
188
        #[cfg(feature = "serde")]
189
        impl serde::Serialize for $i {
190
            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
191
            where
192
                S: serde::Serializer,
193
            {
194
                use serde_with::SerializeAs;
195
                serde_with::Bytes::serialize_as(&self.0, serializer)
196
            }
197
        }
198
199
        #[cfg(feature = "serde")]
200
        impl<'a> serde::Deserialize<'a> for $i {
201
            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
202
            where
203
                D: serde::Deserializer<'a>,
204
            {
205
                use serde_with::DeserializeAs;
206
                let bytes: [u8; $i::LEN] =
207
                    serde_with::Bytes::deserialize_as(deserializer)?;
208
                Ok(Self(bytes))
209
            }
210
        }
211
    };
212
}
/home/marten/fuel/fuel-vm/fuel-vm/src/transactor.rs
Line
Count
Source
1
//! State machine of the interpreter.
2
3
use crate::{
4
    backtrace::Backtrace,
5
    checked_transaction::{
6
        Checked,
7
        IntoChecked,
8
        Ready,
9
    },
10
    error::InterpreterError,
11
    interpreter::{
12
        CheckedMetadata,
13
        EcalHandler,
14
        ExecutableTransaction,
15
        Interpreter,
16
        InterpreterParams,
17
        Memory,
18
        NotSupportedEcal,
19
    },
20
    state::{
21
        ProgramState,
22
        StateTransition,
23
        StateTransitionRef,
24
    },
25
    storage::InterpreterStorage,
26
};
27
use fuel_tx::{
28
    Blob,
29
    Create,
30
    FeeParameters,
31
    GasCosts,
32
    Receipt,
33
    Script,
34
    Upgrade,
35
    Upload,
36
};
37
38
#[cfg(any(test, feature = "test-helpers"))]
39
use crate::interpreter::MemoryInstance;
40
41
#[derive(Debug)]
42
/// State machine to execute transactions and provide runtime entities on
43
/// demand.
44
///
45
/// Builder pattern for [`Interpreter`]. Follows the recommended `Non-consuming
46
/// builder`.
47
///
48
/// Based on <https://doc.rust-lang.org/1.5.0/style/ownership/builders.html#non-consuming-builders-preferred>
49
pub struct Transactor<M, S, Tx, Ecal = NotSupportedEcal>
50
where
51
    S: InterpreterStorage,
52
{
53
    interpreter: Interpreter<M, S, Tx, Ecal>,
54
    program_state: Option<ProgramState>,
55
    error: Option<InterpreterError<S::DataError>>,
56
}
57
58
impl<M, S, Tx, Ecal> Transactor<M, S, Tx, Ecal>
59
where
60
    S: InterpreterStorage,
61
    Tx: ExecutableTransaction,
62
    Ecal: EcalHandler + Default,
63
{
64
    /// Transactor constructor
65
4.38k
    pub fn new(memory: M, storage: S, interpreter_params: InterpreterParams) -> Self {
66
4.38k
        Self {
67
4.38k
            interpreter: Interpreter::<M, S, Tx, Ecal>::with_storage(
68
4.38k
                memory,
69
4.38k
                storage,
70
4.38k
                interpreter_params,
71
4.38k
            ),
72
4.38k
            program_state: None,
73
4.38k
            error: None,
74
4.38k
        }
75
4.38k
    }
Unexecuted instantiation: _RNvMNtCsg6P9hFxt0iW_7fuel_vm10transactorINtB2_10TransactorNtNtNtB4_11interpreter6memory14MemoryInstanceNtNtNtB4_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_4blob8BlobBodyNtB3R_12BlobMetadataEE3newB4_
_RNvMNtCsg6P9hFxt0iW_7fuel_vm10transactorINtB2_10TransactorNtNtNtB4_11interpreter6memory14MemoryInstanceNtNtNtB4_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_6create10CreateBodyNtB3R_14CreateMetadataEE3newB4_
Line
Count
Source
65
2.19k
    pub fn new(memory: M, storage: S, interpreter_params: InterpreterParams) -> Self {
66
2.19k
        Self {
67
2.19k
            interpreter: Interpreter::<M, S, Tx, Ecal>::with_storage(
68
2.19k
                memory,
69
2.19k
                storage,
70
2.19k
                interpreter_params,
71
2.19k
            ),
72
2.19k
            program_state: None,
73
2.19k
            error: None,
74
2.19k
        }
75
2.19k
    }
_RNvMNtCsg6P9hFxt0iW_7fuel_vm10transactorINtB2_10TransactorNtNtNtB4_11interpreter6memory14MemoryInstanceNtNtNtB4_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_6script10ScriptBodyNtB3R_14ScriptMetadataEE3newB4_
Line
Count
Source
65
2.19k
    pub fn new(memory: M, storage: S, interpreter_params: InterpreterParams) -> Self {
66
2.19k
        Self {
67
2.19k
            interpreter: Interpreter::<M, S, Tx, Ecal>::with_storage(
68
2.19k
                memory,
69
2.19k
                storage,
70
2.19k
                interpreter_params,
71
2.19k
            ),
72
2.19k
            program_state: None,
73
2.19k
            error: None,
74
2.19k
        }
75
2.19k
    }
76
}
77
impl<M, S, Tx, Ecal> Transactor<M, S, Tx, Ecal>
78
where
79
    S: InterpreterStorage,
80
    Tx: ExecutableTransaction,
81
    Ecal: EcalHandler,
82
{
83
    /// State transition representation after the execution of a transaction.
84
    ///
85
    /// Will be `None` if the last transaction resulted in a VM panic, or if no
86
    /// transaction was executed.
87
0
    pub fn state_transition(&self) -> Option<StateTransitionRef<'_, Tx>> {
88
0
        self.program_state.map(|state| {
89
0
            StateTransitionRef::new(
90
0
                state,
91
0
                self.interpreter.transaction(),
92
0
                self.interpreter.receipts(),
93
0
            )
94
0
        })
95
0
    }
96
97
    /// State transition representation after the execution of a transaction.
98
    ///
99
    /// Will be `None` if the last transaction resulted in a VM panic, or if no
100
    /// transaction was executed.
101
4.38k
    pub fn to_owned_state_transition(&self) -> Option<StateTransition<Tx>> {
102
4.38k
        self.program_state.map(|state| {
103
4.38k
            StateTransition::new(
104
4.38k
                state,
105
4.38k
                self.interpreter.transaction().clone(),
106
4.38k
                self.interpreter.receipts().to_vec(),
107
4.38k
            )
108
4.38k
        })
Unexecuted instantiation: _RNCNvMs_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB6_10TransactorNtNtNtB8_11interpreter6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2p_4blob8BlobBodyNtB3V_12BlobMetadataEE25to_owned_state_transition0B8_
_RNCNvMs_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB6_10TransactorNtNtNtB8_11interpreter6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2p_6create10CreateBodyNtB3V_14CreateMetadataEE25to_owned_state_transition0B8_
Line
Count
Source
102
2.19k
        self.program_state.map(|state| {
103
2.19k
            StateTransition::new(
104
2.19k
                state,
105
2.19k
                self.interpreter.transaction().clone(),
106
2.19k
                self.interpreter.receipts().to_vec(),
107
2.19k
            )
108
2.19k
        })
_RNCNvMs_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB6_10TransactorNtNtNtB8_11interpreter6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2p_6script10ScriptBodyNtB3V_14ScriptMetadataEE25to_owned_state_transition0B8_
Line
Count
Source
102
2.19k
        self.program_state.map(|state| {
103
2.19k
            StateTransition::new(
104
2.19k
                state,
105
2.19k
                self.interpreter.transaction().clone(),
106
2.19k
                self.interpreter.receipts().to_vec(),
107
2.19k
            )
108
2.19k
        })
109
4.38k
    }
Unexecuted instantiation: _RNvMs_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB4_10TransactorNtNtNtB6_11interpreter6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2n_4blob8BlobBodyNtB3T_12BlobMetadataEE25to_owned_state_transitionB6_
_RNvMs_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB4_10TransactorNtNtNtB6_11interpreter6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2n_6create10CreateBodyNtB3T_14CreateMetadataEE25to_owned_state_transitionB6_
Line
Count
Source
101
2.19k
    pub fn to_owned_state_transition(&self) -> Option<StateTransition<Tx>> {
102
2.19k
        self.program_state.map(|state| {
103
            StateTransition::new(
104
                state,
105
                self.interpreter.transaction().clone(),
106
                self.interpreter.receipts().to_vec(),
107
            )
108
2.19k
        })
109
2.19k
    }
_RNvMs_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB4_10TransactorNtNtNtB6_11interpreter6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2n_6script10ScriptBodyNtB3T_14ScriptMetadataEE25to_owned_state_transitionB6_
Line
Count
Source
101
2.19k
    pub fn to_owned_state_transition(&self) -> Option<StateTransition<Tx>> {
102
2.19k
        self.program_state.map(|state| {
103
            StateTransition::new(
104
                state,
105
                self.interpreter.transaction().clone(),
106
                self.interpreter.receipts().to_vec(),
107
            )
108
2.19k
        })
109
2.19k
    }
110
111
    /// Interpreter error representation after the execution of a transaction.
112
    ///
113
    /// Follows the same criteria as [`Self::state_transition`] to return
114
    /// `None`.
115
    ///
116
    /// Will be `None` if the last transaction resulted successful, or if no
117
    /// transaction was executed.
118
4.38k
    pub const fn error(&self) -> Option<&InterpreterError<S::DataError>> {
119
4.38k
        self.error.as_ref()
120
4.38k
    }
Unexecuted instantiation: _RNvMs_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB4_10TransactorNtNtNtB6_11interpreter6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2n_4blob8BlobBodyNtB3T_12BlobMetadataEE5errorB6_
_RNvMs_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB4_10TransactorNtNtNtB6_11interpreter6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2n_6create10CreateBodyNtB3T_14CreateMetadataEE5errorB6_
Line
Count
Source
118
2.19k
    pub const fn error(&self) -> Option<&InterpreterError<S::DataError>> {
119
2.19k
        self.error.as_ref()
120
2.19k
    }
_RNvMs_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB4_10TransactorNtNtNtB6_11interpreter6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2n_6script10ScriptBodyNtB3T_14ScriptMetadataEE5errorB6_
Line
Count
Source
118
2.19k
    pub const fn error(&self) -> Option<&InterpreterError<S::DataError>> {
119
2.19k
        self.error.as_ref()
120
2.19k
    }
121
122
    /// Returns true if last transaction execution was successful
123
0
    pub const fn is_success(&self) -> bool {
124
0
        !self.is_reverted()
125
0
    }
126
127
    /// Returns true if last transaction execution was erroneous
128
4.38k
    pub const fn is_reverted(&self) -> bool {
129
4.38k
        self.error.is_some()
130
4.38k
            || matches!(self.program_state, Some(ProgramState::Revert(_)))
131
4.38k
    }
Unexecuted instantiation: _RNvMs_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB4_10TransactorNtNtNtB6_11interpreter6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2n_4blob8BlobBodyNtB3T_12BlobMetadataEE11is_revertedB6_
_RNvMs_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB4_10TransactorNtNtNtB6_11interpreter6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2n_6create10CreateBodyNtB3T_14CreateMetadataEE11is_revertedB6_
Line
Count
Source
128
2.19k
    pub const fn is_reverted(&self) -> bool {
129
2.19k
        self.error.is_some()
130
2.19k
            || matches!(self.program_state, Some(ProgramState::Revert(_)))
131
2.19k
    }
_RNvMs_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB4_10TransactorNtNtNtB6_11interpreter6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2n_6script10ScriptBodyNtB3T_14ScriptMetadataEE11is_revertedB6_
Line
Count
Source
128
2.19k
    pub const fn is_reverted(&self) -> bool {
129
2.19k
        self.error.is_some()
130
2.19k
            || matches!(self.program_state, Some(ProgramState::Revert(_)))
131
2.19k
    }
132
133
    /// Result representation of the last executed transaction.
134
    ///
135
    /// Will return `None` if no transaction was executed.
136
0
    pub fn result(
137
0
        &self,
138
0
    ) -> Result<StateTransitionRef<'_, Tx>, &InterpreterError<S::DataError>> {
139
0
        let state = self.state_transition();
140
0
        let error = self.error.as_ref();
141
0
142
0
        match (state, error) {
143
0
            (Some(s), None) => Ok(s),
144
0
            (None, Some(e)) => Err(e),
145
146
            // Cover also inconsistent states such as `(Some, Some)`
147
0
            _ => Err(&InterpreterError::NoTransactionInitialized),
148
        }
149
0
    }
150
151
    /// Gets the interpreter.
152
4.38k
    pub fn interpreter(&self) -> &Interpreter<M, S, Tx, Ecal> {
153
4.38k
        &self.interpreter
154
4.38k
    }
Unexecuted instantiation: _RNvMs_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB4_10TransactorNtNtNtB6_11interpreter6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2n_4blob8BlobBodyNtB3T_12BlobMetadataEE11interpreterB6_
_RNvMs_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB4_10TransactorNtNtNtB6_11interpreter6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2n_6create10CreateBodyNtB3T_14CreateMetadataEE11interpreterB6_
Line
Count
Source
152
2.19k
    pub fn interpreter(&self) -> &Interpreter<M, S, Tx, Ecal> {
153
2.19k
        &self.interpreter
154
2.19k
    }
_RNvMs_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB4_10TransactorNtNtNtB6_11interpreter6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2n_6script10ScriptBodyNtB3T_14ScriptMetadataEE11interpreterB6_
Line
Count
Source
152
2.19k
    pub fn interpreter(&self) -> &Interpreter<M, S, Tx, Ecal> {
153
2.19k
        &self.interpreter
154
2.19k
    }
155
156
    /// Gas costs of opcodes
157
0
    pub fn gas_costs(&self) -> &GasCosts {
158
0
        self.interpreter.gas_costs()
159
0
    }
160
161
    /// Fee parameters
162
0
    pub fn fee_params(&self) -> &FeeParameters {
163
0
        self.interpreter.fee_params()
164
0
    }
165
166
    #[cfg(feature = "test-helpers")]
167
    /// Sets the gas price of the `Interpreter`
168
0
    pub fn set_gas_price(&mut self, gas_price: u64) {
169
0
        self.interpreter.set_gas_price(gas_price);
170
0
    }
171
172
    /// Tx memory offset
173
0
    pub fn tx_offset(&self) -> usize {
174
0
        self.interpreter.tx_offset()
175
0
    }
176
}
177
178
impl<M, S, Ecal> Transactor<M, S, Script, Ecal>
179
where
180
    M: Memory,
181
    S: InterpreterStorage,
182
{
183
    /// Receipts after the execution of a transaction.
184
    ///
185
    /// Follows the same criteria as [`Self::state_transition`] to return
186
    /// `None`.
187
0
    pub fn receipts(&self) -> Option<&[Receipt]> {
188
0
        self.program_state
189
0
            .is_some()
190
0
            .then(|| self.interpreter.receipts())
191
0
    }
192
193
    /// Generate a backtrace when at least one receipt of `ScriptResult` was
194
    /// found.
195
0
    pub fn backtrace(&self) -> Option<Backtrace> {
196
0
        self.receipts()
197
0
            .and_then(|r| r.iter().find_map(Receipt::result))
198
0
            .copied()
199
0
            .map(|result| Backtrace::from_vm_error(&self.interpreter, result))
200
0
    }
201
}
202
203
impl<M, S, Tx, Ecal> Transactor<M, S, Tx, Ecal>
204
where
205
    S: InterpreterStorage,
206
{
207
    /// Deploys `Create` checked transactions.
208
0
    pub fn deploy(
209
0
        &mut self,
210
0
        checked: Checked<Create>,
211
0
    ) -> Result<Create, InterpreterError<S::DataError>> {
212
0
        let gas_price = self.interpreter.gas_price();
213
0
        let gas_costs = self.interpreter.gas_costs();
214
0
        let fee_params = self.interpreter.fee_params();
215
216
0
        let ready = checked
217
0
            .into_ready(gas_price, gas_costs, fee_params)
218
0
            .map_err(InterpreterError::CheckError)?;
219
220
0
        self.deploy_ready_tx(ready)
221
0
    }
222
223
    /// Deployt a `Ready` transaction directly instead of letting `Transactor` construct
224
0
    pub fn deploy_ready_tx(
225
0
        &mut self,
226
0
        ready_tx: Ready<Create>,
227
0
    ) -> Result<Create, InterpreterError<S::DataError>> {
228
0
        self.interpreter.deploy(ready_tx)
229
0
    }
230
231
    /// Executes `Upgrade` checked transactions.
232
0
    pub fn upgrade(
233
0
        &mut self,
234
0
        checked: Checked<Upgrade>,
235
0
    ) -> Result<Upgrade, InterpreterError<S::DataError>> {
236
0
        let gas_price = self.interpreter.gas_price();
237
0
        let gas_costs = self.interpreter.gas_costs();
238
0
        let fee_params = self.interpreter.fee_params();
239
240
0
        let ready = checked
241
0
            .into_ready(gas_price, gas_costs, fee_params)
242
0
            .map_err(InterpreterError::CheckError)?;
243
244
0
        self.execute_ready_upgrade_tx(ready)
245
0
    }
246
247
    /// Executes a `Ready` transaction directly instead of letting `Transactor` construct
248
0
    pub fn execute_ready_upgrade_tx(
249
0
        &mut self,
250
0
        ready_tx: Ready<Upgrade>,
251
0
    ) -> Result<Upgrade, InterpreterError<S::DataError>> {
252
0
        self.interpreter.upgrade(ready_tx)
253
0
    }
254
255
    /// Executes `Upload` checked transactions.
256
0
    pub fn upload(
257
0
        &mut self,
258
0
        checked: Checked<Upload>,
259
0
    ) -> Result<Upload, InterpreterError<S::DataError>> {
260
0
        let gas_price = self.interpreter.gas_price();
261
0
        let gas_costs = self.interpreter.gas_costs();
262
0
        let fee_params = self.interpreter.fee_params();
263
264
0
        let ready = checked
265
0
            .into_ready(gas_price, gas_costs, fee_params)
266
0
            .map_err(InterpreterError::CheckError)?;
267
268
0
        self.execute_ready_upload_tx(ready)
269
0
    }
270
271
    /// Executes a `Ready` transaction directly instead of letting `Transactor` construct
272
0
    pub fn execute_ready_upload_tx(
273
0
        &mut self,
274
0
        ready_tx: Ready<Upload>,
275
0
    ) -> Result<Upload, InterpreterError<S::DataError>> {
276
0
        self.interpreter.upload(ready_tx)
277
0
    }
278
279
    /// Executes `Blob` checked transactions.
280
0
    pub fn blob(
281
0
        &mut self,
282
0
        checked: Checked<Blob>,
283
0
    ) -> Result<Blob, InterpreterError<S::DataError>> {
284
0
        let gas_price = self.interpreter.gas_price();
285
0
        let gas_costs = self.interpreter.gas_costs();
286
0
        let fee_params = self.interpreter.fee_params();
287
288
0
        let ready = checked
289
0
            .into_ready(gas_price, gas_costs, fee_params)
290
0
            .map_err(InterpreterError::CheckError)?;
291
292
0
        self.execute_ready_blob_tx(ready)
293
0
    }
294
295
    /// Executes a `Ready` transaction directly instead of letting `Transactor` construct
296
0
    pub fn execute_ready_blob_tx(
297
0
        &mut self,
298
0
        ready_tx: Ready<Blob>,
299
0
    ) -> Result<Blob, InterpreterError<S::DataError>> {
300
0
        self.interpreter.blob(ready_tx)
301
0
    }
302
}
303
304
impl<M, S, Tx, Ecal> Transactor<M, S, Tx, Ecal>
305
where
306
    M: Memory,
307
    S: InterpreterStorage,
308
    Tx: ExecutableTransaction,
309
    <Tx as IntoChecked>::Metadata: CheckedMetadata,
310
    Ecal: EcalHandler,
311
{
312
    /// Execute a transaction, and return the new state of the transactor
313
4.38k
    pub fn transact(&mut self, tx: Checked<Tx>) -> &mut Self {
314
4.38k
        let gas_price = self.interpreter.gas_price();
315
4.38k
        let gas_costs = self.interpreter.gas_costs();
316
4.38k
        let fee_params = self.interpreter.fee_params();
317
4.38k
318
4.38k
        match tx
319
4.38k
            .into_ready(gas_price, gas_costs, fee_params)
320
4.38k
            .map_err(InterpreterError::CheckError)
321
        {
322
4.38k
            Ok(ready_tx) => self.transact_ready_tx(ready_tx),
323
0
            Err(e) => self.handle_error(e),
324
        }
325
4.38k
    }
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB5_10TransactorNtNtNtB7_11interpreter6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_4blob8BlobBodyNtB3U_12BlobMetadataEE8transactB7_
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB5_10TransactorNtNtNtB7_11interpreter6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6create10CreateBodyNtB3U_14CreateMetadataEE8transactB7_
Line
Count
Source
313
2.19k
    pub fn transact(&mut self, tx: Checked<Tx>) -> &mut Self {
314
2.19k
        let gas_price = self.interpreter.gas_price();
315
2.19k
        let gas_costs = self.interpreter.gas_costs();
316
2.19k
        let fee_params = self.interpreter.fee_params();
317
2.19k
318
2.19k
        match tx
319
2.19k
            .into_ready(gas_price, gas_costs, fee_params)
320
2.19k
            .map_err(InterpreterError::CheckError)
321
        {
322
2.19k
            Ok(ready_tx) => self.transact_ready_tx(ready_tx),
323
0
            Err(e) => self.handle_error(e),
324
        }
325
2.19k
    }
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB5_10TransactorNtNtNtB7_11interpreter6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6script10ScriptBodyNtB3U_14ScriptMetadataEE8transactB7_
Line
Count
Source
313
2.19k
    pub fn transact(&mut self, tx: Checked<Tx>) -> &mut Self {
314
2.19k
        let gas_price = self.interpreter.gas_price();
315
2.19k
        let gas_costs = self.interpreter.gas_costs();
316
2.19k
        let fee_params = self.interpreter.fee_params();
317
2.19k
318
2.19k
        match tx
319
2.19k
            .into_ready(gas_price, gas_costs, fee_params)
320
2.19k
            .map_err(InterpreterError::CheckError)
321
        {
322
2.19k
            Ok(ready_tx) => self.transact_ready_tx(ready_tx),
323
0
            Err(e) => self.handle_error(e),
324
        }
325
2.19k
    }
326
327
    /// Transact a `Ready` transaction directly instead of letting `Transactor` construct
328
4.38k
    pub fn transact_ready_tx(&mut self, ready_tx: Ready<Tx>) -> &mut Self {
329
4.38k
        match self.interpreter.transact(ready_tx) {
330
4.38k
            Ok(s) => {
331
4.38k
                self.program_state.replace(s.into());
332
4.38k
                self.error.take();
333
4.38k
                self
334
            }
335
336
0
            Err(e) => self.handle_error(e),
337
        }
338
4.38k
    }
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB5_10TransactorNtNtNtB7_11interpreter6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_4blob8BlobBodyNtB3U_12BlobMetadataEE17transact_ready_txB7_
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB5_10TransactorNtNtNtB7_11interpreter6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6create10CreateBodyNtB3U_14CreateMetadataEE17transact_ready_txB7_
Line
Count
Source
328
2.19k
    pub fn transact_ready_tx(&mut self, ready_tx: Ready<Tx>) -> &mut Self {
329
2.19k
        match self.interpreter.transact(ready_tx) {
330
2.19k
            Ok(s) => {
331
2.19k
                self.program_state.replace(s.into());
332
2.19k
                self.error.take();
333
2.19k
                self
334
            }
335
336
0
            Err(e) => self.handle_error(e),
337
        }
338
2.19k
    }
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB5_10TransactorNtNtNtB7_11interpreter6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6script10ScriptBodyNtB3U_14ScriptMetadataEE17transact_ready_txB7_
Line
Count
Source
328
2.19k
    pub fn transact_ready_tx(&mut self, ready_tx: Ready<Tx>) -> &mut Self {
329
2.19k
        match self.interpreter.transact(ready_tx) {
330
2.19k
            Ok(s) => {
331
2.19k
                self.program_state.replace(s.into());
332
2.19k
                self.error.take();
333
2.19k
                self
334
            }
335
336
0
            Err(e) => self.handle_error(e),
337
        }
338
2.19k
    }
339
340
0
    fn handle_error(&mut self, error: InterpreterError<S::DataError>) -> &mut Self {
341
0
        self.program_state.take();
342
0
        self.error.replace(error);
343
0
        self
344
0
    }
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB5_10TransactorNtNtNtB7_11interpreter6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_4blob8BlobBodyNtB3U_12BlobMetadataEE12handle_errorB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB5_10TransactorNtNtNtB7_11interpreter6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6create10CreateBodyNtB3U_14CreateMetadataEE12handle_errorB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB5_10TransactorNtNtNtB7_11interpreter6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6script10ScriptBodyNtB3U_14ScriptMetadataEE12handle_errorB7_
345
}
346
347
impl<M, S, Tx, Ecal> From<Interpreter<M, S, Tx, Ecal>> for Transactor<M, S, Tx, Ecal>
348
where
349
    Tx: ExecutableTransaction,
350
    S: InterpreterStorage,
351
{
352
0
    fn from(interpreter: Interpreter<M, S, Tx, Ecal>) -> Self {
353
0
        let program_state = None;
354
0
        let error = None;
355
0
356
0
        Self {
357
0
            interpreter,
358
0
            program_state,
359
0
            error,
360
0
        }
361
0
    }
362
}
363
364
impl<M, S, Tx, Ecal> From<Transactor<M, S, Tx, Ecal>> for Interpreter<M, S, Tx, Ecal>
365
where
366
    Tx: ExecutableTransaction,
367
    S: InterpreterStorage,
368
{
369
0
    fn from(transactor: Transactor<M, S, Tx, Ecal>) -> Self {
370
0
        transactor.interpreter
371
0
    }
372
}
373
374
impl<M, S, Tx, Ecal> AsRef<Interpreter<M, S, Tx, Ecal>> for Transactor<M, S, Tx, Ecal>
375
where
376
    Tx: ExecutableTransaction,
377
    S: InterpreterStorage,
378
    Ecal: EcalHandler,
379
{
380
0
    fn as_ref(&self) -> &Interpreter<M, S, Tx, Ecal> {
381
0
        &self.interpreter
382
0
    }
383
}
384
385
impl<M, S, Tx, Ecal> AsRef<S> for Transactor<M, S, Tx, Ecal>
386
where
387
    Tx: ExecutableTransaction,
388
    S: InterpreterStorage,
389
{
390
0
    fn as_ref(&self) -> &S {
391
0
        self.interpreter.as_ref()
392
0
    }
393
}
394
395
impl<M, S, Tx, Ecal> AsMut<S> for Transactor<M, S, Tx, Ecal>
396
where
397
    Tx: ExecutableTransaction,
398
    S: InterpreterStorage,
399
{
400
4.38k
    fn as_mut(&mut self) -> &mut S {
401
4.38k
        self.interpreter.as_mut()
402
4.38k
    }
_RNvXs7_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB5_10TransactorNtNtNtB7_11interpreter6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6script10ScriptBodyNtB3U_14ScriptMetadataEEINtNtCsd3UI3IJrzMw_4core7convert5AsMutB1G_E6as_mutB7_
Line
Count
Source
400
2.19k
    fn as_mut(&mut self) -> &mut S {
401
2.19k
        self.interpreter.as_mut()
402
2.19k
    }
Unexecuted instantiation: _RNvXs7_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB5_10TransactorNtNtNtB7_11interpreter6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_4blob8BlobBodyNtB3U_12BlobMetadataEEINtNtCsd3UI3IJrzMw_4core7convert5AsMutB1G_E6as_mutB7_
_RNvXs7_NtCsg6P9hFxt0iW_7fuel_vm10transactorINtB5_10TransactorNtNtNtB7_11interpreter6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6create10CreateBodyNtB3U_14CreateMetadataEEINtNtCsd3UI3IJrzMw_4core7convert5AsMutB1G_E6as_mutB7_
Line
Count
Source
400
2.19k
    fn as_mut(&mut self) -> &mut S {
401
2.19k
        self.interpreter.as_mut()
402
2.19k
    }
403
}
404
405
#[cfg(feature = "test-helpers")]
406
impl<S, Tx, Ecal> Default for Transactor<MemoryInstance, S, Tx, Ecal>
407
where
408
    S: InterpreterStorage + Default,
409
    Tx: ExecutableTransaction,
410
    Ecal: EcalHandler + Default,
411
{
412
0
    fn default() -> Self {
413
0
        Self::new(
414
0
            MemoryInstance::new(),
415
0
            S::default(),
416
0
            InterpreterParams::default(),
417
0
        )
418
0
    }
419
}
/home/marten/fuel/fuel-vm/fuel-vm/src/checked_transaction.rs
Line
Count
Source
1
//! A checked transaction is type-wrapper for transactions which have been checked.
2
//! It is impossible to construct a checked transaction without performing necessary
3
//! checks.
4
//!
5
//! This allows the VM to accept transactions with metadata that have been already
6
//! verified upstream.
7
8
#![allow(non_upper_case_globals)]
9
10
use fuel_tx::{
11
    Create,
12
    Mint,
13
    Script,
14
    Transaction,
15
    ValidityError,
16
};
17
use fuel_types::{
18
    BlockHeight,
19
    ChainId,
20
};
21
22
use alloc::{
23
    boxed::Box,
24
    vec::Vec,
25
};
26
use core::{
27
    borrow::Borrow,
28
    fmt::Debug,
29
    future::Future,
30
};
31
use fuel_tx::{
32
    field::MaxFeeLimit,
33
    ConsensusParameters,
34
};
35
36
mod balances;
37
#[cfg(feature = "test-helpers")]
38
pub mod builder;
39
pub mod types;
40
41
pub use types::*;
42
43
use crate::{
44
    error::PredicateVerificationFailed,
45
    interpreter::{
46
        Memory,
47
        MemoryInstance,
48
    },
49
    pool::VmMemoryPool,
50
    prelude::*,
51
    storage::predicate::{
52
        EmptyStorage,
53
        PredicateStorageProvider,
54
        PredicateStorageRequirements,
55
    },
56
};
57
58
bitflags::bitflags! {
59
    /// Possible types of transaction checks.
60
    #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
61
    pub struct Checks: u32 {
62
        /// Basic checks defined in the specification for each transaction:
63
        /// https://github.com/FuelLabs/fuel-specs/blob/master/src/tx-format/transaction.md#transaction
64
        /// Also ensures that malleable fields are zeroed.
65
        const Basic         = 0b00000001;
66
        /// Check that signature in the transactions are valid.
67
        const Signatures    = 0b00000010;
68
        /// Check that predicate in the transactions are valid.
69
        const Predicates    = 0b00000100;
70
    }
71
}
72
73
impl core::fmt::Display for Checks {
74
0
    fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
75
0
        write!(f, "{:032b}", self.bits())
76
0
    }
77
}
78
79
/// The type describes that the inner transaction was already checked.
80
///
81
/// All fields are private, and there is no constructor, so it is impossible to create the
82
/// instance of `Checked` outside the `fuel-tx` crate.
83
///
84
/// The inner data is immutable to prevent modification to invalidate the checking.
85
///
86
/// If you need to modify an inner state, you need to get inner values
87
/// (via the `Into<(Tx, Tx ::Metadata)>` trait), modify them and check again.
88
///
89
/// # Dev note: Avoid serde serialization of this type.
90
///
91
/// Since checked tx would need to be re-validated on deserialization anyways,
92
/// it's cleaner to redo the tx check.
93
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
94
pub struct Checked<Tx: IntoChecked> {
95
    transaction: Tx,
96
    metadata: Tx::Metadata,
97
    checks_bitmask: Checks,
98
}
99
100
impl<Tx: IntoChecked> Checked<Tx> {
101
8.77k
    fn new(transaction: Tx, metadata: Tx::Metadata, checks_bitmask: Checks) -> Self {
102
8.77k
        Checked {
103
8.77k
            transaction,
104
8.77k
            metadata,
105
8.77k
            checks_bitmask,
106
8.77k
        }
107
8.77k
    }
_RNvMs_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB4_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6create10CreateBodyNtB2C_14CreateMetadataEE3newB6_
Line
Count
Source
101
4.38k
    fn new(transaction: Tx, metadata: Tx::Metadata, checks_bitmask: Checks) -> Self {
102
4.38k
        Checked {
103
4.38k
            transaction,
104
4.38k
            metadata,
105
4.38k
            checks_bitmask,
106
4.38k
        }
107
4.38k
    }
Unexecuted instantiation: _RNvMs_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB4_7CheckedNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mint4MintE3newB6_
_RNvMs_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB4_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2C_14ScriptMetadataEE3newB6_
Line
Count
Source
101
4.38k
    fn new(transaction: Tx, metadata: Tx::Metadata, checks_bitmask: Checks) -> Self {
102
4.38k
        Checked {
103
4.38k
            transaction,
104
4.38k
            metadata,
105
4.38k
            checks_bitmask,
106
4.38k
        }
107
4.38k
    }
Unexecuted instantiation: _RNvMs_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB4_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_7upgrade11UpgradeBodyNtB2C_15UpgradeMetadataEE3newB6_
Unexecuted instantiation: _RNvMs_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB4_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6upload10UploadBodyNtB2C_14UploadMetadataEE3newB6_
Unexecuted instantiation: _RNvMs_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB4_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_4blob8BlobBodyNtB2C_12BlobMetadataEE3newB6_
Unexecuted instantiation: _RNvMs_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB4_7CheckedNtNtCseSMGV7FMBK4_7fuel_tx11transaction11TransactionE3newB6_
108
109
4.38k
    pub(crate) fn basic(transaction: Tx, metadata: Tx::Metadata) -> Self {
110
4.38k
        Checked::new(transaction, metadata, Checks::Basic)
111
4.38k
    }
_RNvMs_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB4_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6create10CreateBodyNtB2C_14CreateMetadataEE5basicB6_
Line
Count
Source
109
2.19k
    pub(crate) fn basic(transaction: Tx, metadata: Tx::Metadata) -> Self {
110
2.19k
        Checked::new(transaction, metadata, Checks::Basic)
111
2.19k
    }
Unexecuted instantiation: _RNvMs_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB4_7CheckedNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mint4MintE5basicB6_
_RNvMs_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB4_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2C_14ScriptMetadataEE5basicB6_
Line
Count
Source
109
2.19k
    pub(crate) fn basic(transaction: Tx, metadata: Tx::Metadata) -> Self {
110
2.19k
        Checked::new(transaction, metadata, Checks::Basic)
111
2.19k
    }
Unexecuted instantiation: _RNvMs_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB4_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_7upgrade11UpgradeBodyNtB2C_15UpgradeMetadataEE5basicB6_
Unexecuted instantiation: _RNvMs_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB4_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6upload10UploadBodyNtB2C_14UploadMetadataEE5basicB6_
Unexecuted instantiation: _RNvMs_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB4_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_4blob8BlobBodyNtB2C_12BlobMetadataEE5basicB6_
Unexecuted instantiation: _RNvMs_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB4_7CheckedNtNtCseSMGV7FMBK4_7fuel_tx11transaction11TransactionE5basicB6_
112
113
    /// Returns reference on inner transaction.
114
4.38k
    pub fn transaction(&self) -> &Tx {
115
4.38k
        &self.transaction
116
4.38k
    }
Unexecuted instantiation: _RNvMs_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB4_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_4blob8BlobBodyNtB2C_12BlobMetadataEE11transactionB6_
_RNvMs_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB4_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6create10CreateBodyNtB2C_14CreateMetadataEE11transactionB6_
Line
Count
Source
114
2.19k
    pub fn transaction(&self) -> &Tx {
115
2.19k
        &self.transaction
116
2.19k
    }
_RNvMs_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB4_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2C_14ScriptMetadataEE11transactionB6_
Line
Count
Source
114
2.19k
    pub fn transaction(&self) -> &Tx {
115
2.19k
        &self.transaction
116
2.19k
    }
Unexecuted instantiation: _RNvMs_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB4_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6upload10UploadBodyNtB2C_14UploadMetadataEE11transactionB6_
Unexecuted instantiation: _RNvMs_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB4_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_7upgrade11UpgradeBodyNtB2C_15UpgradeMetadataEE11transactionB6_
117
118
    /// Returns the metadata generated during the check for transaction.
119
0
    pub fn metadata(&self) -> &Tx::Metadata {
120
0
        &self.metadata
121
0
    }
122
123
    /// Returns the bitmask of all passed checks.
124
0
    pub fn checks(&self) -> &Checks {
125
0
        &self.checks_bitmask
126
0
    }
127
128
    /// Performs check of signatures, if not yet done.
129
4.38k
    pub fn check_signatures(mut self, chain_id: &ChainId) -> Result<Self, CheckError> {
130
4.38k
        if !self.checks_bitmask.contains(Checks::Signatures) {
131
4.38k
            self.transaction.check_signatures(chain_id)?;
132
4.38k
            self.checks_bitmask.insert(Checks::Signatures);
133
0
        }
134
4.38k
        Ok(self)
135
4.38k
    }
Unexecuted instantiation: _RNvMs_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB4_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_4blob8BlobBodyNtB2C_12BlobMetadataEE16check_signaturesB6_
_RNvMs_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB4_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6create10CreateBodyNtB2C_14CreateMetadataEE16check_signaturesB6_
Line
Count
Source
129
2.19k
    pub fn check_signatures(mut self, chain_id: &ChainId) -> Result<Self, CheckError> {
130
2.19k
        if !self.checks_bitmask.contains(Checks::Signatures) {
131
2.19k
            self.transaction.check_signatures(chain_id)?;
132
2.19k
            self.checks_bitmask.insert(Checks::Signatures);
133
0
        }
134
2.19k
        Ok(self)
135
2.19k
    }
_RNvMs_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB4_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6script10ScriptBodyNtB2C_14ScriptMetadataEE16check_signaturesB6_
Line
Count
Source
129
2.19k
    pub fn check_signatures(mut self, chain_id: &ChainId) -> Result<Self, CheckError> {
130
2.19k
        if !self.checks_bitmask.contains(Checks::Signatures) {
131
2.19k
            self.transaction.check_signatures(chain_id)?;
132
2.19k
            self.checks_bitmask.insert(Checks::Signatures);
133
0
        }
134
2.19k
        Ok(self)
135
2.19k
    }
Unexecuted instantiation: _RNvMs_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB4_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_6upload10UploadBodyNtB2C_14UploadMetadataEE16check_signaturesB6_
Unexecuted instantiation: _RNvMs_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB4_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB16_7upgrade11UpgradeBodyNtB2C_15UpgradeMetadataEE16check_signaturesB6_
Unexecuted instantiation: _RNvMs_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB4_7CheckedNtNtCseSMGV7FMBK4_7fuel_tx11transaction11TransactionE16check_signaturesB6_
Unexecuted instantiation: _RNvMs_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB4_7CheckedNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mint4MintE16check_signaturesB6_
136
}
137
138
/// Transaction that has checks for all dynamic values, e.g. `gas_price`
139
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
140
pub struct Ready<Tx: IntoChecked> {
141
    gas_price: Word,
142
    transaction: Tx,
143
    metadata: Tx::Metadata,
144
    checks_bitmask: Checks,
145
}
146
147
impl<Tx: IntoChecked> Ready<Tx> {
148
    /// Consume and decompose components of the `Immutable` transaction.
149
4.38k
    pub fn decompose(self) -> (Word, Checked<Tx>) {
150
4.38k
        let Ready {
151
4.38k
            gas_price,
152
4.38k
            transaction,
153
4.38k
            metadata,
154
4.38k
            checks_bitmask,
155
4.38k
        } = self;
156
4.38k
        let checked = Checked::new(transaction, metadata, checks_bitmask);
157
4.38k
        (gas_price, checked)
158
4.38k
    }
_RNvMs0_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB5_5ReadyINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB15_6create10CreateBodyNtB2B_14CreateMetadataEE9decomposeB7_
Line
Count
Source
149
2.19k
    pub fn decompose(self) -> (Word, Checked<Tx>) {
150
2.19k
        let Ready {
151
2.19k
            gas_price,
152
2.19k
            transaction,
153
2.19k
            metadata,
154
2.19k
            checks_bitmask,
155
2.19k
        } = self;
156
2.19k
        let checked = Checked::new(transaction, metadata, checks_bitmask);
157
2.19k
        (gas_price, checked)
158
2.19k
    }
Unexecuted instantiation: _RNvMs0_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB5_5ReadyINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB15_4blob8BlobBodyNtB2B_12BlobMetadataEE9decomposeB7_
_RNvMs0_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB5_5ReadyINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB15_6script10ScriptBodyNtB2B_14ScriptMetadataEE9decomposeB7_
Line
Count
Source
149
2.19k
    pub fn decompose(self) -> (Word, Checked<Tx>) {
150
2.19k
        let Ready {
151
2.19k
            gas_price,
152
2.19k
            transaction,
153
2.19k
            metadata,
154
2.19k
            checks_bitmask,
155
2.19k
        } = self;
156
2.19k
        let checked = Checked::new(transaction, metadata, checks_bitmask);
157
2.19k
        (gas_price, checked)
158
2.19k
    }
159
160
    /// Getter for `gas_price` field
161
4.38k
    pub fn gas_price(&self) -> Word {
162
4.38k
        self.gas_price
163
4.38k
    }
Unexecuted instantiation: _RNvMs0_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB5_5ReadyINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB15_4blob8BlobBodyNtB2B_12BlobMetadataEE9gas_priceB7_
_RNvMs0_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB5_5ReadyINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB15_6create10CreateBodyNtB2B_14CreateMetadataEE9gas_priceB7_
Line
Count
Source
161
2.19k
    pub fn gas_price(&self) -> Word {
162
2.19k
        self.gas_price
163
2.19k
    }
_RNvMs0_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB5_5ReadyINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB15_6script10ScriptBodyNtB2B_14ScriptMetadataEE9gas_priceB7_
Line
Count
Source
161
2.19k
    pub fn gas_price(&self) -> Word {
162
2.19k
        self.gas_price
163
2.19k
    }
164
}
165
166
#[cfg(feature = "test-helpers")]
167
impl<Tx: IntoChecked> Checked<Tx> {
168
    /// Convert `Checked` into `Ready` without performing final checks.
169
0
    pub fn test_into_ready(self) -> Ready<Tx> {
170
0
        let Checked {
171
0
            transaction,
172
0
            metadata,
173
0
            checks_bitmask,
174
0
        } = self;
175
0
        Ready {
176
0
            gas_price: 0,
177
0
            transaction,
178
0
            metadata,
179
0
            checks_bitmask,
180
0
        }
181
0
    }
182
}
183
184
impl<Tx: IntoChecked + Chargeable> Checked<Tx> {
185
    /// Run final checks on `Checked` using dynamic values, e.g. `gas_price`
186
4.38k
    pub fn into_ready(
187
4.38k
        self,
188
4.38k
        gas_price: Word,
189
4.38k
        gas_costs: &GasCosts,
190
4.38k
        fee_parameters: &FeeParameters,
191
4.38k
    ) -> Result<Ready<Tx>, CheckError> {
192
4.38k
        let Checked {
193
4.38k
            transaction,
194
4.38k
            metadata,
195
4.38k
            checks_bitmask,
196
4.38k
        } = self;
197
4.38k
        let fee = TransactionFee::checked_from_tx(
198
4.38k
            gas_costs,
199
4.38k
            fee_parameters,
200
4.38k
            &transaction,
201
4.38k
            gas_price,
202
4.38k
        )
203
4.38k
        .ok_or(CheckError::Validity(ValidityError::BalanceOverflow))?;
204
205
4.38k
        let max_fee_from_policies = transaction.max_fee_limit();
206
4.38k
        let max_fee_from_gas_price = fee.max_fee();
207
4.38k
208
4.38k
        if max_fee_from_gas_price > max_fee_from_policies {
209
0
            Err(CheckError::InsufficientMaxFee {
210
0
                max_fee_from_policies,
211
0
                max_fee_from_gas_price,
212
0
            })
213
        } else {
214
4.38k
            Ok(Ready {
215
4.38k
                gas_price,
216
4.38k
                transaction,
217
4.38k
                metadata,
218
4.38k
                checks_bitmask,
219
4.38k
            })
220
        }
221
4.38k
    }
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB5_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB17_4blob8BlobBodyNtB2D_12BlobMetadataEE10into_readyB7_
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB5_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB17_6create10CreateBodyNtB2D_14CreateMetadataEE10into_readyB7_
Line
Count
Source
186
2.19k
    pub fn into_ready(
187
2.19k
        self,
188
2.19k
        gas_price: Word,
189
2.19k
        gas_costs: &GasCosts,
190
2.19k
        fee_parameters: &FeeParameters,
191
2.19k
    ) -> Result<Ready<Tx>, CheckError> {
192
2.19k
        let Checked {
193
2.19k
            transaction,
194
2.19k
            metadata,
195
2.19k
            checks_bitmask,
196
2.19k
        } = self;
197
2.19k
        let fee = TransactionFee::checked_from_tx(
198
2.19k
            gas_costs,
199
2.19k
            fee_parameters,
200
2.19k
            &transaction,
201
2.19k
            gas_price,
202
2.19k
        )
203
2.19k
        .ok_or(CheckError::Validity(ValidityError::BalanceOverflow))?;
204
205
2.19k
        let max_fee_from_policies = transaction.max_fee_limit();
206
2.19k
        let max_fee_from_gas_price = fee.max_fee();
207
2.19k
208
2.19k
        if max_fee_from_gas_price > max_fee_from_policies {
209
0
            Err(CheckError::InsufficientMaxFee {
210
0
                max_fee_from_policies,
211
0
                max_fee_from_gas_price,
212
0
            })
213
        } else {
214
2.19k
            Ok(Ready {
215
2.19k
                gas_price,
216
2.19k
                transaction,
217
2.19k
                metadata,
218
2.19k
                checks_bitmask,
219
2.19k
            })
220
        }
221
2.19k
    }
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB5_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB17_6script10ScriptBodyNtB2D_14ScriptMetadataEE10into_readyB7_
Line
Count
Source
186
2.19k
    pub fn into_ready(
187
2.19k
        self,
188
2.19k
        gas_price: Word,
189
2.19k
        gas_costs: &GasCosts,
190
2.19k
        fee_parameters: &FeeParameters,
191
2.19k
    ) -> Result<Ready<Tx>, CheckError> {
192
2.19k
        let Checked {
193
2.19k
            transaction,
194
2.19k
            metadata,
195
2.19k
            checks_bitmask,
196
2.19k
        } = self;
197
2.19k
        let fee = TransactionFee::checked_from_tx(
198
2.19k
            gas_costs,
199
2.19k
            fee_parameters,
200
2.19k
            &transaction,
201
2.19k
            gas_price,
202
2.19k
        )
203
2.19k
        .ok_or(CheckError::Validity(ValidityError::BalanceOverflow))?;
204
205
2.19k
        let max_fee_from_policies = transaction.max_fee_limit();
206
2.19k
        let max_fee_from_gas_price = fee.max_fee();
207
2.19k
208
2.19k
        if max_fee_from_gas_price > max_fee_from_policies {
209
0
            Err(CheckError::InsufficientMaxFee {
210
0
                max_fee_from_policies,
211
0
                max_fee_from_gas_price,
212
0
            })
213
        } else {
214
2.19k
            Ok(Ready {
215
2.19k
                gas_price,
216
2.19k
                transaction,
217
2.19k
                metadata,
218
2.19k
                checks_bitmask,
219
2.19k
            })
220
        }
221
2.19k
    }
222
}
223
224
impl<Tx: IntoChecked + UniqueIdentifier> Checked<Tx> {
225
    /// Returns the transaction ID from the computed metadata
226
0
    pub fn id(&self) -> TxId {
227
0
        self.transaction
228
0
            .cached_id()
229
0
            .expect("Transaction metadata should be computed for checked transactions")
230
0
    }
231
}
232
233
#[cfg(feature = "test-helpers")]
234
impl<Tx: IntoChecked + Default> Default for Checked<Tx>
235
where
236
    Checked<Tx>: CheckPredicates,
237
{
238
0
    fn default() -> Self {
239
0
        Tx::default()
240
0
            .into_checked(Default::default(), &ConsensusParameters::standard())
241
0
            .expect("default tx should produce a valid fully checked transaction")
242
0
    }
243
}
244
245
impl<Tx: IntoChecked> From<Checked<Tx>> for (Tx, Tx::Metadata) {
246
4.38k
    fn from(checked: Checked<Tx>) -> Self {
247
4.38k
        let Checked {
248
4.38k
            transaction,
249
4.38k
            metadata,
250
4.38k
            ..
251
4.38k
        } = checked;
252
4.38k
253
4.38k
        (transaction, metadata)
254
4.38k
    }
_RNvXs5_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionTINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtBU_6script10ScriptBodyNtB2q_14ScriptMetadataENtNtNtB5_5types6script15CheckedMetadataEINtNtCsd3UI3IJrzMw_4core7convert4FromINtB5_7CheckedBP_EE4fromB7_
Line
Count
Source
246
2.19k
    fn from(checked: Checked<Tx>) -> Self {
247
2.19k
        let Checked {
248
2.19k
            transaction,
249
2.19k
            metadata,
250
2.19k
            ..
251
2.19k
        } = checked;
252
2.19k
253
2.19k
        (transaction, metadata)
254
2.19k
    }
_RNvXs5_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionTINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtBU_6create10CreateBodyNtB2q_14CreateMetadataENtNtNtB5_5types6create15CheckedMetadataEINtNtCsd3UI3IJrzMw_4core7convert4FromINtB5_7CheckedBP_EE4fromB7_
Line
Count
Source
246
2.19k
    fn from(checked: Checked<Tx>) -> Self {
247
2.19k
        let Checked {
248
2.19k
            transaction,
249
2.19k
            metadata,
250
2.19k
            ..
251
2.19k
        } = checked;
252
2.19k
253
2.19k
        (transaction, metadata)
254
2.19k
    }
Unexecuted instantiation: _RNvXs5_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionTNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mint4MintuEINtNtCsd3UI3IJrzMw_4core7convert4FromINtB5_7CheckedBP_EE4fromB7_
Unexecuted instantiation: _RNvXs5_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionTINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtBU_7upgrade11UpgradeBodyNtB2q_15UpgradeMetadataENtNtNtB5_5types7upgrade15CheckedMetadataEINtNtCsd3UI3IJrzMw_4core7convert4FromINtB5_7CheckedBP_EE4fromB7_
Unexecuted instantiation: _RNvXs5_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionTINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtBU_6upload10UploadBodyNtB2q_14UploadMetadataENtNtNtB5_5types6upload15CheckedMetadataEINtNtCsd3UI3IJrzMw_4core7convert4FromINtB5_7CheckedBP_EE4fromB7_
Unexecuted instantiation: _RNvXs5_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionTINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtBU_4blob8BlobBodyNtB2q_12BlobMetadataENtNtNtB5_5types4blob15CheckedMetadataEINtNtCsd3UI3IJrzMw_4core7convert4FromINtB5_7CheckedBP_EE4fromB7_
255
}
256
257
impl<Tx: IntoChecked> AsRef<Tx> for Checked<Tx> {
258
0
    fn as_ref(&self) -> &Tx {
259
0
        &self.transaction
260
0
    }
261
}
262
263
#[cfg(feature = "test-helpers")]
264
impl<Tx: IntoChecked> AsMut<Tx> for Checked<Tx> {
265
0
    fn as_mut(&mut self) -> &mut Tx {
266
0
        &mut self.transaction
267
0
    }
268
}
269
270
impl<Tx: IntoChecked> Borrow<Tx> for Checked<Tx> {
271
0
    fn borrow(&self) -> &Tx {
272
0
        self.transaction()
273
0
    }
274
}
275
276
/// The error can occur when transforming transactions into the `Checked` type.
277
#[derive(Debug, Clone, PartialEq)]
278
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
279
pub enum CheckError {
280
    /// The transaction doesn't pass validity rules.
281
    Validity(ValidityError),
282
    /// The predicate verification failed.
283
    PredicateVerificationFailed(PredicateVerificationFailed),
284
    /// The max fee used during checking was lower than calculated during `Immutable`
285
    /// conversion
286
    InsufficientMaxFee {
287
        /// The max fee from the policies defined by the user.
288
        max_fee_from_policies: Word,
289
        /// The max fee calculated from the gas price and gas used by the transaction.
290
        max_fee_from_gas_price: Word,
291
    },
292
}
293
294
/// Performs checks for a transaction
295
pub trait IntoChecked: FormatValidityChecks + Sized {
296
    /// Metadata produced during the check.
297
    type Metadata: Sized;
298
299
    /// Returns transaction that passed all `Checks`.
300
2.19k
    fn into_checked(
301
2.19k
        self,
302
2.19k
        block_height: BlockHeight,
303
2.19k
        consensus_params: &ConsensusParameters,
304
2.19k
    ) -> Result<Checked<Self>, CheckError>
305
2.19k
    where
306
2.19k
        Checked<Self>: CheckPredicates,
307
2.19k
    {
308
2.19k
        self.into_checked_reusable_memory(
309
2.19k
            block_height,
310
2.19k
            consensus_params,
311
2.19k
            MemoryInstance::new(),
312
2.19k
            &EmptyStorage,
313
2.19k
        )
314
2.19k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction11IntoChecked12into_checkedB2l_
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction11IntoChecked12into_checkedB2s_
Line
Count
Source
300
2.19k
    fn into_checked(
301
2.19k
        self,
302
2.19k
        block_height: BlockHeight,
303
2.19k
        consensus_params: &ConsensusParameters,
304
2.19k
    ) -> Result<Checked<Self>, CheckError>
305
2.19k
    where
306
2.19k
        Checked<Self>: CheckPredicates,
307
2.19k
    {
308
2.19k
        self.into_checked_reusable_memory(
309
2.19k
            block_height,
310
2.19k
            consensus_params,
311
2.19k
            MemoryInstance::new(),
312
2.19k
            &EmptyStorage,
313
2.19k
        )
314
2.19k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction11IntoChecked12into_checkedB2s_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1D_14UploadMetadataENtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction11IntoChecked12into_checkedB2s_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction11IntoChecked12into_checkedB2v_
Unexecuted instantiation: _RNvYNtNtCseSMGV7FMBK4_7fuel_tx11transaction11TransactionNtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction11IntoChecked12into_checkedBW_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mint4MintNtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction11IntoChecked12into_checkedB13_
315
316
    /// Returns transaction that passed all `Checks` accepting reusable memory
317
    /// to run predicates.
318
4.38k
    fn into_checked_reusable_memory(
319
4.38k
        self,
320
4.38k
        block_height: BlockHeight,
321
4.38k
        consensus_params: &ConsensusParameters,
322
4.38k
        memory: impl Memory,
323
4.38k
        storage: &impl PredicateStorageRequirements,
324
4.38k
    ) -> Result<Checked<Self>, CheckError>
325
4.38k
    where
326
4.38k
        Checked<Self>: CheckPredicates,
327
4.38k
    {
328
4.38k
        let check_predicate_params = consensus_params.into();
329
4.38k
        self.into_checked_basic(block_height, consensus_params)?
330
4.38k
            .check_signatures(&consensus_params.chain_id())?
331
4.38k
            .check_predicates(&check_predicate_params, memory, storage)
332
4.38k
    }
Unexecuted instantiation: _RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB8_4blob8BlobBodyNtB1E_12BlobMetadataENtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction11IntoChecked28into_checked_reusable_memoryNtNtNtB2m_11interpreter6memory14MemoryInstanceNtNtNtB2m_7storage9predicate12EmptyStorageEB2m_
_RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB8_6create10CreateBodyNtB1E_14CreateMetadataENtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction11IntoChecked28into_checked_reusable_memoryNtNtNtB2t_11interpreter6memory14MemoryInstanceNtNtNtB2t_7storage9predicate12EmptyStorageEB2t_
Line
Count
Source
318
2.19k
    fn into_checked_reusable_memory(
319
2.19k
        self,
320
2.19k
        block_height: BlockHeight,
321
2.19k
        consensus_params: &ConsensusParameters,
322
2.19k
        memory: impl Memory,
323
2.19k
        storage: &impl PredicateStorageRequirements,
324
2.19k
    ) -> Result<Checked<Self>, CheckError>
325
2.19k
    where
326
2.19k
        Checked<Self>: CheckPredicates,
327
2.19k
    {
328
2.19k
        let check_predicate_params = consensus_params.into();
329
2.19k
        self.into_checked_basic(block_height, consensus_params)?
330
2.19k
            .check_signatures(&consensus_params.chain_id())?
331
2.19k
            .check_predicates(&check_predicate_params, memory, storage)
332
2.19k
    }
_RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB8_6script10ScriptBodyNtB1E_14ScriptMetadataENtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction11IntoChecked28into_checked_reusable_memoryNtNtNtB2t_11interpreter6memory14MemoryInstanceNtNtNtB2t_7storage6memory13MemoryStorageEB2t_
Line
Count
Source
318
2.19k
    fn into_checked_reusable_memory(
319
2.19k
        self,
320
2.19k
        block_height: BlockHeight,
321
2.19k
        consensus_params: &ConsensusParameters,
322
2.19k
        memory: impl Memory,
323
2.19k
        storage: &impl PredicateStorageRequirements,
324
2.19k
    ) -> Result<Checked<Self>, CheckError>
325
2.19k
    where
326
2.19k
        Checked<Self>: CheckPredicates,
327
2.19k
    {
328
2.19k
        let check_predicate_params = consensus_params.into();
329
2.19k
        self.into_checked_basic(block_height, consensus_params)?
330
2.19k
            .check_signatures(&consensus_params.chain_id())?
331
2.19k
            .check_predicates(&check_predicate_params, memory, storage)
332
2.19k
    }
Unexecuted instantiation: _RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB8_6script10ScriptBodyNtB1E_14ScriptMetadataENtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction11IntoChecked28into_checked_reusable_memoryNtNtNtB2t_11interpreter6memory14MemoryInstanceNtNtNtB2t_7storage9predicate12EmptyStorageEB2t_
Unexecuted instantiation: _RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB8_6upload10UploadBodyNtB1E_14UploadMetadataENtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction11IntoChecked28into_checked_reusable_memoryNtNtNtB2t_11interpreter6memory14MemoryInstanceNtNtNtB2t_7storage9predicate12EmptyStorageEB2t_
Unexecuted instantiation: _RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB8_7upgrade11UpgradeBodyNtB1E_15UpgradeMetadataENtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction11IntoChecked28into_checked_reusable_memoryNtNtNtB2w_11interpreter6memory14MemoryInstanceNtNtNtB2w_7storage9predicate12EmptyStorageEB2w_
Unexecuted instantiation: _RINvYNtNtCseSMGV7FMBK4_7fuel_tx11transaction11TransactionNtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction11IntoChecked28into_checked_reusable_memoryNtNtNtBX_11interpreter6memory14MemoryInstanceNtNtNtBX_7storage9predicate12EmptyStorageEBX_
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mint4MintNtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction11IntoChecked28into_checked_reusable_memoryNtNtNtB14_11interpreter6memory14MemoryInstanceNtNtNtB14_7storage9predicate12EmptyStorageEB14_
333
334
    /// Returns transaction that passed only `Checks::Basic`.
335
    fn into_checked_basic(
336
        self,
337
        block_height: BlockHeight,
338
        consensus_params: &ConsensusParameters,
339
    ) -> Result<Checked<Self>, CheckError>;
340
}
341
342
/// The parameters needed for checking a predicate
343
#[derive(Debug, Clone)]
344
pub struct CheckPredicateParams {
345
    /// Gas costs for opcodes
346
    pub gas_costs: GasCosts,
347
    /// Chain ID
348
    pub chain_id: ChainId,
349
    /// Maximum gas per predicate
350
    pub max_gas_per_predicate: u64,
351
    /// Maximum gas per transaction
352
    pub max_gas_per_tx: u64,
353
    /// Maximum number of inputs
354
    pub max_inputs: u16,
355
    /// Maximum size of the contract in bytes
356
    pub contract_max_size: u64,
357
    /// Maximum length of the message data
358
    pub max_message_data_length: u64,
359
    /// Offset of the transaction data in the memory
360
    pub tx_offset: usize,
361
    /// Fee parameters
362
    pub fee_params: FeeParameters,
363
    /// Base Asset ID
364
    pub base_asset_id: AssetId,
365
}
366
367
#[cfg(feature = "test-helpers")]
368
impl Default for CheckPredicateParams {
369
0
    fn default() -> Self {
370
0
        CheckPredicateParams::from(&ConsensusParameters::standard())
371
0
    }
372
}
373
374
impl From<ConsensusParameters> for CheckPredicateParams {
375
0
    fn from(value: ConsensusParameters) -> Self {
376
0
        CheckPredicateParams::from(&value)
377
0
    }
378
}
379
380
impl From<&ConsensusParameters> for CheckPredicateParams {
381
8.77k
    fn from(value: &ConsensusParameters) -> Self {
382
8.77k
        CheckPredicateParams {
383
8.77k
            gas_costs: value.gas_costs().clone(),
384
8.77k
            chain_id: value.chain_id(),
385
8.77k
            max_gas_per_predicate: value.predicate_params().max_gas_per_predicate(),
386
8.77k
            max_gas_per_tx: value.tx_params().max_gas_per_tx(),
387
8.77k
            max_inputs: value.tx_params().max_inputs(),
388
8.77k
            contract_max_size: value.contract_params().contract_max_size(),
389
8.77k
            max_message_data_length: value.predicate_params().max_message_data_length(),
390
8.77k
            tx_offset: value.tx_params().tx_offset(),
391
8.77k
            fee_params: *(value.fee_params()),
392
8.77k
            base_asset_id: *value.base_asset_id(),
393
8.77k
        }
394
8.77k
    }
395
}
396
397
/// Provides predicate verification functionality for the transaction.
398
#[async_trait::async_trait]
399
pub trait CheckPredicates: Sized {
400
    /// Performs predicates verification of the transaction.
401
    fn check_predicates(
402
        self,
403
        params: &CheckPredicateParams,
404
        memory: impl Memory,
405
        storage: &impl PredicateStorageRequirements,
406
    ) -> Result<Self, CheckError>;
407
408
    /// Performs predicates verification of the transaction in parallel.
409
    async fn check_predicates_async<E: ParallelExecutor>(
410
        self,
411
        params: &CheckPredicateParams,
412
        pool: &impl VmMemoryPool,
413
        storage: &impl PredicateStorageProvider,
414
    ) -> Result<Self, CheckError>;
415
}
416
417
/// Provides predicate estimation functionality for the transaction.
418
#[async_trait::async_trait]
419
pub trait EstimatePredicates: Sized {
420
    /// Estimates predicates of the transaction.
421
    fn estimate_predicates(
422
        &mut self,
423
        params: &CheckPredicateParams,
424
        memory: impl Memory,
425
        storage: &impl PredicateStorageRequirements,
426
    ) -> Result<(), CheckError>;
427
428
    /// Estimates predicates of the transaction in parallel.
429
    async fn estimate_predicates_async<E: ParallelExecutor>(
430
        &mut self,
431
        params: &CheckPredicateParams,
432
        pool: &impl VmMemoryPool,
433
        storage: &impl PredicateStorageProvider,
434
    ) -> Result<(), CheckError>;
435
}
436
437
/// Executes CPU-heavy tasks in parallel.
438
#[async_trait::async_trait]
439
pub trait ParallelExecutor {
440
    /// Future created from a CPU-heavy task.
441
    type Task: Future + Send + 'static;
442
443
    /// Creates a Future from a CPU-heavy task.
444
    fn create_task<F>(func: F) -> Self::Task
445
    where
446
        F: FnOnce() -> Result<(Word, usize), PredicateVerificationFailed>
447
            + Send
448
            + 'static;
449
450
    /// Executes tasks created by `create_task` in parallel.
451
    async fn execute_tasks(
452
        futures: Vec<Self::Task>,
453
    ) -> Vec<Result<(Word, usize), PredicateVerificationFailed>>;
454
}
455
456
#[async_trait::async_trait]
457
impl<Tx> CheckPredicates for Checked<Tx>
458
where
459
    Tx: ExecutableTransaction + Send + Sync + 'static,
460
    <Tx as IntoChecked>::Metadata: crate::interpreter::CheckedMetadata + Send + Sync,
461
{
462
4.38k
    fn check_predicates(
463
4.38k
        mut self,
464
4.38k
        params: &CheckPredicateParams,
465
4.38k
        memory: impl Memory,
466
4.38k
        storage: &impl PredicateStorageRequirements,
467
4.38k
    ) -> Result<Self, CheckError> {
468
4.38k
        if !self.checks_bitmask.contains(Checks::Predicates) {
469
4.38k
            predicates::check_predicates(&self, params, memory, storage)?;
470
4.38k
            self.checks_bitmask.insert(Checks::Predicates);
471
0
        }
472
4.38k
        Ok(self)
473
4.38k
    }
Unexecuted instantiation: _RINvXsU_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB6_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB18_4blob8BlobBodyNtB2E_12BlobMetadataEENtB6_15CheckPredicates16check_predicatesNtNtNtB8_11interpreter6memory14MemoryInstanceNtNtNtB8_7storage9predicate12EmptyStorageEB8_
_RINvXsU_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB6_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB18_6create10CreateBodyNtB2E_14CreateMetadataEENtB6_15CheckPredicates16check_predicatesNtNtNtB8_11interpreter6memory14MemoryInstanceNtNtNtB8_7storage9predicate12EmptyStorageEB8_
Line
Count
Source
462
2.19k
    fn check_predicates(
463
2.19k
        mut self,
464
2.19k
        params: &CheckPredicateParams,
465
2.19k
        memory: impl Memory,
466
2.19k
        storage: &impl PredicateStorageRequirements,
467
2.19k
    ) -> Result<Self, CheckError> {
468
2.19k
        if !self.checks_bitmask.contains(Checks::Predicates) {
469
2.19k
            predicates::check_predicates(&self, params, memory, storage)?;
470
2.19k
            self.checks_bitmask.insert(Checks::Predicates);
471
0
        }
472
2.19k
        Ok(self)
473
2.19k
    }
_RINvXsU_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB6_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB18_6script10ScriptBodyNtB2E_14ScriptMetadataEENtB6_15CheckPredicates16check_predicatesNtNtNtB8_11interpreter6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageEB8_
Line
Count
Source
462
2.19k
    fn check_predicates(
463
2.19k
        mut self,
464
2.19k
        params: &CheckPredicateParams,
465
2.19k
        memory: impl Memory,
466
2.19k
        storage: &impl PredicateStorageRequirements,
467
2.19k
    ) -> Result<Self, CheckError> {
468
2.19k
        if !self.checks_bitmask.contains(Checks::Predicates) {
469
2.19k
            predicates::check_predicates(&self, params, memory, storage)?;
470
2.19k
            self.checks_bitmask.insert(Checks::Predicates);
471
0
        }
472
2.19k
        Ok(self)
473
2.19k
    }
Unexecuted instantiation: _RINvXsU_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB6_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB18_6script10ScriptBodyNtB2E_14ScriptMetadataEENtB6_15CheckPredicates16check_predicatesNtNtNtB8_11interpreter6memory14MemoryInstanceNtNtNtB8_7storage9predicate12EmptyStorageEB8_
Unexecuted instantiation: _RINvXsU_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB6_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB18_6upload10UploadBodyNtB2E_14UploadMetadataEENtB6_15CheckPredicates16check_predicatesNtNtNtB8_11interpreter6memory14MemoryInstanceNtNtNtB8_7storage9predicate12EmptyStorageEB8_
Unexecuted instantiation: _RINvXsU_NtCsg6P9hFxt0iW_7fuel_vm19checked_transactionINtB6_7CheckedINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB18_7upgrade11UpgradeBodyNtB2E_15UpgradeMetadataEENtB6_15CheckPredicates16check_predicatesNtNtNtB8_11interpreter6memory14MemoryInstanceNtNtNtB8_7storage9predicate12EmptyStorageEB8_
474
475
    async fn check_predicates_async<E>(
476
        mut self,
477
        params: &CheckPredicateParams,
478
        pool: &impl VmMemoryPool,
479
        storage: &impl PredicateStorageProvider,
480
    ) -> Result<Self, CheckError>
481
    where
482
        E: ParallelExecutor,
483
0
    {
484
0
        if !self.checks_bitmask.contains(Checks::Predicates) {
485
0
            predicates::check_predicates_async::<Tx, E>(&self, params, pool, storage)
486
0
                .await?;
487
488
0
            self.checks_bitmask.insert(Checks::Predicates);
489
0
490
0
            Ok(self)
491
        } else {
492
0
            Ok(self)
493
        }
494
0
    }
495
}
496
497
#[async_trait::async_trait]
498
impl<Tx: ExecutableTransaction + Send + Sync + 'static> EstimatePredicates for Tx {
499
0
    fn estimate_predicates(
500
0
        &mut self,
501
0
        params: &CheckPredicateParams,
502
0
        memory: impl Memory,
503
0
        storage: &impl PredicateStorageRequirements,
504
0
    ) -> Result<(), CheckError> {
505
0
        predicates::estimate_predicates(self, params, memory, storage)?;
506
0
        Ok(())
507
0
    }
508
509
    async fn estimate_predicates_async<E>(
510
        &mut self,
511
        params: &CheckPredicateParams,
512
        pool: &impl VmMemoryPool,
513
        storage: &impl PredicateStorageProvider,
514
    ) -> Result<(), CheckError>
515
    where
516
        E: ParallelExecutor,
517
0
    {
518
0
        predicates::estimate_predicates_async::<Self, E>(self, params, pool, storage)
519
0
            .await?;
520
521
0
        Ok(())
522
0
    }
523
}
524
525
#[async_trait::async_trait]
526
impl EstimatePredicates for Transaction {
527
0
    fn estimate_predicates(
528
0
        &mut self,
529
0
        params: &CheckPredicateParams,
530
0
        memory: impl Memory,
531
0
        storage: &impl PredicateStorageRequirements,
532
0
    ) -> Result<(), CheckError> {
533
0
        match self {
534
0
            Self::Script(tx) => tx.estimate_predicates(params, memory, storage),
535
0
            Self::Create(tx) => tx.estimate_predicates(params, memory, storage),
536
0
            Self::Mint(_) => Ok(()),
537
0
            Self::Upgrade(tx) => tx.estimate_predicates(params, memory, storage),
538
0
            Self::Upload(tx) => tx.estimate_predicates(params, memory, storage),
539
0
            Self::Blob(tx) => tx.estimate_predicates(params, memory, storage),
540
        }
541
0
    }
542
543
    async fn estimate_predicates_async<E: ParallelExecutor>(
544
        &mut self,
545
        params: &CheckPredicateParams,
546
        pool: &impl VmMemoryPool,
547
        storage: &impl PredicateStorageProvider,
548
0
    ) -> Result<(), CheckError> {
549
0
        match self {
550
0
            Self::Script(tx) => {
551
0
                tx.estimate_predicates_async::<E>(params, pool, storage)
552
0
                    .await
553
            }
554
0
            Self::Create(tx) => {
555
0
                tx.estimate_predicates_async::<E>(params, pool, storage)
556
0
                    .await
557
            }
558
0
            Self::Mint(_) => Ok(()),
559
0
            Self::Upgrade(tx) => {
560
0
                tx.estimate_predicates_async::<E>(params, pool, storage)
561
0
                    .await
562
            }
563
0
            Self::Upload(tx) => {
564
0
                tx.estimate_predicates_async::<E>(params, pool, storage)
565
0
                    .await
566
            }
567
0
            Self::Blob(tx) => {
568
0
                tx.estimate_predicates_async::<E>(params, pool, storage)
569
0
                    .await
570
            }
571
        }
572
0
    }
573
}
574
575
#[async_trait::async_trait]
576
impl CheckPredicates for Checked<Mint> {
577
0
    fn check_predicates(
578
0
        mut self,
579
0
        _params: &CheckPredicateParams,
580
0
        _memory: impl Memory,
581
0
        _storage: &impl PredicateStorageRequirements,
582
0
    ) -> Result<Self, CheckError> {
583
0
        self.checks_bitmask.insert(Checks::Predicates);
584
0
        Ok(self)
585
0
    }
586
587
    async fn check_predicates_async<E: ParallelExecutor>(
588
        mut self,
589
        _params: &CheckPredicateParams,
590
        _pool: &impl VmMemoryPool,
591
        _storage: &impl PredicateStorageProvider,
592
0
    ) -> Result<Self, CheckError> {
593
0
        self.checks_bitmask.insert(Checks::Predicates);
594
0
        Ok(self)
595
0
    }
596
}
597
598
#[async_trait::async_trait]
599
impl CheckPredicates for Checked<Transaction> {
600
0
    fn check_predicates(
601
0
        self,
602
0
        params: &CheckPredicateParams,
603
0
        memory: impl Memory,
604
0
        storage: &impl PredicateStorageRequirements,
605
0
    ) -> Result<Self, CheckError> {
606
0
        let checked_transaction: CheckedTransaction = self.into();
607
0
        let checked_transaction: CheckedTransaction = match checked_transaction {
608
0
            CheckedTransaction::Script(tx) => {
609
0
                CheckPredicates::check_predicates(tx, params, memory, storage)?.into()
610
            }
611
0
            CheckedTransaction::Create(tx) => {
612
0
                CheckPredicates::check_predicates(tx, params, memory, storage)?.into()
613
            }
614
0
            CheckedTransaction::Mint(tx) => {
615
0
                CheckPredicates::check_predicates(tx, params, memory, storage)?.into()
616
            }
617
0
            CheckedTransaction::Upgrade(tx) => {
618
0
                CheckPredicates::check_predicates(tx, params, memory, storage)?.into()
619
            }
620
0
            CheckedTransaction::Upload(tx) => {
621
0
                CheckPredicates::check_predicates(tx, params, memory, storage)?.into()
622
            }
623
0
            CheckedTransaction::Blob(tx) => {
624
0
                CheckPredicates::check_predicates(tx, params, memory, storage)?.into()
625
            }
626
        };
627
0
        Ok(checked_transaction.into())
628
0
    }
629
630
    async fn check_predicates_async<E>(
631
        mut self,
632
        params: &CheckPredicateParams,
633
        pool: &impl VmMemoryPool,
634
        storage: &impl PredicateStorageProvider,
635
    ) -> Result<Self, CheckError>
636
    where
637
        E: ParallelExecutor,
638
0
    {
639
0
        let checked_transaction: CheckedTransaction = self.into();
640
641
0
        let checked_transaction: CheckedTransaction = match checked_transaction {
642
0
            CheckedTransaction::Script(tx) => {
643
0
                CheckPredicates::check_predicates_async::<E>(tx, params, pool, storage)
644
0
                    .await?
645
0
                    .into()
646
            }
647
0
            CheckedTransaction::Create(tx) => {
648
0
                CheckPredicates::check_predicates_async::<E>(tx, params, pool, storage)
649
0
                    .await?
650
0
                    .into()
651
            }
652
0
            CheckedTransaction::Mint(tx) => {
653
0
                CheckPredicates::check_predicates_async::<E>(tx, params, pool, storage)
654
0
                    .await?
655
0
                    .into()
656
            }
657
0
            CheckedTransaction::Upgrade(tx) => {
658
0
                CheckPredicates::check_predicates_async::<E>(tx, params, pool, storage)
659
0
                    .await?
660
0
                    .into()
661
            }
662
0
            CheckedTransaction::Upload(tx) => {
663
0
                CheckPredicates::check_predicates_async::<E>(tx, params, pool, storage)
664
0
                    .await?
665
0
                    .into()
666
            }
667
0
            CheckedTransaction::Blob(tx) => {
668
0
                CheckPredicates::check_predicates_async::<E>(tx, params, pool, storage)
669
0
                    .await?
670
0
                    .into()
671
            }
672
        };
673
674
0
        Ok(checked_transaction.into())
675
0
    }
676
}
677
678
/// The Enum version of `Checked<Transaction>` allows getting the inner variant without
679
/// losing "checked" status.
680
///
681
/// It is possible to freely convert `Checked<Transaction>` into `CheckedTransaction` and
682
/// vice verse without the overhead.
683
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
684
#[allow(missing_docs)]
685
pub enum CheckedTransaction {
686
    Script(Checked<Script>),
687
    Create(Checked<Create>),
688
    Mint(Checked<Mint>),
689
    Upgrade(Checked<Upgrade>),
690
    Upload(Checked<Upload>),
691
    Blob(Checked<Blob>),
692
}
693
694
impl From<Checked<Transaction>> for CheckedTransaction {
695
0
    fn from(checked: Checked<Transaction>) -> Self {
696
0
        let Checked {
697
0
            transaction,
698
0
            metadata,
699
0
            checks_bitmask,
700
0
        } = checked;
701
0
702
0
        // # Dev note: Avoid wildcard pattern to be sure that all variants are covered.
703
0
        match (transaction, metadata) {
704
0
            (Transaction::Script(transaction), CheckedMetadata::Script(metadata)) => {
705
0
                Self::Script(Checked::new(transaction, metadata, checks_bitmask))
706
            }
707
0
            (Transaction::Create(transaction), CheckedMetadata::Create(metadata)) => {
708
0
                Self::Create(Checked::new(transaction, metadata, checks_bitmask))
709
            }
710
0
            (Transaction::Mint(transaction), CheckedMetadata::Mint(metadata)) => {
711
0
                Self::Mint(Checked::new(transaction, metadata, checks_bitmask))
712
            }
713
0
            (Transaction::Upgrade(transaction), CheckedMetadata::Upgrade(metadata)) => {
714
0
                Self::Upgrade(Checked::new(transaction, metadata, checks_bitmask))
715
            }
716
0
            (Transaction::Upload(transaction), CheckedMetadata::Upload(metadata)) => {
717
0
                Self::Upload(Checked::new(transaction, metadata, checks_bitmask))
718
            }
719
0
            (Transaction::Blob(transaction), CheckedMetadata::Blob(metadata)) => {
720
0
                Self::Blob(Checked::new(transaction, metadata, checks_bitmask))
721
            }
722
            // The code should produce the `CheckedMetadata` for the corresponding
723
            // transaction variant. It is done in the implementation of the
724
            // `IntoChecked` trait for `Transaction`. With the current
725
            // implementation, the patterns below are unreachable.
726
0
            (Transaction::Script(_), _) => unreachable!(),
727
0
            (Transaction::Create(_), _) => unreachable!(),
728
0
            (Transaction::Mint(_), _) => unreachable!(),
729
0
            (Transaction::Upgrade(_), _) => unreachable!(),
730
0
            (Transaction::Upload(_), _) => unreachable!(),
731
0
            (Transaction::Blob(_), _) => unreachable!(),
732
        }
733
0
    }
734
}
735
736
impl From<Checked<Script>> for CheckedTransaction {
737
0
    fn from(checked: Checked<Script>) -> Self {
738
0
        Self::Script(checked)
739
0
    }
740
}
741
742
impl From<Checked<Create>> for CheckedTransaction {
743
0
    fn from(checked: Checked<Create>) -> Self {
744
0
        Self::Create(checked)
745
0
    }
746
}
747
748
impl From<Checked<Mint>> for CheckedTransaction {
749
0
    fn from(checked: Checked<Mint>) -> Self {
750
0
        Self::Mint(checked)
751
0
    }
752
}
753
754
impl From<Checked<Upgrade>> for CheckedTransaction {
755
0
    fn from(checked: Checked<Upgrade>) -> Self {
756
0
        Self::Upgrade(checked)
757
0
    }
758
}
759
760
impl From<Checked<Upload>> for CheckedTransaction {
761
0
    fn from(checked: Checked<Upload>) -> Self {
762
0
        Self::Upload(checked)
763
0
    }
764
}
765
766
impl From<Checked<Blob>> for CheckedTransaction {
767
0
    fn from(checked: Checked<Blob>) -> Self {
768
0
        Self::Blob(checked)
769
0
    }
770
}
771
772
impl From<CheckedTransaction> for Checked<Transaction> {
773
0
    fn from(checked: CheckedTransaction) -> Self {
774
0
        match checked {
775
            CheckedTransaction::Script(Checked {
776
0
                transaction,
777
0
                metadata,
778
0
                checks_bitmask,
779
0
            }) => Checked::new(transaction.into(), metadata.into(), checks_bitmask),
780
            CheckedTransaction::Create(Checked {
781
0
                transaction,
782
0
                metadata,
783
0
                checks_bitmask,
784
0
            }) => Checked::new(transaction.into(), metadata.into(), checks_bitmask),
785
            CheckedTransaction::Mint(Checked {
786
0
                transaction,
787
0
                metadata,
788
0
                checks_bitmask,
789
0
            }) => Checked::new(transaction.into(), metadata.into(), checks_bitmask),
790
            CheckedTransaction::Upgrade(Checked {
791
0
                transaction,
792
0
                metadata,
793
0
                checks_bitmask,
794
0
            }) => Checked::new(transaction.into(), metadata.into(), checks_bitmask),
795
            CheckedTransaction::Upload(Checked {
796
0
                transaction,
797
0
                metadata,
798
0
                checks_bitmask,
799
0
            }) => Checked::new(transaction.into(), metadata.into(), checks_bitmask),
800
            CheckedTransaction::Blob(Checked {
801
0
                transaction,
802
0
                metadata,
803
0
                checks_bitmask,
804
0
            }) => Checked::new(transaction.into(), metadata.into(), checks_bitmask),
805
        }
806
0
    }
807
}
808
809
/// The `IntoChecked` metadata for `CheckedTransaction`.
810
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
811
#[allow(missing_docs)]
812
pub enum CheckedMetadata {
813
    Script(<Script as IntoChecked>::Metadata),
814
    Create(<Create as IntoChecked>::Metadata),
815
    Mint(<Mint as IntoChecked>::Metadata),
816
    Upgrade(<Upgrade as IntoChecked>::Metadata),
817
    Upload(<Upload as IntoChecked>::Metadata),
818
    Blob(<Blob as IntoChecked>::Metadata),
819
}
820
821
impl From<<Script as IntoChecked>::Metadata> for CheckedMetadata {
822
0
    fn from(metadata: <Script as IntoChecked>::Metadata) -> Self {
823
0
        Self::Script(metadata)
824
0
    }
825
}
826
827
impl From<<Create as IntoChecked>::Metadata> for CheckedMetadata {
828
0
    fn from(metadata: <Create as IntoChecked>::Metadata) -> Self {
829
0
        Self::Create(metadata)
830
0
    }
831
}
832
833
impl From<<Mint as IntoChecked>::Metadata> for CheckedMetadata {
834
0
    fn from(metadata: <Mint as IntoChecked>::Metadata) -> Self {
835
0
        Self::Mint(metadata)
836
0
    }
837
}
838
839
impl From<<Upgrade as IntoChecked>::Metadata> for CheckedMetadata {
840
0
    fn from(metadata: <Upgrade as IntoChecked>::Metadata) -> Self {
841
0
        Self::Upgrade(metadata)
842
0
    }
843
}
844
845
impl From<<Upload as IntoChecked>::Metadata> for CheckedMetadata {
846
0
    fn from(metadata: <Upload as IntoChecked>::Metadata) -> Self {
847
0
        Self::Upload(metadata)
848
0
    }
849
}
850
impl From<<Blob as IntoChecked>::Metadata> for CheckedMetadata {
851
0
    fn from(metadata: <Blob as IntoChecked>::Metadata) -> Self {
852
0
        Self::Blob(metadata)
853
0
    }
854
}
855
856
impl IntoChecked for Transaction {
857
    type Metadata = CheckedMetadata;
858
859
0
    fn into_checked_basic(
860
0
        self,
861
0
        block_height: BlockHeight,
862
0
        consensus_params: &ConsensusParameters,
863
0
    ) -> Result<Checked<Self>, CheckError> {
864
0
        match self {
865
0
            Self::Script(tx) => {
866
0
                let (transaction, metadata) = tx
867
0
                    .into_checked_basic(block_height, consensus_params)?
868
0
                    .into();
869
0
                Ok((transaction.into(), metadata.into()))
870
            }
871
0
            Self::Create(tx) => {
872
0
                let (transaction, metadata) = tx
873
0
                    .into_checked_basic(block_height, consensus_params)?
874
0
                    .into();
875
0
                Ok((transaction.into(), metadata.into()))
876
            }
877
0
            Self::Mint(tx) => {
878
0
                let (transaction, metadata) = tx
879
0
                    .into_checked_basic(block_height, consensus_params)?
880
0
                    .into();
881
0
                Ok((transaction.into(), metadata.into()))
882
            }
883
0
            Self::Upgrade(tx) => {
884
0
                let (transaction, metadata) = tx
885
0
                    .into_checked_basic(block_height, consensus_params)?
886
0
                    .into();
887
0
                Ok((transaction.into(), metadata.into()))
888
            }
889
0
            Self::Upload(tx) => {
890
0
                let (transaction, metadata) = tx
891
0
                    .into_checked_basic(block_height, consensus_params)?
892
0
                    .into();
893
0
                Ok((transaction.into(), metadata.into()))
894
            }
895
0
            Self::Blob(tx) => {
896
0
                let (transaction, metadata) = tx
897
0
                    .into_checked_basic(block_height, consensus_params)?
898
0
                    .into();
899
0
                Ok((transaction.into(), metadata.into()))
900
            }
901
        }
902
0
        .map(|(transaction, metadata)| Checked::basic(transaction, metadata))
903
0
    }
904
}
905
906
impl From<ValidityError> for CheckError {
907
0
    fn from(value: ValidityError) -> Self {
908
0
        CheckError::Validity(value)
909
0
    }
910
}
911
912
impl From<PredicateVerificationFailed> for CheckError {
913
0
    fn from(value: PredicateVerificationFailed) -> Self {
914
0
        CheckError::PredicateVerificationFailed(value)
915
0
    }
916
}
917
918
#[cfg(feature = "random")]
919
#[allow(non_snake_case)]
920
#[allow(clippy::arithmetic_side_effects, clippy::cast_possible_truncation)]
921
#[cfg(test)]
922
mod tests {
923
924
    use super::*;
925
    use alloc::vec;
926
    use fuel_asm::op;
927
    use fuel_crypto::SecretKey;
928
    use fuel_tx::{
929
        field::{
930
            ScriptGasLimit,
931
            Tip,
932
            WitnessLimit,
933
            Witnesses,
934
        },
935
        Script,
936
        TransactionBuilder,
937
        ValidityError,
938
    };
939
    use fuel_types::canonical::Serialize;
940
    use quickcheck::TestResult;
941
    use quickcheck_macros::quickcheck;
942
    use rand::{
943
        rngs::StdRng,
944
        Rng,
945
        SeedableRng,
946
    };
947
948
    fn params(factor: u64) -> ConsensusParameters {
949
        ConsensusParameters::new(
950
            TxParameters::default(),
951
            PredicateParameters::default(),
952
            ScriptParameters::default(),
953
            ContractParameters::default(),
954
            FeeParameters::default().with_gas_price_factor(factor),
955
            Default::default(),
956
            Default::default(),
957
            Default::default(),
958
            Default::default(),
959
            Default::default(),
960
            Default::default(),
961
        )
962
    }
963
964
    #[test]
965
    fn into_checked__tx_accepts_valid_tx() {
966
        // simple smoke test that valid txs can be checked
967
        let rng = &mut StdRng::seed_from_u64(2322u64);
968
        let gas_limit = 1000;
969
        let input_amount = 1000;
970
        let output_amount = 10;
971
        let max_fee_limit = 500;
972
        let tx =
973
            valid_coin_tx(rng, gas_limit, input_amount, output_amount, max_fee_limit);
974
975
        let checked = tx
976
            .clone()
977
            .into_checked(Default::default(), &ConsensusParameters::standard())
978
            .expect("Expected valid transaction");
979
980
        // verify transaction getter works
981
        assert_eq!(checked.transaction(), &tx);
982
        // verify available balance was decreased by max fee
983
        assert_eq!(
984
            checked.metadata().non_retryable_balances[&AssetId::default()],
985
            input_amount - max_fee_limit - output_amount
986
        );
987
    }
988
989
    #[test]
990
    fn into_checked__tx_accepts_valid_signed_message_coin_for_fees() {
991
        // simple test to ensure a tx that only has a message input can cover fees
992
        let rng = &mut StdRng::seed_from_u64(2322u64);
993
        let input_amount = 1000;
994
        let gas_limit = 1000;
995
        let zero_fee_limit = 500;
996
        let tx = signed_message_coin_tx(rng, gas_limit, input_amount, zero_fee_limit);
997
998
        let checked = tx
999
            .into_checked(Default::default(), &ConsensusParameters::standard())
1000
            .expect("Expected valid transaction");
1001
1002
        // verify available balance was decreased by max fee
1003
        assert_eq!(
1004
            checked.metadata().non_retryable_balances[&AssetId::default()],
1005
            input_amount - checked.transaction.max_fee_limit()
1006
        );
1007
    }
1008
1009
    #[test]
1010
    fn into_checked__tx_excludes_message_output_amount_from_fee() {
1011
        // ensure message outputs aren't deducted from available balance
1012
        let rng = &mut StdRng::seed_from_u64(2322u64);
1013
        let input_amount = 100;
1014
        let gas_limit = 1000;
1015
        let zero_fee_limit = 50;
1016
        let tx = signed_message_coin_tx(rng, gas_limit, input_amount, zero_fee_limit);
1017
1018
        let checked = tx
1019
            .into_checked(Default::default(), &ConsensusParameters::standard())
1020
            .expect("Expected valid transaction");
1021
1022
        // verify available balance was decreased by max fee
1023
        assert_eq!(
1024
            checked.metadata().non_retryable_balances[&AssetId::default()],
1025
            input_amount - checked.transaction.max_fee_limit()
1026
        );
1027
    }
1028
1029
    #[test]
1030
    fn into_checked__message_data_signed_message_is_not_used_to_cover_fees() {
1031
        let rng = &mut StdRng::seed_from_u64(2322u64);
1032
1033
        // given
1034
        let input_amount = 100;
1035
1036
        // when
1037
        let max_fee = input_amount;
1038
        let tx = TransactionBuilder::script(vec![], vec![])
1039
            .max_fee_limit(max_fee)
1040
            // Add message input with enough to cover max fee
1041
            .add_unsigned_message_input(SecretKey::random(rng), rng.gen(), rng.gen(), input_amount, vec![0xff; 10])
1042
            // Add empty base coin
1043
            .add_unsigned_coin_input(SecretKey::random(rng), rng.gen(), 0, AssetId::BASE, rng.gen())
1044
            .finalize();
1045
1046
        let err = tx
1047
            .into_checked(Default::default(), &ConsensusParameters::standard())
1048
            .expect_err("Expected valid transaction");
1049
1050
        // then
1051
        assert!(matches!(
1052
            err,
1053
            CheckError::Validity(ValidityError::InsufficientFeeAmount {
1054
                expected: _,
1055
                provided: 0
1056
            })
1057
        ));
1058
    }
1059
1060
    #[test]
1061
    fn message_data_predicate_message_is_not_used_to_cover_fees() {
1062
        let rng = &mut StdRng::seed_from_u64(2322u64);
1063
        let gas_limit = 1000;
1064
1065
        // given
1066
        let input_amount = 100;
1067
1068
        // when
1069
        let max_fee = input_amount;
1070
1071
        let tx = TransactionBuilder::script(vec![], vec![])
1072
            .max_fee_limit(max_fee)
1073
            .script_gas_limit(gas_limit)
1074
            .add_input(Input::message_data_predicate(
1075
                rng.gen(),
1076
                rng.gen(),
1077
                input_amount,
1078
                rng.gen(),
1079
                Default::default(),
1080
                vec![0xff; 10],
1081
                vec![0xaa; 10],
1082
                vec![0xbb; 10],
1083
            ))
1084
            // Add empty base coin
1085
            .add_unsigned_coin_input(SecretKey::random(rng), rng.gen(), 0, AssetId::BASE, rng.gen())
1086
            .finalize();
1087
1088
        let err = tx
1089
            .into_checked(Default::default(), &ConsensusParameters::standard())
1090
            .expect_err("Expected valid transaction");
1091
1092
        // then
1093
        assert!(matches!(
1094
            err,
1095
            CheckError::Validity(ValidityError::InsufficientFeeAmount {
1096
                expected: _,
1097
                provided: 0
1098
            })
1099
        ));
1100
    }
1101
1102
    // use quickcheck to fuzz any rounding or precision errors in the max fee w/ coin
1103
    // input
1104
    #[quickcheck]
1105
    fn max_fee_coin_input(
1106
        gas_price: u64,
1107
        gas_limit: u64,
1108
        witness_limit: u64,
1109
        input_amount: u64,
1110
        gas_price_factor: u64,
1111
        seed: u64,
1112
    ) -> TestResult {
1113
        // verify max fee a transaction can consume based on gas limit + bytes is correct
1114
1115
        // dont divide by zero
1116
        if gas_price_factor == 0 {
1117
            return TestResult::discard();
1118
        }
1119
1120
        let rng = &mut StdRng::seed_from_u64(seed);
1121
        let gas_costs = GasCosts::default();
1122
        let fee_params = FeeParameters::DEFAULT.with_gas_price_factor(gas_price_factor);
1123
        let predicate_gas_used = rng.gen();
1124
        let tx = predicate_tx(
1125
            rng,
1126
            gas_limit,
1127
            witness_limit,
1128
            input_amount,
1129
            predicate_gas_used,
1130
        );
1131
1132
        if let Ok(valid) = is_valid_max_fee(&tx, gas_price, &gas_costs, &fee_params) {
1133
            TestResult::from_bool(valid)
1134
        } else {
1135
            TestResult::discard()
1136
        }
1137
    }
1138
1139
    // use quickcheck to fuzz any rounding or precision errors in the min fee w/ coin
1140
    // input
1141
    #[quickcheck]
1142
    fn min_fee_coin_input(
1143
        gas_price: u64,
1144
        gas_limit: u64,
1145
        witness_limit: u64,
1146
        input_amount: u64,
1147
        gas_price_factor: u64,
1148
        seed: u64,
1149
    ) -> TestResult {
1150
        // verify min fee a transaction can consume based on bytes is correct
1151
1152
        // dont divide by zero
1153
        if gas_price_factor == 0 {
1154
            return TestResult::discard();
1155
        }
1156
        let rng = &mut StdRng::seed_from_u64(seed);
1157
        let gas_costs = GasCosts::default();
1158
        let fee_params = FeeParameters::DEFAULT.with_gas_price_factor(gas_price_factor);
1159
        let predicate_gas_used = rng.gen();
1160
        let tx = predicate_tx(
1161
            rng,
1162
            gas_limit,
1163
            witness_limit,
1164
            input_amount,
1165
            predicate_gas_used,
1166
        );
1167
1168
        if let Ok(valid) = is_valid_max_fee(&tx, gas_price, &gas_costs, &fee_params) {
1169
            TestResult::from_bool(valid)
1170
        } else {
1171
            TestResult::discard()
1172
        }
1173
    }
1174
1175
    // use quickcheck to fuzz any rounding or precision errors in the max fee w/ message
1176
    // input
1177
    #[quickcheck]
1178
    fn max_fee_message_input(
1179
        gas_price: u64,
1180
        gas_limit: u64,
1181
        input_amount: u64,
1182
        gas_price_factor: u64,
1183
        tip: u64,
1184
        seed: u64,
1185
    ) -> TestResult {
1186
        // dont divide by zero
1187
        if gas_price_factor == 0 {
1188
            return TestResult::discard();
1189
        }
1190
1191
        let rng = &mut StdRng::seed_from_u64(seed);
1192
        let gas_costs = GasCosts::default();
1193
        let fee_params = FeeParameters::DEFAULT.with_gas_price_factor(gas_price_factor);
1194
        let tx = predicate_message_coin_tx(rng, gas_limit, input_amount, tip);
1195
1196
        if let Ok(valid) = is_valid_max_fee(&tx, gas_price, &gas_costs, &fee_params) {
1197
            TestResult::from_bool(valid)
1198
        } else {
1199
            TestResult::discard()
1200
        }
1201
    }
1202
1203
    // use quickcheck to fuzz any rounding or precision errors in refund calculation
1204
    #[quickcheck]
1205
    fn refund_when_used_gas_is_zero(
1206
        gas_price: u64,
1207
        gas_limit: u64,
1208
        input_amount: u64,
1209
        gas_price_factor: u64,
1210
        seed: u64,
1211
        tip: u64,
1212
    ) -> TestResult {
1213
        // dont divide by zero
1214
        if gas_price_factor == 0 {
1215
            return TestResult::discard();
1216
        }
1217
1218
        let rng = &mut StdRng::seed_from_u64(seed);
1219
        let gas_costs = GasCosts::default();
1220
        let fee_params = FeeParameters::DEFAULT.with_gas_price_factor(gas_price_factor);
1221
        let tx = predicate_message_coin_tx(rng, gas_limit, input_amount, tip);
1222
1223
        // Given
1224
        let used_gas = 0;
1225
1226
        // When
1227
        let refund = tx.refund_fee(&gas_costs, &fee_params, used_gas, gas_price);
1228
1229
        let min_fee = tx.min_fee(&gas_costs, &fee_params, gas_price);
1230
        let max_fee = tx.max_fee(&gas_costs, &fee_params, gas_price);
1231
1232
        // Then
1233
        if let Some(refund) = refund {
1234
            TestResult::from_bool(max_fee - min_fee == refund as u128)
1235
        } else {
1236
            TestResult::discard()
1237
        }
1238
    }
1239
1240
    // use quickcheck to fuzz any rounding or precision errors in the min fee w/ message
1241
    // input
1242
    #[quickcheck]
1243
    fn min_fee_message_input(
1244
        gas_limit: u64,
1245
        input_amount: u64,
1246
        gas_price: u64,
1247
        gas_price_factor: u64,
1248
        tip: u64,
1249
        seed: u64,
1250
    ) -> TestResult {
1251
        // verify min fee a transaction can consume based on bytes is correct
1252
1253
        // dont divide by zero
1254
        if gas_price_factor == 0 {
1255
            return TestResult::discard();
1256
        }
1257
        let rng = &mut StdRng::seed_from_u64(seed);
1258
        let gas_costs = GasCosts::default();
1259
        let fee_params = FeeParameters::DEFAULT.with_gas_price_factor(gas_price_factor);
1260
        let tx = predicate_message_coin_tx(rng, gas_limit, input_amount, tip);
1261
1262
        if let Ok(valid) = is_valid_min_fee(&tx, &gas_costs, &fee_params, gas_price) {
1263
            TestResult::from_bool(valid)
1264
        } else {
1265
            TestResult::discard()
1266
        }
1267
    }
1268
1269
    #[test]
1270
    fn fee_multiple_signed_inputs() {
1271
        let rng = &mut StdRng::seed_from_u64(2322u64);
1272
        let gas_price = 100;
1273
        let gas_limit = 1000;
1274
        let gas_costs = GasCosts::default();
1275
        let fee_params = FeeParameters::DEFAULT.with_gas_price_factor(1);
1276
        let tx = TransactionBuilder::script(vec![], vec![])
1277
            .script_gas_limit(gas_limit)
1278
            // Set up 3 signed inputs
1279
            .add_unsigned_message_input(
1280
                SecretKey::random(rng),
1281
                rng.gen(),
1282
                rng.gen(),
1283
                rng.gen::<u32>() as u64,
1284
                vec![],
1285
            )
1286
            .add_unsigned_message_input(
1287
                SecretKey::random(rng),
1288
                rng.gen(),
1289
                rng.gen(),
1290
                rng.gen::<u32>() as u64,
1291
                vec![],
1292
            )
1293
            .add_unsigned_message_input(
1294
                SecretKey::random(rng),
1295
                rng.gen(),
1296
                rng.gen(),
1297
                rng.gen::<u32>() as u64,
1298
                vec![],
1299
            )
1300
            .finalize();
1301
        let fee =
1302
            TransactionFee::checked_from_tx(&gas_costs, &fee_params, &tx, gas_price)
1303
                .unwrap();
1304
1305
        let min_fee = fee.min_fee();
1306
        let expected_min_fee = (tx.metered_bytes_size() as u64
1307
            * fee_params.gas_per_byte()
1308
            + gas_costs.vm_initialization().resolve(tx.size() as u64)
1309
            + 3 * gas_costs.eck1()
1310
            + gas_costs.s256().resolve(tx.size() as u64))
1311
            * gas_price;
1312
        assert_eq!(min_fee, expected_min_fee);
1313
1314
        let max_fee = fee.max_fee();
1315
        let expected_max_fee = expected_min_fee + gas_limit * gas_price;
1316
        assert_eq!(max_fee, expected_max_fee);
1317
    }
1318
1319
    #[test]
1320
    fn fee_multiple_signed_inputs_single_owner() {
1321
        let rng = &mut StdRng::seed_from_u64(2322u64);
1322
        let gas_price = 100;
1323
        let gas_limit = 1000;
1324
        let gas_costs = GasCosts::default();
1325
        let fee_params = FeeParameters::DEFAULT.with_gas_price_factor(1);
1326
        let secret = SecretKey::random(rng);
1327
        let tx = TransactionBuilder::script(vec![], vec![])
1328
            .script_gas_limit(gas_limit)
1329
            // Set up 3 signed inputs
1330
            .add_unsigned_message_input(
1331
                secret,
1332
                rng.gen(),
1333
                rng.gen(),
1334
                rng.gen::<u32>() as u64,
1335
                vec![],
1336
            )
1337
            .add_unsigned_message_input(
1338
                secret,
1339
                rng.gen(),
1340
                rng.gen(),
1341
                rng.gen::<u32>() as u64,
1342
                vec![],
1343
            )
1344
            .add_unsigned_message_input(
1345
                secret,
1346
                rng.gen(),
1347
                rng.gen(),
1348
                rng.gen::<u32>() as u64,
1349
                vec![],
1350
            )
1351
            .finalize();
1352
        let fee =
1353
            TransactionFee::checked_from_tx(&gas_costs, &fee_params, &tx, gas_price)
1354
                .unwrap();
1355
1356
        let min_fee = fee.min_fee();
1357
        // Because all inputs are owned by the same address, the address will only need to
1358
        // be recovered once. Therefore, we charge only once for the address
1359
        // recovery of the signed inputs.
1360
        let expected_min_fee = (tx.metered_bytes_size() as u64
1361
            * fee_params.gas_per_byte()
1362
            + gas_costs.vm_initialization().resolve(tx.size() as u64)
1363
            + gas_costs.eck1()
1364
            + gas_costs.s256().resolve(tx.size() as u64))
1365
            * gas_price;
1366
        assert_eq!(min_fee, expected_min_fee);
1367
1368
        let max_fee = fee.max_fee();
1369
        let expected_max_fee = min_fee + gas_limit * gas_price;
1370
        assert_eq!(max_fee, expected_max_fee);
1371
    }
1372
1373
    fn random_bytes<const N: usize, R: Rng + ?Sized>(rng: &mut R) -> Box<[u8; N]> {
1374
        let mut bytes = Box::new([0u8; N]);
1375
        for chunk in bytes.chunks_mut(32) {
1376
            rng.fill(chunk);
1377
        }
1378
        bytes
1379
    }
1380
1381
    #[test]
1382
    fn min_fee_multiple_predicate_inputs() {
1383
        let rng = &mut StdRng::seed_from_u64(2322u64);
1384
        let gas_price = 100;
1385
        let gas_limit = 1000;
1386
        let gas_costs = GasCosts::default();
1387
        let fee_params = FeeParameters::DEFAULT.with_gas_price_factor(1);
1388
        let predicate_1 = random_bytes::<1024, _>(rng);
1389
        let predicate_2 = random_bytes::<2048, _>(rng);
1390
        let predicate_3 = random_bytes::<4096, _>(rng);
1391
        let tx = TransactionBuilder::script(vec![], vec![])
1392
            .script_gas_limit(gas_limit)
1393
            // Set up 3 predicate inputs
1394
            .add_input(Input::message_coin_predicate(
1395
                rng.gen(),
1396
                rng.gen(),
1397
                rng.gen(),
1398
                rng.gen(),
1399
                50,
1400
                predicate_1.to_vec(),
1401
                vec![],
1402
            ))
1403
            .add_input(Input::message_coin_predicate(
1404
                rng.gen(),
1405
                rng.gen(),
1406
                rng.gen(),
1407
                rng.gen(),
1408
                100,
1409
                predicate_2.to_vec(),
1410
                vec![],
1411
            ))
1412
            .add_input(Input::message_coin_predicate(
1413
                rng.gen(),
1414
                rng.gen(),
1415
                rng.gen(),
1416
                rng.gen(),
1417
                200,
1418
                predicate_3.to_vec(),
1419
                vec![],
1420
            ))
1421
            .finalize();
1422
        let fee =
1423
            TransactionFee::checked_from_tx(&gas_costs, &fee_params, &tx, gas_price)
1424
                .unwrap();
1425
1426
        let min_fee = fee.min_fee();
1427
        let expected_min_fee = (tx.size() as u64 * fee_params.gas_per_byte()
1428
            + gas_costs.vm_initialization().resolve(tx.size() as u64)
1429
            + gas_costs.contract_root().resolve(predicate_1.len() as u64)
1430
            + gas_costs.contract_root().resolve(predicate_2.len() as u64)
1431
            + gas_costs.contract_root().resolve(predicate_3.len() as u64)
1432
            + 3 * gas_costs.vm_initialization().resolve(tx.size() as u64)
1433
            + 50
1434
            + 100
1435
            + 200
1436
            + gas_costs.s256().resolve(tx.size() as u64))
1437
            * gas_price;
1438
        assert_eq!(min_fee, expected_min_fee);
1439
1440
        let max_fee = fee.max_fee();
1441
        let expected_max_fee = min_fee + gas_limit * gas_price;
1442
        assert_eq!(max_fee, expected_max_fee);
1443
    }
1444
1445
    #[test]
1446
    fn min_fee_multiple_signed_and_predicate_inputs() {
1447
        let rng = &mut StdRng::seed_from_u64(2322u64);
1448
        let gas_price = 100;
1449
        let gas_limit = 1000;
1450
        let gas_costs = GasCosts::default();
1451
        let fee_params = FeeParameters::DEFAULT.with_gas_price_factor(1);
1452
        let predicate_1 = random_bytes::<1024, _>(rng);
1453
        let predicate_2 = random_bytes::<2048, _>(rng);
1454
        let predicate_3 = random_bytes::<4096, _>(rng);
1455
        let tx = TransactionBuilder::script(vec![], vec![])
1456
            .script_gas_limit(gas_limit)
1457
            // Set up 3 signed inputs
1458
            .add_unsigned_message_input(
1459
                SecretKey::random(rng),
1460
                rng.gen(),
1461
                rng.gen(),
1462
                rng.gen::<u32>() as u64,
1463
                vec![],
1464
            )
1465
            .add_unsigned_message_input(
1466
                SecretKey::random(rng),
1467
                rng.gen(),
1468
                rng.gen(),
1469
                rng.gen::<u32>() as u64,
1470
                vec![],
1471
            )
1472
            .add_unsigned_message_input(
1473
                SecretKey::random(rng),
1474
                rng.gen(),
1475
                rng.gen(),
1476
                rng.gen::<u32>() as u64,
1477
                vec![],
1478
            )
1479
            // Set up 3 predicate inputs
1480
            .add_input(Input::message_coin_predicate(
1481
                rng.gen(),
1482
                rng.gen(),
1483
                rng.gen(),
1484
                rng.gen(),
1485
                50,
1486
                predicate_1.to_vec(),
1487
                vec![],
1488
            ))
1489
            .add_input(Input::message_coin_predicate(
1490
                rng.gen(),
1491
                rng.gen(),
1492
                rng.gen(),
1493
                rng.gen(),
1494
                100,
1495
                predicate_2.to_vec(),
1496
                vec![],
1497
            ))
1498
            .add_input(Input::message_coin_predicate(
1499
                rng.gen(),
1500
                rng.gen(),
1501
                rng.gen(),
1502
                rng.gen(),
1503
                200,
1504
                predicate_3.to_vec(),
1505
                vec![],
1506
            ))
1507
            .finalize();
1508
        let fee =
1509
            TransactionFee::checked_from_tx(&gas_costs, &fee_params, &tx, gas_price)
1510
                .unwrap();
1511
1512
        let min_fee = fee.min_fee();
1513
        let expected_min_fee = (tx.metered_bytes_size() as u64
1514
            * fee_params.gas_per_byte()
1515
            + 3 * gas_costs.eck1()
1516
            + gas_costs.vm_initialization().resolve(tx.size() as u64)
1517
            + gas_costs.contract_root().resolve(predicate_1.len() as u64)
1518
            + gas_costs.contract_root().resolve(predicate_2.len() as u64)
1519
            + gas_costs.contract_root().resolve(predicate_3.len() as u64)
1520
            + 3 * gas_costs.vm_initialization().resolve(tx.size() as u64)
1521
            + 50
1522
            + 100
1523
            + 200
1524
            + gas_costs.s256().resolve(tx.size() as u64))
1525
            * gas_price;
1526
        assert_eq!(min_fee, expected_min_fee);
1527
1528
        let max_fee = fee.max_fee();
1529
        let expected_max_fee = min_fee + gas_limit * gas_price;
1530
        assert_eq!(max_fee, expected_max_fee);
1531
    }
1532
1533
    #[test]
1534
    fn fee_create_tx() {
1535
        let rng = &mut StdRng::seed_from_u64(2322u64);
1536
        let gas_price = 100;
1537
        let witness_limit = 1000;
1538
        let gas_costs = GasCosts::default();
1539
        let fee_params = FeeParameters::DEFAULT.with_gas_price_factor(1);
1540
        let gen_storage_slot = || rng.gen::<StorageSlot>();
1541
        let storage_slots = core::iter::repeat_with(gen_storage_slot)
1542
            .take(100)
1543
            .collect::<Vec<_>>();
1544
        let storage_slots_len = storage_slots.len();
1545
        let bytecode = rng.gen::<Witness>();
1546
        let bytecode_len = bytecode.as_ref().len();
1547
        let salt = rng.gen::<Salt>();
1548
        let tx = TransactionBuilder::create(bytecode.clone(), salt, storage_slots)
1549
            .witness_limit(witness_limit)
1550
            .finalize();
1551
        let fee =
1552
            TransactionFee::checked_from_tx(&gas_costs, &fee_params, &tx, gas_price)
1553
                .unwrap();
1554
1555
        let min_fee = fee.min_fee();
1556
        let expected_min_fee = (tx.metered_bytes_size() as u64
1557
            * fee_params.gas_per_byte()
1558
            + gas_costs.state_root().resolve(storage_slots_len as Word)
1559
            + gas_costs.contract_root().resolve(bytecode_len as Word)
1560
            + gas_costs.vm_initialization().resolve(tx.size() as u64)
1561
            + gas_costs.s256().resolve(100)
1562
            + gas_costs.s256().resolve(tx.size() as u64))
1563
            * gas_price;
1564
        assert_eq!(min_fee, expected_min_fee);
1565
1566
        let max_fee = fee.max_fee();
1567
        let expected_max_fee = min_fee
1568
            + (witness_limit - bytecode.size() as u64)
1569
                * fee_params.gas_per_byte()
1570
                * gas_price;
1571
        assert_eq!(max_fee, expected_max_fee);
1572
    }
1573
1574
    #[test]
1575
    fn fee_create_tx_no_bytecode() {
1576
        let rng = &mut StdRng::seed_from_u64(2322u64);
1577
        let gas_price = 100;
1578
        let witness_limit = 1000;
1579
        let gas_costs = GasCosts::default();
1580
        let fee_params = FeeParameters::DEFAULT.with_gas_price_factor(1);
1581
        let bytecode: Witness = Vec::<u8>::new().into();
1582
        let salt = rng.gen::<Salt>();
1583
        let tx = TransactionBuilder::create(bytecode.clone(), salt, vec![])
1584
            .witness_limit(witness_limit)
1585
            .finalize();
1586
        let fee =
1587
            TransactionFee::checked_from_tx(&gas_costs, &fee_params, &tx, gas_price)
1588
                .unwrap();
1589
1590
        let min_fee = fee.min_fee();
1591
        let expected_min_fee = (tx.metered_bytes_size() as u64
1592
            * fee_params.gas_per_byte()
1593
            + gas_costs.state_root().resolve(0)
1594
            + gas_costs.contract_root().resolve(0)
1595
            + gas_costs.vm_initialization().resolve(tx.size() as u64)
1596
            + gas_costs.s256().resolve(100)
1597
            + gas_costs.s256().resolve(tx.size() as u64))
1598
            * gas_price;
1599
        assert_eq!(min_fee, expected_min_fee);
1600
1601
        let max_fee = fee.max_fee();
1602
        let expected_max_fee = min_fee
1603
            + (witness_limit - bytecode.size_static() as u64)
1604
                * fee_params.gas_per_byte()
1605
                * gas_price;
1606
        assert_eq!(max_fee, expected_max_fee);
1607
    }
1608
1609
    #[test]
1610
    fn checked_tx_rejects_invalid_tx() {
1611
        // simple smoke test that invalid txs cannot be checked
1612
        let rng = &mut StdRng::seed_from_u64(2322u64);
1613
        let asset = rng.gen();
1614
        let gas_limit = 100;
1615
        let input_amount = 1_000;
1616
1617
        // create a tx with invalid signature
1618
        let tx = TransactionBuilder::script(vec![], vec![])
1619
            .script_gas_limit(gas_limit)
1620
            .add_input(Input::coin_signed(
1621
                rng.gen(),
1622
                rng.gen(),
1623
                input_amount,
1624
                asset,
1625
                rng.gen(),
1626
                Default::default(),
1627
            ))
1628
            .add_input(Input::contract(
1629
                rng.gen(),
1630
                rng.gen(),
1631
                rng.gen(),
1632
                rng.gen(),
1633
                rng.gen(),
1634
            ))
1635
            .add_output(Output::contract(1, rng.gen(), rng.gen()))
1636
            .add_output(Output::coin(rng.gen(), 10, asset))
1637
            .add_output(Output::change(rng.gen(), 0, asset))
1638
            .add_witness(Default::default())
1639
            .finalize();
1640
1641
        let err = tx
1642
            .into_checked(Default::default(), &ConsensusParameters::standard())
1643
            .expect_err("Expected invalid transaction");
1644
1645
        // assert that tx without base input assets fails
1646
        assert!(matches!(
1647
            err,
1648
            CheckError::Validity(ValidityError::InputInvalidSignature { .. })
1649
        ));
1650
    }
1651
1652
    #[test]
1653
    fn into_checked__tx_fails_when_provided_fees_dont_cover_byte_costs() {
1654
        let rng = &mut StdRng::seed_from_u64(2322u64);
1655
1656
        let arb_input_amount = 1;
1657
        let gas_price = 2; // price > amount
1658
        let gas_limit = 0; // don't include any gas execution fees
1659
        let factor = 1;
1660
        let zero_max_fee = 0;
1661
        let params = params(factor);
1662
1663
        // setup "valid" transaction
1664
        let transaction = base_asset_tx(rng, arb_input_amount, gas_limit, zero_max_fee);
1665
        transaction
1666
            .clone()
1667
            .into_checked(Default::default(), &params)
1668
            .unwrap();
1669
        let fees = TransactionFee::checked_from_tx(
1670
            &GasCosts::default(),
1671
            params.fee_params(),
1672
            &transaction,
1673
            gas_price,
1674
        )
1675
        .unwrap();
1676
        let real_max_fee = fees.max_fee();
1677
1678
        let new_input_amount = real_max_fee;
1679
        let mut new_transaction =
1680
            base_asset_tx(rng, new_input_amount, gas_limit, real_max_fee);
1681
        new_transaction
1682
            .clone()
1683
            .into_checked(Default::default(), &params)
1684
            .unwrap()
1685
            .into_ready(gas_price, &GasCosts::default(), params.fee_params())
1686
            .expect("`new_transaction` should be fully valid");
1687
1688
        // given
1689
        // invalidating the transaction by increasing witness size
1690
        new_transaction.witnesses_mut().push(rng.gen());
1691
        let bigger_checked = new_transaction
1692
            .into_checked(Default::default(), &params)
1693
            .unwrap();
1694
1695
        // when
1696
        let err = bigger_checked
1697
            .into_ready(gas_price, &GasCosts::default(), params.fee_params())
1698
            .expect_err("Expected invalid transaction");
1699
1700
        let max_fee_from_policies = match err {
1701
            CheckError::InsufficientMaxFee {
1702
                max_fee_from_policies,
1703
                ..
1704
            } => max_fee_from_policies,
1705
            _ => panic!("expected insufficient max fee; found {err:?}"),
1706
        };
1707
1708
        // then
1709
        assert_eq!(max_fee_from_policies, real_max_fee);
1710
    }
1711
1712
    #[test]
1713
    fn into_checked__tx_fails_when_provided_fees_dont_cover_fee_limit() {
1714
        let rng = &mut StdRng::seed_from_u64(2322u64);
1715
1716
        let input_amount = 10;
1717
        let factor = 1;
1718
        // make gas price too high for the input amount
1719
        let gas_limit = input_amount + 1; // make gas cost 1 higher than input amount
1720
1721
        // given
1722
        let input_amount = 10;
1723
        let big_fee_limit = input_amount + 1;
1724
1725
        let transaction = base_asset_tx(rng, input_amount, gas_limit, big_fee_limit);
1726
1727
        let consensus_params = params(factor);
1728
1729
        // when
1730
        let err = transaction
1731
            .into_checked(Default::default(), &consensus_params)
1732
            .expect_err("overflow expected");
1733
1734
        // then
1735
        let provided = match err {
1736
            CheckError::Validity(ValidityError::InsufficientFeeAmount {
1737
                provided,
1738
                ..
1739
            }) => provided,
1740
            _ => panic!("expected insufficient fee amount; found {err:?}"),
1741
        };
1742
        assert_eq!(provided, input_amount);
1743
    }
1744
1745
    #[test]
1746
    fn into_ready__bytes_fee_cant_overflow() {
1747
        let rng = &mut StdRng::seed_from_u64(2322u64);
1748
1749
        let input_amount = 1000;
1750
        let max_gas_price = Word::MAX;
1751
        let gas_limit = 0; // ensure only bytes are included in fee
1752
        let zero_fee_limit = 0;
1753
        let transaction = base_asset_tx(rng, input_amount, gas_limit, zero_fee_limit);
1754
        let gas_costs = GasCosts::default();
1755
1756
        let consensus_params = params(1);
1757
1758
        let fee_params = consensus_params.fee_params();
1759
        let err = transaction
1760
            .into_checked(Default::default(), &consensus_params)
1761
            .unwrap()
1762
            .into_ready(max_gas_price, &gas_costs, fee_params)
1763
            .expect_err("overflow expected");
1764
1765
        assert_eq!(err, CheckError::Validity(ValidityError::BalanceOverflow));
1766
    }
1767
1768
    #[test]
1769
    fn into_ready__fails_if_fee_limit_too_low() {
1770
        let rng = &mut StdRng::seed_from_u64(2322u64);
1771
1772
        let input_amount = 1000;
1773
        let gas_price = 100;
1774
        let gas_limit = 0; // ensure only bytes are included in fee
1775
        let gas_costs = GasCosts::default();
1776
1777
        let consensus_params = params(1);
1778
1779
        let fee_params = consensus_params.fee_params();
1780
1781
        // given
1782
        let zero_fee_limit = 0;
1783
        let transaction = base_asset_tx(rng, input_amount, gas_limit, zero_fee_limit);
1784
1785
        // when
1786
        let err = transaction
1787
            .into_checked(Default::default(), &consensus_params)
1788
            .unwrap()
1789
            .into_ready(gas_price, &gas_costs, fee_params)
1790
            .expect_err("overflow expected");
1791
1792
        // then
1793
        assert!(matches!(err, CheckError::InsufficientMaxFee { .. }));
1794
    }
1795
1796
    #[test]
1797
    fn into_ready__tx_fails_if_tip_not_covered() {
1798
        let rng = &mut StdRng::seed_from_u64(2322u64);
1799
1800
        // tx without tip and fee limit that is good
1801
        let input_amount = 1;
1802
        let gas_limit = 1000;
1803
        let params = ConsensusParameters::standard();
1804
        let block_height = 1.into();
1805
        let gas_costs = GasCosts::default();
1806
        let max_fee_limit = input_amount;
1807
        let gas_price = 1;
1808
1809
        let tx_without_tip =
1810
            base_asset_tx_with_tip(rng, input_amount, gas_limit, max_fee_limit, None);
1811
        tx_without_tip
1812
            .clone()
1813
            .into_checked(block_height, &params)
1814
            .unwrap()
1815
            .into_ready(gas_price, &gas_costs, params.fee_params())
1816
            .expect("Should be valid");
1817
1818
        // given
1819
        let tip = 100;
1820
        let tx_without_enough_to_pay_for_tip = base_asset_tx_with_tip(
1821
            rng,
1822
            input_amount,
1823
            gas_limit,
1824
            max_fee_limit,
1825
            Some(tip),
1826
        );
1827
        tx_without_enough_to_pay_for_tip
1828
            .into_checked(block_height, &params)
1829
            .unwrap()
1830
            .into_ready(gas_price, &gas_costs, params.fee_params())
1831
            .expect_err("Expected invalid transaction");
1832
1833
        // when
1834
        let new_input_amount = input_amount + tip;
1835
        let new_gas_limit = new_input_amount;
1836
        let tx = base_asset_tx_with_tip(
1837
            rng,
1838
            new_input_amount,
1839
            gas_limit,
1840
            new_gas_limit,
1841
            Some(tip),
1842
        );
1843
1844
        // then
1845
        tx.clone()
1846
            .into_checked(block_height, &params)
1847
            .unwrap()
1848
            .into_ready(gas_price, &GasCosts::default(), params.fee_params())
1849
            .expect("Should be valid");
1850
    }
1851
1852
    #[test]
1853
    fn into_ready__return_overflow_error_if_gas_price_too_high() {
1854
        let rng = &mut StdRng::seed_from_u64(2322u64);
1855
        let input_amount = 1000;
1856
        let gas_price = Word::MAX;
1857
        let gas_limit = 2; // 2 * max should cause gas fee overflow
1858
        let max_fee_limit = 0;
1859
1860
        let transaction = base_asset_tx(rng, input_amount, gas_limit, max_fee_limit);
1861
1862
        let consensus_params = params(1);
1863
1864
        let err = transaction
1865
            .into_checked(Default::default(), &consensus_params)
1866
            .unwrap()
1867
            .into_ready(
1868
                gas_price,
1869
                &GasCosts::default(),
1870
                consensus_params.fee_params(),
1871
            )
1872
            .expect_err("overflow expected");
1873
1874
        assert_eq!(err, CheckError::Validity(ValidityError::BalanceOverflow));
1875
    }
1876
1877
    #[test]
1878
    fn checked_tx_fails_if_asset_is_overspent_by_coin_output() {
1879
        let input_amount = 1_000;
1880
        let rng = &mut StdRng::seed_from_u64(2322u64);
1881
        let secret = SecretKey::random(rng);
1882
        let any_asset = rng.gen();
1883
        let tx = TransactionBuilder::script(vec![], vec![])
1884
            .script_gas_limit(100)
1885
            // base asset
1886
            .add_unsigned_coin_input(
1887
                secret,
1888
                rng.gen(),
1889
                input_amount,
1890
                AssetId::default(),
1891
                rng.gen(),
1892
            )
1893
            .add_output(Output::change(rng.gen(), 0, AssetId::default()))
1894
            // arbitrary spending asset
1895
            .add_unsigned_coin_input(
1896
                secret,
1897
                rng.gen(),
1898
                input_amount,
1899
                any_asset,
1900
                rng.gen(),
1901
            )
1902
            .add_output(Output::coin(rng.gen(), input_amount + 1, any_asset))
1903
            .add_output(Output::change(rng.gen(), 0, any_asset))
1904
            .finalize();
1905
1906
        let checked = tx
1907
            .into_checked(Default::default(), &ConsensusParameters::standard())
1908
            .expect_err("Expected valid transaction");
1909
1910
        assert_eq!(
1911
            CheckError::Validity(ValidityError::InsufficientInputAmount {
1912
                asset: any_asset,
1913
                expected: input_amount + 1,
1914
                provided: input_amount,
1915
            }),
1916
            checked
1917
        );
1918
    }
1919
1920
    #[cfg(feature = "std")]
1921
    #[test]
1922
    fn basic_check_marks_basic_flag() {
1923
        let block_height = 1.into();
1924
1925
        let tx = Transaction::default_test_tx();
1926
        // Sets Checks::Basic
1927
        let checked = tx
1928
            .into_checked_basic(block_height, &ConsensusParameters::standard())
1929
            .unwrap();
1930
        assert!(checked.checks().contains(Checks::Basic));
1931
    }
1932
1933
    #[test]
1934
    fn signatures_check_marks_signatures_flag() {
1935
        let mut rng = StdRng::seed_from_u64(1);
1936
        let block_height = 1.into();
1937
        let max_fee_limit = 0;
1938
1939
        let tx = valid_coin_tx(&mut rng, 100000, 1000000, 10, max_fee_limit);
1940
        let chain_id = ChainId::default();
1941
        let checked = tx
1942
            // Sets Checks::Basic
1943
            .into_checked(
1944
                block_height,
1945
                &ConsensusParameters::standard_with_id(chain_id),
1946
            )
1947
            .unwrap()
1948
            // Sets Checks::Signatures
1949
            .check_signatures(&chain_id)
1950
            .unwrap();
1951
1952
        assert!(checked
1953
            .checks()
1954
            .contains(Checks::Basic | Checks::Signatures));
1955
    }
1956
1957
    #[test]
1958
    fn predicates_check_marks_predicate_flag() {
1959
        let mut rng = StdRng::seed_from_u64(1);
1960
        let block_height = 1.into();
1961
        let gas_costs = GasCosts::default();
1962
1963
        let tx = predicate_tx(&mut rng, 1000000, 1000000, 1000000, gas_costs.ret());
1964
1965
        let mut consensus_params = ConsensusParameters::standard();
1966
        consensus_params.set_gas_costs(gas_costs);
1967
1968
        let check_predicate_params = CheckPredicateParams::from(&consensus_params);
1969
1970
        let checked = tx
1971
            // Sets Checks::Basic
1972
            .into_checked(
1973
                block_height,
1974
                &consensus_params,
1975
            )
1976
            .unwrap()
1977
            // Sets Checks::Predicates
1978
            .check_predicates(&check_predicate_params, MemoryInstance::new(), &EmptyStorage)
1979
            .unwrap();
1980
        assert!(checked
1981
            .checks()
1982
            .contains(Checks::Basic | Checks::Predicates));
1983
    }
1984
1985
    fn is_valid_max_fee(
1986
        tx: &Script,
1987
        gas_price: u64,
1988
        gas_costs: &GasCosts,
1989
        fee_params: &FeeParameters,
1990
    ) -> Result<bool, ValidityError> {
1991
        fn gas_to_fee(gas: u64, price: u64, factor: u64) -> u128 {
1992
            let prices_gas = gas as u128 * price as u128;
1993
            let fee = prices_gas / factor as u128;
1994
            let fee_remainder = (prices_gas.rem_euclid(factor as u128) > 0) as u128;
1995
            fee + fee_remainder
1996
        }
1997
1998
        // cant overflow as metered bytes * gas_per_byte < u64::MAX
1999
        let gas_used_by_bytes = fee_params
2000
            .gas_per_byte()
2001
            .saturating_mul(tx.metered_bytes_size() as u64);
2002
        let gas_used_by_inputs = tx.gas_used_by_inputs(gas_costs);
2003
        let gas_used_by_metadata = tx.gas_used_by_metadata(gas_costs);
2004
        let min_gas = gas_used_by_bytes
2005
            .saturating_add(gas_used_by_inputs)
2006
            .saturating_add(gas_used_by_metadata)
2007
            .saturating_add(
2008
                gas_costs
2009
                    .vm_initialization()
2010
                    .resolve(tx.metered_bytes_size() as u64),
2011
            );
2012
2013
        // use different division mechanism than impl
2014
        let witness_limit_allowance = tx
2015
            .witness_limit()
2016
            .saturating_sub(tx.witnesses().size_dynamic() as u64)
2017
            .saturating_mul(fee_params.gas_per_byte());
2018
        let max_gas = min_gas
2019
            .saturating_add(*tx.script_gas_limit())
2020
            .saturating_add(witness_limit_allowance);
2021
        let max_fee = gas_to_fee(max_gas, gas_price, fee_params.gas_price_factor());
2022
2023
        let max_fee_with_tip = max_fee.saturating_add(tx.tip() as u128);
2024
2025
        let result = max_fee_with_tip == tx.max_fee(gas_costs, fee_params, gas_price);
2026
        Ok(result)
2027
    }
2028
2029
    fn is_valid_min_fee<Tx>(
2030
        tx: &Tx,
2031
        gas_costs: &GasCosts,
2032
        fee_params: &FeeParameters,
2033
        gas_price: u64,
2034
    ) -> Result<bool, ValidityError>
2035
    where
2036
        Tx: Chargeable + field::Inputs + field::Outputs,
2037
    {
2038
        // cant overflow as (metered bytes + gas_used_by_predicates) * gas_per_byte <
2039
        // u64::MAX
2040
        let gas_used_by_bytes = fee_params
2041
            .gas_per_byte()
2042
            .saturating_mul(tx.metered_bytes_size() as u64);
2043
        let gas_used_by_inputs = tx.gas_used_by_inputs(gas_costs);
2044
        let gas_used_by_metadata = tx.gas_used_by_metadata(gas_costs);
2045
        let gas = gas_used_by_bytes
2046
            .saturating_add(gas_used_by_inputs)
2047
            .saturating_add(gas_used_by_metadata)
2048
            .saturating_add(
2049
                gas_costs
2050
                    .vm_initialization()
2051
                    .resolve(tx.metered_bytes_size() as u64),
2052
            );
2053
        let total = gas as u128 * gas_price as u128;
2054
        // use different division mechanism than impl
2055
        let fee = total / fee_params.gas_price_factor() as u128;
2056
        let fee_remainder =
2057
            (total.rem_euclid(fee_params.gas_price_factor() as u128) > 0) as u128;
2058
        let rounded_fee = fee
2059
            .saturating_add(fee_remainder)
2060
            .saturating_add(tx.tip() as u128);
2061
        let min_fee = rounded_fee;
2062
        let calculated_min_fee = tx.min_fee(gas_costs, fee_params, gas_price);
2063
2064
        Ok(min_fee == calculated_min_fee)
2065
    }
2066
2067
    fn valid_coin_tx(
2068
        rng: &mut StdRng,
2069
        gas_limit: u64,
2070
        input_amount: u64,
2071
        output_amount: u64,
2072
        max_fee_limit: u64,
2073
    ) -> Script {
2074
        let asset = AssetId::default();
2075
        TransactionBuilder::script(vec![], vec![])
2076
            .script_gas_limit(gas_limit)
2077
            .max_fee_limit(max_fee_limit)
2078
            .add_unsigned_coin_input(
2079
                SecretKey::random(rng),
2080
                rng.gen(),
2081
                input_amount,
2082
                asset,
2083
                rng.gen(),
2084
            )
2085
            .add_input(Input::contract(
2086
                rng.gen(),
2087
                rng.gen(),
2088
                rng.gen(),
2089
                rng.gen(),
2090
                rng.gen(),
2091
            ))
2092
            .add_output(Output::contract(1, rng.gen(), rng.gen()))
2093
            .add_output(Output::coin(rng.gen(), output_amount, asset))
2094
            .add_output(Output::change(rng.gen(), 0, asset))
2095
            .finalize()
2096
    }
2097
2098
    // used when proptesting to avoid expensive crypto signatures
2099
    fn predicate_tx(
2100
        rng: &mut StdRng,
2101
        gas_limit: u64,
2102
        witness_limit: u64,
2103
        fee_input_amount: u64,
2104
        predicate_gas_used: u64,
2105
    ) -> Script {
2106
        let asset = AssetId::default();
2107
        let predicate = vec![op::ret(1)].into_iter().collect::<Vec<u8>>();
2108
        let owner = Input::predicate_owner(&predicate);
2109
        let zero_fee_limit = 0;
2110
        TransactionBuilder::script(vec![], vec![])
2111
            .max_fee_limit(zero_fee_limit)
2112
            .script_gas_limit(gas_limit)
2113
            .witness_limit(witness_limit)
2114
            .add_input(Input::coin_predicate(
2115
                rng.gen(),
2116
                owner,
2117
                fee_input_amount,
2118
                asset,
2119
                rng.gen(),
2120
                predicate_gas_used,
2121
                predicate,
2122
                vec![],
2123
            ))
2124
            .add_output(Output::change(rng.gen(), 0, asset))
2125
            .finalize()
2126
    }
2127
2128
    // used to verify message inputs can cover fees
2129
    fn signed_message_coin_tx(
2130
        rng: &mut StdRng,
2131
        gas_limit: u64,
2132
        input_amount: u64,
2133
        max_fee: u64,
2134
    ) -> Script {
2135
        TransactionBuilder::script(vec![], vec![])
2136
            .max_fee_limit(max_fee)
2137
            .script_gas_limit(gas_limit)
2138
            .add_unsigned_message_input(
2139
                SecretKey::random(rng),
2140
                rng.gen(),
2141
                rng.gen(),
2142
                input_amount,
2143
                vec![],
2144
            )
2145
            .finalize()
2146
    }
2147
2148
    fn predicate_message_coin_tx(
2149
        rng: &mut StdRng,
2150
        gas_limit: u64,
2151
        input_amount: u64,
2152
        tip: u64,
2153
    ) -> Script {
2154
        TransactionBuilder::script(vec![], vec![])
2155
            .tip(tip)
2156
            .script_gas_limit(gas_limit)
2157
            .add_input(Input::message_coin_predicate(
2158
                rng.gen(),
2159
                rng.gen(),
2160
                input_amount,
2161
                rng.gen(),
2162
                Default::default(),
2163
                vec![],
2164
                vec![],
2165
            ))
2166
            .finalize()
2167
    }
2168
2169
    fn base_asset_tx(
2170
        rng: &mut StdRng,
2171
        input_amount: u64,
2172
        gas_limit: u64,
2173
        max_fee: u64,
2174
    ) -> Script {
2175
        base_asset_tx_with_tip(rng, input_amount, gas_limit, max_fee, None)
2176
    }
2177
2178
    fn base_asset_tx_with_tip(
2179
        rng: &mut StdRng,
2180
        input_amount: u64,
2181
        gas_limit: u64,
2182
        max_fee: u64,
2183
        tip: Option<u64>,
2184
    ) -> Script {
2185
        let mut builder = TransactionBuilder::script(vec![], vec![]);
2186
        if let Some(tip) = tip {
2187
            builder.tip(tip);
2188
        }
2189
        builder
2190
            .max_fee_limit(max_fee)
2191
            .script_gas_limit(gas_limit)
2192
            .add_unsigned_coin_input(
2193
                SecretKey::random(rng),
2194
                rng.gen(),
2195
                input_amount,
2196
                AssetId::default(),
2197
                rng.gen(),
2198
            )
2199
            .add_output(Output::change(rng.gen(), 0, AssetId::default()))
2200
            .finalize()
2201
    }
2202
}
/home/marten/fuel/fuel-vm/fuel-vm/src/lib.rs
Line
Count
Source
1
//! FuelVM implementation
2
3
#![cfg_attr(not(feature = "std"), no_std)]
4
#![warn(missing_docs)]
5
#![deny(unsafe_code)]
6
#![deny(unused_must_use)]
7
#![deny(unused_crate_dependencies)]
8
#![deny(
9
    clippy::arithmetic_side_effects,
10
    clippy::cast_sign_loss,
11
    clippy::cast_possible_truncation,
12
    clippy::cast_possible_wrap,
13
    clippy::string_slice
14
)]
15
16
#[doc(hidden)] // Needed by some of the exported macros
17
pub extern crate alloc;
18
19
extern crate core;
20
#[cfg(feature = "std")]
21
extern crate libm as _; // Not needed with stdlib
22
23
#[cfg(test)]
24
use criterion as _;
25
26
pub mod backtrace;
27
pub mod call;
28
pub mod checked_transaction;
29
pub mod constraints;
30
pub mod consts;
31
pub mod context;
32
mod convert;
33
pub mod crypto;
34
pub mod error;
35
pub mod interpreter;
36
#[cfg(feature = "test-helpers")]
37
pub mod memory_client;
38
pub mod pool;
39
pub mod predicate;
40
pub mod state;
41
pub mod storage;
42
pub mod transactor;
43
pub mod util;
44
45
#[cfg(feature = "profile-any")]
46
pub mod profiler;
47
48
#[cfg(test)]
49
mod tests;
50
51
#[cfg(not(feature = "profile-any"))]
52
/// Placeholder
53
pub mod profiler {
54
    use crate::constraints::InstructionLocation;
55
56
    /// Placeholder profiler.
57
    #[derive(Default, Debug, Clone)]
58
    pub struct Profiler;
59
60
    impl Profiler {
61
        /// Set the current coverage location.
62
0
        pub fn set_coverage(&mut self, _location: InstructionLocation) {}
63
64
        /// Add gas to the current coverage location.
65
0
        pub fn add_gas(&mut self, _location: InstructionLocation, _gas_use: u64) {}
66
    }
67
}
68
69
// Fully re-export fuel dependencies
70
#[doc(no_inline)]
71
pub use fuel_asm;
72
#[doc(no_inline)]
73
#[cfg(feature = "da-compression")]
74
pub use fuel_compression;
75
#[doc(no_inline)]
76
pub use fuel_crypto;
77
#[doc(no_inline)]
78
pub use fuel_merkle;
79
#[doc(no_inline)]
80
pub use fuel_storage;
81
#[doc(no_inline)]
82
pub use fuel_tx;
83
#[doc(no_inline)]
84
pub use fuel_types;
85
86
pub mod prelude {
87
    //! Required implementations for full functionality
88
    #[doc(no_inline)]
89
    pub use fuel_asm::{
90
        GMArgs,
91
        GTFArgs,
92
        Instruction,
93
        Opcode,
94
        PanicReason,
95
        RegId,
96
    };
97
    #[doc(no_inline)]
98
    pub use fuel_crypto::{
99
        Hasher,
100
        Message,
101
        PublicKey,
102
        SecretKey,
103
        Signature,
104
    };
105
    #[doc(no_inline)]
106
    pub use fuel_storage::{
107
        MerkleRoot,
108
        MerkleRootStorage,
109
        StorageAsMut,
110
        StorageAsRef,
111
        StorageInspect,
112
        StorageMutate,
113
    };
114
    #[doc(no_inline)]
115
    pub use fuel_tx::*;
116
    #[doc(no_inline)]
117
    pub use fuel_types::{
118
        Address,
119
        AssetId,
120
        BlobId,
121
        Bytes32,
122
        Bytes4,
123
        Bytes64,
124
        Bytes8,
125
        ContractId,
126
        Immediate06,
127
        Immediate12,
128
        Immediate18,
129
        Immediate24,
130
        RegisterId,
131
        Salt,
132
        Word,
133
    };
134
135
    pub use crate::{
136
        backtrace::Backtrace,
137
        call::{
138
            Call,
139
            CallFrame,
140
        },
141
        context::Context,
142
        error::{
143
            Bug,
144
            BugVariant,
145
            InterpreterError,
146
            RuntimeError,
147
        },
148
        interpreter::{
149
            predicates,
150
            ExecutableTransaction,
151
            Interpreter,
152
            Memory,
153
            MemoryInstance,
154
            MemoryRange,
155
        },
156
        pool::VmMemoryPool,
157
        predicate::RuntimePredicate,
158
        state::{
159
            Debugger,
160
            ProgramState,
161
            StateTransition,
162
            StateTransitionRef,
163
        },
164
        storage::{
165
            predicate::PredicateStorage,
166
            InterpreterStorage,
167
        },
168
        transactor::Transactor,
169
    };
170
171
    pub use crate::state::{
172
        Breakpoint,
173
        DebugEval,
174
    };
175
176
    #[cfg(any(test, feature = "test-helpers"))]
177
    pub use crate::{
178
        checked_transaction::{
179
            builder::TransactionBuilderExt,
180
            IntoChecked,
181
        },
182
        memory_client::MemoryClient,
183
        storage::MemoryStorage,
184
        util::test_helpers::TestBuilder,
185
    };
186
187
    #[cfg(all(
188
        feature = "profile-gas",
189
        feature = "std",
190
        any(test, feature = "test-helpers")
191
    ))]
192
    pub use crate::util::gas_profiling::GasProfiler;
193
194
    pub use crate::profiler::Profiler;
195
    #[cfg(feature = "profile-any")]
196
    pub use crate::profiler::{
197
        CoverageProfilingData,
198
        GasProfilingData,
199
        InstructionLocation,
200
        PerLocationIter,
201
        PerLocationKeys,
202
        PerLocationValues,
203
        ProfileReceiver,
204
        ProfilingData,
205
        StderrReceiver,
206
    };
207
}
/home/marten/fuel/fuel-vm/fuel-vm/src/pool.rs
Line
Count
Source
1
//! Pool of VM memory instances for reuse.
2
3
use crate::interpreter::Memory;
4
5
#[cfg(any(test, feature = "test-helpers"))]
6
use crate::interpreter::MemoryInstance;
7
8
/// Trait for a VM memory pool.
9
pub trait VmMemoryPool: Sync {
10
    /// The memory instance returned by this pool.
11
    type Memory: Memory + Send + Sync + 'static;
12
13
    /// Gets a new VM memory instance from the pool.
14
    fn get_new(&self) -> impl core::future::Future<Output = Self::Memory> + Send;
15
}
16
17
/// Dummy pool that just returns new instance every time.
18
#[cfg(any(test, feature = "test-helpers"))]
19
#[derive(Default, Clone)]
20
pub struct DummyPool;
21
22
#[cfg(any(test, feature = "test-helpers"))]
23
impl VmMemoryPool for DummyPool {
24
    type Memory = MemoryInstance;
25
26
0
    fn get_new(&self) -> impl core::future::Future<Output = Self::Memory> + Send {
27
0
        core::future::ready(MemoryInstance::new())
28
0
    }
29
}
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter/executors/predicate.rs
Line
Count
Source
1
use crate::{
2
    error::PredicateVerificationFailed,
3
    interpreter::{
4
        EcalHandler,
5
        Memory,
6
    },
7
    prelude::{
8
        ExecutableTransaction,
9
        Interpreter,
10
    },
11
    state::{
12
        ExecuteState,
13
        ProgramState,
14
    },
15
    storage::predicate::PredicateStorage,
16
};
17
18
use crate::storage::predicate::PredicateStorageRequirements;
19
use fuel_asm::PanicReason;
20
21
impl<M, Tx, Ecal, S> Interpreter<M, PredicateStorage<S>, Tx, Ecal>
22
where
23
    M: Memory,
24
    Tx: ExecutableTransaction,
25
    Ecal: EcalHandler,
26
    S: PredicateStorageRequirements,
27
{
28
    /// Verify a predicate that has been initialized already
29
0
    pub(crate) fn verify_predicate(
30
0
        &mut self,
31
0
    ) -> Result<ProgramState, PredicateVerificationFailed> {
32
        loop {
33
0
            match self.execute()? {
34
0
                ExecuteState::Return(r) => {
35
0
                    if r == 1 {
36
0
                        return Ok(ProgramState::Return(r))
37
                    } else {
38
0
                        return Err(PanicReason::PredicateReturnedNonOne.into())
39
                    }
40
                }
41
42
                // A predicate is not expected to return data
43
                ExecuteState::ReturnData(_) => {
44
0
                    return Err(PanicReason::ContractInstructionNotAllowed.into())
45
                }
46
47
0
                ExecuteState::Revert(r) => return Ok(ProgramState::Revert(r)),
48
49
0
                ExecuteState::Proceed => (),
50
51
0
                ExecuteState::DebugEvent(d) => {
52
0
                    return Ok(ProgramState::VerifyPredicate(d))
53
                }
54
            }
55
        }
56
0
    }
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors9predicateINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1S_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_4blob8BlobBodyNtB4w_12BlobMetadataEE16verify_predicateB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors9predicateINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1S_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_6create10CreateBodyNtB4w_14CreateMetadataEE16verify_predicateB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors9predicateINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1S_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_6script10ScriptBodyNtB4w_14ScriptMetadataEE16verify_predicateB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors9predicateINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1S_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_6upload10UploadBodyNtB4w_14UploadMetadataEE16verify_predicateB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors9predicateINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1S_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_7upgrade11UpgradeBodyNtB4w_15UpgradeMetadataEE16verify_predicateB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors9predicateINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1U_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3a_6script10ScriptBodyNtB4G_14ScriptMetadataEE16verify_predicateB8_
57
}
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter/executors/debug.rs
Line
Count
Source
1
use crate::{
2
    error::InterpreterError,
3
    interpreter::{
4
        EcalHandler,
5
        ExecutableTransaction,
6
        Interpreter,
7
        Memory,
8
    },
9
    state::ProgramState,
10
    storage::InterpreterStorage,
11
};
12
13
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
14
where
15
    M: Memory,
16
    S: InterpreterStorage,
17
    Tx: ExecutableTransaction,
18
    Ecal: EcalHandler,
19
{
20
    /// Continue the execution from a previously interrupted program flow.
21
0
    pub fn resume(&mut self) -> Result<ProgramState, InterpreterError<S::DataError>> {
22
0
        let state = self
23
0
            .debugger_last_state()
24
0
            .ok_or(InterpreterError::DebugStateNotInitialized)?;
25
26
0
        let state = match state {
27
0
            ProgramState::Return(w) => Ok(ProgramState::Return(w)),
28
29
0
            ProgramState::ReturnData(d) => Ok(ProgramState::ReturnData(d)),
30
31
0
            ProgramState::Revert(w) => Ok(ProgramState::Revert(w)),
32
33
0
            ProgramState::RunProgram(_) => self.run_program(),
34
35
0
            ProgramState::VerifyPredicate(_) => unimplemented!(),
36
0
        }?;
37
38
0
        if state.is_debug() {
39
0
            self.debugger_set_last_state(state);
40
0
        }
41
42
0
        Ok(state)
43
0
    }
44
}
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter/executors/instruction.rs
Line
Count
Source
1
use crate::{
2
    constraints::reg_key::ProgramRegistersSegment,
3
    error::{
4
        InterpreterError,
5
        IoResult,
6
        RuntimeError,
7
    },
8
    interpreter::{
9
        alu,
10
        flow::{
11
            JumpArgs,
12
            JumpMode,
13
        },
14
        EcalHandler,
15
        ExecutableTransaction,
16
        Interpreter,
17
        Memory,
18
    },
19
    state::ExecuteState,
20
    storage::InterpreterStorage,
21
};
22
23
use fuel_asm::{
24
    wideint,
25
    Instruction,
26
    PanicInstruction,
27
    PanicReason,
28
    RawInstruction,
29
    RegId,
30
};
31
use fuel_types::Word;
32
33
use core::ops::Div;
34
35
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
36
where
37
    M: Memory,
38
    S: InterpreterStorage,
39
    Tx: ExecutableTransaction,
40
    Ecal: EcalHandler,
41
{
42
    /// Execute the current instruction located in `$m[$pc]`.
43
387M
    pub fn execute(&mut self) -> Result<ExecuteState, InterpreterError<S::DataError>> {
44
387M
        let raw_instruction = self.fetch_instruction()?;
45
387M
        self.instruction(raw_instruction)
46
387M
    }
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2z_4blob8BlobBodyNtB45_12BlobMetadataEE7executeB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2z_6create10CreateBodyNtB45_14CreateMetadataEE7executeB8_
_RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2z_6script10ScriptBodyNtB45_14ScriptMetadataEE7executeB8_
Line
Count
Source
43
387M
    pub fn execute(&mut self) -> Result<ExecuteState, InterpreterError<S::DataError>> {
44
387M
        let raw_instruction = self.fetch_instruction()?;
45
387M
        self.instruction(raw_instruction)
46
387M
    }
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1V_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB33_4blob8BlobBodyNtB4z_12BlobMetadataEE7executeB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1V_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB33_6create10CreateBodyNtB4z_14CreateMetadataEE7executeB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1V_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB33_6script10ScriptBodyNtB4z_14ScriptMetadataEE7executeB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1V_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB33_6upload10UploadBodyNtB4z_14UploadMetadataEE7executeB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1V_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB33_7upgrade11UpgradeBodyNtB4z_15UpgradeMetadataEE7executeB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1X_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3d_6script10ScriptBodyNtB4J_14ScriptMetadataEE7executeB8_
47
48
    /// Reads the current instruction located in `$m[$pc]`,
49
    /// performing memory boundary checks.
50
387M
    fn fetch_instruction(
51
387M
        &self,
52
387M
    ) -> Result<RawInstruction, InterpreterError<S::DataError>> {
53
387M
        let pc = self.registers[RegId::PC];
54
387M
        let instruction = RawInstruction::from_be_bytes(
55
387M
            self.memory().read_bytes(pc).map_err(|reason| {
56
23
                InterpreterError::PanicInstruction(PanicInstruction::error(
57
23
                    reason,
58
23
                    0, // The value is meaningless since fetch was out-of-bounds
59
23
                ))
60
387M
            })?,
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2B_4blob8BlobBodyNtB47_12BlobMetadataEE17fetch_instruction0Ba_
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2B_6create10CreateBodyNtB47_14CreateMetadataEE17fetch_instruction0Ba_
_RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2B_6script10ScriptBodyNtB47_14ScriptMetadataEE17fetch_instruction0Ba_
Line
Count
Source
55
23
            self.memory().read_bytes(pc).map_err(|reason| {
56
23
                InterpreterError::PanicInstruction(PanicInstruction::error(
57
23
                    reason,
58
23
                    0, // The value is meaningless since fetch was out-of-bounds
59
23
                ))
60
23
            })?,
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1X_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB35_4blob8BlobBodyNtB4B_12BlobMetadataEE17fetch_instruction0Ba_
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1X_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB35_6create10CreateBodyNtB4B_14CreateMetadataEE17fetch_instruction0Ba_
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1X_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB35_6script10ScriptBodyNtB4B_14ScriptMetadataEE17fetch_instruction0Ba_
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1X_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB35_6upload10UploadBodyNtB4B_14UploadMetadataEE17fetch_instruction0Ba_
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1X_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB35_7upgrade11UpgradeBodyNtB4B_15UpgradeMetadataEE17fetch_instruction0Ba_
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtNtB1Z_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3f_6script10ScriptBodyNtB4L_14ScriptMetadataEE17fetch_instruction0Ba_
61
        );
62
387M
        if pc < self.registers[RegId::IS] || pc >= self.registers[RegId::SSP] {
63
6
            return Err(InterpreterError::PanicInstruction(PanicInstruction::error(
64
6
                PanicReason::MemoryNotExecutable,
65
6
                instruction,
66
6
            )))
67
387M
        }
68
387M
        Ok(instruction)
69
387M
    }
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2z_4blob8BlobBodyNtB45_12BlobMetadataEE17fetch_instructionB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2z_6create10CreateBodyNtB45_14CreateMetadataEE17fetch_instructionB8_
_RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2z_6script10ScriptBodyNtB45_14ScriptMetadataEE17fetch_instructionB8_
Line
Count
Source
50
387M
    fn fetch_instruction(
51
387M
        &self,
52
387M
    ) -> Result<RawInstruction, InterpreterError<S::DataError>> {
53
387M
        let pc = self.registers[RegId::PC];
54
387M
        let instruction = RawInstruction::from_be_bytes(
55
387M
            self.memory().read_bytes(pc).map_err(|reason| {
56
                InterpreterError::PanicInstruction(PanicInstruction::error(
57
                    reason,
58
                    0, // The value is meaningless since fetch was out-of-bounds
59
                ))
60
387M
            })?,
61
        );
62
387M
        if pc < self.registers[RegId::IS] || pc >= self.registers[RegId::SSP] {
63
6
            return Err(InterpreterError::PanicInstruction(PanicInstruction::error(
64
6
                PanicReason::MemoryNotExecutable,
65
6
                instruction,
66
6
            )))
67
387M
        }
68
387M
        Ok(instruction)
69
387M
    }
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1V_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB33_4blob8BlobBodyNtB4z_12BlobMetadataEE17fetch_instructionB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1V_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB33_6create10CreateBodyNtB4z_14CreateMetadataEE17fetch_instructionB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1V_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB33_6script10ScriptBodyNtB4z_14ScriptMetadataEE17fetch_instructionB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1V_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB33_6upload10UploadBodyNtB4z_14UploadMetadataEE17fetch_instructionB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1V_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB33_7upgrade11UpgradeBodyNtB4z_15UpgradeMetadataEE17fetch_instructionB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1X_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3d_6script10ScriptBodyNtB4J_14ScriptMetadataEE17fetch_instructionB8_
70
71
    /// Execute a provided instruction
72
387M
    pub fn instruction<R: Into<RawInstruction> + Copy>(
73
387M
        &mut self,
74
387M
        raw: R,
75
387M
    ) -> Result<ExecuteState, InterpreterError<S::DataError>> {
76
387M
        if self.debugger.is_active() {
77
0
            let debug = self.eval_debugger_state();
78
0
            if !debug.should_continue() {
79
0
                return Ok(debug.into())
80
0
            }
81
387M
        }
82
83
387M
        self.instruction_inner(raw.into())
84
387M
            .map_err(|e| InterpreterError::from_runtime(e, raw.into()))
Unexecuted instantiation: _RNCINvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2C_4blob8BlobBodyNtB48_12BlobMetadataEE11instructionmE0Bb_
Unexecuted instantiation: _RNCINvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2C_6create10CreateBodyNtB48_14CreateMetadataEE11instructionmE0Bb_
_RNCINvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2C_6script10ScriptBodyNtB48_14ScriptMetadataEE11instructionmE0Bb_
Line
Count
Source
84
2.12k
            .map_err(|e| InterpreterError::from_runtime(e, raw.into()))
Unexecuted instantiation: _RNCINvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB9_11InterpreterQNtNtB9_6memory14MemoryInstanceINtNtNtBb_7storage9predicate16PredicateStorageRNtB1Y_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB36_4blob8BlobBodyNtB4C_12BlobMetadataEE11instructionmE0Bb_
Unexecuted instantiation: _RNCINvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB9_11InterpreterQNtNtB9_6memory14MemoryInstanceINtNtNtBb_7storage9predicate16PredicateStorageRNtB1Y_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB36_6create10CreateBodyNtB4C_14CreateMetadataEE11instructionmE0Bb_
Unexecuted instantiation: _RNCINvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB9_11InterpreterQNtNtB9_6memory14MemoryInstanceINtNtNtBb_7storage9predicate16PredicateStorageRNtB1Y_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB36_6script10ScriptBodyNtB4C_14ScriptMetadataEE11instructionmE0Bb_
Unexecuted instantiation: _RNCINvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB9_11InterpreterQNtNtB9_6memory14MemoryInstanceINtNtNtBb_7storage9predicate16PredicateStorageRNtB1Y_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB36_6upload10UploadBodyNtB4C_14UploadMetadataEE11instructionmE0Bb_
Unexecuted instantiation: _RNCINvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB9_11InterpreterQNtNtB9_6memory14MemoryInstanceINtNtNtBb_7storage9predicate16PredicateStorageRNtB1Y_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB36_7upgrade11UpgradeBodyNtB4C_15UpgradeMetadataEE11instructionmE0Bb_
Unexecuted instantiation: _RNCINvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB9_11InterpreterQNtNtB9_6memory14MemoryInstanceINtNtNtBb_7storage9predicate16PredicateStorageRNtNtB20_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3g_6script10ScriptBodyNtB4M_14ScriptMetadataEE11instructionmE0Bb_
85
387M
    }
Unexecuted instantiation: _RINvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2A_4blob8BlobBodyNtB46_12BlobMetadataEE11instructionmEB9_
Unexecuted instantiation: _RINvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2A_6create10CreateBodyNtB46_14CreateMetadataEE11instructionmEB9_
_RINvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2A_6script10ScriptBodyNtB46_14ScriptMetadataEE11instructionmEB9_
Line
Count
Source
72
387M
    pub fn instruction<R: Into<RawInstruction> + Copy>(
73
387M
        &mut self,
74
387M
        raw: R,
75
387M
    ) -> Result<ExecuteState, InterpreterError<S::DataError>> {
76
387M
        if self.debugger.is_active() {
77
0
            let debug = self.eval_debugger_state();
78
0
            if !debug.should_continue() {
79
0
                return Ok(debug.into())
80
0
            }
81
387M
        }
82
83
387M
        self.instruction_inner(raw.into())
84
387M
            .map_err(|e| InterpreterError::from_runtime(e, raw.into()))
85
387M
    }
Unexecuted instantiation: _RINvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1W_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB34_4blob8BlobBodyNtB4A_12BlobMetadataEE11instructionmEB9_
Unexecuted instantiation: _RINvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1W_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB34_6create10CreateBodyNtB4A_14CreateMetadataEE11instructionmEB9_
Unexecuted instantiation: _RINvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1W_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB34_6script10ScriptBodyNtB4A_14ScriptMetadataEE11instructionmEB9_
Unexecuted instantiation: _RINvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1W_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB34_6upload10UploadBodyNtB4A_14UploadMetadataEE11instructionmEB9_
Unexecuted instantiation: _RINvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1W_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB34_7upgrade11UpgradeBodyNtB4A_15UpgradeMetadataEE11instructionmEB9_
Unexecuted instantiation: _RINvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtNtB1Y_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3e_6script10ScriptBodyNtB4K_14ScriptMetadataEE11instructionmEB9_
86
87
387M
    fn instruction_inner(
88
387M
        &mut self,
89
387M
        raw: RawInstruction,
90
387M
    ) -> IoResult<ExecuteState, S::DataError> {
91
387M
        let instruction = Instruction::try_from(raw)
92
387M
            .map_err(|_| RuntimeError::from(PanicReason::InvalidInstruction))?;
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2B_4blob8BlobBodyNtB47_12BlobMetadataEE17instruction_inner0Ba_
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2B_6create10CreateBodyNtB47_14CreateMetadataEE17instruction_inner0Ba_
_RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2B_6script10ScriptBodyNtB47_14ScriptMetadataEE17instruction_inner0Ba_
Line
Count
Source
92
596
            .map_err(|_| RuntimeError::from(PanicReason::InvalidInstruction))?;
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1X_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB35_4blob8BlobBodyNtB4B_12BlobMetadataEE17instruction_inner0Ba_
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1X_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB35_6create10CreateBodyNtB4B_14CreateMetadataEE17instruction_inner0Ba_
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1X_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB35_6script10ScriptBodyNtB4B_14ScriptMetadataEE17instruction_inner0Ba_
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1X_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB35_6upload10UploadBodyNtB4B_14UploadMetadataEE17instruction_inner0Ba_
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1X_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB35_7upgrade11UpgradeBodyNtB4B_15UpgradeMetadataEE17instruction_inner0Ba_
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtNtB1Z_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3f_6script10ScriptBodyNtB4L_14ScriptMetadataEE17instruction_inner0Ba_
93
94
        // TODO additional branch that might be optimized after
95
        // https://github.com/FuelLabs/fuel-asm/issues/68
96
387M
        if self.is_predicate() && !instruction.opcode().is_predicate_allowed() {
97
0
            return Err(PanicReason::ContractInstructionNotAllowed.into())
98
387M
        }
99
100
        // Short-hand for retrieving the value from the register with the given ID.
101
        // We use a macro to "close over" `self.registers` without taking ownership of it.
102
        macro_rules! r {
103
            ($id:expr) => {
104
                self.registers[$id]
105
            };
106
        }
107
108
387M
        match instruction {
109
30.0M
            Instruction::ADD(add) => {
110
30.0M
                self.gas_charge(self.gas_costs().add())?;
111
30.0M
                let (a, b, c) = add.unpack();
112
30.0M
                self.alu_capture_overflow(
113
30.0M
                    a.into(),
114
30.0M
                    u128::overflowing_add,
115
30.0M
                    r!(b).into(),
116
30.0M
                    r!(c).into(),
117
30.0M
                )?;
118
            }
119
120
34.9M
            Instruction::ADDI(addi) => {
121
34.9M
                self.gas_charge(self.gas_costs().addi())?;
122
34.9M
                let (a, b, imm) = addi.unpack();
123
34.9M
                self.alu_capture_overflow(
124
34.9M
                    a.into(),
125
34.9M
                    u128::overflowing_add,
126
34.9M
                    r!(b).into(),
127
34.9M
                    imm.into(),
128
34.9M
                )?;
129
            }
130
131
4.64M
            Instruction::AND(and) => {
132
4.64M
                self.gas_charge(self.gas_costs().and())?;
133
4.64M
                let (a, b, c) = and.unpack();
134
4.64M
                self.alu_set(a.into(), r!(b) & r!(c))?;
135
            }
136
137
3.18M
            Instruction::ANDI(andi) => {
138
3.18M
                self.gas_charge(self.gas_costs().andi())?;
139
3.18M
                let (a, b, imm) = andi.unpack();
140
3.18M
                self.alu_set(a.into(), r!(b) & Word::from(imm))?;
141
            }
142
143
141k
            Instruction::DIV(div) => {
144
141k
                self.gas_charge(self.gas_costs().div())?;
145
141k
                let (a, b, c) = div.unpack();
146
141k
                let c = r!(c);
147
141k
                self.alu_error(a.into(), Word::div, r!(b), c, c == 0)?;
148
            }
149
150
5.48M
            Instruction::DIVI(divi) => {
151
5.48M
                self.gas_charge(self.gas_costs().divi())?;
152
5.48M
                let (a, b, imm) = divi.unpack();
153
5.48M
                let imm = Word::from(imm);
154
5.48M
                self.alu_error(a.into(), Word::div, r!(b), imm, imm == 0)?;
155
            }
156
157
6.91M
            Instruction::EQ(eq) => {
158
6.91M
                self.gas_charge(self.gas_costs().eq_())?;
159
6.91M
                let (a, b, c) = eq.unpack();
160
6.91M
                self.alu_set(a.into(), (r!(b) == r!(c)) as Word)?;
161
            }
162
163
1.59M
            Instruction::EXP(exp) => {
164
1.59M
                self.gas_charge(self.gas_costs().exp())?;
165
1.59M
                let (a, b, c) = exp.unpack();
166
1.59M
                self.alu_boolean_overflow(a.into(), alu::exp, r!(b), r!(c))?;
167
            }
168
169
1.74M
            Instruction::EXPI(expi) => {
170
1.74M
                self.gas_charge(self.gas_costs().expi())?;
171
1.74M
                let (a, b, imm) = expi.unpack();
172
1.74M
                let expo = u32::from(imm);
173
1.74M
                self.alu_boolean_overflow(a.into(), Word::overflowing_pow, r!(b), expo)?;
174
            }
175
176
5.78M
            Instruction::GT(gt) => {
177
5.78M
                self.gas_charge(self.gas_costs().gt())?;
178
5.78M
                let (a, b, c) = gt.unpack();
179
5.78M
                self.alu_set(a.into(), (r!(b) > r!(c)) as Word)?;
180
            }
181
182
2.39M
            Instruction::LT(lt) => {
183
2.39M
                self.gas_charge(self.gas_costs().lt())?;
184
2.39M
                let (a, b, c) = lt.unpack();
185
2.39M
                self.alu_set(a.into(), (r!(b) < r!(c)) as Word)?;
186
            }
187
188
4.77M
            Instruction::WDCM(wdcm) => {
189
4.77M
                self.gas_charge(self.gas_costs().wdcm())?;
190
4.77M
                let (a, b, c, imm) = wdcm.unpack();
191
4.77M
                let args = wideint::CompareArgs::from_imm(imm)
192
4.77M
                    .ok_or(PanicReason::InvalidImmediateValue)?;
193
4.77M
                self.alu_wideint_cmp_u128(a.into(), r!(b), r!(c), args)?;
194
            }
195
196
5.48M
            Instruction::WQCM(wqcm) => {
197
5.48M
                self.gas_charge(self.gas_costs().wqcm())?;
198
5.48M
                let (a, b, c, imm) = wqcm.unpack();
199
5.48M
                let args = wideint::CompareArgs::from_imm(imm)
200
5.48M
                    .ok_or(PanicReason::InvalidImmediateValue)?;
201
5.48M
                self.alu_wideint_cmp_u256(a.into(), r!(b), r!(c), args)?;
202
            }
203
204
706k
            Instruction::WDOP(wdop) => {
205
706k
                self.gas_charge(self.gas_costs().wdop())?;
206
706k
                let (a, b, c, imm) = wdop.unpack();
207
706k
                let args = wideint::MathArgs::from_imm(imm)
208
706k
                    .ok_or(PanicReason::InvalidImmediateValue)?;
209
706k
                self.alu_wideint_op_u128(r!(a), r!(b), r!(c), args)?;
210
            }
211
212
1.55M
            Instruction::WQOP(wqop) => {
213
1.55M
                self.gas_charge(self.gas_costs().wqop())?;
214
1.55M
                let (a, b, c, imm) = wqop.unpack();
215
1.55M
                let args = wideint::MathArgs::from_imm(imm)
216
1.55M
                    .ok_or(PanicReason::InvalidImmediateValue)?;
217
1.55M
                self.alu_wideint_op_u256(r!(a), r!(b), r!(c), args)?;
218
            }
219
220
487k
            Instruction::WDML(wdml) => {
221
487k
                self.gas_charge(self.gas_costs().wdml())?;
222
487k
                let (a, b, c, imm) = wdml.unpack();
223
487k
                let args = wideint::MulArgs::from_imm(imm)
224
487k
                    .ok_or(PanicReason::InvalidImmediateValue)?;
225
487k
                self.alu_wideint_mul_u128(r!(a), r!(b), r!(c), args)?;
226
            }
227
228
1.08M
            Instruction::WQML(wqml) => {
229
1.08M
                self.gas_charge(self.gas_costs().wqml())?;
230
1.08M
                let (a, b, c, imm) = wqml.unpack();
231
1.08M
                let args = wideint::MulArgs::from_imm(imm)
232
1.08M
                    .ok_or(PanicReason::InvalidImmediateValue)?;
233
1.08M
                self.alu_wideint_mul_u256(r!(a), r!(b), r!(c), args)?;
234
            }
235
236
1.17M
            Instruction::WDDV(wddv) => {
237
1.17M
                self.gas_charge(self.gas_costs().wddv())?;
238
1.17M
                let (a, b, c, imm) = wddv.unpack();
239
1.17M
                let args = wideint::DivArgs::from_imm(imm)
240
1.17M
                    .ok_or(PanicReason::InvalidImmediateValue)?;
241
1.17M
                self.alu_wideint_div_u128(r!(a), r!(b), r!(c), args)?;
242
            }
243
244
615k
            Instruction::WQDV(wqdv) => {
245
615k
                self.gas_charge(self.gas_costs().wqdv())?;
246
615k
                let (a, b, c, imm) = wqdv.unpack();
247
615k
                let args = wideint::DivArgs::from_imm(imm)
248
615k
                    .ok_or(PanicReason::InvalidImmediateValue)?;
249
615k
                self.alu_wideint_div_u256(r!(a), r!(b), r!(c), args)?;
250
            }
251
252
899k
            Instruction::WDMD(wdmd) => {
253
899k
                self.gas_charge(self.gas_costs().wdmd())?;
254
899k
                let (a, b, c, d) = wdmd.unpack();
255
899k
                self.alu_wideint_muldiv_u128(r!(a), r!(b), r!(c), r!(d))?;
256
            }
257
258
1.66M
            Instruction::WQMD(wqmd) => {
259
1.66M
                self.gas_charge(self.gas_costs().wqmd())?;
260
1.66M
                let (a, b, c, d) = wqmd.unpack();
261
1.66M
                self.alu_wideint_muldiv_u256(r!(a), r!(b), r!(c), r!(d))?;
262
            }
263
264
127k
            Instruction::WDAM(wdam) => {
265
127k
                self.gas_charge(self.gas_costs().wdam())?;
266
127k
                let (a, b, c, d) = wdam.unpack();
267
127k
                self.alu_wideint_addmod_u128(r!(a), r!(b), r!(c), r!(d))?;
268
            }
269
1.22M
            Instruction::WQAM(wqam) => {
270
1.22M
                self.gas_charge(self.gas_costs().wqam())?;
271
1.22M
                let (a, b, c, d) = wqam.unpack();
272
1.22M
                self.alu_wideint_addmod_u256(r!(a), r!(b), r!(c), r!(d))?;
273
            }
274
800k
            Instruction::WDMM(wdmm) => {
275
800k
                self.gas_charge(self.gas_costs().wdmm())?;
276
800k
                let (a, b, c, d) = wdmm.unpack();
277
800k
                self.alu_wideint_mulmod_u128(r!(a), r!(b), r!(c), r!(d))?;
278
            }
279
252k
            Instruction::WQMM(wqmm) => {
280
252k
                self.gas_charge(self.gas_costs().wqmm())?;
281
252k
                let (a, b, c, d) = wqmm.unpack();
282
252k
                self.alu_wideint_mulmod_u256(r!(a), r!(b), r!(c), r!(d))?;
283
            }
284
285
1.04M
            Instruction::MLOG(mlog) => {
286
1.04M
                self.gas_charge(self.gas_costs().mlog())?;
287
1.04M
                let (a, b, c) = mlog.unpack();
288
1.04M
                let (lhs, rhs) = (r!(b), r!(c));
289
1.04M
                self.alu_error(
290
1.04M
                    a.into(),
291
1.04M
                    |l, r| {
292
1.04M
                        l.checked_ilog(r)
293
1.04M
                            .expect("checked_ilog returned None for valid values")
294
1.04M
                            as Word
295
1.04M
                    },
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2B_4blob8BlobBodyNtB47_12BlobMetadataEE17instruction_inners_0Ba_
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2B_6create10CreateBodyNtB47_14CreateMetadataEE17instruction_inners_0Ba_
_RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2B_6script10ScriptBodyNtB47_14ScriptMetadataEE17instruction_inners_0Ba_
Line
Count
Source
291
1.04M
                    |l, r| {
292
1.04M
                        l.checked_ilog(r)
293
1.04M
                            .expect("checked_ilog returned None for valid values")
294
1.04M
                            as Word
295
1.04M
                    },
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1X_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB35_4blob8BlobBodyNtB4B_12BlobMetadataEE17instruction_inners_0Ba_
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1X_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB35_6create10CreateBodyNtB4B_14CreateMetadataEE17instruction_inners_0Ba_
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1X_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB35_6script10ScriptBodyNtB4B_14ScriptMetadataEE17instruction_inners_0Ba_
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1X_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB35_6upload10UploadBodyNtB4B_14UploadMetadataEE17instruction_inners_0Ba_
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1X_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB35_7upgrade11UpgradeBodyNtB4B_15UpgradeMetadataEE17instruction_inners_0Ba_
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtNtB1Z_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3f_6script10ScriptBodyNtB4L_14ScriptMetadataEE17instruction_inners_0Ba_
296
1.04M
                    lhs,
297
1.04M
                    rhs,
298
1.04M
                    lhs == 0 || rhs <= 1,
299
6
                )?;
300
            }
301
302
1.63M
            Instruction::MOD(mod_) => {
303
1.63M
                self.gas_charge(self.gas_costs().mod_op())?;
304
1.63M
                let (a, b, c) = mod_.unpack();
305
1.63M
                let rhs = r!(c);
306
1.63M
                self.alu_error(a.into(), Word::wrapping_rem, r!(b), rhs, rhs == 0)?;
307
            }
308
309
987k
            Instruction::MODI(modi) => {
310
987k
                self.gas_charge(self.gas_costs().modi())?;
311
987k
                let (a, b, imm) = modi.unpack();
312
987k
                let rhs = Word::from(imm);
313
987k
                self.alu_error(a.into(), Word::wrapping_rem, r!(b), rhs, rhs == 0)?;
314
            }
315
316
25.3M
            Instruction::MOVE(move_) => {
317
25.3M
                self.gas_charge(self.gas_costs().move_op())?;
318
25.3M
                let (a, b) = move_.unpack();
319
25.3M
                self.alu_set(a.into(), r!(b))?;
320
            }
321
322
13.4M
            Instruction::MOVI(movi) => {
323
13.4M
                self.gas_charge(self.gas_costs().movi())?;
324
13.4M
                let (a, imm) = movi.unpack();
325
13.4M
                self.alu_set(a.into(), Word::from(imm))?;
326
            }
327
328
1.48M
            Instruction::MROO(mroo) => {
329
1.48M
                self.gas_charge(self.gas_costs().mroo())?;
330
1.48M
                let (a, b, c) = mroo.unpack();
331
1.48M
                let (lhs, rhs) = (r!(b), r!(c));
332
1.48M
                self.alu_error(
333
1.48M
                    a.into(),
334
1.48M
                    |l, r| {
335
1.48M
                        checked_nth_root(l, r)
336
1.48M
                            .expect("checked_nth_root returned None for valid values")
337
1.48M
                            as Word
338
1.48M
                    },
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2B_4blob8BlobBodyNtB47_12BlobMetadataEE17instruction_inners0_0Ba_
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2B_6create10CreateBodyNtB47_14CreateMetadataEE17instruction_inners0_0Ba_
_RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2B_6script10ScriptBodyNtB47_14ScriptMetadataEE17instruction_inners0_0Ba_
Line
Count
Source
334
1.48M
                    |l, r| {
335
1.48M
                        checked_nth_root(l, r)
336
1.48M
                            .expect("checked_nth_root returned None for valid values")
337
1.48M
                            as Word
338
1.48M
                    },
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1X_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB35_4blob8BlobBodyNtB4B_12BlobMetadataEE17instruction_inners0_0Ba_
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1X_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB35_6create10CreateBodyNtB4B_14CreateMetadataEE17instruction_inners0_0Ba_
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1X_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB35_6script10ScriptBodyNtB4B_14ScriptMetadataEE17instruction_inners0_0Ba_
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1X_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB35_6upload10UploadBodyNtB4B_14UploadMetadataEE17instruction_inners0_0Ba_
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1X_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB35_7upgrade11UpgradeBodyNtB4B_15UpgradeMetadataEE17instruction_inners0_0Ba_
Unexecuted instantiation: _RNCNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtNtB1Z_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3f_6script10ScriptBodyNtB4L_14ScriptMetadataEE17instruction_inners0_0Ba_
339
1.48M
                    lhs,
340
1.48M
                    rhs,
341
1.48M
                    rhs == 0,
342
1.48M
                )?;
343
            }
344
345
3.49M
            Instruction::MUL(mul) => {
346
3.49M
                self.gas_charge(self.gas_costs().mul())?;
347
3.49M
                let (a, b, c) = mul.unpack();
348
3.49M
                self.alu_capture_overflow(
349
3.49M
                    a.into(),
350
3.49M
                    u128::overflowing_mul,
351
3.49M
                    r!(b).into(),
352
3.49M
                    r!(c).into(),
353
3.49M
                )?;
354
            }
355
356
1.87M
            Instruction::MULI(muli) => {
357
1.87M
                self.gas_charge(self.gas_costs().muli())?;
358
1.87M
                let (a, b, imm) = muli.unpack();
359
1.87M
                self.alu_capture_overflow(
360
1.87M
                    a.into(),
361
1.87M
                    u128::overflowing_mul,
362
1.87M
                    r!(b).into(),
363
1.87M
                    imm.into(),
364
1.87M
                )?;
365
            }
366
367
3.50M
            Instruction::MLDV(mldv) => {
368
3.50M
                self.gas_charge(self.gas_costs().mldv())?;
369
3.50M
                let (a, b, c, d) = mldv.unpack();
370
3.50M
                self.alu_muldiv(a.into(), r!(b), r!(c), r!(d))?;
371
            }
372
373
448k
            Instruction::NOOP(_noop) => {
374
448k
                self.gas_charge(self.gas_costs().noop())?;
375
447k
                self.alu_clear()?;
376
            }
377
378
203k
            Instruction::NOT(not) => {
379
203k
                self.gas_charge(self.gas_costs().not())?;
380
203k
                let (a, b) = not.unpack();
381
203k
                self.alu_set(a.into(), !r!(b))?;
382
            }
383
384
466k
            Instruction::OR(or) => {
385
466k
                self.gas_charge(self.gas_costs().or())?;
386
466k
                let (a, b, c) = or.unpack();
387
466k
                self.alu_set(a.into(), r!(b) | r!(c))?;
388
            }
389
390
1.20M
            Instruction::ORI(ori) => {
391
1.20M
                self.gas_charge(self.gas_costs().ori())?;
392
1.20M
                let (a, b, imm) = ori.unpack();
393
1.20M
                self.alu_set(a.into(), r!(b) | Word::from(imm))?;
394
            }
395
396
2.40M
            Instruction::SLL(sll) => {
397
2.40M
                self.gas_charge(self.gas_costs().sll())?;
398
2.40M
                let (a, b, c) = sll.unpack();
399
2.40M
400
2.40M
                self.alu_set(
401
2.40M
                    a.into(),
402
2.40M
                    if let Ok(c) = r!(c).try_into() {
403
1.53M
                        Word::checked_shl(r!(b), c).unwrap_or_default()
404
                    } else {
405
861k
                        0
406
                    },
407
4
                )?;
408
            }
409
410
738k
            Instruction::SLLI(slli) => {
411
738k
                self.gas_charge(self.gas_costs().slli())?;
412
738k
                let (a, b, imm) = slli.unpack();
413
738k
                let rhs = u32::from(imm);
414
738k
                self.alu_set(a.into(), r!(b).checked_shl(rhs).unwrap_or_default())?;
415
            }
416
417
470k
            Instruction::SRL(srl) => {
418
470k
                self.gas_charge(self.gas_costs().srl())?;
419
470k
                let (a, b, c) = srl.unpack();
420
470k
                self.alu_set(
421
470k
                    a.into(),
422
470k
                    if let Ok(c) = r!(c).try_into() {
423
421k
                        Word::checked_shr(r!(b), c).unwrap_or_default()
424
                    } else {
425
48.9k
                        0
426
                    },
427
1
                )?;
428
            }
429
430
1.09M
            Instruction::SRLI(srli) => {
431
1.09M
                self.gas_charge(self.gas_costs().srli())?;
432
1.09M
                let (a, b, imm) = srli.unpack();
433
1.09M
                let rhs = u32::from(imm);
434
1.09M
                self.alu_set(a.into(), r!(b).checked_shr(rhs).unwrap_or_default())?;
435
            }
436
437
750k
            Instruction::SUB(sub) => {
438
750k
                self.gas_charge(self.gas_costs().sub())?;
439
750k
                let (a, b, c) = sub.unpack();
440
750k
                self.alu_capture_overflow(
441
750k
                    a.into(),
442
750k
                    u128::overflowing_sub,
443
750k
                    r!(b).into(),
444
750k
                    r!(c).into(),
445
750k
                )?;
446
            }
447
448
2.61M
            Instruction::SUBI(subi) => {
449
2.61M
                self.gas_charge(self.gas_costs().subi())?;
450
2.61M
                let (a, b, imm) = subi.unpack();
451
2.61M
                self.alu_capture_overflow(
452
2.61M
                    a.into(),
453
2.61M
                    u128::overflowing_sub,
454
2.61M
                    r!(b).into(),
455
2.61M
                    imm.into(),
456
2.61M
                )?;
457
            }
458
459
893k
            Instruction::XOR(xor) => {
460
893k
                self.gas_charge(self.gas_costs().xor())?;
461
893k
                let (a, b, c) = xor.unpack();
462
893k
                self.alu_set(a.into(), r!(b) ^ r!(c))?;
463
            }
464
465
425k
            Instruction::XORI(xori) => {
466
425k
                self.gas_charge(self.gas_costs().xori())?;
467
425k
                let (a, b, imm) = xori.unpack();
468
425k
                self.alu_set(a.into(), r!(b) ^ Word::from(imm))?;
469
            }
470
471
40.7M
            Instruction::JI(ji) => {
472
40.7M
                self.gas_charge(self.gas_costs().ji())?;
473
40.7M
                let imm = ji.unpack();
474
40.7M
                self.jump(JumpArgs::new(JumpMode::Absolute).to_address(imm.into()))?;
475
            }
476
477
4.19M
            Instruction::JNEI(jnei) => {
478
4.19M
                self.gas_charge(self.gas_costs().jnei())?;
479
4.19M
                let (a, b, imm) = jnei.unpack();
480
4.19M
                self.jump(
481
4.19M
                    JumpArgs::new(JumpMode::Absolute)
482
4.19M
                        .with_condition(r!(a) != r!(b))
483
4.19M
                        .to_address(imm.into()),
484
4.19M
                )?;
485
            }
486
487
20.2M
            Instruction::JNZI(jnzi) => {
488
20.2M
                self.gas_charge(self.gas_costs().jnzi())?;
489
20.2M
                let (a, imm) = jnzi.unpack();
490
20.2M
                self.jump(
491
20.2M
                    JumpArgs::new(JumpMode::Absolute)
492
20.2M
                        .with_condition(r!(a) != 0)
493
20.2M
                        .to_address(imm.into()),
494
20.2M
                )?;
495
            }
496
497
3.45M
            Instruction::JMP(jmp) => {
498
3.45M
                self.gas_charge(self.gas_costs().jmp())?;
499
3.45M
                let a = jmp.unpack();
500
3.45M
                self.jump(JumpArgs::new(JumpMode::Absolute).to_address(r!(a)))?;
501
            }
502
503
7.04M
            Instruction::JNE(jne) => {
504
7.04M
                self.gas_charge(self.gas_costs().jne())?;
505
7.04M
                let (a, b, c) = jne.unpack();
506
7.04M
                self.jump(
507
7.04M
                    JumpArgs::new(JumpMode::Absolute)
508
7.04M
                        .with_condition(r!(a) != r!(b))
509
7.04M
                        .to_address(r!(c)),
510
7.04M
                )?;
511
            }
512
513
464k
            Instruction::JMPF(jmpf) => {
514
464k
                self.gas_charge(self.gas_costs().jmpf())?;
515
464k
                let (a, offset) = jmpf.unpack();
516
464k
                self.jump(
517
464k
                    JumpArgs::new(JumpMode::RelativeForwards)
518
464k
                        .to_address(r!(a))
519
464k
                        .plus_fixed(offset.into()),
520
464k
                )?;
521
            }
522
523
1.19M
            Instruction::JMPB(jmpb) => {
524
1.19M
                self.gas_charge(self.gas_costs().jmpb())?;
525
1.19M
                let (a, offset) = jmpb.unpack();
526
1.19M
                self.jump(
527
1.19M
                    JumpArgs::new(JumpMode::RelativeBackwards)
528
1.19M
                        .to_address(r!(a))
529
1.19M
                        .plus_fixed(offset.into()),
530
1.19M
                )?;
531
            }
532
533
2.12M
            Instruction::JNZF(jnzf) => {
534
2.12M
                self.gas_charge(self.gas_costs().jnzf())?;
535
2.12M
                let (a, b, offset) = jnzf.unpack();
536
2.12M
                self.jump(
537
2.12M
                    JumpArgs::new(JumpMode::RelativeForwards)
538
2.12M
                        .with_condition(r!(a) != 0)
539
2.12M
                        .to_address(r!(b))
540
2.12M
                        .plus_fixed(offset.into()),
541
2.12M
                )?;
542
            }
543
544
5.18M
            Instruction::JNZB(jnzb) => {
545
5.18M
                self.gas_charge(self.gas_costs().jnzb())?;
546
5.18M
                let (a, b, offset) = jnzb.unpack();
547
5.18M
                self.jump(
548
5.18M
                    JumpArgs::new(JumpMode::RelativeBackwards)
549
5.18M
                        .with_condition(r!(a) != 0)
550
5.18M
                        .to_address(r!(b))
551
5.18M
                        .plus_fixed(offset.into()),
552
5.18M
                )?;
553
            }
554
555
792k
            Instruction::JNEF(jnef) => {
556
792k
                self.gas_charge(self.gas_costs().jnef())?;
557
792k
                let (a, b, c, offset) = jnef.unpack();
558
792k
                self.jump(
559
792k
                    JumpArgs::new(JumpMode::RelativeForwards)
560
792k
                        .with_condition(r!(a) != r!(b))
561
792k
                        .to_address(r!(c))
562
792k
                        .plus_fixed(offset.into()),
563
792k
                )?;
564
            }
565
566
7.13M
            Instruction::JNEB(jneb) => {
567
7.13M
                self.gas_charge(self.gas_costs().jneb())?;
568
7.13M
                let (a, b, c, offset) = jneb.unpack();
569
7.13M
                self.jump(
570
7.13M
                    JumpArgs::new(JumpMode::RelativeBackwards)
571
7.13M
                        .with_condition(r!(a) != r!(b))
572
7.13M
                        .to_address(r!(c))
573
7.13M
                        .plus_fixed(offset.into()),
574
7.13M
                )?;
575
            }
576
577
23
            Instruction::RET(ret) => {
578
23
                self.gas_charge(self.gas_costs().ret())?;
579
23
                let a = ret.unpack();
580
23
                let ra = r!(a);
581
23
                self.ret(ra)?;
582
23
                return Ok(ExecuteState::Return(ra))
583
            }
584
585
11.3k
            Instruction::RETD(retd) => {
586
11.3k
                let (a, b) = retd.unpack();
587
11.3k
                let len = r!(b);
588
11.3k
                self.dependent_gas_charge(self.gas_costs().retd(), len)?;
589
11.3k
                return Ok(self.ret_data(r!(a), len).map(ExecuteState::ReturnData)?)
590
            }
591
592
10
            Instruction::RVRT(rvrt) => {
593
10
                self.gas_charge(self.gas_costs().rvrt())?;
594
10
                let a = rvrt.unpack();
595
10
                let ra = r!(a);
596
10
                self.revert(ra)?;
597
10
                return Ok(ExecuteState::Revert(ra))
598
            }
599
600
88.9k
            Instruction::SMO(smo) => {
601
88.9k
                let (a, b, c, d) = smo.unpack();
602
88.9k
                self.dependent_gas_charge(self.gas_costs().smo(), r!(c))?;
603
88.9k
                self.message_output(r!(a), r!(b), r!(c), r!(d))?;
604
            }
605
606
898k
            Instruction::ALOC(aloc) => {
607
898k
                let a = aloc.unpack();
608
898k
                let number_of_bytes = r!(a);
609
898k
                self.dependent_gas_charge(self.gas_costs().aloc(), number_of_bytes)?;
610
898k
                self.malloc(number_of_bytes)?;
611
            }
612
613
14.9M
            Instruction::CFEI(cfei) => {
614
14.9M
                let number_of_bytes = cfei.unpack().into();
615
14.9M
                self.dependent_gas_charge(self.gas_costs().cfei(), number_of_bytes)?;
616
14.9M
                self.stack_pointer_overflow(Word::overflowing_add, number_of_bytes)?;
617
            }
618
619
333k
            Instruction::CFE(cfe) => {
620
333k
                let a = cfe.unpack();
621
333k
                let number_of_bytes = r!(a);
622
333k
                self.dependent_gas_charge(self.gas_costs().cfe(), number_of_bytes)?;
623
333k
                self.stack_pointer_overflow(Word::overflowing_add, number_of_bytes)?;
624
            }
625
626
1.76M
            Instruction::CFSI(cfsi) => {
627
1.76M
                self.gas_charge(self.gas_costs().cfsi())?;
628
1.76M
                let imm = cfsi.unpack();
629
1.76M
                self.stack_pointer_overflow(Word::overflowing_sub, imm.into())?;
630
            }
631
632
394k
            Instruction::CFS(cfs) => {
633
394k
                self.gas_charge(self.gas_costs().cfsi())?;
634
394k
                let a = cfs.unpack();
635
394k
                self.stack_pointer_overflow(Word::overflowing_sub, r!(a))?;
636
            }
637
638
805k
            Instruction::PSHL(pshl) => {
639
805k
                self.gas_charge(self.gas_costs().pshl())?;
640
805k
                let bitmask = pshl.unpack();
641
805k
                self.push_selected_registers(ProgramRegistersSegment::Low, bitmask)?;
642
            }
643
644
3.66M
            Instruction::PSHH(pshh) => {
645
3.66M
                self.gas_charge(self.gas_costs().pshh())?;
646
3.66M
                let bitmask = pshh.unpack();
647
3.66M
                self.push_selected_registers(ProgramRegistersSegment::High, bitmask)?;
648
            }
649
650
276k
            Instruction::POPL(popl) => {
651
276k
                self.gas_charge(self.gas_costs().popl())?;
652
276k
                let bitmask = popl.unpack();
653
276k
                self.pop_selected_registers(ProgramRegistersSegment::Low, bitmask)?;
654
            }
655
656
159k
            Instruction::POPH(poph) => {
657
159k
                self.gas_charge(self.gas_costs().poph())?;
658
159k
                let bitmask = poph.unpack();
659
159k
                self.pop_selected_registers(ProgramRegistersSegment::High, bitmask)?;
660
            }
661
662
735k
            Instruction::LB(lb) => {
663
735k
                self.gas_charge(self.gas_costs().lb())?;
664
735k
                let (a, b, imm) = lb.unpack();
665
735k
                self.load_byte(a.into(), r!(b), imm.into())?;
666
            }
667
668
51.5M
            Instruction::LW(lw) => {
669
51.5M
                self.gas_charge(self.gas_costs().lw())?;
670
51.5M
                let (a, b, imm) = lw.unpack();
671
51.5M
                self.load_word(a.into(), r!(b), imm)?;
672
            }
673
674
148k
            Instruction::MCL(mcl) => {
675
148k
                let (a, b) = mcl.unpack();
676
148k
                let len = r!(b);
677
148k
                self.dependent_gas_charge(self.gas_costs().mcl(), len)?;
678
148k
                self.memclear(r!(a), len)?;
679
            }
680
681
114k
            Instruction::MCLI(mcli) => {
682
114k
                let (a, imm) = mcli.unpack();
683
114k
                let len = Word::from(imm);
684
114k
                self.dependent_gas_charge(self.gas_costs().mcli(), len)?;
685
114k
                self.memclear(r!(a), len)?;
686
            }
687
688
7.30M
            Instruction::MCP(mcp) => {
689
7.30M
                let (a, b, c) = mcp.unpack();
690
7.30M
                let len = r!(c);
691
7.30M
                self.dependent_gas_charge(self.gas_costs().mcp(), len)?;
692
7.30M
                self.memcopy(r!(a), r!(b), len)?;
693
            }
694
695
87.0k
            Instruction::MCPI(mcpi) => {
696
87.0k
                let (a, b, imm) = mcpi.unpack();
697
87.0k
                let len = imm.into();
698
87.0k
                self.dependent_gas_charge(self.gas_costs().mcpi(), len)?;
699
87.0k
                self.memcopy(r!(a), r!(b), len)?;
700
            }
701
702
1.63M
            Instruction::MEQ(meq) => {
703
1.63M
                let (a, b, c, d) = meq.unpack();
704
1.63M
                let len = r!(d);
705
1.63M
                self.dependent_gas_charge(self.gas_costs().meq(), len)?;
706
1.63M
                self.memeq(a.into(), r!(b), r!(c), len)?;
707
            }
708
709
164k
            Instruction::SB(sb) => {
710
164k
                self.gas_charge(self.gas_costs().sb())?;
711
164k
                let (a, b, imm) = sb.unpack();
712
164k
                self.store_byte(r!(a), r!(b), imm.into())?;
713
            }
714
715
12.9M
            Instruction::SW(sw) => {
716
12.9M
                self.gas_charge(self.gas_costs().sw())?;
717
12.9M
                let (a, b, imm) = sw.unpack();
718
12.9M
                self.store_word(r!(a), r!(b), imm)?;
719
            }
720
721
7
            Instruction::BAL(bal) => {
722
7
                self.gas_charge(self.gas_costs().bal())?;
723
7
                let (a, b, c) = bal.unpack();
724
7
                self.contract_balance(a.into(), r!(b), r!(c))?;
725
            }
726
727
174k
            Instruction::BHEI(bhei) => {
728
174k
                self.gas_charge(self.gas_costs().bhei())?;
729
174k
                let a = bhei.unpack();
730
174k
                self.block_height(a.into())?;
731
            }
732
733
72.8k
            Instruction::BHSH(bhsh) => {
734
72.8k
                self.gas_charge(self.gas_costs().bhsh())?;
735
72.8k
                let (a, b) = bhsh.unpack();
736
72.8k
                self.block_hash(r!(a), r!(b))?;
737
            }
738
739
117
            Instruction::BURN(burn) => {
740
117
                self.gas_charge(self.gas_costs().burn())?;
741
116
                let (a, b) = burn.unpack();
742
116
                self.burn(r!(a), r!(b))?;
743
            }
744
745
12.3k
            Instruction::CALL(call) => {
746
12.3k
                // We charge for the gas inside of the `prepare_call` function.
747
12.3k
                let (a, b, c, d) = call.unpack();
748
12.3k
749
12.3k
                // Enter call context
750
12.3k
                self.prepare_call(a, b, c, d)?;
751
            }
752
753
231k
            Instruction::CB(cb) => {
754
231k
                self.gas_charge(self.gas_costs().cb())?;
755
231k
                let a = cb.unpack();
756
231k
                self.block_proposer(r!(a))?;
757
            }
758
759
14
            Instruction::CCP(ccp) => {
760
14
                let (a, b, c, d) = ccp.unpack();
761
14
                self.code_copy(r!(a), r!(b), r!(c), r!(d))?;
762
            }
763
764
7
            Instruction::CROO(croo) => {
765
7
                let (a, b) = croo.unpack();
766
7
                self.code_root(r!(a), r!(b))?;
767
            }
768
769
4
            Instruction::CSIZ(csiz) => {
770
4
                // We charge for the gas inside of the `code_size` function.
771
4
                let (a, b) = csiz.unpack();
772
4
                self.code_size(a.into(), r!(b))?;
773
            }
774
775
597k
            Instruction::LDC(ldc) => {
776
597k
                // We charge for the gas inside of the `load_contract_code` function.
777
597k
                let (a, b, c, mode) = ldc.unpack();
778
597k
                self.load_contract_code(r!(a), r!(b), r!(c), mode)?;
779
            }
780
781
631k
            Instruction::LOG(log) => {
782
631k
                self.gas_charge(self.gas_costs().log())?;
783
631k
                let (a, b, c, d) = log.unpack();
784
631k
                self.log(r!(a), r!(b), r!(c), r!(d))?;
785
            }
786
787
176k
            Instruction::LOGD(logd) => {
788
176k
                let (a, b, c, d) = logd.unpack();
789
176k
                self.dependent_gas_charge(self.gas_costs().logd(), r!(d))?;
790
176k
                self.log_data(r!(a), r!(b), r!(c), r!(d))?;
791
            }
792
793
48
            Instruction::MINT(mint) => {
794
48
                self.gas_charge(self.gas_costs().mint())?;
795
47
                let (a, b) = mint.unpack();
796
47
                self.mint(r!(a), r!(b))?;
797
            }
798
799
5.19k
            Instruction::SCWQ(scwq) => {
800
5.19k
                let (a, b, c) = scwq.unpack();
801
5.19k
                self.dependent_gas_charge(self.gas_costs().scwq(), r!(c))?;
802
5.17k
                self.state_clear_qword(r!(a), b.into(), r!(c))?;
803
            }
804
805
2.05k
            Instruction::SRW(srw) => {
806
2.05k
                self.gas_charge(self.gas_costs().srw())?;
807
2.04k
                let (a, b, c) = srw.unpack();
808
2.04k
                self.state_read_word(a.into(), b.into(), r!(c))?;
809
            }
810
811
896
            Instruction::SRWQ(srwq) => {
812
896
                let (a, b, c, d) = srwq.unpack();
813
896
                self.dependent_gas_charge(self.gas_costs().srwq(), r!(d))?;
814
890
                self.state_read_qword(r!(a), b.into(), r!(c), r!(d))?;
815
            }
816
817
354
            Instruction::SWW(sww) => {
818
354
                self.gas_charge(self.gas_costs().sww())?;
819
352
                let (a, b, c) = sww.unpack();
820
352
                self.state_write_word(r!(a), b.into(), r!(c))?;
821
            }
822
823
3.79k
            Instruction::SWWQ(swwq) => {
824
3.79k
                let (a, b, c, d) = swwq.unpack();
825
3.79k
                self.dependent_gas_charge(self.gas_costs().swwq(), r!(d))?;
826
3.77k
                self.state_write_qword(r!(a), b.into(), r!(c), r!(d))?;
827
            }
828
829
326k
            Instruction::TIME(time) => {
830
326k
                self.gas_charge(self.gas_costs().time())?;
831
326k
                let (a, b) = time.unpack();
832
326k
                self.timestamp(a.into(), r!(b))?;
833
            }
834
835
11.1k
            Instruction::ECK1(eck1) => {
836
11.1k
                self.gas_charge(self.gas_costs().eck1())?;
837
11.1k
                let (a, b, c) = eck1.unpack();
838
11.1k
                self.secp256k1_recover(r!(a), r!(b), r!(c))?;
839
            }
840
841
4.53k
            Instruction::ECR1(ecr1) => {
842
4.53k
                self.gas_charge(self.gas_costs().ecr1())?;
843
4.52k
                let (a, b, c) = ecr1.unpack();
844
4.52k
                self.secp256r1_recover(r!(a), r!(b), r!(c))?;
845
            }
846
847
11.9k
            Instruction::ED19(ed19) => {
848
11.9k
                let (a, b, c, len) = ed19.unpack();
849
11.9k
                let mut len = r!(len);
850
11.9k
851
11.9k
                // Backwards compatibility with old contracts
852
11.9k
                if len == 0 {
853
8.35k
                    len = 32;
854
8.35k
                }
855
856
11.9k
                self.dependent_gas_charge(self.gas_costs().ed19(), len)?;
857
11.9k
                self.ed25519_verify(r!(a), r!(b), r!(c), len)?;
858
            }
859
860
38.7k
            Instruction::K256(k256) => {
861
38.7k
                let (a, b, c) = k256.unpack();
862
38.7k
                let len = r!(c);
863
38.7k
                self.dependent_gas_charge(self.gas_costs().k256(), len)?;
864
38.7k
                self.keccak256(r!(a), r!(b), len)?;
865
            }
866
867
146k
            Instruction::S256(s256) => {
868
146k
                let (a, b, c) = s256.unpack();
869
146k
                let len = r!(c);
870
146k
                self.dependent_gas_charge(self.gas_costs().s256(), len)?;
871
146k
                self.sha256(r!(a), r!(b), len)?;
872
            }
873
874
583k
            Instruction::FLAG(flag) => {
875
583k
                self.gas_charge(self.gas_costs().flag())?;
876
583k
                let a = flag.unpack();
877
583k
                self.set_flag(r!(a))?;
878
            }
879
880
1.61M
            Instruction::GM(gm) => {
881
1.61M
                self.gas_charge(self.gas_costs().gm())?;
882
1.61M
                let (a, imm) = gm.unpack();
883
1.61M
                self.metadata(a.into(), imm.into())?;
884
            }
885
886
10.4M
            Instruction::GTF(gtf) => {
887
10.4M
                self.gas_charge(self.gas_costs().gtf())?;
888
10.4M
                let (a, b, imm) = gtf.unpack();
889
10.4M
                self.get_transaction_field(a.into(), r!(b), imm.into())?;
890
            }
891
892
8
            Instruction::TR(tr) => {
893
8
                self.gas_charge(self.gas_costs().tr())?;
894
8
                let (a, b, c) = tr.unpack();
895
8
                self.transfer(r!(a), r!(b), r!(c))?;
896
            }
897
898
13
            Instruction::TRO(tro) => {
899
13
                self.gas_charge(self.gas_costs().tro())?;
900
13
                let (a, b, c, d) = tro.unpack();
901
13
                self.transfer_output(r!(a), r!(b), r!(c), r!(d))?;
902
            }
903
904
2
            Instruction::ECAL(ecal) => {
905
2
                let (a, b, c, d) = ecal.unpack();
906
2
                self.external_call(a, b, c, d)?;
907
            }
908
909
2
            Instruction::BSIZ(bsiz) => {
910
2
                // We charge for this inside the function.
911
2
                let (a, b) = bsiz.unpack();
912
2
                self.blob_size(a.into(), r!(b))?;
913
            }
914
915
3
            Instruction::BLDD(bldd) => {
916
3
                // We charge for this inside the function.
917
3
                let (a, b, c, d) = bldd.unpack();
918
3
                self.blob_load_data(r!(a), r!(b), r!(c), r!(d))?;
919
            }
920
        }
921
922
387M
        Ok(ExecuteState::Proceed)
923
387M
    }
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2z_4blob8BlobBodyNtB45_12BlobMetadataEE17instruction_innerB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2z_6create10CreateBodyNtB45_14CreateMetadataEE17instruction_innerB8_
_RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2z_6script10ScriptBodyNtB45_14ScriptMetadataEE17instruction_innerB8_
Line
Count
Source
87
387M
    fn instruction_inner(
88
387M
        &mut self,
89
387M
        raw: RawInstruction,
90
387M
    ) -> IoResult<ExecuteState, S::DataError> {
91
387M
        let instruction = Instruction::try_from(raw)
92
387M
            .map_err(|_| RuntimeError::from(PanicReason::InvalidInstruction))?;
93
94
        // TODO additional branch that might be optimized after
95
        // https://github.com/FuelLabs/fuel-asm/issues/68
96
387M
        if self.is_predicate() && !instruction.opcode().is_predicate_allowed() {
97
0
            return Err(PanicReason::ContractInstructionNotAllowed.into())
98
387M
        }
99
100
        // Short-hand for retrieving the value from the register with the given ID.
101
        // We use a macro to "close over" `self.registers` without taking ownership of it.
102
        macro_rules! r {
103
            ($id:expr) => {
104
                self.registers[$id]
105
            };
106
        }
107
108
387M
        match instruction {
109
30.0M
            Instruction::ADD(add) => {
110
30.0M
                self.gas_charge(self.gas_costs().add())?;
111
30.0M
                let (a, b, c) = add.unpack();
112
30.0M
                self.alu_capture_overflow(
113
30.0M
                    a.into(),
114
30.0M
                    u128::overflowing_add,
115
30.0M
                    r!(b).into(),
116
30.0M
                    r!(c).into(),
117
30.0M
                )?;
118
            }
119
120
34.9M
            Instruction::ADDI(addi) => {
121
34.9M
                self.gas_charge(self.gas_costs().addi())?;
122
34.9M
                let (a, b, imm) = addi.unpack();
123
34.9M
                self.alu_capture_overflow(
124
34.9M
                    a.into(),
125
34.9M
                    u128::overflowing_add,
126
34.9M
                    r!(b).into(),
127
34.9M
                    imm.into(),
128
34.9M
                )?;
129
            }
130
131
4.64M
            Instruction::AND(and) => {
132
4.64M
                self.gas_charge(self.gas_costs().and())?;
133
4.64M
                let (a, b, c) = and.unpack();
134
4.64M
                self.alu_set(a.into(), r!(b) & r!(c))?;
135
            }
136
137
3.18M
            Instruction::ANDI(andi) => {
138
3.18M
                self.gas_charge(self.gas_costs().andi())?;
139
3.18M
                let (a, b, imm) = andi.unpack();
140
3.18M
                self.alu_set(a.into(), r!(b) & Word::from(imm))?;
141
            }
142
143
141k
            Instruction::DIV(div) => {
144
141k
                self.gas_charge(self.gas_costs().div())?;
145
141k
                let (a, b, c) = div.unpack();
146
141k
                let c = r!(c);
147
141k
                self.alu_error(a.into(), Word::div, r!(b), c, c == 0)?;
148
            }
149
150
5.48M
            Instruction::DIVI(divi) => {
151
5.48M
                self.gas_charge(self.gas_costs().divi())?;
152
5.48M
                let (a, b, imm) = divi.unpack();
153
5.48M
                let imm = Word::from(imm);
154
5.48M
                self.alu_error(a.into(), Word::div, r!(b), imm, imm == 0)?;
155
            }
156
157
6.91M
            Instruction::EQ(eq) => {
158
6.91M
                self.gas_charge(self.gas_costs().eq_())?;
159
6.91M
                let (a, b, c) = eq.unpack();
160
6.91M
                self.alu_set(a.into(), (r!(b) == r!(c)) as Word)?;
161
            }
162
163
1.59M
            Instruction::EXP(exp) => {
164
1.59M
                self.gas_charge(self.gas_costs().exp())?;
165
1.59M
                let (a, b, c) = exp.unpack();
166
1.59M
                self.alu_boolean_overflow(a.into(), alu::exp, r!(b), r!(c))?;
167
            }
168
169
1.74M
            Instruction::EXPI(expi) => {
170
1.74M
                self.gas_charge(self.gas_costs().expi())?;
171
1.74M
                let (a, b, imm) = expi.unpack();
172
1.74M
                let expo = u32::from(imm);
173
1.74M
                self.alu_boolean_overflow(a.into(), Word::overflowing_pow, r!(b), expo)?;
174
            }
175
176
5.78M
            Instruction::GT(gt) => {
177
5.78M
                self.gas_charge(self.gas_costs().gt())?;
178
5.78M
                let (a, b, c) = gt.unpack();
179
5.78M
                self.alu_set(a.into(), (r!(b) > r!(c)) as Word)?;
180
            }
181
182
2.39M
            Instruction::LT(lt) => {
183
2.39M
                self.gas_charge(self.gas_costs().lt())?;
184
2.39M
                let (a, b, c) = lt.unpack();
185
2.39M
                self.alu_set(a.into(), (r!(b) < r!(c)) as Word)?;
186
            }
187
188
4.77M
            Instruction::WDCM(wdcm) => {
189
4.77M
                self.gas_charge(self.gas_costs().wdcm())?;
190
4.77M
                let (a, b, c, imm) = wdcm.unpack();
191
4.77M
                let args = wideint::CompareArgs::from_imm(imm)
192
4.77M
                    .ok_or(PanicReason::InvalidImmediateValue)?;
193
4.77M
                self.alu_wideint_cmp_u128(a.into(), r!(b), r!(c), args)?;
194
            }
195
196
5.48M
            Instruction::WQCM(wqcm) => {
197
5.48M
                self.gas_charge(self.gas_costs().wqcm())?;
198
5.48M
                let (a, b, c, imm) = wqcm.unpack();
199
5.48M
                let args = wideint::CompareArgs::from_imm(imm)
200
5.48M
                    .ok_or(PanicReason::InvalidImmediateValue)?;
201
5.48M
                self.alu_wideint_cmp_u256(a.into(), r!(b), r!(c), args)?;
202
            }
203
204
706k
            Instruction::WDOP(wdop) => {
205
706k
                self.gas_charge(self.gas_costs().wdop())?;
206
706k
                let (a, b, c, imm) = wdop.unpack();
207
706k
                let args = wideint::MathArgs::from_imm(imm)
208
706k
                    .ok_or(PanicReason::InvalidImmediateValue)?;
209
706k
                self.alu_wideint_op_u128(r!(a), r!(b), r!(c), args)?;
210
            }
211
212
1.55M
            Instruction::WQOP(wqop) => {
213
1.55M
                self.gas_charge(self.gas_costs().wqop())?;
214
1.55M
                let (a, b, c, imm) = wqop.unpack();
215
1.55M
                let args = wideint::MathArgs::from_imm(imm)
216
1.55M
                    .ok_or(PanicReason::InvalidImmediateValue)?;
217
1.55M
                self.alu_wideint_op_u256(r!(a), r!(b), r!(c), args)?;
218
            }
219
220
487k
            Instruction::WDML(wdml) => {
221
487k
                self.gas_charge(self.gas_costs().wdml())?;
222
487k
                let (a, b, c, imm) = wdml.unpack();
223
487k
                let args = wideint::MulArgs::from_imm(imm)
224
487k
                    .ok_or(PanicReason::InvalidImmediateValue)?;
225
487k
                self.alu_wideint_mul_u128(r!(a), r!(b), r!(c), args)?;
226
            }
227
228
1.08M
            Instruction::WQML(wqml) => {
229
1.08M
                self.gas_charge(self.gas_costs().wqml())?;
230
1.08M
                let (a, b, c, imm) = wqml.unpack();
231
1.08M
                let args = wideint::MulArgs::from_imm(imm)
232
1.08M
                    .ok_or(PanicReason::InvalidImmediateValue)?;
233
1.08M
                self.alu_wideint_mul_u256(r!(a), r!(b), r!(c), args)?;
234
            }
235
236
1.17M
            Instruction::WDDV(wddv) => {
237
1.17M
                self.gas_charge(self.gas_costs().wddv())?;
238
1.17M
                let (a, b, c, imm) = wddv.unpack();
239
1.17M
                let args = wideint::DivArgs::from_imm(imm)
240
1.17M
                    .ok_or(PanicReason::InvalidImmediateValue)?;
241
1.17M
                self.alu_wideint_div_u128(r!(a), r!(b), r!(c), args)?;
242
            }
243
244
615k
            Instruction::WQDV(wqdv) => {
245
615k
                self.gas_charge(self.gas_costs().wqdv())?;
246
615k
                let (a, b, c, imm) = wqdv.unpack();
247
615k
                let args = wideint::DivArgs::from_imm(imm)
248
615k
                    .ok_or(PanicReason::InvalidImmediateValue)?;
249
615k
                self.alu_wideint_div_u256(r!(a), r!(b), r!(c), args)?;
250
            }
251
252
899k
            Instruction::WDMD(wdmd) => {
253
899k
                self.gas_charge(self.gas_costs().wdmd())?;
254
899k
                let (a, b, c, d) = wdmd.unpack();
255
899k
                self.alu_wideint_muldiv_u128(r!(a), r!(b), r!(c), r!(d))?;
256
            }
257
258
1.66M
            Instruction::WQMD(wqmd) => {
259
1.66M
                self.gas_charge(self.gas_costs().wqmd())?;
260
1.66M
                let (a, b, c, d) = wqmd.unpack();
261
1.66M
                self.alu_wideint_muldiv_u256(r!(a), r!(b), r!(c), r!(d))?;
262
            }
263
264
127k
            Instruction::WDAM(wdam) => {
265
127k
                self.gas_charge(self.gas_costs().wdam())?;
266
127k
                let (a, b, c, d) = wdam.unpack();
267
127k
                self.alu_wideint_addmod_u128(r!(a), r!(b), r!(c), r!(d))?;
268
            }
269
1.22M
            Instruction::WQAM(wqam) => {
270
1.22M
                self.gas_charge(self.gas_costs().wqam())?;
271
1.22M
                let (a, b, c, d) = wqam.unpack();
272
1.22M
                self.alu_wideint_addmod_u256(r!(a), r!(b), r!(c), r!(d))?;
273
            }
274
800k
            Instruction::WDMM(wdmm) => {
275
800k
                self.gas_charge(self.gas_costs().wdmm())?;
276
800k
                let (a, b, c, d) = wdmm.unpack();
277
800k
                self.alu_wideint_mulmod_u128(r!(a), r!(b), r!(c), r!(d))?;
278
            }
279
252k
            Instruction::WQMM(wqmm) => {
280
252k
                self.gas_charge(self.gas_costs().wqmm())?;
281
252k
                let (a, b, c, d) = wqmm.unpack();
282
252k
                self.alu_wideint_mulmod_u256(r!(a), r!(b), r!(c), r!(d))?;
283
            }
284
285
1.04M
            Instruction::MLOG(mlog) => {
286
1.04M
                self.gas_charge(self.gas_costs().mlog())?;
287
1.04M
                let (a, b, c) = mlog.unpack();
288
1.04M
                let (lhs, rhs) = (r!(b), r!(c));
289
1.04M
                self.alu_error(
290
1.04M
                    a.into(),
291
                    |l, r| {
292
                        l.checked_ilog(r)
293
                            .expect("checked_ilog returned None for valid values")
294
                            as Word
295
                    },
296
1.04M
                    lhs,
297
1.04M
                    rhs,
298
1.04M
                    lhs == 0 || rhs <= 1,
299
6
                )?;
300
            }
301
302
1.63M
            Instruction::MOD(mod_) => {
303
1.63M
                self.gas_charge(self.gas_costs().mod_op())?;
304
1.63M
                let (a, b, c) = mod_.unpack();
305
1.63M
                let rhs = r!(c);
306
1.63M
                self.alu_error(a.into(), Word::wrapping_rem, r!(b), rhs, rhs == 0)?;
307
            }
308
309
987k
            Instruction::MODI(modi) => {
310
987k
                self.gas_charge(self.gas_costs().modi())?;
311
987k
                let (a, b, imm) = modi.unpack();
312
987k
                let rhs = Word::from(imm);
313
987k
                self.alu_error(a.into(), Word::wrapping_rem, r!(b), rhs, rhs == 0)?;
314
            }
315
316
25.3M
            Instruction::MOVE(move_) => {
317
25.3M
                self.gas_charge(self.gas_costs().move_op())?;
318
25.3M
                let (a, b) = move_.unpack();
319
25.3M
                self.alu_set(a.into(), r!(b))?;
320
            }
321
322
13.4M
            Instruction::MOVI(movi) => {
323
13.4M
                self.gas_charge(self.gas_costs().movi())?;
324
13.4M
                let (a, imm) = movi.unpack();
325
13.4M
                self.alu_set(a.into(), Word::from(imm))?;
326
            }
327
328
1.48M
            Instruction::MROO(mroo) => {
329
1.48M
                self.gas_charge(self.gas_costs().mroo())?;
330
1.48M
                let (a, b, c) = mroo.unpack();
331
1.48M
                let (lhs, rhs) = (r!(b), r!(c));
332
1.48M
                self.alu_error(
333
1.48M
                    a.into(),
334
1.48M
                    |l, r| {
335
                        checked_nth_root(l, r)
336
                            .expect("checked_nth_root returned None for valid values")
337
                            as Word
338
1.48M
                    },
339
1.48M
                    lhs,
340
1.48M
                    rhs,
341
1.48M
                    rhs == 0,
342
1.48M
                )?;
343
            }
344
345
3.49M
            Instruction::MUL(mul) => {
346
3.49M
                self.gas_charge(self.gas_costs().mul())?;
347
3.49M
                let (a, b, c) = mul.unpack();
348
3.49M
                self.alu_capture_overflow(
349
3.49M
                    a.into(),
350
3.49M
                    u128::overflowing_mul,
351
3.49M
                    r!(b).into(),
352
3.49M
                    r!(c).into(),
353
3.49M
                )?;
354
            }
355
356
1.87M
            Instruction::MULI(muli) => {
357
1.87M
                self.gas_charge(self.gas_costs().muli())?;
358
1.87M
                let (a, b, imm) = muli.unpack();
359
1.87M
                self.alu_capture_overflow(
360
1.87M
                    a.into(),
361
1.87M
                    u128::overflowing_mul,
362
1.87M
                    r!(b).into(),
363
1.87M
                    imm.into(),
364
1.87M
                )?;
365
            }
366
367
3.50M
            Instruction::MLDV(mldv) => {
368
3.50M
                self.gas_charge(self.gas_costs().mldv())?;
369
3.50M
                let (a, b, c, d) = mldv.unpack();
370
3.50M
                self.alu_muldiv(a.into(), r!(b), r!(c), r!(d))?;
371
            }
372
373
448k
            Instruction::NOOP(_noop) => {
374
448k
                self.gas_charge(self.gas_costs().noop())?;
375
447k
                self.alu_clear()?;
376
            }
377
378
203k
            Instruction::NOT(not) => {
379
203k
                self.gas_charge(self.gas_costs().not())?;
380
203k
                let (a, b) = not.unpack();
381
203k
                self.alu_set(a.into(), !r!(b))?;
382
            }
383
384
466k
            Instruction::OR(or) => {
385
466k
                self.gas_charge(self.gas_costs().or())?;
386
466k
                let (a, b, c) = or.unpack();
387
466k
                self.alu_set(a.into(), r!(b) | r!(c))?;
388
            }
389
390
1.20M
            Instruction::ORI(ori) => {
391
1.20M
                self.gas_charge(self.gas_costs().ori())?;
392
1.20M
                let (a, b, imm) = ori.unpack();
393
1.20M
                self.alu_set(a.into(), r!(b) | Word::from(imm))?;
394
            }
395
396
2.40M
            Instruction::SLL(sll) => {
397
2.40M
                self.gas_charge(self.gas_costs().sll())?;
398
2.40M
                let (a, b, c) = sll.unpack();
399
2.40M
400
2.40M
                self.alu_set(
401
2.40M
                    a.into(),
402
2.40M
                    if let Ok(c) = r!(c).try_into() {
403
1.53M
                        Word::checked_shl(r!(b), c).unwrap_or_default()
404
                    } else {
405
861k
                        0
406
                    },
407
4
                )?;
408
            }
409
410
738k
            Instruction::SLLI(slli) => {
411
738k
                self.gas_charge(self.gas_costs().slli())?;
412
738k
                let (a, b, imm) = slli.unpack();
413
738k
                let rhs = u32::from(imm);
414
738k
                self.alu_set(a.into(), r!(b).checked_shl(rhs).unwrap_or_default())?;
415
            }
416
417
470k
            Instruction::SRL(srl) => {
418
470k
                self.gas_charge(self.gas_costs().srl())?;
419
470k
                let (a, b, c) = srl.unpack();
420
470k
                self.alu_set(
421
470k
                    a.into(),
422
470k
                    if let Ok(c) = r!(c).try_into() {
423
421k
                        Word::checked_shr(r!(b), c).unwrap_or_default()
424
                    } else {
425
48.9k
                        0
426
                    },
427
1
                )?;
428
            }
429
430
1.09M
            Instruction::SRLI(srli) => {
431
1.09M
                self.gas_charge(self.gas_costs().srli())?;
432
1.09M
                let (a, b, imm) = srli.unpack();
433
1.09M
                let rhs = u32::from(imm);
434
1.09M
                self.alu_set(a.into(), r!(b).checked_shr(rhs).unwrap_or_default())?;
435
            }
436
437
750k
            Instruction::SUB(sub) => {
438
750k
                self.gas_charge(self.gas_costs().sub())?;
439
750k
                let (a, b, c) = sub.unpack();
440
750k
                self.alu_capture_overflow(
441
750k
                    a.into(),
442
750k
                    u128::overflowing_sub,
443
750k
                    r!(b).into(),
444
750k
                    r!(c).into(),
445
750k
                )?;
446
            }
447
448
2.61M
            Instruction::SUBI(subi) => {
449
2.61M
                self.gas_charge(self.gas_costs().subi())?;
450
2.61M
                let (a, b, imm) = subi.unpack();
451
2.61M
                self.alu_capture_overflow(
452
2.61M
                    a.into(),
453
2.61M
                    u128::overflowing_sub,
454
2.61M
                    r!(b).into(),
455
2.61M
                    imm.into(),
456
2.61M
                )?;
457
            }
458
459
893k
            Instruction::XOR(xor) => {
460
893k
                self.gas_charge(self.gas_costs().xor())?;
461
893k
                let (a, b, c) = xor.unpack();
462
893k
                self.alu_set(a.into(), r!(b) ^ r!(c))?;
463
            }
464
465
425k
            Instruction::XORI(xori) => {
466
425k
                self.gas_charge(self.gas_costs().xori())?;
467
425k
                let (a, b, imm) = xori.unpack();
468
425k
                self.alu_set(a.into(), r!(b) ^ Word::from(imm))?;
469
            }
470
471
40.7M
            Instruction::JI(ji) => {
472
40.7M
                self.gas_charge(self.gas_costs().ji())?;
473
40.7M
                let imm = ji.unpack();
474
40.7M
                self.jump(JumpArgs::new(JumpMode::Absolute).to_address(imm.into()))?;
475
            }
476
477
4.19M
            Instruction::JNEI(jnei) => {
478
4.19M
                self.gas_charge(self.gas_costs().jnei())?;
479
4.19M
                let (a, b, imm) = jnei.unpack();
480
4.19M
                self.jump(
481
4.19M
                    JumpArgs::new(JumpMode::Absolute)
482
4.19M
                        .with_condition(r!(a) != r!(b))
483
4.19M
                        .to_address(imm.into()),
484
4.19M
                )?;
485
            }
486
487
20.2M
            Instruction::JNZI(jnzi) => {
488
20.2M
                self.gas_charge(self.gas_costs().jnzi())?;
489
20.2M
                let (a, imm) = jnzi.unpack();
490
20.2M
                self.jump(
491
20.2M
                    JumpArgs::new(JumpMode::Absolute)
492
20.2M
                        .with_condition(r!(a) != 0)
493
20.2M
                        .to_address(imm.into()),
494
20.2M
                )?;
495
            }
496
497
3.45M
            Instruction::JMP(jmp) => {
498
3.45M
                self.gas_charge(self.gas_costs().jmp())?;
499
3.45M
                let a = jmp.unpack();
500
3.45M
                self.jump(JumpArgs::new(JumpMode::Absolute).to_address(r!(a)))?;
501
            }
502
503
7.04M
            Instruction::JNE(jne) => {
504
7.04M
                self.gas_charge(self.gas_costs().jne())?;
505
7.04M
                let (a, b, c) = jne.unpack();
506
7.04M
                self.jump(
507
7.04M
                    JumpArgs::new(JumpMode::Absolute)
508
7.04M
                        .with_condition(r!(a) != r!(b))
509
7.04M
                        .to_address(r!(c)),
510
7.04M
                )?;
511
            }
512
513
464k
            Instruction::JMPF(jmpf) => {
514
464k
                self.gas_charge(self.gas_costs().jmpf())?;
515
464k
                let (a, offset) = jmpf.unpack();
516
464k
                self.jump(
517
464k
                    JumpArgs::new(JumpMode::RelativeForwards)
518
464k
                        .to_address(r!(a))
519
464k
                        .plus_fixed(offset.into()),
520
464k
                )?;
521
            }
522
523
1.19M
            Instruction::JMPB(jmpb) => {
524
1.19M
                self.gas_charge(self.gas_costs().jmpb())?;
525
1.19M
                let (a, offset) = jmpb.unpack();
526
1.19M
                self.jump(
527
1.19M
                    JumpArgs::new(JumpMode::RelativeBackwards)
528
1.19M
                        .to_address(r!(a))
529
1.19M
                        .plus_fixed(offset.into()),
530
1.19M
                )?;
531
            }
532
533
2.12M
            Instruction::JNZF(jnzf) => {
534
2.12M
                self.gas_charge(self.gas_costs().jnzf())?;
535
2.12M
                let (a, b, offset) = jnzf.unpack();
536
2.12M
                self.jump(
537
2.12M
                    JumpArgs::new(JumpMode::RelativeForwards)
538
2.12M
                        .with_condition(r!(a) != 0)
539
2.12M
                        .to_address(r!(b))
540
2.12M
                        .plus_fixed(offset.into()),
541
2.12M
                )?;
542
            }
543
544
5.18M
            Instruction::JNZB(jnzb) => {
545
5.18M
                self.gas_charge(self.gas_costs().jnzb())?;
546
5.18M
                let (a, b, offset) = jnzb.unpack();
547
5.18M
                self.jump(
548
5.18M
                    JumpArgs::new(JumpMode::RelativeBackwards)
549
5.18M
                        .with_condition(r!(a) != 0)
550
5.18M
                        .to_address(r!(b))
551
5.18M
                        .plus_fixed(offset.into()),
552
5.18M
                )?;
553
            }
554
555
792k
            Instruction::JNEF(jnef) => {
556
792k
                self.gas_charge(self.gas_costs().jnef())?;
557
792k
                let (a, b, c, offset) = jnef.unpack();
558
792k
                self.jump(
559
792k
                    JumpArgs::new(JumpMode::RelativeForwards)
560
792k
                        .with_condition(r!(a) != r!(b))
561
792k
                        .to_address(r!(c))
562
792k
                        .plus_fixed(offset.into()),
563
792k
                )?;
564
            }
565
566
7.13M
            Instruction::JNEB(jneb) => {
567
7.13M
                self.gas_charge(self.gas_costs().jneb())?;
568
7.13M
                let (a, b, c, offset) = jneb.unpack();
569
7.13M
                self.jump(
570
7.13M
                    JumpArgs::new(JumpMode::RelativeBackwards)
571
7.13M
                        .with_condition(r!(a) != r!(b))
572
7.13M
                        .to_address(r!(c))
573
7.13M
                        .plus_fixed(offset.into()),
574
7.13M
                )?;
575
            }
576
577
23
            Instruction::RET(ret) => {
578
23
                self.gas_charge(self.gas_costs().ret())?;
579
23
                let a = ret.unpack();
580
23
                let ra = r!(a);
581
23
                self.ret(ra)?;
582
23
                return Ok(ExecuteState::Return(ra))
583
            }
584
585
11.3k
            Instruction::RETD(retd) => {
586
11.3k
                let (a, b) = retd.unpack();
587
11.3k
                let len = r!(b);
588
11.3k
                self.dependent_gas_charge(self.gas_costs().retd(), len)?;
589
11.3k
                return Ok(self.ret_data(r!(a), len).map(ExecuteState::ReturnData)?)
590
            }
591
592
10
            Instruction::RVRT(rvrt) => {
593
10
                self.gas_charge(self.gas_costs().rvrt())?;
594
10
                let a = rvrt.unpack();
595
10
                let ra = r!(a);
596
10
                self.revert(ra)?;
597
10
                return Ok(ExecuteState::Revert(ra))
598
            }
599
600
88.9k
            Instruction::SMO(smo) => {
601
88.9k
                let (a, b, c, d) = smo.unpack();
602
88.9k
                self.dependent_gas_charge(self.gas_costs().smo(), r!(c))?;
603
88.9k
                self.message_output(r!(a), r!(b), r!(c), r!(d))?;
604
            }
605
606
898k
            Instruction::ALOC(aloc) => {
607
898k
                let a = aloc.unpack();
608
898k
                let number_of_bytes = r!(a);
609
898k
                self.dependent_gas_charge(self.gas_costs().aloc(), number_of_bytes)?;
610
898k
                self.malloc(number_of_bytes)?;
611
            }
612
613
14.9M
            Instruction::CFEI(cfei) => {
614
14.9M
                let number_of_bytes = cfei.unpack().into();
615
14.9M
                self.dependent_gas_charge(self.gas_costs().cfei(), number_of_bytes)?;
616
14.9M
                self.stack_pointer_overflow(Word::overflowing_add, number_of_bytes)?;
617
            }
618
619
333k
            Instruction::CFE(cfe) => {
620
333k
                let a = cfe.unpack();
621
333k
                let number_of_bytes = r!(a);
622
333k
                self.dependent_gas_charge(self.gas_costs().cfe(), number_of_bytes)?;
623
333k
                self.stack_pointer_overflow(Word::overflowing_add, number_of_bytes)?;
624
            }
625
626
1.76M
            Instruction::CFSI(cfsi) => {
627
1.76M
                self.gas_charge(self.gas_costs().cfsi())?;
628
1.76M
                let imm = cfsi.unpack();
629
1.76M
                self.stack_pointer_overflow(Word::overflowing_sub, imm.into())?;
630
            }
631
632
394k
            Instruction::CFS(cfs) => {
633
394k
                self.gas_charge(self.gas_costs().cfsi())?;
634
394k
                let a = cfs.unpack();
635
394k
                self.stack_pointer_overflow(Word::overflowing_sub, r!(a))?;
636
            }
637
638
805k
            Instruction::PSHL(pshl) => {
639
805k
                self.gas_charge(self.gas_costs().pshl())?;
640
805k
                let bitmask = pshl.unpack();
641
805k
                self.push_selected_registers(ProgramRegistersSegment::Low, bitmask)?;
642
            }
643
644
3.66M
            Instruction::PSHH(pshh) => {
645
3.66M
                self.gas_charge(self.gas_costs().pshh())?;
646
3.66M
                let bitmask = pshh.unpack();
647
3.66M
                self.push_selected_registers(ProgramRegistersSegment::High, bitmask)?;
648
            }
649
650
276k
            Instruction::POPL(popl) => {
651
276k
                self.gas_charge(self.gas_costs().popl())?;
652
276k
                let bitmask = popl.unpack();
653
276k
                self.pop_selected_registers(ProgramRegistersSegment::Low, bitmask)?;
654
            }
655
656
159k
            Instruction::POPH(poph) => {
657
159k
                self.gas_charge(self.gas_costs().poph())?;
658
159k
                let bitmask = poph.unpack();
659
159k
                self.pop_selected_registers(ProgramRegistersSegment::High, bitmask)?;
660
            }
661
662
735k
            Instruction::LB(lb) => {
663
735k
                self.gas_charge(self.gas_costs().lb())?;
664
735k
                let (a, b, imm) = lb.unpack();
665
735k
                self.load_byte(a.into(), r!(b), imm.into())?;
666
            }
667
668
51.5M
            Instruction::LW(lw) => {
669
51.5M
                self.gas_charge(self.gas_costs().lw())?;
670
51.5M
                let (a, b, imm) = lw.unpack();
671
51.5M
                self.load_word(a.into(), r!(b), imm)?;
672
            }
673
674
148k
            Instruction::MCL(mcl) => {
675
148k
                let (a, b) = mcl.unpack();
676
148k
                let len = r!(b);
677
148k
                self.dependent_gas_charge(self.gas_costs().mcl(), len)?;
678
148k
                self.memclear(r!(a), len)?;
679
            }
680
681
114k
            Instruction::MCLI(mcli) => {
682
114k
                let (a, imm) = mcli.unpack();
683
114k
                let len = Word::from(imm);
684
114k
                self.dependent_gas_charge(self.gas_costs().mcli(), len)?;
685
114k
                self.memclear(r!(a), len)?;
686
            }
687
688
7.30M
            Instruction::MCP(mcp) => {
689
7.30M
                let (a, b, c) = mcp.unpack();
690
7.30M
                let len = r!(c);
691
7.30M
                self.dependent_gas_charge(self.gas_costs().mcp(), len)?;
692
7.30M
                self.memcopy(r!(a), r!(b), len)?;
693
            }
694
695
87.0k
            Instruction::MCPI(mcpi) => {
696
87.0k
                let (a, b, imm) = mcpi.unpack();
697
87.0k
                let len = imm.into();
698
87.0k
                self.dependent_gas_charge(self.gas_costs().mcpi(), len)?;
699
87.0k
                self.memcopy(r!(a), r!(b), len)?;
700
            }
701
702
1.63M
            Instruction::MEQ(meq) => {
703
1.63M
                let (a, b, c, d) = meq.unpack();
704
1.63M
                let len = r!(d);
705
1.63M
                self.dependent_gas_charge(self.gas_costs().meq(), len)?;
706
1.63M
                self.memeq(a.into(), r!(b), r!(c), len)?;
707
            }
708
709
164k
            Instruction::SB(sb) => {
710
164k
                self.gas_charge(self.gas_costs().sb())?;
711
164k
                let (a, b, imm) = sb.unpack();
712
164k
                self.store_byte(r!(a), r!(b), imm.into())?;
713
            }
714
715
12.9M
            Instruction::SW(sw) => {
716
12.9M
                self.gas_charge(self.gas_costs().sw())?;
717
12.9M
                let (a, b, imm) = sw.unpack();
718
12.9M
                self.store_word(r!(a), r!(b), imm)?;
719
            }
720
721
7
            Instruction::BAL(bal) => {
722
7
                self.gas_charge(self.gas_costs().bal())?;
723
7
                let (a, b, c) = bal.unpack();
724
7
                self.contract_balance(a.into(), r!(b), r!(c))?;
725
            }
726
727
174k
            Instruction::BHEI(bhei) => {
728
174k
                self.gas_charge(self.gas_costs().bhei())?;
729
174k
                let a = bhei.unpack();
730
174k
                self.block_height(a.into())?;
731
            }
732
733
72.8k
            Instruction::BHSH(bhsh) => {
734
72.8k
                self.gas_charge(self.gas_costs().bhsh())?;
735
72.8k
                let (a, b) = bhsh.unpack();
736
72.8k
                self.block_hash(r!(a), r!(b))?;
737
            }
738
739
117
            Instruction::BURN(burn) => {
740
117
                self.gas_charge(self.gas_costs().burn())?;
741
116
                let (a, b) = burn.unpack();
742
116
                self.burn(r!(a), r!(b))?;
743
            }
744
745
12.3k
            Instruction::CALL(call) => {
746
12.3k
                // We charge for the gas inside of the `prepare_call` function.
747
12.3k
                let (a, b, c, d) = call.unpack();
748
12.3k
749
12.3k
                // Enter call context
750
12.3k
                self.prepare_call(a, b, c, d)?;
751
            }
752
753
231k
            Instruction::CB(cb) => {
754
231k
                self.gas_charge(self.gas_costs().cb())?;
755
231k
                let a = cb.unpack();
756
231k
                self.block_proposer(r!(a))?;
757
            }
758
759
14
            Instruction::CCP(ccp) => {
760
14
                let (a, b, c, d) = ccp.unpack();
761
14
                self.code_copy(r!(a), r!(b), r!(c), r!(d))?;
762
            }
763
764
7
            Instruction::CROO(croo) => {
765
7
                let (a, b) = croo.unpack();
766
7
                self.code_root(r!(a), r!(b))?;
767
            }
768
769
4
            Instruction::CSIZ(csiz) => {
770
4
                // We charge for the gas inside of the `code_size` function.
771
4
                let (a, b) = csiz.unpack();
772
4
                self.code_size(a.into(), r!(b))?;
773
            }
774
775
597k
            Instruction::LDC(ldc) => {
776
597k
                // We charge for the gas inside of the `load_contract_code` function.
777
597k
                let (a, b, c, mode) = ldc.unpack();
778
597k
                self.load_contract_code(r!(a), r!(b), r!(c), mode)?;
779
            }
780
781
631k
            Instruction::LOG(log) => {
782
631k
                self.gas_charge(self.gas_costs().log())?;
783
631k
                let (a, b, c, d) = log.unpack();
784
631k
                self.log(r!(a), r!(b), r!(c), r!(d))?;
785
            }
786
787
176k
            Instruction::LOGD(logd) => {
788
176k
                let (a, b, c, d) = logd.unpack();
789
176k
                self.dependent_gas_charge(self.gas_costs().logd(), r!(d))?;
790
176k
                self.log_data(r!(a), r!(b), r!(c), r!(d))?;
791
            }
792
793
48
            Instruction::MINT(mint) => {
794
48
                self.gas_charge(self.gas_costs().mint())?;
795
47
                let (a, b) = mint.unpack();
796
47
                self.mint(r!(a), r!(b))?;
797
            }
798
799
5.19k
            Instruction::SCWQ(scwq) => {
800
5.19k
                let (a, b, c) = scwq.unpack();
801
5.19k
                self.dependent_gas_charge(self.gas_costs().scwq(), r!(c))?;
802
5.17k
                self.state_clear_qword(r!(a), b.into(), r!(c))?;
803
            }
804
805
2.05k
            Instruction::SRW(srw) => {
806
2.05k
                self.gas_charge(self.gas_costs().srw())?;
807
2.04k
                let (a, b, c) = srw.unpack();
808
2.04k
                self.state_read_word(a.into(), b.into(), r!(c))?;
809
            }
810
811
896
            Instruction::SRWQ(srwq) => {
812
896
                let (a, b, c, d) = srwq.unpack();
813
896
                self.dependent_gas_charge(self.gas_costs().srwq(), r!(d))?;
814
890
                self.state_read_qword(r!(a), b.into(), r!(c), r!(d))?;
815
            }
816
817
354
            Instruction::SWW(sww) => {
818
354
                self.gas_charge(self.gas_costs().sww())?;
819
352
                let (a, b, c) = sww.unpack();
820
352
                self.state_write_word(r!(a), b.into(), r!(c))?;
821
            }
822
823
3.79k
            Instruction::SWWQ(swwq) => {
824
3.79k
                let (a, b, c, d) = swwq.unpack();
825
3.79k
                self.dependent_gas_charge(self.gas_costs().swwq(), r!(d))?;
826
3.77k
                self.state_write_qword(r!(a), b.into(), r!(c), r!(d))?;
827
            }
828
829
326k
            Instruction::TIME(time) => {
830
326k
                self.gas_charge(self.gas_costs().time())?;
831
326k
                let (a, b) = time.unpack();
832
326k
                self.timestamp(a.into(), r!(b))?;
833
            }
834
835
11.1k
            Instruction::ECK1(eck1) => {
836
11.1k
                self.gas_charge(self.gas_costs().eck1())?;
837
11.1k
                let (a, b, c) = eck1.unpack();
838
11.1k
                self.secp256k1_recover(r!(a), r!(b), r!(c))?;
839
            }
840
841
4.53k
            Instruction::ECR1(ecr1) => {
842
4.53k
                self.gas_charge(self.gas_costs().ecr1())?;
843
4.52k
                let (a, b, c) = ecr1.unpack();
844
4.52k
                self.secp256r1_recover(r!(a), r!(b), r!(c))?;
845
            }
846
847
11.9k
            Instruction::ED19(ed19) => {
848
11.9k
                let (a, b, c, len) = ed19.unpack();
849
11.9k
                let mut len = r!(len);
850
11.9k
851
11.9k
                // Backwards compatibility with old contracts
852
11.9k
                if len == 0 {
853
8.35k
                    len = 32;
854
8.35k
                }
855
856
11.9k
                self.dependent_gas_charge(self.gas_costs().ed19(), len)?;
857
11.9k
                self.ed25519_verify(r!(a), r!(b), r!(c), len)?;
858
            }
859
860
38.7k
            Instruction::K256(k256) => {
861
38.7k
                let (a, b, c) = k256.unpack();
862
38.7k
                let len = r!(c);
863
38.7k
                self.dependent_gas_charge(self.gas_costs().k256(), len)?;
864
38.7k
                self.keccak256(r!(a), r!(b), len)?;
865
            }
866
867
146k
            Instruction::S256(s256) => {
868
146k
                let (a, b, c) = s256.unpack();
869
146k
                let len = r!(c);
870
146k
                self.dependent_gas_charge(self.gas_costs().s256(), len)?;
871
146k
                self.sha256(r!(a), r!(b), len)?;
872
            }
873
874
583k
            Instruction::FLAG(flag) => {
875
583k
                self.gas_charge(self.gas_costs().flag())?;
876
583k
                let a = flag.unpack();
877
583k
                self.set_flag(r!(a))?;
878
            }
879
880
1.61M
            Instruction::GM(gm) => {
881
1.61M
                self.gas_charge(self.gas_costs().gm())?;
882
1.61M
                let (a, imm) = gm.unpack();
883
1.61M
                self.metadata(a.into(), imm.into())?;
884
            }
885
886
10.4M
            Instruction::GTF(gtf) => {
887
10.4M
                self.gas_charge(self.gas_costs().gtf())?;
888
10.4M
                let (a, b, imm) = gtf.unpack();
889
10.4M
                self.get_transaction_field(a.into(), r!(b), imm.into())?;
890
            }
891
892
8
            Instruction::TR(tr) => {
893
8
                self.gas_charge(self.gas_costs().tr())?;
894
8
                let (a, b, c) = tr.unpack();
895
8
                self.transfer(r!(a), r!(b), r!(c))?;
896
            }
897
898
13
            Instruction::TRO(tro) => {
899
13
                self.gas_charge(self.gas_costs().tro())?;
900
13
                let (a, b, c, d) = tro.unpack();
901
13
                self.transfer_output(r!(a), r!(b), r!(c), r!(d))?;
902
            }
903
904
2
            Instruction::ECAL(ecal) => {
905
2
                let (a, b, c, d) = ecal.unpack();
906
2
                self.external_call(a, b, c, d)?;
907
            }
908
909
2
            Instruction::BSIZ(bsiz) => {
910
2
                // We charge for this inside the function.
911
2
                let (a, b) = bsiz.unpack();
912
2
                self.blob_size(a.into(), r!(b))?;
913
            }
914
915
3
            Instruction::BLDD(bldd) => {
916
3
                // We charge for this inside the function.
917
3
                let (a, b, c, d) = bldd.unpack();
918
3
                self.blob_load_data(r!(a), r!(b), r!(c), r!(d))?;
919
            }
920
        }
921
922
387M
        Ok(ExecuteState::Proceed)
923
387M
    }
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1V_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB33_4blob8BlobBodyNtB4z_12BlobMetadataEE17instruction_innerB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1V_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB33_6create10CreateBodyNtB4z_14CreateMetadataEE17instruction_innerB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1V_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB33_6script10ScriptBodyNtB4z_14ScriptMetadataEE17instruction_innerB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1V_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB33_6upload10UploadBodyNtB4z_14UploadMetadataEE17instruction_innerB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1V_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB33_7upgrade11UpgradeBodyNtB4z_15UpgradeMetadataEE17instruction_innerB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors11instructionINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1X_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3d_6script10ScriptBodyNtB4J_14ScriptMetadataEE17instruction_innerB8_
924
}
925
926
/// Computes nth root of target, rounding down to nearest integer.
927
/// This function uses the floating point operation to get an approximate solution,
928
/// but corrects the result using exponentation to check for inaccuracy.
929
1.48M
fn checked_nth_root(target: u64, nth_root: u64) -> Option<u64> {
930
1.48M
    if nth_root == 0 {
931
        // Zeroth root is not defined
932
0
        return None
933
1.48M
    }
934
1.48M
935
1.48M
    if nth_root == 1 || target <= 1 {
936
        // Corner cases
937
1.25M
        return Some(target)
938
236k
    }
939
236k
940
236k
    if nth_root >= target || nth_root > 64 {
941
        // For any root >= target, result always 1
942
        // For any n>1, n**64 can never fit into u64
943
133k
        return Some(1)
944
102k
    }
945
102k
946
102k
    let nth_root = u32::try_from(nth_root).expect("Never loses bits, checked above");
947
102k
948
102k
    // Use floating point operation to get an approximation for the starting point.
949
102k
    // This is at most off by one in either direction.
950
102k
951
102k
    #[cfg(feature = "std")]
952
102k
    let powf = f64::powf;
953
102k
    #[cfg(not(feature = "std"))]
954
102k
    let powf = libm::pow;
955
102k
956
102k
    #[allow(clippy::cast_possible_truncation, clippy::cast_sign_loss)]
957
102k
    let guess = powf(target as f64, (nth_root as f64).recip()) as u64;
958
102k
959
102k
    debug_assert!(guess != 0, "This should never occur for {{target, n}} > 1");
960
961
    // Check if a value raised to nth_power is below the target value, handling overflow
962
    // correctly
963
205k
    let is_nth_power_below_target = |v: u64| match v.checked_pow(nth_root) {
964
205k
        Some(pow) => target < pow,
965
169
        None => true, // v**nth_root >= 2**64 and target < 2**64
966
205k
    };
967
968
    // Compute guess**n to check if the guess is too large.
969
    // Note that if guess == 1, then g1 == 1 as well, meaning that we will not return
970
    // here.
971
102k
    if is_nth_power_below_target(guess) {
972
0
        return Some(guess.saturating_sub(1))
973
102k
    }
974
102k
975
102k
    // Check if the initial guess was correct
976
102k
    let guess_plus_one = guess.checked_add(1).expect(
977
102k
        "Guess cannot be u64::MAX, as we have taken a root > 2 of a value to get it",
978
102k
    );
979
102k
    if is_nth_power_below_target(guess_plus_one) {
980
102k
        return Some(guess)
981
0
    }
982
0
983
0
    // If not, then the value above must be the correct one.
984
0
    Some(guess_plus_one)
985
1.48M
}
986
987
#[cfg(test)]
988
mod tests;
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter/executors/main.rs
Line
Count
Source
1
#[cfg(test)]
2
mod tests;
3
4
use crate::{
5
    checked_transaction::{
6
        Checked,
7
        IntoChecked,
8
        ParallelExecutor,
9
    },
10
    context::Context,
11
    error::{
12
        Bug,
13
        InterpreterError,
14
        PredicateVerificationFailed,
15
    },
16
    interpreter::{
17
        CheckedMetadata,
18
        EcalHandler,
19
        ExecutableTransaction,
20
        InitialBalances,
21
        Interpreter,
22
        Memory,
23
        RuntimeBalances,
24
    },
25
    pool::VmMemoryPool,
26
    predicate::RuntimePredicate,
27
    prelude::{
28
        BugVariant,
29
        RuntimeError,
30
    },
31
    state::{
32
        ExecuteState,
33
        ProgramState,
34
        StateTransitionRef,
35
    },
36
    storage::{
37
        predicate::PredicateStorage,
38
        BlobData,
39
        InterpreterStorage,
40
    },
41
};
42
use alloc::{
43
    vec,
44
    vec::Vec,
45
};
46
use core::fmt::Debug;
47
48
use crate::{
49
    checked_transaction::{
50
        CheckError,
51
        CheckPredicateParams,
52
        Ready,
53
    },
54
    interpreter::InterpreterParams,
55
    prelude::MemoryInstance,
56
    storage::{
57
        predicate::PredicateStorageRequirements,
58
        UploadedBytecode,
59
        UploadedBytecodes,
60
    },
61
};
62
use fuel_asm::PanicReason;
63
use fuel_storage::{
64
    StorageAsMut,
65
    StorageAsRef,
66
};
67
use fuel_tx::{
68
    field::{
69
        BlobId as _,
70
        BytecodeRoot,
71
        BytecodeWitnessIndex,
72
        ReceiptsRoot,
73
        Salt,
74
        Script as ScriptField,
75
        ScriptGasLimit,
76
        StorageSlots,
77
        SubsectionIndex,
78
        SubsectionsNumber,
79
        UpgradePurpose as UpgradePurposeField,
80
        Witnesses,
81
    },
82
    input::{
83
        coin::CoinPredicate,
84
        message::{
85
            MessageCoinPredicate,
86
            MessageDataPredicate,
87
        },
88
    },
89
    Blob,
90
    BlobIdExt,
91
    ConsensusParameters,
92
    Contract,
93
    Create,
94
    FeeParameters,
95
    GasCosts,
96
    Input,
97
    Receipt,
98
    ScriptExecutionResult,
99
    Upgrade,
100
    UpgradeMetadata,
101
    UpgradePurpose,
102
    Upload,
103
    ValidityError,
104
};
105
use fuel_types::{
106
    AssetId,
107
    BlobId,
108
    Word,
109
};
110
111
/// Predicates were checked succesfully
112
#[derive(Debug, Clone, Copy)]
113
pub struct PredicatesChecked {
114
    gas_used: Word,
115
}
116
117
impl PredicatesChecked {
118
0
    pub fn gas_used(&self) -> Word {
119
0
        self.gas_used
120
0
    }
121
}
122
123
enum PredicateRunKind<'a, Tx> {
124
    Verifying(&'a Tx),
125
    Estimating(&'a mut Tx),
126
}
127
128
impl<'a, Tx> PredicateRunKind<'a, Tx> {
129
19.7k
    fn tx(&self) -> &Tx {
130
19.7k
        match self {
131
19.7k
            PredicateRunKind::Verifying(tx) => tx,
132
0
            PredicateRunKind::Estimating(tx) => tx,
133
        }
134
19.7k
    }
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB4_16PredicateRunKindINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1r_4blob8BlobBodyNtB2X_12BlobMetadataEE2txBa_
_RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB4_16PredicateRunKindINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1r_6create10CreateBodyNtB2X_14CreateMetadataEE2txBa_
Line
Count
Source
129
8.77k
    fn tx(&self) -> &Tx {
130
8.77k
        match self {
131
8.77k
            PredicateRunKind::Verifying(tx) => tx,
132
0
            PredicateRunKind::Estimating(tx) => tx,
133
        }
134
8.77k
    }
_RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB4_16PredicateRunKindINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1r_6script10ScriptBodyNtB2X_14ScriptMetadataEE2txBa_
Line
Count
Source
129
10.9k
    fn tx(&self) -> &Tx {
130
10.9k
        match self {
131
10.9k
            PredicateRunKind::Verifying(tx) => tx,
132
0
            PredicateRunKind::Estimating(tx) => tx,
133
        }
134
10.9k
    }
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB4_16PredicateRunKindINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1r_6upload10UploadBodyNtB2X_14UploadMetadataEE2txBa_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB4_16PredicateRunKindINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1r_7upgrade11UpgradeBodyNtB2X_15UpgradeMetadataEE2txBa_
135
}
136
137
#[derive(Debug, Clone, Copy)]
138
enum PredicateAction {
139
    Verifying,
140
    Estimating { available_gas: Word },
141
}
142
143
/// The module contains functions to check predicates defined in the inputs of a
144
/// transaction.
145
pub mod predicates {
146
    use super::*;
147
    use crate::storage::predicate::PredicateStorageProvider;
148
149
    /// Initialize the VM with the provided transaction and check all predicates defined
150
    /// in the inputs.
151
    ///
152
    /// The storage provider is not used since contract opcodes are not allowed for
153
    /// predicates.
154
4.38k
    pub fn check_predicates<Tx>(
155
4.38k
        checked: &Checked<Tx>,
156
4.38k
        params: &CheckPredicateParams,
157
4.38k
        mut memory: impl Memory,
158
4.38k
        storage: &impl PredicateStorageRequirements,
159
4.38k
    ) -> Result<PredicatesChecked, PredicateVerificationFailed>
160
4.38k
    where
161
4.38k
        Tx: ExecutableTransaction,
162
4.38k
        <Tx as IntoChecked>::Metadata: CheckedMetadata,
163
4.38k
    {
164
4.38k
        let tx = checked.transaction();
165
4.38k
        run_predicates(
166
4.38k
            PredicateRunKind::Verifying(tx),
167
4.38k
            params,
168
4.38k
            memory.as_mut(),
169
4.38k
            storage,
170
4.38k
        )
171
4.38k
    }
Unexecuted instantiation: _RINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates16check_predicatesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1x_4blob8BlobBodyNtB33_12BlobMetadataENtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage9predicate12EmptyStorageEBa_
_RINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates16check_predicatesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1x_6create10CreateBodyNtB33_14CreateMetadataENtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage9predicate12EmptyStorageEBa_
Line
Count
Source
154
2.19k
    pub fn check_predicates<Tx>(
155
2.19k
        checked: &Checked<Tx>,
156
2.19k
        params: &CheckPredicateParams,
157
2.19k
        mut memory: impl Memory,
158
2.19k
        storage: &impl PredicateStorageRequirements,
159
2.19k
    ) -> Result<PredicatesChecked, PredicateVerificationFailed>
160
2.19k
    where
161
2.19k
        Tx: ExecutableTransaction,
162
2.19k
        <Tx as IntoChecked>::Metadata: CheckedMetadata,
163
2.19k
    {
164
2.19k
        let tx = checked.transaction();
165
2.19k
        run_predicates(
166
2.19k
            PredicateRunKind::Verifying(tx),
167
2.19k
            params,
168
2.19k
            memory.as_mut(),
169
2.19k
            storage,
170
2.19k
        )
171
2.19k
    }
_RINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates16check_predicatesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1x_6script10ScriptBodyNtB33_14ScriptMetadataENtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageEBa_
Line
Count
Source
154
2.19k
    pub fn check_predicates<Tx>(
155
2.19k
        checked: &Checked<Tx>,
156
2.19k
        params: &CheckPredicateParams,
157
2.19k
        mut memory: impl Memory,
158
2.19k
        storage: &impl PredicateStorageRequirements,
159
2.19k
    ) -> Result<PredicatesChecked, PredicateVerificationFailed>
160
2.19k
    where
161
2.19k
        Tx: ExecutableTransaction,
162
2.19k
        <Tx as IntoChecked>::Metadata: CheckedMetadata,
163
2.19k
    {
164
2.19k
        let tx = checked.transaction();
165
2.19k
        run_predicates(
166
2.19k
            PredicateRunKind::Verifying(tx),
167
2.19k
            params,
168
2.19k
            memory.as_mut(),
169
2.19k
            storage,
170
2.19k
        )
171
2.19k
    }
Unexecuted instantiation: _RINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates16check_predicatesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1x_6script10ScriptBodyNtB33_14ScriptMetadataENtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage9predicate12EmptyStorageEBa_
Unexecuted instantiation: _RINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates16check_predicatesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1x_6upload10UploadBodyNtB33_14UploadMetadataENtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage9predicate12EmptyStorageEBa_
Unexecuted instantiation: _RINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates16check_predicatesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1x_7upgrade11UpgradeBodyNtB33_15UpgradeMetadataENtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage9predicate12EmptyStorageEBa_
172
173
    /// Initialize the VM with the provided transaction and check all predicates defined
174
    /// in the inputs in parallel.
175
    ///
176
    /// The storage provider is not used since contract opcodes are not allowed for
177
    /// predicates.
178
0
    pub async fn check_predicates_async<Tx, E>(
179
0
        checked: &Checked<Tx>,
180
0
        params: &CheckPredicateParams,
181
0
        pool: &impl VmMemoryPool,
182
0
        storage: &impl PredicateStorageProvider,
183
0
    ) -> Result<PredicatesChecked, PredicateVerificationFailed>
184
0
    where
185
0
        Tx: ExecutableTransaction + Send + 'static,
186
0
        <Tx as IntoChecked>::Metadata: CheckedMetadata,
187
0
        E: ParallelExecutor,
188
0
    {
189
0
        let tx = checked.transaction();
190
191
0
        let predicates_checked = run_predicate_async::<Tx, E>(
192
0
            PredicateRunKind::Verifying(tx),
193
0
            params,
194
0
            pool,
195
0
            storage,
196
0
        )
197
0
        .await?;
198
199
0
        Ok(predicates_checked)
200
0
    }
201
202
    /// Initialize the VM with the provided transaction, check all predicates defined in
203
    /// the inputs and set the predicate_gas_used to be the actual gas consumed during
204
    /// execution for each predicate.
205
    ///
206
    /// The storage provider is not used since contract opcodes are not allowed for
207
    /// predicates.
208
0
    pub fn estimate_predicates<Tx>(
209
0
        transaction: &mut Tx,
210
0
        params: &CheckPredicateParams,
211
0
        mut memory: impl Memory,
212
0
        storage: &impl PredicateStorageRequirements,
213
0
    ) -> Result<PredicatesChecked, PredicateVerificationFailed>
214
0
    where
215
0
        Tx: ExecutableTransaction,
216
0
    {
217
0
        let predicates_checked = run_predicates(
218
0
            PredicateRunKind::Estimating(transaction),
219
0
            params,
220
0
            memory.as_mut(),
221
0
            storage,
222
0
        )?;
223
0
        Ok(predicates_checked)
224
0
    }
225
226
    /// Initialize the VM with the provided transaction, check all predicates defined in
227
    /// the inputs and set the predicate_gas_used to be the actual gas consumed during
228
    /// execution for each predicate in parallel.
229
    ///
230
    /// The storage provider is not used since contract opcodes are not allowed for
231
    /// predicates.
232
0
    pub async fn estimate_predicates_async<Tx, E>(
233
0
        transaction: &mut Tx,
234
0
        params: &CheckPredicateParams,
235
0
        pool: &impl VmMemoryPool,
236
0
        storage: &impl PredicateStorageProvider,
237
0
    ) -> Result<PredicatesChecked, PredicateVerificationFailed>
238
0
    where
239
0
        Tx: ExecutableTransaction + Send + 'static,
240
0
        E: ParallelExecutor,
241
0
    {
242
0
        let predicates_checked = run_predicate_async::<Tx, E>(
243
0
            PredicateRunKind::Estimating(transaction),
244
0
            params,
245
0
            pool,
246
0
            storage,
247
0
        )
248
0
        .await?;
249
250
0
        Ok(predicates_checked)
251
0
    }
252
253
0
    async fn run_predicate_async<Tx, E>(
254
0
        kind: PredicateRunKind<'_, Tx>,
255
0
        params: &CheckPredicateParams,
256
0
        pool: &impl VmMemoryPool,
257
0
        storage: &impl PredicateStorageProvider,
258
0
    ) -> Result<PredicatesChecked, PredicateVerificationFailed>
259
0
    where
260
0
        Tx: ExecutableTransaction + Send + 'static,
261
0
        E: ParallelExecutor,
262
0
    {
263
0
        let mut checks = vec![];
264
0
        let tx_offset = params.tx_offset;
265
0
266
0
        let max_gas_per_tx = params.max_gas_per_tx;
267
0
        let max_gas_per_predicate = params.max_gas_per_predicate;
268
0
        let available_gas = core::cmp::min(max_gas_per_predicate, max_gas_per_tx);
269
0
        let predicate_action = match kind {
270
0
            PredicateRunKind::Verifying(_) => PredicateAction::Verifying,
271
            PredicateRunKind::Estimating(_) => {
272
0
                PredicateAction::Estimating { available_gas }
273
            }
274
        };
275
276
0
        for index in 0..kind.tx().inputs().len() {
277
0
            if let Some(predicate) =
278
0
                RuntimePredicate::from_tx(kind.tx(), tx_offset, index)
279
            {
280
0
                let tx = kind.tx().clone();
281
0
                let my_params = params.clone();
282
0
                let mut memory = pool.get_new().await;
283
0
                let storage_instance = storage.storage();
284
0
285
0
                let verify_task = E::create_task(move || {
286
0
                    let (used_gas, result) = check_predicate(
287
0
                        tx,
288
0
                        index,
289
0
                        predicate_action,
290
0
                        predicate,
291
0
                        my_params,
292
0
                        memory.as_mut(),
293
0
                        &storage_instance,
294
0
                    );
295
0
296
0
                    result.map(|_| (used_gas, index))
297
0
                });
298
0
299
0
                checks.push(verify_task);
300
0
            }
301
        }
302
303
0
        let checks = E::execute_tasks(checks).await;
304
305
0
        finalize_check_predicate(kind, checks, params)
306
0
    }
307
308
4.38k
    fn run_predicates<Tx>(
309
4.38k
        kind: PredicateRunKind<'_, Tx>,
310
4.38k
        params: &CheckPredicateParams,
311
4.38k
        mut memory: impl Memory,
312
4.38k
        storage: &impl PredicateStorageRequirements,
313
4.38k
    ) -> Result<PredicatesChecked, PredicateVerificationFailed>
314
4.38k
    where
315
4.38k
        Tx: ExecutableTransaction,
316
4.38k
    {
317
4.38k
        let mut checks = vec![];
318
4.38k
319
4.38k
        let max_gas = kind.tx().max_gas(&params.gas_costs, &params.fee_params);
320
4.38k
        let max_gas_per_tx = params.max_gas_per_tx;
321
4.38k
        let max_gas_per_predicate = params.max_gas_per_predicate;
322
4.38k
        let mut available_gas =
323
4.38k
            core::cmp::min(max_gas_per_predicate, max_gas_per_tx).saturating_sub(max_gas);
324
325
6.57k
        for index in 0..kind.tx().inputs().len() {
326
6.57k
            let tx = kind.tx().clone();
327
328
0
            if let Some(predicate) =
329
6.57k
                RuntimePredicate::from_tx(&tx, params.tx_offset, index)
330
            {
331
0
                let predicate_action = match kind {
332
0
                    PredicateRunKind::Verifying(_) => PredicateAction::Verifying,
333
                    PredicateRunKind::Estimating(_) => {
334
0
                        PredicateAction::Estimating { available_gas }
335
                    }
336
                };
337
0
                let (gas_used, result) = check_predicate(
338
0
                    tx,
339
0
                    index,
340
0
                    predicate_action,
341
0
                    predicate,
342
0
                    params.clone(),
343
0
                    memory.as_mut(),
344
0
                    storage,
345
0
                );
346
0
                available_gas = available_gas.saturating_sub(gas_used);
347
0
                let result = result.map(|_| (gas_used, index));
Unexecuted instantiation: _RNCINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates14run_predicatesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1x_4blob8BlobBodyNtB33_12BlobMetadataEQNtNtBa_6memory14MemoryInstanceNtNtNtBc_7storage9predicate12EmptyStorageE0Bc_
Unexecuted instantiation: _RNCINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates14run_predicatesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1x_6create10CreateBodyNtB33_14CreateMetadataEQNtNtBa_6memory14MemoryInstanceNtNtNtBc_7storage9predicate12EmptyStorageE0Bc_
Unexecuted instantiation: _RNCINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates14run_predicatesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1x_6script10ScriptBodyNtB33_14ScriptMetadataEQNtNtBa_6memory14MemoryInstanceNtNtNtBc_7storage6memory13MemoryStorageE0Bc_
Unexecuted instantiation: _RNCINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates14run_predicatesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1x_6script10ScriptBodyNtB33_14ScriptMetadataEQNtNtBa_6memory14MemoryInstanceNtNtNtBc_7storage9predicate12EmptyStorageE0Bc_
Unexecuted instantiation: _RNCINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates14run_predicatesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1x_6upload10UploadBodyNtB33_14UploadMetadataEQNtNtBa_6memory14MemoryInstanceNtNtNtBc_7storage9predicate12EmptyStorageE0Bc_
Unexecuted instantiation: _RNCINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates14run_predicatesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1x_7upgrade11UpgradeBodyNtB33_15UpgradeMetadataEQNtNtBa_6memory14MemoryInstanceNtNtNtBc_7storage9predicate12EmptyStorageE0Bc_
348
0
                checks.push(result);
349
6.57k
            }
350
        }
351
352
4.38k
        finalize_check_predicate(kind, checks, params)
353
4.38k
    }
Unexecuted instantiation: _RINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates14run_predicatesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1v_4blob8BlobBodyNtB31_12BlobMetadataEQNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage9predicate12EmptyStorageEBa_
_RINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates14run_predicatesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1v_6create10CreateBodyNtB31_14CreateMetadataEQNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage9predicate12EmptyStorageEBa_
Line
Count
Source
308
2.19k
    fn run_predicates<Tx>(
309
2.19k
        kind: PredicateRunKind<'_, Tx>,
310
2.19k
        params: &CheckPredicateParams,
311
2.19k
        mut memory: impl Memory,
312
2.19k
        storage: &impl PredicateStorageRequirements,
313
2.19k
    ) -> Result<PredicatesChecked, PredicateVerificationFailed>
314
2.19k
    where
315
2.19k
        Tx: ExecutableTransaction,
316
2.19k
    {
317
2.19k
        let mut checks = vec![];
318
2.19k
319
2.19k
        let max_gas = kind.tx().max_gas(&params.gas_costs, &params.fee_params);
320
2.19k
        let max_gas_per_tx = params.max_gas_per_tx;
321
2.19k
        let max_gas_per_predicate = params.max_gas_per_predicate;
322
2.19k
        let mut available_gas =
323
2.19k
            core::cmp::min(max_gas_per_predicate, max_gas_per_tx).saturating_sub(max_gas);
324
325
2.19k
        for index in 0..kind.tx().inputs().len() {
326
2.19k
            let tx = kind.tx().clone();
327
328
0
            if let Some(predicate) =
329
2.19k
                RuntimePredicate::from_tx(&tx, params.tx_offset, index)
330
            {
331
0
                let predicate_action = match kind {
332
0
                    PredicateRunKind::Verifying(_) => PredicateAction::Verifying,
333
                    PredicateRunKind::Estimating(_) => {
334
0
                        PredicateAction::Estimating { available_gas }
335
                    }
336
                };
337
0
                let (gas_used, result) = check_predicate(
338
0
                    tx,
339
0
                    index,
340
0
                    predicate_action,
341
0
                    predicate,
342
0
                    params.clone(),
343
0
                    memory.as_mut(),
344
0
                    storage,
345
0
                );
346
0
                available_gas = available_gas.saturating_sub(gas_used);
347
0
                let result = result.map(|_| (gas_used, index));
348
0
                checks.push(result);
349
2.19k
            }
350
        }
351
352
2.19k
        finalize_check_predicate(kind, checks, params)
353
2.19k
    }
_RINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates14run_predicatesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1v_6script10ScriptBodyNtB31_14ScriptMetadataEQNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageEBa_
Line
Count
Source
308
2.19k
    fn run_predicates<Tx>(
309
2.19k
        kind: PredicateRunKind<'_, Tx>,
310
2.19k
        params: &CheckPredicateParams,
311
2.19k
        mut memory: impl Memory,
312
2.19k
        storage: &impl PredicateStorageRequirements,
313
2.19k
    ) -> Result<PredicatesChecked, PredicateVerificationFailed>
314
2.19k
    where
315
2.19k
        Tx: ExecutableTransaction,
316
2.19k
    {
317
2.19k
        let mut checks = vec![];
318
2.19k
319
2.19k
        let max_gas = kind.tx().max_gas(&params.gas_costs, &params.fee_params);
320
2.19k
        let max_gas_per_tx = params.max_gas_per_tx;
321
2.19k
        let max_gas_per_predicate = params.max_gas_per_predicate;
322
2.19k
        let mut available_gas =
323
2.19k
            core::cmp::min(max_gas_per_predicate, max_gas_per_tx).saturating_sub(max_gas);
324
325
4.38k
        for index in 0..kind.tx().inputs().len() {
326
4.38k
            let tx = kind.tx().clone();
327
328
0
            if let Some(predicate) =
329
4.38k
                RuntimePredicate::from_tx(&tx, params.tx_offset, index)
330
            {
331
0
                let predicate_action = match kind {
332
0
                    PredicateRunKind::Verifying(_) => PredicateAction::Verifying,
333
                    PredicateRunKind::Estimating(_) => {
334
0
                        PredicateAction::Estimating { available_gas }
335
                    }
336
                };
337
0
                let (gas_used, result) = check_predicate(
338
0
                    tx,
339
0
                    index,
340
0
                    predicate_action,
341
0
                    predicate,
342
0
                    params.clone(),
343
0
                    memory.as_mut(),
344
0
                    storage,
345
0
                );
346
0
                available_gas = available_gas.saturating_sub(gas_used);
347
0
                let result = result.map(|_| (gas_used, index));
348
0
                checks.push(result);
349
4.38k
            }
350
        }
351
352
2.19k
        finalize_check_predicate(kind, checks, params)
353
2.19k
    }
Unexecuted instantiation: _RINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates14run_predicatesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1v_6script10ScriptBodyNtB31_14ScriptMetadataEQNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage9predicate12EmptyStorageEBa_
Unexecuted instantiation: _RINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates14run_predicatesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1v_6upload10UploadBodyNtB31_14UploadMetadataEQNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage9predicate12EmptyStorageEBa_
Unexecuted instantiation: _RINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates14run_predicatesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1v_7upgrade11UpgradeBodyNtB31_15UpgradeMetadataEQNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage9predicate12EmptyStorageEBa_
354
355
0
    fn check_predicate<Tx>(
356
0
        tx: Tx,
357
0
        index: usize,
358
0
        predicate_action: PredicateAction,
359
0
        predicate: RuntimePredicate,
360
0
        params: CheckPredicateParams,
361
0
        memory: &mut MemoryInstance,
362
0
        storage: &impl PredicateStorageRequirements,
363
0
    ) -> (Word, Result<(), PredicateVerificationFailed>)
364
0
    where
365
0
        Tx: ExecutableTransaction,
366
0
    {
367
0
        match &tx.inputs()[index] {
368
            Input::CoinPredicate(CoinPredicate {
369
0
                owner: address,
370
0
                predicate,
371
                ..
372
            })
373
            | Input::MessageDataPredicate(MessageDataPredicate {
374
0
                recipient: address,
375
0
                predicate,
376
                ..
377
            })
378
            | Input::MessageCoinPredicate(MessageCoinPredicate {
379
0
                predicate,
380
0
                recipient: address,
381
                ..
382
            }) => {
383
0
                if !Input::is_predicate_owner_valid(address, &**predicate) {
384
0
                    return (0, Err(PredicateVerificationFailed::InvalidOwner));
385
0
                }
386
            }
387
0
            _ => {}
388
        }
389
390
0
        let zero_gas_price = 0;
391
0
        let interpreter_params = InterpreterParams::new(zero_gas_price, params);
392
0
393
0
        let mut vm = Interpreter::<_, _, _>::with_storage(
394
0
            memory,
395
0
            PredicateStorage::new(storage),
396
0
            interpreter_params,
397
0
        );
398
399
0
        let (context, available_gas) = match predicate_action {
400
            PredicateAction::Verifying => {
401
0
                let context = Context::PredicateVerification { program: predicate };
402
0
                let available_gas = tx.inputs()[index]
403
0
                    .predicate_gas_used()
404
0
                    .expect("We only run predicates at this stage, so it should exist.");
405
0
406
0
                (context, available_gas)
407
            }
408
0
            PredicateAction::Estimating { available_gas } => {
409
0
                let context = Context::PredicateEstimation { program: predicate };
410
0
411
0
                (context, available_gas)
412
            }
413
        };
414
415
0
        if let Err(err) = vm.init_predicate(context, tx, available_gas) {
416
0
            return (0, Err(err.into()));
417
0
        }
418
0
419
0
        let result = vm.verify_predicate();
420
0
        let is_successful = matches!(result, Ok(ProgramState::Return(0x01)));
421
422
0
        let Some(gas_used) = available_gas.checked_sub(vm.remaining_gas()) else {
423
0
            return (0, Err(Bug::new(BugVariant::GlobalGasUnderflow).into()));
424
        };
425
426
0
        if let PredicateAction::Verifying = predicate_action {
427
0
            if !is_successful {
428
0
                return if let Err(err) = result {
429
0
                    (gas_used, Err(err))
430
                } else {
431
0
                    (gas_used, Err(PredicateVerificationFailed::False))
432
                }
433
0
            }
434
0
435
0
            if vm.remaining_gas() != 0 {
436
0
                return (gas_used, Err(PredicateVerificationFailed::GasMismatch));
437
0
            }
438
0
        }
439
440
0
        (gas_used, Ok(()))
441
0
    }
Unexecuted instantiation: _RINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates15check_predicateINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1w_4blob8BlobBodyNtB32_12BlobMetadataENtNtNtBa_7storage9predicate12EmptyStorageEBa_
Unexecuted instantiation: _RINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates15check_predicateINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1w_6create10CreateBodyNtB32_14CreateMetadataENtNtNtBa_7storage9predicate12EmptyStorageEBa_
Unexecuted instantiation: _RINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates15check_predicateINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1w_6script10ScriptBodyNtB32_14ScriptMetadataENtNtNtBa_7storage6memory13MemoryStorageEBa_
Unexecuted instantiation: _RINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates15check_predicateINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1w_6script10ScriptBodyNtB32_14ScriptMetadataENtNtNtBa_7storage9predicate12EmptyStorageEBa_
Unexecuted instantiation: _RINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates15check_predicateINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1w_6upload10UploadBodyNtB32_14UploadMetadataENtNtNtBa_7storage9predicate12EmptyStorageEBa_
Unexecuted instantiation: _RINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates15check_predicateINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1w_7upgrade11UpgradeBodyNtB32_15UpgradeMetadataENtNtNtBa_7storage9predicate12EmptyStorageEBa_
442
443
4.38k
    fn finalize_check_predicate<Tx>(
444
4.38k
        mut kind: PredicateRunKind<Tx>,
445
4.38k
        checks: Vec<Result<(Word, usize), PredicateVerificationFailed>>,
446
4.38k
        params: &CheckPredicateParams,
447
4.38k
    ) -> Result<PredicatesChecked, PredicateVerificationFailed>
448
4.38k
    where
449
4.38k
        Tx: ExecutableTransaction,
450
4.38k
    {
451
4.38k
        if let PredicateRunKind::Estimating(tx) = &mut kind {
452
0
            checks.iter().for_each(|result| {
453
0
                if let Ok((gas_used, index)) = result {
454
0
                    match &mut tx.inputs_mut()[*index] {
455
                        Input::CoinPredicate(CoinPredicate {
456
0
                            predicate_gas_used,
457
                            ..
458
                        })
459
                        | Input::MessageCoinPredicate(MessageCoinPredicate {
460
0
                            predicate_gas_used,
461
                            ..
462
                        })
463
                        | Input::MessageDataPredicate(MessageDataPredicate {
464
0
                            predicate_gas_used,
465
                            ..
466
0
                        }) => {
467
0
                            *predicate_gas_used = *gas_used;
468
0
                        }
469
                        _ => {
470
0
                            unreachable!(
471
0
                                "It was checked before during iteration over predicates"
472
0
                            )
473
                        }
474
                    }
475
0
                }
476
0
            });
Unexecuted instantiation: _RNCINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates24finalize_check_predicateINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1H_4blob8BlobBodyNtB3d_12BlobMetadataEE0Bc_
Unexecuted instantiation: _RNCINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates24finalize_check_predicateINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1H_6create10CreateBodyNtB3d_14CreateMetadataEE0Bc_
Unexecuted instantiation: _RNCINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates24finalize_check_predicateINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1H_6script10ScriptBodyNtB3d_14ScriptMetadataEE0Bc_
Unexecuted instantiation: _RNCINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates24finalize_check_predicateINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1H_6upload10UploadBodyNtB3d_14UploadMetadataEE0Bc_
Unexecuted instantiation: _RNCINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates24finalize_check_predicateINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1H_7upgrade11UpgradeBodyNtB3d_15UpgradeMetadataEE0Bc_
477
4.38k
        }
478
479
4.38k
        let max_gas = kind.tx().max_gas(&params.gas_costs, &params.fee_params);
480
4.38k
        if max_gas > params.max_gas_per_tx {
481
0
            return Err(
482
0
                PredicateVerificationFailed::TransactionExceedsTotalGasAllowance(max_gas),
483
0
            );
484
4.38k
        }
485
486
4.38k
        let cumulative_gas_used = checks.into_iter().try_fold(0u64, |acc, result| {
487
0
            acc.checked_add(result.map(|(gas_used, _)| gas_used)?)
Unexecuted instantiation: _RNCNCINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates24finalize_check_predicateINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1J_4blob8BlobBodyNtB3f_12BlobMetadataEEs_00Be_
Unexecuted instantiation: _RNCNCINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates24finalize_check_predicateINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1J_6create10CreateBodyNtB3f_14CreateMetadataEEs_00Be_
Unexecuted instantiation: _RNCNCINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates24finalize_check_predicateINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1J_6script10ScriptBodyNtB3f_14ScriptMetadataEEs_00Be_
Unexecuted instantiation: _RNCNCINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates24finalize_check_predicateINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1J_6upload10UploadBodyNtB3f_14UploadMetadataEEs_00Be_
Unexecuted instantiation: _RNCNCINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates24finalize_check_predicateINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1J_7upgrade11UpgradeBodyNtB3f_15UpgradeMetadataEEs_00Be_
488
0
                .ok_or(PredicateVerificationFailed::OutOfGas)
489
4.38k
        })?;
Unexecuted instantiation: _RNCINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates24finalize_check_predicateINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1H_4blob8BlobBodyNtB3d_12BlobMetadataEEs_0Bc_
Unexecuted instantiation: _RNCINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates24finalize_check_predicateINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1H_6create10CreateBodyNtB3d_14CreateMetadataEEs_0Bc_
Unexecuted instantiation: _RNCINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates24finalize_check_predicateINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1H_6script10ScriptBodyNtB3d_14ScriptMetadataEEs_0Bc_
Unexecuted instantiation: _RNCINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates24finalize_check_predicateINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1H_6upload10UploadBodyNtB3d_14UploadMetadataEEs_0Bc_
Unexecuted instantiation: _RNCINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates24finalize_check_predicateINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1H_7upgrade11UpgradeBodyNtB3d_15UpgradeMetadataEEs_0Bc_
490
491
4.38k
        Ok(PredicatesChecked {
492
4.38k
            gas_used: cumulative_gas_used,
493
4.38k
        })
494
4.38k
    }
Unexecuted instantiation: _RINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates24finalize_check_predicateINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1F_4blob8BlobBodyNtB3b_12BlobMetadataEEBa_
_RINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates24finalize_check_predicateINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1F_6create10CreateBodyNtB3b_14CreateMetadataEEBa_
Line
Count
Source
443
2.19k
    fn finalize_check_predicate<Tx>(
444
2.19k
        mut kind: PredicateRunKind<Tx>,
445
2.19k
        checks: Vec<Result<(Word, usize), PredicateVerificationFailed>>,
446
2.19k
        params: &CheckPredicateParams,
447
2.19k
    ) -> Result<PredicatesChecked, PredicateVerificationFailed>
448
2.19k
    where
449
2.19k
        Tx: ExecutableTransaction,
450
2.19k
    {
451
2.19k
        if let PredicateRunKind::Estimating(tx) = &mut kind {
452
0
            checks.iter().for_each(|result| {
453
                if let Ok((gas_used, index)) = result {
454
                    match &mut tx.inputs_mut()[*index] {
455
                        Input::CoinPredicate(CoinPredicate {
456
                            predicate_gas_used,
457
                            ..
458
                        })
459
                        | Input::MessageCoinPredicate(MessageCoinPredicate {
460
                            predicate_gas_used,
461
                            ..
462
                        })
463
                        | Input::MessageDataPredicate(MessageDataPredicate {
464
                            predicate_gas_used,
465
                            ..
466
                        }) => {
467
                            *predicate_gas_used = *gas_used;
468
                        }
469
                        _ => {
470
                            unreachable!(
471
                                "It was checked before during iteration over predicates"
472
                            )
473
                        }
474
                    }
475
                }
476
0
            });
477
2.19k
        }
478
479
2.19k
        let max_gas = kind.tx().max_gas(&params.gas_costs, &params.fee_params);
480
2.19k
        if max_gas > params.max_gas_per_tx {
481
0
            return Err(
482
0
                PredicateVerificationFailed::TransactionExceedsTotalGasAllowance(max_gas),
483
0
            );
484
2.19k
        }
485
486
2.19k
        let cumulative_gas_used = checks.into_iter().try_fold(0u64, |acc, result| {
487
            acc.checked_add(result.map(|(gas_used, _)| gas_used)?)
488
                .ok_or(PredicateVerificationFailed::OutOfGas)
489
2.19k
        })?;
490
491
2.19k
        Ok(PredicatesChecked {
492
2.19k
            gas_used: cumulative_gas_used,
493
2.19k
        })
494
2.19k
    }
_RINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates24finalize_check_predicateINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1F_6script10ScriptBodyNtB3b_14ScriptMetadataEEBa_
Line
Count
Source
443
2.19k
    fn finalize_check_predicate<Tx>(
444
2.19k
        mut kind: PredicateRunKind<Tx>,
445
2.19k
        checks: Vec<Result<(Word, usize), PredicateVerificationFailed>>,
446
2.19k
        params: &CheckPredicateParams,
447
2.19k
    ) -> Result<PredicatesChecked, PredicateVerificationFailed>
448
2.19k
    where
449
2.19k
        Tx: ExecutableTransaction,
450
2.19k
    {
451
2.19k
        if let PredicateRunKind::Estimating(tx) = &mut kind {
452
0
            checks.iter().for_each(|result| {
453
                if let Ok((gas_used, index)) = result {
454
                    match &mut tx.inputs_mut()[*index] {
455
                        Input::CoinPredicate(CoinPredicate {
456
                            predicate_gas_used,
457
                            ..
458
                        })
459
                        | Input::MessageCoinPredicate(MessageCoinPredicate {
460
                            predicate_gas_used,
461
                            ..
462
                        })
463
                        | Input::MessageDataPredicate(MessageDataPredicate {
464
                            predicate_gas_used,
465
                            ..
466
                        }) => {
467
                            *predicate_gas_used = *gas_used;
468
                        }
469
                        _ => {
470
                            unreachable!(
471
                                "It was checked before during iteration over predicates"
472
                            )
473
                        }
474
                    }
475
                }
476
0
            });
477
2.19k
        }
478
479
2.19k
        let max_gas = kind.tx().max_gas(&params.gas_costs, &params.fee_params);
480
2.19k
        if max_gas > params.max_gas_per_tx {
481
0
            return Err(
482
0
                PredicateVerificationFailed::TransactionExceedsTotalGasAllowance(max_gas),
483
0
            );
484
2.19k
        }
485
486
2.19k
        let cumulative_gas_used = checks.into_iter().try_fold(0u64, |acc, result| {
487
            acc.checked_add(result.map(|(gas_used, _)| gas_used)?)
488
                .ok_or(PredicateVerificationFailed::OutOfGas)
489
2.19k
        })?;
490
491
2.19k
        Ok(PredicatesChecked {
492
2.19k
            gas_used: cumulative_gas_used,
493
2.19k
        })
494
2.19k
    }
Unexecuted instantiation: _RINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates24finalize_check_predicateINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1F_6upload10UploadBodyNtB3b_14UploadMetadataEEBa_
Unexecuted instantiation: _RINvNtNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4main10predicates24finalize_check_predicateINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1F_7upgrade11UpgradeBodyNtB3b_15UpgradeMetadataEEBa_
495
}
496
497
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
498
where
499
    S: InterpreterStorage,
500
{
501
2.19k
    fn deploy_inner(
502
2.19k
        create: &mut Create,
503
2.19k
        storage: &mut S,
504
2.19k
        initial_balances: InitialBalances,
505
2.19k
        gas_costs: &GasCosts,
506
2.19k
        fee_params: &FeeParameters,
507
2.19k
        base_asset_id: &AssetId,
508
2.19k
        gas_price: Word,
509
2.19k
    ) -> Result<(), InterpreterError<S::DataError>> {
510
2.19k
        let metadata = create.metadata().as_ref();
511
2.19k
        debug_assert!(
512
2.19k
            metadata.is_some(),
513
0
            "`deploy_inner` is called without cached metadata"
514
        );
515
2.19k
        let salt = create.salt();
516
2.19k
        let storage_slots = create.storage_slots();
517
2.19k
        let contract = Contract::try_from(&*create)?;
518
2.19k
        let root = if let Some(m) = metadata {
519
2.19k
            m.body.contract_root
520
        } else {
521
0
            contract.root()
522
        };
523
524
2.19k
        let storage_root = if let Some(m) = metadata {
525
2.19k
            m.body.state_root
526
        } else {
527
0
            Contract::initial_state_root(storage_slots.iter())
528
        };
529
530
2.19k
        let id = if let Some(m) = metadata {
531
2.19k
            m.body.contract_id
532
        } else {
533
0
            contract.id(salt, &root, &storage_root)
534
        };
535
536
        // Prevent redeployment of contracts
537
2.19k
        if storage
538
2.19k
            .storage_contract_exists(&id)
539
2.19k
            .map_err(RuntimeError::Storage)?
540
        {
541
0
            return Err(InterpreterError::Panic(
542
0
                PanicReason::ContractIdAlreadyDeployed,
543
0
            ));
544
2.19k
        }
545
2.19k
546
2.19k
        storage
547
2.19k
            .deploy_contract_with_id(storage_slots, &contract, &id)
548
2.19k
            .map_err(RuntimeError::Storage)?;
549
        Self::finalize_outputs(
550
2.19k
            create,
551
2.19k
            gas_costs,
552
2.19k
            fee_params,
553
2.19k
            base_asset_id,
554
2.19k
            false,
555
2.19k
            0,
556
2.19k
            &initial_balances,
557
2.19k
            &RuntimeBalances::try_from(initial_balances.clone())?,
558
2.19k
            gas_price,
559
0
        )?;
560
2.19k
        Ok(())
561
2.19k
    }
Unexecuted instantiation: _RNvMs0_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_4blob8BlobBodyNtB40_12BlobMetadataEE12deploy_innerBb_
_RNvMs0_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_6create10CreateBodyNtB40_14CreateMetadataEE12deploy_innerBb_
Line
Count
Source
501
2.19k
    fn deploy_inner(
502
2.19k
        create: &mut Create,
503
2.19k
        storage: &mut S,
504
2.19k
        initial_balances: InitialBalances,
505
2.19k
        gas_costs: &GasCosts,
506
2.19k
        fee_params: &FeeParameters,
507
2.19k
        base_asset_id: &AssetId,
508
2.19k
        gas_price: Word,
509
2.19k
    ) -> Result<(), InterpreterError<S::DataError>> {
510
2.19k
        let metadata = create.metadata().as_ref();
511
2.19k
        debug_assert!(
512
2.19k
            metadata.is_some(),
513
0
            "`deploy_inner` is called without cached metadata"
514
        );
515
2.19k
        let salt = create.salt();
516
2.19k
        let storage_slots = create.storage_slots();
517
2.19k
        let contract = Contract::try_from(&*create)?;
518
2.19k
        let root = if let Some(m) = metadata {
519
2.19k
            m.body.contract_root
520
        } else {
521
0
            contract.root()
522
        };
523
524
2.19k
        let storage_root = if let Some(m) = metadata {
525
2.19k
            m.body.state_root
526
        } else {
527
0
            Contract::initial_state_root(storage_slots.iter())
528
        };
529
530
2.19k
        let id = if let Some(m) = metadata {
531
2.19k
            m.body.contract_id
532
        } else {
533
0
            contract.id(salt, &root, &storage_root)
534
        };
535
536
        // Prevent redeployment of contracts
537
2.19k
        if storage
538
2.19k
            .storage_contract_exists(&id)
539
2.19k
            .map_err(RuntimeError::Storage)?
540
        {
541
0
            return Err(InterpreterError::Panic(
542
0
                PanicReason::ContractIdAlreadyDeployed,
543
0
            ));
544
2.19k
        }
545
2.19k
546
2.19k
        storage
547
2.19k
            .deploy_contract_with_id(storage_slots, &contract, &id)
548
2.19k
            .map_err(RuntimeError::Storage)?;
549
        Self::finalize_outputs(
550
2.19k
            create,
551
2.19k
            gas_costs,
552
2.19k
            fee_params,
553
2.19k
            base_asset_id,
554
2.19k
            false,
555
2.19k
            0,
556
2.19k
            &initial_balances,
557
2.19k
            &RuntimeBalances::try_from(initial_balances.clone())?,
558
2.19k
            gas_price,
559
0
        )?;
560
2.19k
        Ok(())
561
2.19k
    }
Unexecuted instantiation: _RNvMs0_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_6script10ScriptBodyNtB40_14ScriptMetadataEE12deploy_innerBb_
562
}
563
564
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
565
where
566
    S: InterpreterStorage,
567
{
568
0
    fn upgrade_inner(
569
0
        upgrade: &mut Upgrade,
570
0
        storage: &mut S,
571
0
        initial_balances: InitialBalances,
572
0
        gas_costs: &GasCosts,
573
0
        fee_params: &FeeParameters,
574
0
        base_asset_id: &AssetId,
575
0
        gas_price: Word,
576
0
    ) -> Result<(), InterpreterError<S::DataError>> {
577
0
        let metadata = upgrade.metadata().as_ref();
578
0
        debug_assert!(
579
0
            metadata.is_some(),
580
0
            "`upgrade_inner` is called without cached metadata"
581
        );
582
583
0
        match upgrade.upgrade_purpose() {
584
            UpgradePurpose::ConsensusParameters { .. } => {
585
0
                let consensus_parameters = if let Some(metadata) = metadata {
586
0
                    Self::get_consensus_parameters(&metadata.body)?
587
                } else {
588
0
                    let metadata = UpgradeMetadata::compute(upgrade)?;
589
0
                    Self::get_consensus_parameters(&metadata)?
590
                };
591
592
0
                let current_version = storage
593
0
                    .consensus_parameters_version()
594
0
                    .map_err(RuntimeError::Storage)?;
595
0
                let next_version = current_version.saturating_add(1);
596
597
0
                let prev = storage
598
0
                    .set_consensus_parameters(next_version, &consensus_parameters)
599
0
                    .map_err(RuntimeError::Storage)?;
600
601
0
                if prev.is_some() {
602
0
                    return Err(InterpreterError::Panic(
603
0
                        PanicReason::OverridingConsensusParameters,
604
0
                    ));
605
0
                }
606
            }
607
0
            UpgradePurpose::StateTransition { root } => {
608
0
                let exists = storage
609
0
                    .contains_state_transition_bytecode_root(root)
610
0
                    .map_err(RuntimeError::Storage)?;
611
612
0
                if !exists {
613
0
                    return Err(InterpreterError::Panic(
614
0
                        PanicReason::UnknownStateTransactionBytecodeRoot,
615
0
                    ))
616
0
                }
617
618
0
                let current_version = storage
619
0
                    .state_transition_version()
620
0
                    .map_err(RuntimeError::Storage)?;
621
0
                let next_version = current_version.saturating_add(1);
622
623
0
                let prev = storage
624
0
                    .set_state_transition_bytecode(next_version, root)
625
0
                    .map_err(RuntimeError::Storage)?;
626
627
0
                if prev.is_some() {
628
0
                    return Err(InterpreterError::Panic(
629
0
                        PanicReason::OverridingStateTransactionBytecode,
630
0
                    ));
631
0
                }
632
            }
633
        }
634
635
        Self::finalize_outputs(
636
0
            upgrade,
637
0
            gas_costs,
638
0
            fee_params,
639
0
            base_asset_id,
640
0
            false,
641
0
            0,
642
0
            &initial_balances,
643
0
            &RuntimeBalances::try_from(initial_balances.clone())?,
644
0
            gas_price,
645
0
        )?;
646
0
        Ok(())
647
0
    }
Unexecuted instantiation: _RNvMs1_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_4blob8BlobBodyNtB40_12BlobMetadataEE13upgrade_innerBb_
Unexecuted instantiation: _RNvMs1_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_6create10CreateBodyNtB40_14CreateMetadataEE13upgrade_innerBb_
Unexecuted instantiation: _RNvMs1_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_6script10ScriptBodyNtB40_14ScriptMetadataEE13upgrade_innerBb_
648
649
0
    fn get_consensus_parameters(
650
0
        metadata: &UpgradeMetadata,
651
0
    ) -> Result<ConsensusParameters, InterpreterError<S::DataError>> {
652
0
        match &metadata {
653
            UpgradeMetadata::ConsensusParameters {
654
0
                consensus_parameters,
655
0
                ..
656
0
            } => Ok(consensus_parameters.as_ref().clone()),
657
            UpgradeMetadata::StateTransition => {
658
                // It shouldn't be possible since `Check<Upgrade>` guarantees that.
659
0
                Err(InterpreterError::CheckError(CheckError::Validity(
660
0
                    ValidityError::TransactionMetadataMismatch,
661
0
                )))
662
            }
663
        }
664
0
    }
Unexecuted instantiation: _RNvMs1_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_4blob8BlobBodyNtB40_12BlobMetadataEE24get_consensus_parametersBb_
Unexecuted instantiation: _RNvMs1_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_6create10CreateBodyNtB40_14CreateMetadataEE24get_consensus_parametersBb_
Unexecuted instantiation: _RNvMs1_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_6script10ScriptBodyNtB40_14ScriptMetadataEE24get_consensus_parametersBb_
665
}
666
667
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
668
where
669
    S: InterpreterStorage,
670
{
671
0
    fn upload_inner(
672
0
        upload: &mut Upload,
673
0
        storage: &mut S,
674
0
        initial_balances: InitialBalances,
675
0
        gas_costs: &GasCosts,
676
0
        fee_params: &FeeParameters,
677
0
        base_asset_id: &AssetId,
678
0
        gas_price: Word,
679
0
    ) -> Result<(), InterpreterError<S::DataError>> {
680
0
        let root = *upload.bytecode_root();
681
0
        let uploaded_bytecode = storage
682
0
            .storage_as_ref::<UploadedBytecodes>()
683
0
            .get(&root)
684
0
            .map_err(RuntimeError::Storage)?
685
0
            .map(|x| x.into_owned())
Unexecuted instantiation: _RNCNvMs2_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtBb_11InterpreterNtNtBb_6memory14MemoryInstanceNtNtNtBd_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2w_4blob8BlobBodyNtB42_12BlobMetadataEE12upload_inner0Bd_
Unexecuted instantiation: _RNCNvMs2_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtBb_11InterpreterNtNtBb_6memory14MemoryInstanceNtNtNtBd_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2w_6create10CreateBodyNtB42_14CreateMetadataEE12upload_inner0Bd_
Unexecuted instantiation: _RNCNvMs2_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtBb_11InterpreterNtNtBb_6memory14MemoryInstanceNtNtNtBd_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2w_6script10ScriptBodyNtB42_14ScriptMetadataEE12upload_inner0Bd_
686
0
            .unwrap_or_else(|| UploadedBytecode::Uncompleted {
687
0
                bytecode: vec![],
688
0
                uploaded_subsections_number: 0,
689
0
            });
Unexecuted instantiation: _RNCNvMs2_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtBb_11InterpreterNtNtBb_6memory14MemoryInstanceNtNtNtBd_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2w_4blob8BlobBodyNtB42_12BlobMetadataEE12upload_inners_0Bd_
Unexecuted instantiation: _RNCNvMs2_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtBb_11InterpreterNtNtBb_6memory14MemoryInstanceNtNtNtBd_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2w_6create10CreateBodyNtB42_14CreateMetadataEE12upload_inners_0Bd_
Unexecuted instantiation: _RNCNvMs2_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtBb_11InterpreterNtNtBb_6memory14MemoryInstanceNtNtNtBd_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2w_6script10ScriptBodyNtB42_14ScriptMetadataEE12upload_inners_0Bd_
690
691
0
        let new_bytecode = match uploaded_bytecode {
692
            UploadedBytecode::Uncompleted {
693
0
                bytecode,
694
0
                uploaded_subsections_number,
695
0
            } => Self::upload_bytecode_subsection(
696
0
                upload,
697
0
                bytecode,
698
0
                uploaded_subsections_number,
699
0
            )?,
700
            UploadedBytecode::Completed(_) => {
701
0
                return Err(InterpreterError::Panic(
702
0
                    PanicReason::BytecodeAlreadyUploaded,
703
0
                ));
704
            }
705
        };
706
707
0
        storage
708
0
            .storage_as_mut::<UploadedBytecodes>()
709
0
            .insert(&root, &new_bytecode)
710
0
            .map_err(RuntimeError::Storage)?;
711
712
        Self::finalize_outputs(
713
0
            upload,
714
0
            gas_costs,
715
0
            fee_params,
716
0
            base_asset_id,
717
0
            false,
718
0
            0,
719
0
            &initial_balances,
720
0
            &RuntimeBalances::try_from(initial_balances.clone())?,
721
0
            gas_price,
722
0
        )?;
723
0
        Ok(())
724
0
    }
Unexecuted instantiation: _RNvMs2_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_4blob8BlobBodyNtB40_12BlobMetadataEE12upload_innerBb_
Unexecuted instantiation: _RNvMs2_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_6create10CreateBodyNtB40_14CreateMetadataEE12upload_innerBb_
Unexecuted instantiation: _RNvMs2_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_6script10ScriptBodyNtB40_14ScriptMetadataEE12upload_innerBb_
725
726
0
    fn upload_bytecode_subsection(
727
0
        upload: &Upload,
728
0
        mut uploaded_bytecode: Vec<u8>,
729
0
        uploaded_subsections_number: u16,
730
0
    ) -> Result<UploadedBytecode, InterpreterError<S::DataError>> {
731
0
        let index_of_next_subsection = uploaded_subsections_number;
732
0
733
0
        if *upload.subsection_index() != index_of_next_subsection {
734
0
            return Err(InterpreterError::Panic(
735
0
                PanicReason::ThePartIsNotSequentiallyConnected,
736
0
            ));
737
0
        }
738
739
0
        let bytecode_subsection = upload
740
0
            .witnesses()
741
0
            .get(*upload.bytecode_witness_index() as usize)
742
0
            .ok_or(InterpreterError::Bug(Bug::new(
743
0
                // It shouldn't be possible since `Checked<Upload>` guarantees
744
0
                // the existence of the witness.
745
0
                BugVariant::WitnessIndexOutOfBounds,
746
0
            )))?;
747
748
0
        uploaded_bytecode.extend(bytecode_subsection.as_ref());
749
750
0
        let new_uploaded_subsections_number = uploaded_subsections_number
751
0
            .checked_add(1)
752
0
            .ok_or(InterpreterError::Panic(PanicReason::ArithmeticOverflow))?;
753
754
        // It shouldn't be possible since `Checked<Upload>` guarantees
755
        // the validity of the Merkle proof.
756
0
        if new_uploaded_subsections_number > *upload.subsections_number() {
757
0
            return Err(InterpreterError::Bug(Bug::new(
758
0
                BugVariant::NextSubsectionIndexIsHigherThanTotalNumberOfParts,
759
0
            )))
760
0
        }
761
762
0
        let updated_uploaded_bytecode =
763
0
            if *upload.subsections_number() == new_uploaded_subsections_number {
764
0
                UploadedBytecode::Completed(uploaded_bytecode)
765
            } else {
766
0
                UploadedBytecode::Uncompleted {
767
0
                    bytecode: uploaded_bytecode,
768
0
                    uploaded_subsections_number: new_uploaded_subsections_number,
769
0
                }
770
            };
771
772
0
        Ok(updated_uploaded_bytecode)
773
0
    }
Unexecuted instantiation: _RNvMs2_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_4blob8BlobBodyNtB40_12BlobMetadataEE26upload_bytecode_subsectionBb_
Unexecuted instantiation: _RNvMs2_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_6create10CreateBodyNtB40_14CreateMetadataEE26upload_bytecode_subsectionBb_
Unexecuted instantiation: _RNvMs2_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_6script10ScriptBodyNtB40_14ScriptMetadataEE26upload_bytecode_subsectionBb_
774
}
775
776
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
777
where
778
    S: InterpreterStorage,
779
{
780
0
    fn blob_inner(
781
0
        blob: &mut Blob,
782
0
        storage: &mut S,
783
0
        initial_balances: InitialBalances,
784
0
        gas_costs: &GasCosts,
785
0
        fee_params: &FeeParameters,
786
0
        base_asset_id: &AssetId,
787
0
        gas_price: Word,
788
0
    ) -> Result<(), InterpreterError<S::DataError>> {
789
0
        let blob_data = blob
790
0
            .witnesses()
791
0
            .get(*blob.bytecode_witness_index() as usize)
792
0
            .ok_or(InterpreterError::Bug(Bug::new(
793
0
                // It shouldn't be possible since `Checked<Blob>` guarantees
794
0
                // the existence of the witness.
795
0
                BugVariant::WitnessIndexOutOfBounds,
796
0
            )))?;
797
798
0
        let blob_id = blob.blob_id();
799
0
800
0
        debug_assert_eq!(
801
0
            BlobId::compute(blob_data.as_ref()),
802
            *blob_id,
803
0
            "Tx has invalid BlobId",
804
        );
805
806
0
        let old = storage
807
0
            .storage_as_mut::<BlobData>()
808
0
            .replace(blob_id, blob_data.as_ref())
809
0
            .map_err(RuntimeError::Storage)?;
810
811
0
        if old.is_some() {
812
0
            return Err(InterpreterError::Panic(PanicReason::BlobIdAlreadyUploaded));
813
0
        }
814
0
815
0
        Self::finalize_outputs(
816
0
            blob,
817
0
            gas_costs,
818
0
            fee_params,
819
0
            base_asset_id,
820
0
            false,
821
0
            0,
822
0
            &initial_balances,
823
0
            &RuntimeBalances::try_from(initial_balances.clone())?,
824
0
            gas_price,
825
0
        )?;
826
827
0
        Ok(())
828
0
    }
Unexecuted instantiation: _RNvMs3_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_4blob8BlobBodyNtB40_12BlobMetadataEE10blob_innerBb_
Unexecuted instantiation: _RNvMs3_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_6create10CreateBodyNtB40_14CreateMetadataEE10blob_innerBb_
Unexecuted instantiation: _RNvMs3_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_6script10ScriptBodyNtB40_14ScriptMetadataEE10blob_innerBb_
829
}
830
831
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
832
where
833
    M: Memory,
834
    S: InterpreterStorage,
835
    Tx: ExecutableTransaction,
836
    Ecal: EcalHandler,
837
{
838
4.38k
    fn update_transaction_outputs(
839
4.38k
        &mut self,
840
4.38k
    ) -> Result<(), InterpreterError<S::DataError>> {
841
4.38k
        let outputs = self.transaction().outputs().len();
842
6.57k
        (0..outputs).try_for_each(|o| self.update_memory_output(o))?;
Unexecuted instantiation: _RNCNvMs4_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtBb_11InterpreterNtNtBb_6memory14MemoryInstanceNtNtNtBd_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2w_4blob8BlobBodyNtB42_12BlobMetadataEE26update_transaction_outputs0Bd_
_RNCNvMs4_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtBb_11InterpreterNtNtBb_6memory14MemoryInstanceNtNtNtBd_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2w_6create10CreateBodyNtB42_14CreateMetadataEE26update_transaction_outputs0Bd_
Line
Count
Source
842
2.19k
        (0..outputs).try_for_each(|o| self.update_memory_output(o))?;
_RNCNvMs4_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtBb_11InterpreterNtNtBb_6memory14MemoryInstanceNtNtNtBd_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2w_6script10ScriptBodyNtB42_14ScriptMetadataEE26update_transaction_outputs0Bd_
Line
Count
Source
842
4.38k
        (0..outputs).try_for_each(|o| self.update_memory_output(o))?;
843
4.38k
        Ok(())
844
4.38k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_4blob8BlobBodyNtB40_12BlobMetadataEE26update_transaction_outputsBb_
_RNvMs4_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_6create10CreateBodyNtB40_14CreateMetadataEE26update_transaction_outputsBb_
Line
Count
Source
838
2.19k
    fn update_transaction_outputs(
839
2.19k
        &mut self,
840
2.19k
    ) -> Result<(), InterpreterError<S::DataError>> {
841
2.19k
        let outputs = self.transaction().outputs().len();
842
2.19k
        (0..outputs).try_for_each(|o| self.update_memory_output(o))?;
843
2.19k
        Ok(())
844
2.19k
    }
_RNvMs4_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_6script10ScriptBodyNtB40_14ScriptMetadataEE26update_transaction_outputsBb_
Line
Count
Source
838
2.19k
    fn update_transaction_outputs(
839
2.19k
        &mut self,
840
2.19k
    ) -> Result<(), InterpreterError<S::DataError>> {
841
2.19k
        let outputs = self.transaction().outputs().len();
842
2.19k
        (0..outputs).try_for_each(|o| self.update_memory_output(o))?;
843
2.19k
        Ok(())
844
2.19k
    }
845
846
4.38k
    pub(crate) fn run(&mut self) -> Result<ProgramState, InterpreterError<S::DataError>> {
847
4.38k
        // TODO: Remove `Create`, `Upgrade`, and `Upload` from here
848
4.38k
        //  https://github.com/FuelLabs/fuel-vm/issues/251
849
4.38k
        let gas_costs = self.gas_costs().clone();
850
4.38k
        let fee_params = *self.fee_params();
851
4.38k
        let base_asset_id = *self.base_asset_id();
852
4.38k
        let gas_price = self.gas_price();
853
4.38k
        let state = if let Some(create) = self.tx.as_create_mut() {
854
2.19k
            Self::deploy_inner(
855
2.19k
                create,
856
2.19k
                &mut self.storage,
857
2.19k
                self.initial_balances.clone(),
858
2.19k
                &gas_costs,
859
2.19k
                &fee_params,
860
2.19k
                &base_asset_id,
861
2.19k
                gas_price,
862
2.19k
            )?;
863
2.19k
            ProgramState::Return(1)
864
2.19k
        } else if let Some(upgrade) = self.tx.as_upgrade_mut() {
865
0
            Self::upgrade_inner(
866
0
                upgrade,
867
0
                &mut self.storage,
868
0
                self.initial_balances.clone(),
869
0
                &gas_costs,
870
0
                &fee_params,
871
0
                &base_asset_id,
872
0
                gas_price,
873
0
            )?;
874
0
            ProgramState::Return(1)
875
2.19k
        } else if let Some(upload) = self.tx.as_upload_mut() {
876
0
            Self::upload_inner(
877
0
                upload,
878
0
                &mut self.storage,
879
0
                self.initial_balances.clone(),
880
0
                &gas_costs,
881
0
                &fee_params,
882
0
                &base_asset_id,
883
0
                gas_price,
884
0
            )?;
885
0
            ProgramState::Return(1)
886
2.19k
        } else if let Some(blob) = self.tx.as_blob_mut() {
887
0
            Self::blob_inner(
888
0
                blob,
889
0
                &mut self.storage,
890
0
                self.initial_balances.clone(),
891
0
                &gas_costs,
892
0
                &fee_params,
893
0
                &base_asset_id,
894
0
                gas_price,
895
0
            )?;
896
0
            ProgramState::Return(1)
897
        } else {
898
4.38k
            if self.transaction().inputs().iter().any(|input| {
899
4.38k
                if let Input::Contract(contract) = input {
900
2.19k
                    !self
901
2.19k
                        .check_contract_exists(&contract.contract_id)
902
2.19k
                        .unwrap_or(false)
903
                } else {
904
2.19k
                    false
905
                }
906
4.38k
            }) {
Unexecuted instantiation: _RNCNvMs4_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtBb_11InterpreterNtNtBb_6memory14MemoryInstanceNtNtNtBd_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2w_4blob8BlobBodyNtB42_12BlobMetadataEE3run0Bd_
Unexecuted instantiation: _RNCNvMs4_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtBb_11InterpreterNtNtBb_6memory14MemoryInstanceNtNtNtBd_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2w_6create10CreateBodyNtB42_14CreateMetadataEE3run0Bd_
_RNCNvMs4_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtBb_11InterpreterNtNtBb_6memory14MemoryInstanceNtNtNtBd_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2w_6script10ScriptBodyNtB42_14ScriptMetadataEE3run0Bd_
Line
Count
Source
898
4.38k
            if self.transaction().inputs().iter().any(|input| {
899
4.38k
                if let Input::Contract(contract) = input {
900
2.19k
                    !self
901
2.19k
                        .check_contract_exists(&contract.contract_id)
902
2.19k
                        .unwrap_or(false)
903
                } else {
904
2.19k
                    false
905
                }
906
4.38k
            }) {
907
0
                return Err(InterpreterError::Panic(PanicReason::ContractNotInInputs));
908
2.19k
            }
909
910
            let gas_limit;
911
            let is_empty_script;
912
2.19k
            if let Some(script) = self.transaction().as_script() {
913
2.19k
                gas_limit = *script.script_gas_limit();
914
2.19k
                is_empty_script = script.script().is_empty();
915
2.19k
            } else {
916
0
                unreachable!("Only `Create` and `Script` transactions can be executed inside of the VM")
917
            }
918
919
            // TODO set tree balance
920
921
            // `Interpreter` supports only `Create` and `Script` transactions. It is not
922
            // `Create` -> it is `Script`.
923
2.19k
            let program = if !is_empty_script {
924
2.18k
                self.run_program()
925
            } else {
926
                // Return `1` as successful execution.
927
4
                let return_val = 1;
928
4
                self.ret(return_val)?;
929
4
                Ok(ProgramState::Return(return_val))
930
            };
931
932
2.19k
            let gas_used = gas_limit
933
2.19k
                .checked_sub(self.remaining_gas())
934
2.19k
                .ok_or_else(|| Bug::new(BugVariant::GlobalGasUnderflow))?;
Unexecuted instantiation: _RNCNvMs4_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtBb_11InterpreterNtNtBb_6memory14MemoryInstanceNtNtNtBd_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2w_4blob8BlobBodyNtB42_12BlobMetadataEE3runs_0Bd_
Unexecuted instantiation: _RNCNvMs4_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtBb_11InterpreterNtNtBb_6memory14MemoryInstanceNtNtNtBd_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2w_6create10CreateBodyNtB42_14CreateMetadataEE3runs_0Bd_
Unexecuted instantiation: _RNCNvMs4_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtBb_11InterpreterNtNtBb_6memory14MemoryInstanceNtNtNtBd_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2w_6script10ScriptBodyNtB42_14ScriptMetadataEE3runs_0Bd_
935
936
            // Catch VM panic and don't propagate, generating a receipt
937
2.19k
            let (status, program) = match program {
938
37
                Ok(s) => {
939
                    // either a revert or success
940
37
                    let res = if let ProgramState::Revert(_) = &s {
941
10
                        ScriptExecutionResult::Revert
942
                    } else {
943
27
                        ScriptExecutionResult::Success
944
                    };
945
37
                    (res, s)
946
                }
947
948
2.15k
                Err(e) => match e.instruction_result() {
949
2.15k
                    Some(result) => {
950
2.15k
                        self.append_panic_receipt(result);
951
2.15k
952
2.15k
                        (ScriptExecutionResult::Panic, ProgramState::Revert(0))
953
                    }
954
955
                    // This isn't a specified case of an erroneous program and should be
956
                    // propagated. If applicable, OS errors will fall into this category.
957
0
                    None => return Err(e),
958
                },
959
            };
960
961
2.19k
            let receipt = Receipt::script_result(status, gas_used);
962
2.19k
963
2.19k
            self.receipts.push(receipt)?;
964
965
2.19k
            if program.is_debug() {
966
0
                self.debugger_set_last_state(program);
967
2.19k
            }
968
969
2.19k
            let revert = matches!(program, ProgramState::Revert(_));
970
2.19k
            let gas_price = self.gas_price();
971
2.19k
            Self::finalize_outputs(
972
2.19k
                &mut self.tx,
973
2.19k
                &gas_costs,
974
2.19k
                &fee_params,
975
2.19k
                &base_asset_id,
976
2.19k
                revert,
977
2.19k
                gas_used,
978
2.19k
                &self.initial_balances,
979
2.19k
                &self.balances,
980
2.19k
                gas_price,
981
2.19k
            )?;
982
983
2.19k
            program
984
        };
985
4.38k
        self.update_transaction_outputs()?;
986
987
4.38k
        Ok(state)
988
4.38k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_4blob8BlobBodyNtB40_12BlobMetadataEE3runBb_
_RNvMs4_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_6create10CreateBodyNtB40_14CreateMetadataEE3runBb_
Line
Count
Source
846
2.19k
    pub(crate) fn run(&mut self) -> Result<ProgramState, InterpreterError<S::DataError>> {
847
2.19k
        // TODO: Remove `Create`, `Upgrade`, and `Upload` from here
848
2.19k
        //  https://github.com/FuelLabs/fuel-vm/issues/251
849
2.19k
        let gas_costs = self.gas_costs().clone();
850
2.19k
        let fee_params = *self.fee_params();
851
2.19k
        let base_asset_id = *self.base_asset_id();
852
2.19k
        let gas_price = self.gas_price();
853
2.19k
        let state = if let Some(create) = self.tx.as_create_mut() {
854
2.19k
            Self::deploy_inner(
855
2.19k
                create,
856
2.19k
                &mut self.storage,
857
2.19k
                self.initial_balances.clone(),
858
2.19k
                &gas_costs,
859
2.19k
                &fee_params,
860
2.19k
                &base_asset_id,
861
2.19k
                gas_price,
862
2.19k
            )?;
863
2.19k
            ProgramState::Return(1)
864
0
        } else if let Some(upgrade) = self.tx.as_upgrade_mut() {
865
0
            Self::upgrade_inner(
866
0
                upgrade,
867
0
                &mut self.storage,
868
0
                self.initial_balances.clone(),
869
0
                &gas_costs,
870
0
                &fee_params,
871
0
                &base_asset_id,
872
0
                gas_price,
873
0
            )?;
874
0
            ProgramState::Return(1)
875
0
        } else if let Some(upload) = self.tx.as_upload_mut() {
876
0
            Self::upload_inner(
877
0
                upload,
878
0
                &mut self.storage,
879
0
                self.initial_balances.clone(),
880
0
                &gas_costs,
881
0
                &fee_params,
882
0
                &base_asset_id,
883
0
                gas_price,
884
0
            )?;
885
0
            ProgramState::Return(1)
886
0
        } else if let Some(blob) = self.tx.as_blob_mut() {
887
0
            Self::blob_inner(
888
0
                blob,
889
0
                &mut self.storage,
890
0
                self.initial_balances.clone(),
891
0
                &gas_costs,
892
0
                &fee_params,
893
0
                &base_asset_id,
894
0
                gas_price,
895
0
            )?;
896
0
            ProgramState::Return(1)
897
        } else {
898
0
            if self.transaction().inputs().iter().any(|input| {
899
                if let Input::Contract(contract) = input {
900
                    !self
901
                        .check_contract_exists(&contract.contract_id)
902
                        .unwrap_or(false)
903
                } else {
904
                    false
905
                }
906
0
            }) {
907
0
                return Err(InterpreterError::Panic(PanicReason::ContractNotInInputs));
908
0
            }
909
910
            let gas_limit;
911
            let is_empty_script;
912
0
            if let Some(script) = self.transaction().as_script() {
913
0
                gas_limit = *script.script_gas_limit();
914
0
                is_empty_script = script.script().is_empty();
915
0
            } else {
916
0
                unreachable!("Only `Create` and `Script` transactions can be executed inside of the VM")
917
            }
918
919
            // TODO set tree balance
920
921
            // `Interpreter` supports only `Create` and `Script` transactions. It is not
922
            // `Create` -> it is `Script`.
923
0
            let program = if !is_empty_script {
924
0
                self.run_program()
925
            } else {
926
                // Return `1` as successful execution.
927
0
                let return_val = 1;
928
0
                self.ret(return_val)?;
929
0
                Ok(ProgramState::Return(return_val))
930
            };
931
932
0
            let gas_used = gas_limit
933
0
                .checked_sub(self.remaining_gas())
934
0
                .ok_or_else(|| Bug::new(BugVariant::GlobalGasUnderflow))?;
935
936
            // Catch VM panic and don't propagate, generating a receipt
937
0
            let (status, program) = match program {
938
0
                Ok(s) => {
939
                    // either a revert or success
940
0
                    let res = if let ProgramState::Revert(_) = &s {
941
0
                        ScriptExecutionResult::Revert
942
                    } else {
943
0
                        ScriptExecutionResult::Success
944
                    };
945
0
                    (res, s)
946
                }
947
948
0
                Err(e) => match e.instruction_result() {
949
0
                    Some(result) => {
950
0
                        self.append_panic_receipt(result);
951
0
952
0
                        (ScriptExecutionResult::Panic, ProgramState::Revert(0))
953
                    }
954
955
                    // This isn't a specified case of an erroneous program and should be
956
                    // propagated. If applicable, OS errors will fall into this category.
957
0
                    None => return Err(e),
958
                },
959
            };
960
961
0
            let receipt = Receipt::script_result(status, gas_used);
962
0
963
0
            self.receipts.push(receipt)?;
964
965
0
            if program.is_debug() {
966
0
                self.debugger_set_last_state(program);
967
0
            }
968
969
0
            let revert = matches!(program, ProgramState::Revert(_));
970
0
            let gas_price = self.gas_price();
971
0
            Self::finalize_outputs(
972
0
                &mut self.tx,
973
0
                &gas_costs,
974
0
                &fee_params,
975
0
                &base_asset_id,
976
0
                revert,
977
0
                gas_used,
978
0
                &self.initial_balances,
979
0
                &self.balances,
980
0
                gas_price,
981
0
            )?;
982
983
0
            program
984
        };
985
2.19k
        self.update_transaction_outputs()?;
986
987
2.19k
        Ok(state)
988
2.19k
    }
_RNvMs4_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_6script10ScriptBodyNtB40_14ScriptMetadataEE3runBb_
Line
Count
Source
846
2.19k
    pub(crate) fn run(&mut self) -> Result<ProgramState, InterpreterError<S::DataError>> {
847
2.19k
        // TODO: Remove `Create`, `Upgrade`, and `Upload` from here
848
2.19k
        //  https://github.com/FuelLabs/fuel-vm/issues/251
849
2.19k
        let gas_costs = self.gas_costs().clone();
850
2.19k
        let fee_params = *self.fee_params();
851
2.19k
        let base_asset_id = *self.base_asset_id();
852
2.19k
        let gas_price = self.gas_price();
853
2.19k
        let state = if let Some(create) = self.tx.as_create_mut() {
854
0
            Self::deploy_inner(
855
0
                create,
856
0
                &mut self.storage,
857
0
                self.initial_balances.clone(),
858
0
                &gas_costs,
859
0
                &fee_params,
860
0
                &base_asset_id,
861
0
                gas_price,
862
0
            )?;
863
0
            ProgramState::Return(1)
864
2.19k
        } else if let Some(upgrade) = self.tx.as_upgrade_mut() {
865
0
            Self::upgrade_inner(
866
0
                upgrade,
867
0
                &mut self.storage,
868
0
                self.initial_balances.clone(),
869
0
                &gas_costs,
870
0
                &fee_params,
871
0
                &base_asset_id,
872
0
                gas_price,
873
0
            )?;
874
0
            ProgramState::Return(1)
875
2.19k
        } else if let Some(upload) = self.tx.as_upload_mut() {
876
0
            Self::upload_inner(
877
0
                upload,
878
0
                &mut self.storage,
879
0
                self.initial_balances.clone(),
880
0
                &gas_costs,
881
0
                &fee_params,
882
0
                &base_asset_id,
883
0
                gas_price,
884
0
            )?;
885
0
            ProgramState::Return(1)
886
2.19k
        } else if let Some(blob) = self.tx.as_blob_mut() {
887
0
            Self::blob_inner(
888
0
                blob,
889
0
                &mut self.storage,
890
0
                self.initial_balances.clone(),
891
0
                &gas_costs,
892
0
                &fee_params,
893
0
                &base_asset_id,
894
0
                gas_price,
895
0
            )?;
896
0
            ProgramState::Return(1)
897
        } else {
898
2.19k
            if self.transaction().inputs().iter().any(|input| {
899
                if let Input::Contract(contract) = input {
900
                    !self
901
                        .check_contract_exists(&contract.contract_id)
902
                        .unwrap_or(false)
903
                } else {
904
                    false
905
                }
906
2.19k
            }) {
907
0
                return Err(InterpreterError::Panic(PanicReason::ContractNotInInputs));
908
2.19k
            }
909
910
            let gas_limit;
911
            let is_empty_script;
912
2.19k
            if let Some(script) = self.transaction().as_script() {
913
2.19k
                gas_limit = *script.script_gas_limit();
914
2.19k
                is_empty_script = script.script().is_empty();
915
2.19k
            } else {
916
0
                unreachable!("Only `Create` and `Script` transactions can be executed inside of the VM")
917
            }
918
919
            // TODO set tree balance
920
921
            // `Interpreter` supports only `Create` and `Script` transactions. It is not
922
            // `Create` -> it is `Script`.
923
2.19k
            let program = if !is_empty_script {
924
2.18k
                self.run_program()
925
            } else {
926
                // Return `1` as successful execution.
927
4
                let return_val = 1;
928
4
                self.ret(return_val)?;
929
4
                Ok(ProgramState::Return(return_val))
930
            };
931
932
2.19k
            let gas_used = gas_limit
933
2.19k
                .checked_sub(self.remaining_gas())
934
2.19k
                .ok_or_else(|| Bug::new(BugVariant::GlobalGasUnderflow))?;
935
936
            // Catch VM panic and don't propagate, generating a receipt
937
2.19k
            let (status, program) = match program {
938
37
                Ok(s) => {
939
                    // either a revert or success
940
37
                    let res = if let ProgramState::Revert(_) = &s {
941
10
                        ScriptExecutionResult::Revert
942
                    } else {
943
27
                        ScriptExecutionResult::Success
944
                    };
945
37
                    (res, s)
946
                }
947
948
2.15k
                Err(e) => match e.instruction_result() {
949
2.15k
                    Some(result) => {
950
2.15k
                        self.append_panic_receipt(result);
951
2.15k
952
2.15k
                        (ScriptExecutionResult::Panic, ProgramState::Revert(0))
953
                    }
954
955
                    // This isn't a specified case of an erroneous program and should be
956
                    // propagated. If applicable, OS errors will fall into this category.
957
0
                    None => return Err(e),
958
                },
959
            };
960
961
2.19k
            let receipt = Receipt::script_result(status, gas_used);
962
2.19k
963
2.19k
            self.receipts.push(receipt)?;
964
965
2.19k
            if program.is_debug() {
966
0
                self.debugger_set_last_state(program);
967
2.19k
            }
968
969
2.19k
            let revert = matches!(program, ProgramState::Revert(_));
970
2.19k
            let gas_price = self.gas_price();
971
2.19k
            Self::finalize_outputs(
972
2.19k
                &mut self.tx,
973
2.19k
                &gas_costs,
974
2.19k
                &fee_params,
975
2.19k
                &base_asset_id,
976
2.19k
                revert,
977
2.19k
                gas_used,
978
2.19k
                &self.initial_balances,
979
2.19k
                &self.balances,
980
2.19k
                gas_price,
981
2.19k
            )?;
982
983
2.19k
            program
984
        };
985
2.19k
        self.update_transaction_outputs()?;
986
987
2.19k
        Ok(state)
988
2.19k
    }
989
990
2.18k
    pub(crate) fn run_program(
991
2.18k
        &mut self,
992
2.18k
    ) -> Result<ProgramState, InterpreterError<S::DataError>> {
993
        loop {
994
            // Check whether the instruction will be executed in a call context
995
387M
            let in_call = !self.frames.is_empty();
996
997
387M
            let state = self.execute()?;
998
999
387M
            if in_call {
1000
                // Only reverts should terminate execution from a call context
1001
102k
                if let ExecuteState::Revert(r) = state {
1002
1
                    return Ok(ProgramState::Revert(r));
1003
102k
                }
1004
            } else {
1005
387M
                match state {
1006
20
                    ExecuteState::Return(r) => return Ok(ProgramState::Return(r)),
1007
1008
3
                    ExecuteState::ReturnData(d) => return Ok(ProgramState::ReturnData(d)),
1009
1010
9
                    ExecuteState::Revert(r) => return Ok(ProgramState::Revert(r)),
1011
1012
387M
                    ExecuteState::Proceed => (),
1013
1014
0
                    ExecuteState::DebugEvent(d) => return Ok(ProgramState::RunProgram(d)),
1015
                }
1016
            }
1017
        }
1018
2.18k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_4blob8BlobBodyNtB40_12BlobMetadataEE11run_programBb_
Unexecuted instantiation: _RNvMs4_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_6create10CreateBodyNtB40_14CreateMetadataEE11run_programBb_
_RNvMs4_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_6script10ScriptBodyNtB40_14ScriptMetadataEE11run_programBb_
Line
Count
Source
990
2.18k
    pub(crate) fn run_program(
991
2.18k
        &mut self,
992
2.18k
    ) -> Result<ProgramState, InterpreterError<S::DataError>> {
993
        loop {
994
            // Check whether the instruction will be executed in a call context
995
387M
            let in_call = !self.frames.is_empty();
996
997
387M
            let state = self.execute()?;
998
999
387M
            if in_call {
1000
                // Only reverts should terminate execution from a call context
1001
102k
                if let ExecuteState::Revert(r) = state {
1002
1
                    return Ok(ProgramState::Revert(r));
1003
102k
                }
1004
            } else {
1005
387M
                match state {
1006
20
                    ExecuteState::Return(r) => return Ok(ProgramState::Return(r)),
1007
1008
3
                    ExecuteState::ReturnData(d) => return Ok(ProgramState::ReturnData(d)),
1009
1010
9
                    ExecuteState::Revert(r) => return Ok(ProgramState::Revert(r)),
1011
1012
387M
                    ExecuteState::Proceed => (),
1013
1014
0
                    ExecuteState::DebugEvent(d) => return Ok(ProgramState::RunProgram(d)),
1015
                }
1016
            }
1017
        }
1018
2.18k
    }
1019
1020
    /// Update tx fields after execution
1021
4.38k
    pub(crate) fn post_execute(&mut self) {
1022
4.38k
        if let Some(script) = self.tx.as_script_mut() {
1023
2.19k
            *script.receipts_root_mut() = self.receipts.root();
1024
2.19k
        }
1025
4.38k
    }
Unexecuted instantiation: _RNvMs4_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_4blob8BlobBodyNtB40_12BlobMetadataEE12post_executeBb_
_RNvMs4_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_6create10CreateBodyNtB40_14CreateMetadataEE12post_executeBb_
Line
Count
Source
1021
2.19k
    pub(crate) fn post_execute(&mut self) {
1022
2.19k
        if let Some(script) = self.tx.as_script_mut() {
1023
0
            *script.receipts_root_mut() = self.receipts.root();
1024
2.19k
        }
1025
2.19k
    }
_RNvMs4_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_6script10ScriptBodyNtB40_14ScriptMetadataEE12post_executeBb_
Line
Count
Source
1021
2.19k
    pub(crate) fn post_execute(&mut self) {
1022
2.19k
        if let Some(script) = self.tx.as_script_mut() {
1023
2.19k
            *script.receipts_root_mut() = self.receipts.root();
1024
2.19k
        }
1025
2.19k
    }
1026
}
1027
1028
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
1029
where
1030
    M: Memory,
1031
    S: InterpreterStorage,
1032
    Tx: ExecutableTransaction,
1033
    <Tx as IntoChecked>::Metadata: CheckedMetadata,
1034
    Ecal: EcalHandler,
1035
{
1036
    /// Initialize a pre-allocated instance of [`Interpreter`] with the provided
1037
    /// transaction and execute it. The result will be bound to the lifetime
1038
    /// of the interpreter and will avoid unnecessary copy with the data
1039
    /// that can be referenced from the interpreter instance itself.
1040
4.38k
    pub fn transact(
1041
4.38k
        &mut self,
1042
4.38k
        tx: Ready<Tx>,
1043
4.38k
    ) -> Result<StateTransitionRef<'_, Tx>, InterpreterError<S::DataError>> {
1044
4.38k
        self.verify_ready_tx(&tx)?;
1045
1046
4.38k
        let state_result = self.init_script(tx).and_then(|_| self.run());
Unexecuted instantiation: _RNCNvMs5_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtBb_11InterpreterNtNtBb_6memory14MemoryInstanceNtNtNtBd_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2w_4blob8BlobBodyNtB42_12BlobMetadataEE8transact0Bd_
_RNCNvMs5_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtBb_11InterpreterNtNtBb_6memory14MemoryInstanceNtNtNtBd_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2w_6create10CreateBodyNtB42_14CreateMetadataEE8transact0Bd_
Line
Count
Source
1046
2.19k
        let state_result = self.init_script(tx).and_then(|_| self.run());
_RNCNvMs5_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtBb_11InterpreterNtNtBb_6memory14MemoryInstanceNtNtNtBd_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2w_6script10ScriptBodyNtB42_14ScriptMetadataEE8transact0Bd_
Line
Count
Source
1046
2.19k
        let state_result = self.init_script(tx).and_then(|_| self.run());
1047
4.38k
        self.post_execute();
1048
1049
        #[cfg(feature = "profile-any")]
1050
        {
1051
            let r = match &state_result {
1052
                Ok(state) => Ok(state),
1053
                Err(err) => Err(err.erase_generics()),
1054
            };
1055
            self.profiler.on_transaction(r);
1056
        }
1057
1058
4.38k
        let state = state_result?;
1059
4.38k
        Ok(StateTransitionRef::new(
1060
4.38k
            state,
1061
4.38k
            self.transaction(),
1062
4.38k
            self.receipts(),
1063
4.38k
        ))
1064
4.38k
    }
Unexecuted instantiation: _RNvMs5_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_4blob8BlobBodyNtB40_12BlobMetadataEE8transactBb_
_RNvMs5_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_6create10CreateBodyNtB40_14CreateMetadataEE8transactBb_
Line
Count
Source
1040
2.19k
    pub fn transact(
1041
2.19k
        &mut self,
1042
2.19k
        tx: Ready<Tx>,
1043
2.19k
    ) -> Result<StateTransitionRef<'_, Tx>, InterpreterError<S::DataError>> {
1044
2.19k
        self.verify_ready_tx(&tx)?;
1045
1046
2.19k
        let state_result = self.init_script(tx).and_then(|_| self.run());
1047
2.19k
        self.post_execute();
1048
1049
        #[cfg(feature = "profile-any")]
1050
        {
1051
            let r = match &state_result {
1052
                Ok(state) => Ok(state),
1053
                Err(err) => Err(err.erase_generics()),
1054
            };
1055
            self.profiler.on_transaction(r);
1056
        }
1057
1058
2.19k
        let state = state_result?;
1059
2.19k
        Ok(StateTransitionRef::new(
1060
2.19k
            state,
1061
2.19k
            self.transaction(),
1062
2.19k
            self.receipts(),
1063
2.19k
        ))
1064
2.19k
    }
_RNvMs5_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2u_6script10ScriptBodyNtB40_14ScriptMetadataEE8transactBb_
Line
Count
Source
1040
2.19k
    pub fn transact(
1041
2.19k
        &mut self,
1042
2.19k
        tx: Ready<Tx>,
1043
2.19k
    ) -> Result<StateTransitionRef<'_, Tx>, InterpreterError<S::DataError>> {
1044
2.19k
        self.verify_ready_tx(&tx)?;
1045
1046
2.19k
        let state_result = self.init_script(tx).and_then(|_| self.run());
1047
2.19k
        self.post_execute();
1048
1049
        #[cfg(feature = "profile-any")]
1050
        {
1051
            let r = match &state_result {
1052
                Ok(state) => Ok(state),
1053
                Err(err) => Err(err.erase_generics()),
1054
            };
1055
            self.profiler.on_transaction(r);
1056
        }
1057
1058
2.19k
        let state = state_result?;
1059
2.19k
        Ok(StateTransitionRef::new(
1060
2.19k
            state,
1061
2.19k
            self.transaction(),
1062
2.19k
            self.receipts(),
1063
2.19k
        ))
1064
2.19k
    }
1065
}
1066
1067
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
1068
where
1069
    S: InterpreterStorage,
1070
{
1071
    /// Deploys `Create` transaction without initialization VM and without invalidation of
1072
    /// the last state of execution of the `Script` transaction.
1073
    ///
1074
    /// Returns `Create` transaction with all modifications after execution.
1075
0
    pub fn deploy(
1076
0
        &mut self,
1077
0
        tx: Ready<Create>,
1078
0
    ) -> Result<Create, InterpreterError<S::DataError>> {
1079
0
        self.verify_ready_tx(&tx)?;
1080
1081
0
        let (_, checked) = tx.decompose();
1082
0
        let (mut create, metadata): (Create, <Create as IntoChecked>::Metadata) =
1083
0
            checked.into();
1084
0
        let base_asset_id = *self.base_asset_id();
1085
0
        let gas_price = self.gas_price();
1086
0
        Self::deploy_inner(
1087
0
            &mut create,
1088
0
            &mut self.storage,
1089
0
            metadata.balances(),
1090
0
            &self.interpreter_params.gas_costs,
1091
0
            &self.interpreter_params.fee_params,
1092
0
            &base_asset_id,
1093
0
            gas_price,
1094
0
        )?;
1095
0
        Ok(create)
1096
0
    }
1097
}
1098
1099
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
1100
where
1101
    S: InterpreterStorage,
1102
{
1103
    /// Executes `Upgrade` transaction without initialization VM and without invalidation
1104
    /// of the last state of execution of the `Script` transaction.
1105
    ///
1106
    /// Returns `Upgrade` transaction with all modifications after execution.
1107
0
    pub fn upgrade(
1108
0
        &mut self,
1109
0
        tx: Ready<Upgrade>,
1110
0
    ) -> Result<Upgrade, InterpreterError<S::DataError>> {
1111
0
        self.verify_ready_tx(&tx)?;
1112
1113
0
        let (_, checked) = tx.decompose();
1114
0
        let (mut upgrade, metadata): (Upgrade, <Upgrade as IntoChecked>::Metadata) =
1115
0
            checked.into();
1116
0
        let base_asset_id = *self.base_asset_id();
1117
0
        let gas_price = self.gas_price();
1118
0
        Self::upgrade_inner(
1119
0
            &mut upgrade,
1120
0
            &mut self.storage,
1121
0
            metadata.balances(),
1122
0
            &self.interpreter_params.gas_costs,
1123
0
            &self.interpreter_params.fee_params,
1124
0
            &base_asset_id,
1125
0
            gas_price,
1126
0
        )?;
1127
0
        Ok(upgrade)
1128
0
    }
1129
}
1130
1131
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
1132
where
1133
    S: InterpreterStorage,
1134
{
1135
    /// Executes `Upload` transaction without initialization VM and without invalidation
1136
    /// of the last state of execution of the `Script` transaction.
1137
    ///
1138
    /// Returns `Upload` transaction with all modifications after execution.
1139
0
    pub fn upload(
1140
0
        &mut self,
1141
0
        tx: Ready<Upload>,
1142
0
    ) -> Result<Upload, InterpreterError<S::DataError>> {
1143
0
        self.verify_ready_tx(&tx)?;
1144
1145
0
        let (_, checked) = tx.decompose();
1146
0
        let (mut upload, metadata): (Upload, <Upload as IntoChecked>::Metadata) =
1147
0
            checked.into();
1148
0
        let base_asset_id = *self.base_asset_id();
1149
0
        let gas_price = self.gas_price();
1150
0
        Self::upload_inner(
1151
0
            &mut upload,
1152
0
            &mut self.storage,
1153
0
            metadata.balances(),
1154
0
            &self.interpreter_params.gas_costs,
1155
0
            &self.interpreter_params.fee_params,
1156
0
            &base_asset_id,
1157
0
            gas_price,
1158
0
        )?;
1159
0
        Ok(upload)
1160
0
    }
1161
}
1162
1163
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
1164
where
1165
    S: InterpreterStorage,
1166
{
1167
    /// Executes `Blob` transaction without initialization VM and without invalidation
1168
    /// of the last state of execution of the `Script` transaction.
1169
    ///
1170
    /// Returns `Blob` transaction with all modifications after execution.
1171
0
    pub fn blob(
1172
0
        &mut self,
1173
0
        tx: Ready<Blob>,
1174
0
    ) -> Result<Blob, InterpreterError<S::DataError>> {
1175
0
        self.verify_ready_tx(&tx)?;
1176
1177
0
        let (_, checked) = tx.decompose();
1178
0
        let (mut blob, metadata): (Blob, <Blob as IntoChecked>::Metadata) =
1179
0
            checked.into();
1180
0
        let base_asset_id = *self.base_asset_id();
1181
0
        let gas_price = self.gas_price();
1182
0
        Self::blob_inner(
1183
0
            &mut blob,
1184
0
            &mut self.storage,
1185
0
            metadata.balances(),
1186
0
            &self.interpreter_params.gas_costs,
1187
0
            &self.interpreter_params.fee_params,
1188
0
            &base_asset_id,
1189
0
            gas_price,
1190
0
        )?;
1191
0
        Ok(blob)
1192
0
    }
1193
}
1194
1195
impl<M, S: InterpreterStorage, Tx, Ecal> Interpreter<M, S, Tx, Ecal> {
1196
4.38k
    fn verify_ready_tx<Tx2: IntoChecked>(
1197
4.38k
        &self,
1198
4.38k
        tx: &Ready<Tx2>,
1199
4.38k
    ) -> Result<(), InterpreterError<S::DataError>> {
1200
4.38k
        self.gas_price_matches(tx)?;
1201
4.38k
        Ok(())
1202
4.38k
    }
Unexecuted instantiation: _RINvMsa_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtBa_11InterpreterNtNtBa_6memory14MemoryInstanceNtNtNtBc_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2v_4blob8BlobBodyNtB41_12BlobMetadataEE15verify_ready_txB2q_EBc_
_RINvMsa_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtBa_11InterpreterNtNtBa_6memory14MemoryInstanceNtNtNtBc_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2v_6create10CreateBodyNtB41_14CreateMetadataEE15verify_ready_txB2q_EBc_
Line
Count
Source
1196
2.19k
    fn verify_ready_tx<Tx2: IntoChecked>(
1197
2.19k
        &self,
1198
2.19k
        tx: &Ready<Tx2>,
1199
2.19k
    ) -> Result<(), InterpreterError<S::DataError>> {
1200
2.19k
        self.gas_price_matches(tx)?;
1201
2.19k
        Ok(())
1202
2.19k
    }
_RINvMsa_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtBa_11InterpreterNtNtBa_6memory14MemoryInstanceNtNtNtBc_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2v_6script10ScriptBodyNtB41_14ScriptMetadataEE15verify_ready_txB2q_EBc_
Line
Count
Source
1196
2.19k
    fn verify_ready_tx<Tx2: IntoChecked>(
1197
2.19k
        &self,
1198
2.19k
        tx: &Ready<Tx2>,
1199
2.19k
    ) -> Result<(), InterpreterError<S::DataError>> {
1200
2.19k
        self.gas_price_matches(tx)?;
1201
2.19k
        Ok(())
1202
2.19k
    }
Unexecuted instantiation: _RINvMsa_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtBa_11InterpreterNtNtBa_6memory14MemoryInstanceNtNtNtBc_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2v_6script10ScriptBodyNtB41_14ScriptMetadataEE15verify_ready_txIB2r_NtNtB2v_6create10CreateBodyNtB5c_14CreateMetadataEEBc_
1203
1204
4.38k
    fn gas_price_matches<Tx2: IntoChecked>(
1205
4.38k
        &self,
1206
4.38k
        tx: &Ready<Tx2>,
1207
4.38k
    ) -> Result<(), InterpreterError<S::DataError>> {
1208
4.38k
        if tx.gas_price() != self.gas_price() {
1209
0
            Err(InterpreterError::ReadyTransactionWrongGasPrice {
1210
0
                expected: self.gas_price(),
1211
0
                actual: tx.gas_price(),
1212
0
            })
1213
        } else {
1214
4.38k
            Ok(())
1215
        }
1216
4.38k
    }
Unexecuted instantiation: _RINvMsa_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtBa_11InterpreterNtNtBa_6memory14MemoryInstanceNtNtNtBc_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2v_4blob8BlobBodyNtB41_12BlobMetadataEE17gas_price_matchesB2q_EBc_
_RINvMsa_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtBa_11InterpreterNtNtBa_6memory14MemoryInstanceNtNtNtBc_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2v_6create10CreateBodyNtB41_14CreateMetadataEE17gas_price_matchesB2q_EBc_
Line
Count
Source
1204
2.19k
    fn gas_price_matches<Tx2: IntoChecked>(
1205
2.19k
        &self,
1206
2.19k
        tx: &Ready<Tx2>,
1207
2.19k
    ) -> Result<(), InterpreterError<S::DataError>> {
1208
2.19k
        if tx.gas_price() != self.gas_price() {
1209
0
            Err(InterpreterError::ReadyTransactionWrongGasPrice {
1210
0
                expected: self.gas_price(),
1211
0
                actual: tx.gas_price(),
1212
0
            })
1213
        } else {
1214
2.19k
            Ok(())
1215
        }
1216
2.19k
    }
_RINvMsa_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtBa_11InterpreterNtNtBa_6memory14MemoryInstanceNtNtNtBc_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2v_6script10ScriptBodyNtB41_14ScriptMetadataEE17gas_price_matchesB2q_EBc_
Line
Count
Source
1204
2.19k
    fn gas_price_matches<Tx2: IntoChecked>(
1205
2.19k
        &self,
1206
2.19k
        tx: &Ready<Tx2>,
1207
2.19k
    ) -> Result<(), InterpreterError<S::DataError>> {
1208
2.19k
        if tx.gas_price() != self.gas_price() {
1209
0
            Err(InterpreterError::ReadyTransactionWrongGasPrice {
1210
0
                expected: self.gas_price(),
1211
0
                actual: tx.gas_price(),
1212
0
            })
1213
        } else {
1214
2.19k
            Ok(())
1215
        }
1216
2.19k
    }
Unexecuted instantiation: _RINvMsa_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter9executors4mainINtBa_11InterpreterNtNtBa_6memory14MemoryInstanceNtNtNtBc_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2v_6script10ScriptBodyNtB41_14ScriptMetadataEE17gas_price_matchesIB2r_NtNtB2v_6create10CreateBodyNtB5e_14CreateMetadataEEBc_
1217
}
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter/ecal.rs
Line
Count
Source
1
//! See `fuel-vm/examples/external.rs` for example usage.
2
3
use fuel_asm::{
4
    PanicReason,
5
    RegId,
6
};
7
8
use crate::{
9
    constraints::reg_key::{
10
        split_registers,
11
        SystemRegisters,
12
    },
13
    error::SimpleResult,
14
    interpreter::NotSupportedEcal,
15
};
16
17
use super::{
18
    internal::inc_pc,
19
    Interpreter,
20
    Memory,
21
};
22
23
/// ECAL opcode handler
24
pub trait EcalHandler: Clone
25
where
26
    Self: Sized,
27
{
28
    /// Whether to increment PC after executing ECAL. If this is false,
29
    /// the handler must increment PC itself.
30
    const INC_PC: bool = true;
31
32
    /// ECAL opcode handler
33
    fn ecal<M, S, Tx>(
34
        vm: &mut Interpreter<M, S, Tx, Self>,
35
        a: RegId,
36
        b: RegId,
37
        c: RegId,
38
        d: RegId,
39
    ) -> SimpleResult<()>
40
    where
41
        M: Memory;
42
}
43
44
/// Default ECAL opcode handler function, which just errors immediately.
45
impl EcalHandler for NotSupportedEcal {
46
2
    fn ecal<M, S, Tx>(
47
2
        _: &mut Interpreter<M, S, Tx, Self>,
48
2
        _: RegId,
49
2
        _: RegId,
50
2
        _: RegId,
51
2
        _: RegId,
52
2
    ) -> SimpleResult<()> {
53
2
        Err(PanicReason::EcalError)?
54
2
    }
Unexecuted instantiation: _RINvXNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4ecalNtB5_16NotSupportedEcalNtB3_11EcalHandler4ecalNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2H_4blob8BlobBodyNtB4d_12BlobMetadataEEB7_
Unexecuted instantiation: _RINvXNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4ecalNtB5_16NotSupportedEcalNtB3_11EcalHandler4ecalNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2H_6create10CreateBodyNtB4d_14CreateMetadataEEB7_
_RINvXNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4ecalNtB5_16NotSupportedEcalNtB3_11EcalHandler4ecalNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2H_6script10ScriptBodyNtB4d_14ScriptMetadataEEB7_
Line
Count
Source
46
2
    fn ecal<M, S, Tx>(
47
2
        _: &mut Interpreter<M, S, Tx, Self>,
48
2
        _: RegId,
49
2
        _: RegId,
50
2
        _: RegId,
51
2
        _: RegId,
52
2
    ) -> SimpleResult<()> {
53
2
        Err(PanicReason::EcalError)?
54
2
    }
Unexecuted instantiation: _RINvXNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4ecalNtB5_16NotSupportedEcalNtB3_11EcalHandler4ecalQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB23_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3b_4blob8BlobBodyNtB4H_12BlobMetadataEEB7_
Unexecuted instantiation: _RINvXNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4ecalNtB5_16NotSupportedEcalNtB3_11EcalHandler4ecalQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB23_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3b_6create10CreateBodyNtB4H_14CreateMetadataEEB7_
Unexecuted instantiation: _RINvXNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4ecalNtB5_16NotSupportedEcalNtB3_11EcalHandler4ecalQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB23_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3b_6script10ScriptBodyNtB4H_14ScriptMetadataEEB7_
Unexecuted instantiation: _RINvXNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4ecalNtB5_16NotSupportedEcalNtB3_11EcalHandler4ecalQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB23_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3b_6upload10UploadBodyNtB4H_14UploadMetadataEEB7_
Unexecuted instantiation: _RINvXNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4ecalNtB5_16NotSupportedEcalNtB3_11EcalHandler4ecalQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB23_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3b_7upgrade11UpgradeBodyNtB4H_15UpgradeMetadataEEB7_
Unexecuted instantiation: _RINvXNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4ecalNtB5_16NotSupportedEcalNtB3_11EcalHandler4ecalQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtNtB25_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3l_6script10ScriptBodyNtB4R_14ScriptMetadataEEB7_
55
}
56
57
/// ECAL is not allowed in predicates
58
#[derive(Debug, Clone, Copy, Default)]
59
pub struct PredicateErrorEcal;
60
61
/// ECAL is not allowed in predicates
62
impl EcalHandler for PredicateErrorEcal {
63
0
    fn ecal<M, S, Tx>(
64
0
        _vm: &mut Interpreter<M, S, Tx, Self>,
65
0
        _: RegId,
66
0
        _: RegId,
67
0
        _: RegId,
68
0
        _: RegId,
69
0
    ) -> SimpleResult<()> {
70
0
        Err(PanicReason::ContractInstructionNotAllowed)?
71
0
    }
72
}
73
74
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
75
where
76
    M: Memory,
77
    Ecal: EcalHandler,
78
{
79
    /// Executes ECAL opcode handler function and increments PC
80
2
    pub(crate) fn external_call(
81
2
        &mut self,
82
2
        a: RegId,
83
2
        b: RegId,
84
2
        c: RegId,
85
2
        d: RegId,
86
2
    ) -> SimpleResult<()> {
87
2
        Ecal::ecal(self, a, b, c, d)?;
88
0
        let (SystemRegisters { pc, .. }, _) = split_registers(&mut self.registers);
89
0
        if Ecal::INC_PC {
90
0
            Ok(inc_pc(pc)?)
91
        } else {
92
0
            Ok(())
93
        }
94
2
    }
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4ecalINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2i_4blob8BlobBodyNtB3O_12BlobMetadataEE13external_callB9_
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4ecalINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2i_6create10CreateBodyNtB3O_14CreateMetadataEE13external_callB9_
_RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4ecalINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2i_6script10ScriptBodyNtB3O_14ScriptMetadataEE13external_callB9_
Line
Count
Source
80
2
    pub(crate) fn external_call(
81
2
        &mut self,
82
2
        a: RegId,
83
2
        b: RegId,
84
2
        c: RegId,
85
2
        d: RegId,
86
2
    ) -> SimpleResult<()> {
87
2
        Ecal::ecal(self, a, b, c, d)?;
88
0
        let (SystemRegisters { pc, .. }, _) = split_registers(&mut self.registers);
89
0
        if Ecal::INC_PC {
90
0
            Ok(inc_pc(pc)?)
91
        } else {
92
0
            Ok(())
93
        }
94
2
    }
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4ecalINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1E_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2M_4blob8BlobBodyNtB4i_12BlobMetadataEE13external_callB9_
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4ecalINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1E_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2M_6create10CreateBodyNtB4i_14CreateMetadataEE13external_callB9_
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4ecalINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1E_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2M_6script10ScriptBodyNtB4i_14ScriptMetadataEE13external_callB9_
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4ecalINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1E_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2M_6upload10UploadBodyNtB4i_14UploadMetadataEE13external_callB9_
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4ecalINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1E_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2M_7upgrade11UpgradeBodyNtB4i_15UpgradeMetadataEE13external_callB9_
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4ecalINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtNtB1G_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2W_6script10ScriptBodyNtB4s_14ScriptMetadataEE13external_callB9_
95
}
96
97
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
98
where
99
    Ecal: EcalHandler,
100
{
101
    /// Read access to the ECAL state
102
0
    pub fn ecal_state(&self) -> &Ecal {
103
0
        &self.ecal_state
104
0
    }
105
106
    /// Write access to the ECAL state
107
0
    pub fn ecal_state_mut(&mut self) -> &mut Ecal {
108
0
        &mut self.ecal_state
109
0
    }
110
}
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter/receipts.rs
Line
Count
Source
1
use alloc::vec::Vec;
2
use core::{
3
    mem,
4
    ops::Index,
5
};
6
use fuel_asm::PanicReason;
7
8
use fuel_merkle::binary::root_calculator::MerkleRootCalculator as MerkleTree;
9
use fuel_tx::Receipt;
10
use fuel_types::{
11
    canonical::Serialize,
12
    Bytes32,
13
};
14
15
use crate::{
16
    error::SimpleResult,
17
    prelude::{
18
        Bug,
19
        BugVariant,
20
    },
21
};
22
23
/// Receipts and the associated Merkle tree
24
#[derive(Debug, Default, Clone)]
25
pub struct ReceiptsCtx {
26
    receipts: Vec<Receipt>,
27
    receipts_tree: MerkleTree,
28
}
29
30
impl ReceiptsCtx {
31
    /// The maximum number of receipts that can be stored in a single context.
32
    /// https://github.com/FuelLabs/fuel-specs/blob/master/src/fuel-vm/instruction-set.md#Receipts
33
    pub const MAX_RECEIPTS: usize = u16::MAX as usize;
34
35
    /// Add a new receipt, updating the Merkle tree as well.
36
    /// Returns a panic if the context is full.
37
924k
    pub fn push(&mut self, receipt: Receipt) -> SimpleResult<()> {
38
924k
        if self.receipts.len() == Self::MAX_RECEIPTS {
39
0
            return Err(Bug::new(BugVariant::ReceiptsCtxFull).into())
40
924k
        }
41
924k
42
924k
        // Last two slots can be only used for ending the script,
43
924k
        // with a script result optinally preceded by a panic
44
924k
        if (self.receipts.len() == Self::MAX_RECEIPTS - 1
45
2
            && !matches!(receipt, Receipt::ScriptResult { .. }))
46
924k
            || (self.receipts.len() == Self::MAX_RECEIPTS - 2
47
2
                && !matches!(
48
4
                    receipt,
49
                    Receipt::ScriptResult { .. } | Receipt::Panic { .. }
50
                ))
51
        {
52
2
            return Err(PanicReason::TooManyReceipts.into())
53
924k
        }
54
924k
55
924k
        self.receipts_tree.push(receipt.to_bytes().as_slice());
56
924k
        self.receipts.push(receipt);
57
924k
        Ok(())
58
924k
    }
59
60
    /// Reset the context to an empty state
61
4.38k
    pub fn clear(&mut self) {
62
4.38k
        self.receipts_tree = MerkleTree::new();
63
4.38k
        self.receipts.clear();
64
4.38k
    }
65
66
    /// Return how many receipts are in this context
67
88.9k
    pub fn len(&self) -> usize {
68
88.9k
        self.receipts.len()
69
88.9k
    }
70
71
    /// Returns `true` if the context has no receipts.
72
0
    pub fn is_empty(&self) -> bool {
73
0
        self.receipts.len() == 0
74
0
    }
75
76
    /// Return current Merkle root of the receipts
77
4.38k
    pub fn root(&self) -> Bytes32 {
78
4.38k
        self.receipts_tree.clone().root().into()
79
4.38k
    }
80
81
    /// Get a mutable lock on this context
82
0
    pub fn lock(&mut self) -> ReceiptsCtxMut {
83
0
        ReceiptsCtxMut::new(self)
84
0
    }
85
86
    /// Recalculates the Merkle root of the receipts from scratch. This should
87
    /// only be used when the list of receipts has been mutated externally.
88
0
    fn recalculate_root(&mut self) {
89
0
        self.receipts_tree = MerkleTree::new();
90
0
        for receipt in &self.receipts {
91
0
            self.receipts_tree.push(receipt.to_bytes().as_slice())
92
        }
93
0
    }
94
}
95
96
impl Index<usize> for ReceiptsCtx {
97
    type Output = Receipt;
98
99
0
    fn index(&self, index: usize) -> &Self::Output {
100
0
        &self.as_ref()[index]
101
0
    }
102
}
103
104
impl AsRef<Vec<Receipt>> for ReceiptsCtx {
105
8.77k
    fn as_ref(&self) -> &Vec<Receipt> {
106
8.77k
        &self.receipts
107
8.77k
    }
108
}
109
110
impl PartialEq for ReceiptsCtx {
111
0
    fn eq(&self, other: &Self) -> bool {
112
0
        self.root() == other.root()
113
0
    }
114
}
115
116
impl Eq for ReceiptsCtx {}
117
118
#[cfg(any(test, feature = "test-helpers"))]
119
impl From<Vec<Receipt>> for ReceiptsCtx {
120
0
    fn from(receipts: Vec<Receipt>) -> Self {
121
0
        let mut ctx = Self::default();
122
0
        for receipt in receipts {
123
0
            ctx.push(receipt).expect("Too many receipts");
124
0
        }
125
0
        ctx
126
0
    }
127
}
128
129
impl From<ReceiptsCtx> for Vec<Receipt> {
130
0
    fn from(mut ctx: ReceiptsCtx) -> Self {
131
0
        mem::take(&mut ctx.receipts)
132
0
    }
133
}
134
135
/// When modifying the list of receipts directly, it is imperative that the
136
/// receipts tree remain in sync with the modified list. Therefore, we lock
137
/// mutable access to the list of receipts behind an opaque context with
138
/// explicit getters and automatic root calculation. As long as the mutable
139
/// context is in scope, access to the original context is forbidden due to
140
/// borrowing semantics. When the mutable context is dropped, we recalculate the
141
/// root and return access to the original context.
142
pub struct ReceiptsCtxMut<'a> {
143
    receipts_ctx: &'a mut ReceiptsCtx,
144
}
145
146
impl<'a> ReceiptsCtxMut<'a> {
147
0
    pub fn new(receipts_ctx: &'a mut ReceiptsCtx) -> Self {
148
0
        Self { receipts_ctx }
149
0
    }
150
151
0
    pub fn receipts_mut(&mut self) -> &mut Vec<Receipt> {
152
0
        &mut self.receipts_ctx.receipts
153
0
    }
154
}
155
156
impl<'a> Drop for ReceiptsCtxMut<'a> {
157
0
    fn drop(&mut self) {
158
0
        // The receipts may have been modified; recalculate the root
159
0
        self.receipts_ctx.recalculate_root()
160
0
    }
161
}
162
163
#[cfg(test)]
164
mod tests {
165
    use crate::{
166
        crypto::ephemeral_merkle_root,
167
        interpreter::receipts::ReceiptsCtx,
168
    };
169
    use core::iter;
170
    use fuel_tx::Receipt;
171
    use fuel_types::canonical::Serialize;
172
173
    use alloc::vec::Vec;
174
175
    fn create_receipt() -> Receipt {
176
        Receipt::call(
177
            Default::default(),
178
            Default::default(),
179
            Default::default(),
180
            Default::default(),
181
            Default::default(),
182
            Default::default(),
183
            Default::default(),
184
            Default::default(),
185
            Default::default(),
186
        )
187
    }
188
189
    #[test]
190
    fn root_returns_merkle_root_of_pushed_receipts() {
191
        let mut ctx = ReceiptsCtx::default();
192
        let receipts = iter::repeat(create_receipt()).take(5);
193
        for receipt in receipts.clone() {
194
            ctx.push(receipt).expect("context not full");
195
        }
196
197
        let root = ctx.root();
198
199
        let leaves = receipts
200
            .map(|receipt| receipt.to_bytes())
201
            .collect::<Vec<_>>()
202
            .into_iter();
203
        let expected_root = ephemeral_merkle_root(leaves);
204
        assert_eq!(root, expected_root)
205
    }
206
207
    #[test]
208
    fn root_returns_merkle_root_of_directly_modified_receipts() {
209
        let mut ctx = ReceiptsCtx::default();
210
        let receipts = iter::repeat(create_receipt()).take(5);
211
212
        {
213
            let mut ctx_mut = ctx.lock();
214
            *ctx_mut.receipts_mut() = receipts.clone().collect();
215
        }
216
217
        let root = ctx.root();
218
219
        let leaves = receipts
220
            .map(|receipt| receipt.to_bytes())
221
            .collect::<Vec<_>>()
222
            .into_iter();
223
        let expected_root = ephemeral_merkle_root(leaves);
224
        assert_eq!(root, expected_root)
225
    }
226
}
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter/crypto.rs
Line
Count
Source
1
use super::{
2
    internal::{
3
        clear_err,
4
        inc_pc,
5
        set_err,
6
    },
7
    memory::OwnershipRegisters,
8
    ExecutableTransaction,
9
    Interpreter,
10
    Memory,
11
    MemoryInstance,
12
};
13
use crate::{
14
    constraints::reg_key::*,
15
    error::SimpleResult,
16
};
17
18
use fuel_crypto::{
19
    Hasher,
20
    Message,
21
    PublicKey,
22
    Signature,
23
};
24
use fuel_types::{
25
    Bytes32,
26
    Bytes64,
27
    Word,
28
};
29
30
#[cfg(test)]
31
mod tests;
32
33
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
34
where
35
    M: Memory,
36
    Tx: ExecutableTransaction,
37
{
38
11.1k
    pub(crate) fn secp256k1_recover(
39
11.1k
        &mut self,
40
11.1k
        a: Word,
41
11.1k
        b: Word,
42
11.1k
        c: Word,
43
11.1k
    ) -> SimpleResult<()> {
44
11.1k
        let owner = self.ownership_registers();
45
11.1k
        let (SystemRegisters { err, pc, .. }, _) = split_registers(&mut self.registers);
46
11.1k
        secp256k1_recover(self.memory.as_mut(), owner, err, pc, a, b, c)
47
11.1k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2h_4blob8BlobBodyNtB3N_12BlobMetadataEE17secp256k1_recoverB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2h_6create10CreateBodyNtB3N_14CreateMetadataEE17secp256k1_recoverB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2h_6script10ScriptBodyNtB3N_14ScriptMetadataEE17secp256k1_recoverB6_
Line
Count
Source
38
11.1k
    pub(crate) fn secp256k1_recover(
39
11.1k
        &mut self,
40
11.1k
        a: Word,
41
11.1k
        b: Word,
42
11.1k
        c: Word,
43
11.1k
    ) -> SimpleResult<()> {
44
11.1k
        let owner = self.ownership_registers();
45
11.1k
        let (SystemRegisters { err, pc, .. }, _) = split_registers(&mut self.registers);
46
11.1k
        secp256k1_recover(self.memory.as_mut(), owner, err, pc, a, b, c)
47
11.1k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1D_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2L_4blob8BlobBodyNtB4h_12BlobMetadataEE17secp256k1_recoverB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1D_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2L_6create10CreateBodyNtB4h_14CreateMetadataEE17secp256k1_recoverB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1D_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2L_6script10ScriptBodyNtB4h_14ScriptMetadataEE17secp256k1_recoverB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1D_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2L_6upload10UploadBodyNtB4h_14UploadMetadataEE17secp256k1_recoverB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1D_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2L_7upgrade11UpgradeBodyNtB4h_15UpgradeMetadataEE17secp256k1_recoverB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1F_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2V_6script10ScriptBodyNtB4r_14ScriptMetadataEE17secp256k1_recoverB6_
48
49
4.52k
    pub(crate) fn secp256r1_recover(
50
4.52k
        &mut self,
51
4.52k
        a: Word,
52
4.52k
        b: Word,
53
4.52k
        c: Word,
54
4.52k
    ) -> SimpleResult<()> {
55
4.52k
        let owner = self.ownership_registers();
56
4.52k
        let (SystemRegisters { err, pc, .. }, _) = split_registers(&mut self.registers);
57
4.52k
        secp256r1_recover(self.memory.as_mut(), owner, err, pc, a, b, c)
58
4.52k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2h_4blob8BlobBodyNtB3N_12BlobMetadataEE17secp256r1_recoverB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2h_6create10CreateBodyNtB3N_14CreateMetadataEE17secp256r1_recoverB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2h_6script10ScriptBodyNtB3N_14ScriptMetadataEE17secp256r1_recoverB6_
Line
Count
Source
49
4.52k
    pub(crate) fn secp256r1_recover(
50
4.52k
        &mut self,
51
4.52k
        a: Word,
52
4.52k
        b: Word,
53
4.52k
        c: Word,
54
4.52k
    ) -> SimpleResult<()> {
55
4.52k
        let owner = self.ownership_registers();
56
4.52k
        let (SystemRegisters { err, pc, .. }, _) = split_registers(&mut self.registers);
57
4.52k
        secp256r1_recover(self.memory.as_mut(), owner, err, pc, a, b, c)
58
4.52k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1D_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2L_4blob8BlobBodyNtB4h_12BlobMetadataEE17secp256r1_recoverB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1D_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2L_6create10CreateBodyNtB4h_14CreateMetadataEE17secp256r1_recoverB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1D_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2L_6script10ScriptBodyNtB4h_14ScriptMetadataEE17secp256r1_recoverB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1D_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2L_6upload10UploadBodyNtB4h_14UploadMetadataEE17secp256r1_recoverB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1D_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2L_7upgrade11UpgradeBodyNtB4h_15UpgradeMetadataEE17secp256r1_recoverB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1F_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2V_6script10ScriptBodyNtB4r_14ScriptMetadataEE17secp256r1_recoverB6_
59
60
11.9k
    pub(crate) fn ed25519_verify(
61
11.9k
        &mut self,
62
11.9k
        a: Word,
63
11.9k
        b: Word,
64
11.9k
        c: Word,
65
11.9k
        len: Word,
66
11.9k
    ) -> SimpleResult<()> {
67
11.9k
        let (SystemRegisters { err, pc, .. }, _) = split_registers(&mut self.registers);
68
11.9k
        ed25519_verify(self.memory.as_mut(), err, pc, a, b, c, len)
69
11.9k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2h_4blob8BlobBodyNtB3N_12BlobMetadataEE14ed25519_verifyB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2h_6create10CreateBodyNtB3N_14CreateMetadataEE14ed25519_verifyB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2h_6script10ScriptBodyNtB3N_14ScriptMetadataEE14ed25519_verifyB6_
Line
Count
Source
60
11.9k
    pub(crate) fn ed25519_verify(
61
11.9k
        &mut self,
62
11.9k
        a: Word,
63
11.9k
        b: Word,
64
11.9k
        c: Word,
65
11.9k
        len: Word,
66
11.9k
    ) -> SimpleResult<()> {
67
11.9k
        let (SystemRegisters { err, pc, .. }, _) = split_registers(&mut self.registers);
68
11.9k
        ed25519_verify(self.memory.as_mut(), err, pc, a, b, c, len)
69
11.9k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1D_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2L_4blob8BlobBodyNtB4h_12BlobMetadataEE14ed25519_verifyB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1D_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2L_6create10CreateBodyNtB4h_14CreateMetadataEE14ed25519_verifyB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1D_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2L_6script10ScriptBodyNtB4h_14ScriptMetadataEE14ed25519_verifyB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1D_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2L_6upload10UploadBodyNtB4h_14UploadMetadataEE14ed25519_verifyB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1D_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2L_7upgrade11UpgradeBodyNtB4h_15UpgradeMetadataEE14ed25519_verifyB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1F_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2V_6script10ScriptBodyNtB4r_14ScriptMetadataEE14ed25519_verifyB6_
70
71
38.7k
    pub(crate) fn keccak256(&mut self, a: Word, b: Word, c: Word) -> SimpleResult<()> {
72
38.7k
        let owner = self.ownership_registers();
73
38.7k
        keccak256(
74
38.7k
            self.memory.as_mut(),
75
38.7k
            owner,
76
38.7k
            self.registers.pc_mut(),
77
38.7k
            a,
78
38.7k
            b,
79
38.7k
            c,
80
38.7k
        )
81
38.7k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2h_4blob8BlobBodyNtB3N_12BlobMetadataEE9keccak256B6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2h_6create10CreateBodyNtB3N_14CreateMetadataEE9keccak256B6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2h_6script10ScriptBodyNtB3N_14ScriptMetadataEE9keccak256B6_
Line
Count
Source
71
38.7k
    pub(crate) fn keccak256(&mut self, a: Word, b: Word, c: Word) -> SimpleResult<()> {
72
38.7k
        let owner = self.ownership_registers();
73
38.7k
        keccak256(
74
38.7k
            self.memory.as_mut(),
75
38.7k
            owner,
76
38.7k
            self.registers.pc_mut(),
77
38.7k
            a,
78
38.7k
            b,
79
38.7k
            c,
80
38.7k
        )
81
38.7k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1D_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2L_4blob8BlobBodyNtB4h_12BlobMetadataEE9keccak256B6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1D_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2L_6create10CreateBodyNtB4h_14CreateMetadataEE9keccak256B6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1D_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2L_6script10ScriptBodyNtB4h_14ScriptMetadataEE9keccak256B6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1D_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2L_6upload10UploadBodyNtB4h_14UploadMetadataEE9keccak256B6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1D_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2L_7upgrade11UpgradeBodyNtB4h_15UpgradeMetadataEE9keccak256B6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1F_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2V_6script10ScriptBodyNtB4r_14ScriptMetadataEE9keccak256B6_
82
83
146k
    pub(crate) fn sha256(&mut self, a: Word, b: Word, c: Word) -> SimpleResult<()> {
84
146k
        let owner = self.ownership_registers();
85
146k
        sha256(
86
146k
            self.memory.as_mut(),
87
146k
            owner,
88
146k
            self.registers.pc_mut(),
89
146k
            a,
90
146k
            b,
91
146k
            c,
92
146k
        )
93
146k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2h_4blob8BlobBodyNtB3N_12BlobMetadataEE6sha256B6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2h_6create10CreateBodyNtB3N_14CreateMetadataEE6sha256B6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2h_6script10ScriptBodyNtB3N_14ScriptMetadataEE6sha256B6_
Line
Count
Source
83
146k
    pub(crate) fn sha256(&mut self, a: Word, b: Word, c: Word) -> SimpleResult<()> {
84
146k
        let owner = self.ownership_registers();
85
146k
        sha256(
86
146k
            self.memory.as_mut(),
87
146k
            owner,
88
146k
            self.registers.pc_mut(),
89
146k
            a,
90
146k
            b,
91
146k
            c,
92
146k
        )
93
146k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1D_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2L_4blob8BlobBodyNtB4h_12BlobMetadataEE6sha256B6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1D_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2L_6create10CreateBodyNtB4h_14CreateMetadataEE6sha256B6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1D_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2L_6script10ScriptBodyNtB4h_14ScriptMetadataEE6sha256B6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1D_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2L_6upload10UploadBodyNtB4h_14UploadMetadataEE6sha256B6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1D_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2L_7upgrade11UpgradeBodyNtB4h_15UpgradeMetadataEE6sha256B6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6cryptoINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1F_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2V_6script10ScriptBodyNtB4r_14ScriptMetadataEE6sha256B6_
94
}
95
96
11.1k
pub(crate) fn secp256k1_recover(
97
11.1k
    memory: &mut MemoryInstance,
98
11.1k
    owner: OwnershipRegisters,
99
11.1k
    err: RegMut<ERR>,
100
11.1k
    pc: RegMut<PC>,
101
11.1k
    a: Word,
102
11.1k
    b: Word,
103
11.1k
    c: Word,
104
11.1k
) -> SimpleResult<()> {
105
11.1k
    let sig = Bytes64::from(memory.read_bytes(b)?);
106
11.1k
    let msg = Bytes32::from(memory.read_bytes(c)?);
107
108
11.1k
    let signature = Signature::from_bytes_ref(&sig);
109
11.1k
    let message = Message::from_bytes_ref(&msg);
110
11.1k
111
11.1k
    match signature.recover(message) {
112
9.28k
        Ok(pub_key) => {
113
9.28k
            memory.write_bytes(owner, a, *pub_key)?;
114
9.27k
            clear_err(err);
115
        }
116
        Err(_) => {
117
1.89k
            memory.write_bytes(owner, a, [0; PublicKey::LEN])?;
118
1.88k
            set_err(err);
119
        }
120
    }
121
122
11.1k
    Ok(inc_pc(pc)?)
123
11.1k
}
124
125
4.52k
pub(crate) fn secp256r1_recover(
126
4.52k
    memory: &mut MemoryInstance,
127
4.52k
    owner: OwnershipRegisters,
128
4.52k
    err: RegMut<ERR>,
129
4.52k
    pc: RegMut<PC>,
130
4.52k
    a: Word,
131
4.52k
    b: Word,
132
4.52k
    c: Word,
133
4.52k
) -> SimpleResult<()> {
134
4.52k
    let sig = Bytes64::from(memory.read_bytes(b)?);
135
4.52k
    let msg = Bytes32::from(memory.read_bytes(c)?);
136
4.51k
    let message = Message::from_bytes_ref(&msg);
137
4.51k
138
4.51k
    match fuel_crypto::secp256r1::recover(&sig, message) {
139
948
        Ok(pub_key) => {
140
948
            memory.write_bytes(owner, a, *pub_key)?;
141
944
            clear_err(err);
142
        }
143
        Err(_) => {
144
3.57k
            memory.write_bytes(owner, a, [0; PublicKey::LEN])?;
145
3.56k
            set_err(err);
146
        }
147
    }
148
149
4.51k
    Ok(inc_pc(pc)?)
150
4.52k
}
151
152
11.9k
pub(crate) fn ed25519_verify(
153
11.9k
    memory: &mut MemoryInstance,
154
11.9k
    err: RegMut<ERR>,
155
11.9k
    pc: RegMut<PC>,
156
11.9k
    a: Word,
157
11.9k
    b: Word,
158
11.9k
    c: Word,
159
11.9k
    len: Word,
160
11.9k
) -> SimpleResult<()> {
161
11.9k
    let pub_key = Bytes32::from(memory.read_bytes(a)?);
162
11.9k
    let sig = Bytes64::from(memory.read_bytes(b)?);
163
11.9k
    let msg = memory.read(c, len)?;
164
165
11.9k
    if fuel_crypto::ed25519::verify(&pub_key, &sig, msg).is_ok() {
166
0
        clear_err(err);
167
11.9k
    } else {
168
11.9k
        set_err(err);
169
11.9k
    }
170
171
11.9k
    Ok(inc_pc(pc)?)
172
11.9k
}
173
174
38.7k
pub(crate) fn keccak256(
175
38.7k
    memory: &mut MemoryInstance,
176
38.7k
    owner: OwnershipRegisters,
177
38.7k
    pc: RegMut<PC>,
178
38.7k
    a: Word,
179
38.7k
    b: Word,
180
38.7k
    c: Word,
181
38.7k
) -> SimpleResult<()> {
182
    use sha3::{
183
        Digest,
184
        Keccak256,
185
    };
186
38.7k
    let mut h = Keccak256::new();
187
38.7k
    h.update(memory.read(b, c)?);
188
189
38.7k
    memory.write_bytes(owner, a, *h.finalize().as_ref())?;
190
191
38.7k
    Ok(inc_pc(pc)?)
192
38.7k
}
193
194
146k
pub(crate) fn sha256(
195
146k
    memory: &mut MemoryInstance,
196
146k
    owner: OwnershipRegisters,
197
146k
    pc: RegMut<PC>,
198
146k
    a: Word,
199
146k
    b: Word,
200
146k
    c: Word,
201
146k
) -> SimpleResult<()> {
202
146k
    memory.write_bytes(owner, a, *Hasher::hash(memory.read(b, c)?))?;
203
146k
    Ok(inc_pc(pc)?)
204
146k
}
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter/internal.rs
Line
Count
Source
1
use super::{
2
    ExecutableTransaction,
3
    Interpreter,
4
    Memory,
5
    MemoryInstance,
6
    RuntimeBalances,
7
};
8
use crate::{
9
    constraints::reg_key::*,
10
    context::Context,
11
    error::SimpleResult,
12
};
13
14
use fuel_asm::{
15
    Flags,
16
    Instruction,
17
    PanicReason,
18
};
19
use fuel_tx::{
20
    field::Outputs,
21
    Output,
22
};
23
use fuel_types::{
24
    canonical::Serialize,
25
    AssetId,
26
    BlockHeight,
27
    Bytes32,
28
    ContractId,
29
    Word,
30
};
31
32
use core::ops::Range;
33
34
#[cfg(test)]
35
mod message_tests;
36
#[cfg(test)]
37
mod tests;
38
39
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
40
where
41
    M: Memory,
42
    Tx: ExecutableTransaction,
43
{
44
6.57k
    pub(crate) fn update_memory_output(&mut self, idx: usize) -> SimpleResult<()> {
45
6.57k
        let tx_offset = self.tx_offset();
46
6.57k
        update_memory_output(&mut self.tx, self.memory.as_mut(), tx_offset, idx)
47
6.57k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2j_4blob8BlobBodyNtB3P_12BlobMetadataEE20update_memory_outputB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2j_6create10CreateBodyNtB3P_14CreateMetadataEE20update_memory_outputB6_
Line
Count
Source
44
2.19k
    pub(crate) fn update_memory_output(&mut self, idx: usize) -> SimpleResult<()> {
45
2.19k
        let tx_offset = self.tx_offset();
46
2.19k
        update_memory_output(&mut self.tx, self.memory.as_mut(), tx_offset, idx)
47
2.19k
    }
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2j_6script10ScriptBodyNtB3P_14ScriptMetadataEE20update_memory_outputB6_
Line
Count
Source
44
4.38k
    pub(crate) fn update_memory_output(&mut self, idx: usize) -> SimpleResult<()> {
45
4.38k
        let tx_offset = self.tx_offset();
46
4.38k
        update_memory_output(&mut self.tx, self.memory.as_mut(), tx_offset, idx)
47
4.38k
    }
48
}
49
50
/// Increase the variable output with a given asset ID. Modifies both the referenced tx
51
/// and the serialized tx in vm memory.
52
0
pub(crate) fn set_variable_output<Tx: ExecutableTransaction>(
53
0
    tx: &mut Tx,
54
0
    memory: &mut MemoryInstance,
55
0
    tx_offset: usize,
56
0
    idx: usize,
57
0
    variable: Output,
58
0
) -> SimpleResult<()> {
59
0
    tx.replace_variable_output(idx, variable)?;
60
0
    update_memory_output(tx, memory, tx_offset, idx)
61
0
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internal19set_variable_outputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2K_12BlobMetadataEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internal19set_variable_outputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2K_14CreateMetadataEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internal19set_variable_outputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2K_14ScriptMetadataEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internal19set_variable_outputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2K_14UploadMetadataEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internal19set_variable_outputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2K_15UpgradeMetadataEEB6_
62
63
6.57k
fn absolute_output_offset<Tx: Outputs>(
64
6.57k
    tx: &Tx,
65
6.57k
    tx_offset: usize,
66
6.57k
    idx: usize,
67
6.57k
) -> Option<usize> {
68
6.57k
    tx.outputs_offset_at(idx)
69
6.57k
        .map(|offset| tx_offset.saturating_add(offset))
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internal22absolute_output_offsetINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1j_4blob8BlobBodyNtB2P_12BlobMetadataEE0B8_
_RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internal22absolute_output_offsetINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1j_6create10CreateBodyNtB2P_14CreateMetadataEE0B8_
Line
Count
Source
69
2.19k
        .map(|offset| tx_offset.saturating_add(offset))
_RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internal22absolute_output_offsetINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1j_6script10ScriptBodyNtB2P_14ScriptMetadataEE0B8_
Line
Count
Source
69
4.38k
        .map(|offset| tx_offset.saturating_add(offset))
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internal22absolute_output_offsetINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1j_6upload10UploadBodyNtB2P_14UploadMetadataEE0B8_
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internal22absolute_output_offsetINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1j_7upgrade11UpgradeBodyNtB2P_15UpgradeMetadataEE0B8_
70
6.57k
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internal22absolute_output_offsetINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1h_4blob8BlobBodyNtB2N_12BlobMetadataEEB6_
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internal22absolute_output_offsetINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1h_6create10CreateBodyNtB2N_14CreateMetadataEEB6_
Line
Count
Source
63
2.19k
fn absolute_output_offset<Tx: Outputs>(
64
2.19k
    tx: &Tx,
65
2.19k
    tx_offset: usize,
66
2.19k
    idx: usize,
67
2.19k
) -> Option<usize> {
68
2.19k
    tx.outputs_offset_at(idx)
69
2.19k
        .map(|offset| tx_offset.saturating_add(offset))
70
2.19k
}
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internal22absolute_output_offsetINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1h_6script10ScriptBodyNtB2N_14ScriptMetadataEEB6_
Line
Count
Source
63
4.38k
fn absolute_output_offset<Tx: Outputs>(
64
4.38k
    tx: &Tx,
65
4.38k
    tx_offset: usize,
66
4.38k
    idx: usize,
67
4.38k
) -> Option<usize> {
68
4.38k
    tx.outputs_offset_at(idx)
69
4.38k
        .map(|offset| tx_offset.saturating_add(offset))
70
4.38k
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internal22absolute_output_offsetINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1h_6upload10UploadBodyNtB2N_14UploadMetadataEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internal22absolute_output_offsetINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1h_7upgrade11UpgradeBodyNtB2N_15UpgradeMetadataEEB6_
71
72
6.57k
pub(crate) fn absolute_output_mem_range<Tx: Outputs>(
73
6.57k
    tx: &Tx,
74
6.57k
    tx_offset: usize,
75
6.57k
    idx: usize,
76
6.57k
) -> Option<Range<usize>> {
77
6.57k
    let offset = absolute_output_offset(tx, tx_offset, idx)?;
78
6.57k
    let size = tx.outputs().get(idx)?.size();
79
6.57k
    Some(offset..offset.saturating_add(size))
80
6.57k
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internal25absolute_output_mem_rangeINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1k_4blob8BlobBodyNtB2Q_12BlobMetadataEEB6_
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internal25absolute_output_mem_rangeINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1k_6create10CreateBodyNtB2Q_14CreateMetadataEEB6_
Line
Count
Source
72
2.19k
pub(crate) fn absolute_output_mem_range<Tx: Outputs>(
73
2.19k
    tx: &Tx,
74
2.19k
    tx_offset: usize,
75
2.19k
    idx: usize,
76
2.19k
) -> Option<Range<usize>> {
77
2.19k
    let offset = absolute_output_offset(tx, tx_offset, idx)?;
78
2.19k
    let size = tx.outputs().get(idx)?.size();
79
2.19k
    Some(offset..offset.saturating_add(size))
80
2.19k
}
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internal25absolute_output_mem_rangeINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1k_6script10ScriptBodyNtB2Q_14ScriptMetadataEEB6_
Line
Count
Source
72
4.38k
pub(crate) fn absolute_output_mem_range<Tx: Outputs>(
73
4.38k
    tx: &Tx,
74
4.38k
    tx_offset: usize,
75
4.38k
    idx: usize,
76
4.38k
) -> Option<Range<usize>> {
77
4.38k
    let offset = absolute_output_offset(tx, tx_offset, idx)?;
78
4.38k
    let size = tx.outputs().get(idx)?.size();
79
4.38k
    Some(offset..offset.saturating_add(size))
80
4.38k
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internal25absolute_output_mem_rangeINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1k_6upload10UploadBodyNtB2Q_14UploadMetadataEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internal25absolute_output_mem_rangeINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1k_7upgrade11UpgradeBodyNtB2Q_15UpgradeMetadataEEB6_
81
82
6.57k
pub(crate) fn update_memory_output<Tx: ExecutableTransaction>(
83
6.57k
    tx: &mut Tx,
84
6.57k
    memory: &mut MemoryInstance,
85
6.57k
    tx_offset: usize,
86
6.57k
    idx: usize,
87
6.57k
) -> SimpleResult<()> {
88
6.57k
    let range = absolute_output_mem_range(tx, tx_offset, idx)
89
6.57k
        .ok_or(PanicReason::OutputNotFound)?;
90
6.57k
    let mut mem = memory.write_noownerchecks(range.start, range.len())?;
91
6.57k
    let output = tx
92
6.57k
        .outputs_mut()
93
6.57k
        .get_mut(idx)
94
6.57k
        .expect("Invalid output index; checked above");
95
6.57k
    output
96
6.57k
        .encode(&mut mem)
97
6.57k
        .expect("Unable to write output into given memory range");
98
6.57k
    Ok(())
99
6.57k
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internal20update_memory_outputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1f_4blob8BlobBodyNtB2L_12BlobMetadataEEB6_
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internal20update_memory_outputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1f_6create10CreateBodyNtB2L_14CreateMetadataEEB6_
Line
Count
Source
82
2.19k
pub(crate) fn update_memory_output<Tx: ExecutableTransaction>(
83
2.19k
    tx: &mut Tx,
84
2.19k
    memory: &mut MemoryInstance,
85
2.19k
    tx_offset: usize,
86
2.19k
    idx: usize,
87
2.19k
) -> SimpleResult<()> {
88
2.19k
    let range = absolute_output_mem_range(tx, tx_offset, idx)
89
2.19k
        .ok_or(PanicReason::OutputNotFound)?;
90
2.19k
    let mut mem = memory.write_noownerchecks(range.start, range.len())?;
91
2.19k
    let output = tx
92
2.19k
        .outputs_mut()
93
2.19k
        .get_mut(idx)
94
2.19k
        .expect("Invalid output index; checked above");
95
2.19k
    output
96
2.19k
        .encode(&mut mem)
97
2.19k
        .expect("Unable to write output into given memory range");
98
2.19k
    Ok(())
99
2.19k
}
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internal20update_memory_outputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1f_6script10ScriptBodyNtB2L_14ScriptMetadataEEB6_
Line
Count
Source
82
4.38k
pub(crate) fn update_memory_output<Tx: ExecutableTransaction>(
83
4.38k
    tx: &mut Tx,
84
4.38k
    memory: &mut MemoryInstance,
85
4.38k
    tx_offset: usize,
86
4.38k
    idx: usize,
87
4.38k
) -> SimpleResult<()> {
88
4.38k
    let range = absolute_output_mem_range(tx, tx_offset, idx)
89
4.38k
        .ok_or(PanicReason::OutputNotFound)?;
90
4.38k
    let mut mem = memory.write_noownerchecks(range.start, range.len())?;
91
4.38k
    let output = tx
92
4.38k
        .outputs_mut()
93
4.38k
        .get_mut(idx)
94
4.38k
        .expect("Invalid output index; checked above");
95
4.38k
    output
96
4.38k
        .encode(&mut mem)
97
4.38k
        .expect("Unable to write output into given memory range");
98
4.38k
    Ok(())
99
4.38k
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internal20update_memory_outputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1f_6upload10UploadBodyNtB2L_14UploadMetadataEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internal20update_memory_outputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1f_7upgrade11UpgradeBodyNtB2L_15UpgradeMetadataEEB6_
100
101
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
102
where
103
    M: Memory,
104
{
105
583k
    pub(crate) fn set_flag(&mut self, a: Word) -> SimpleResult<()> {
106
583k
        let (SystemRegisters { flag, pc, .. }, _) = split_registers(&mut self.registers);
107
583k
        set_flag(flag, pc, a)
108
583k
    }
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_4blob8BlobBodyNtB3R_12BlobMetadataEE8set_flagB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_6create10CreateBodyNtB3R_14CreateMetadataEE8set_flagB8_
_RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_6script10ScriptBodyNtB3R_14ScriptMetadataEE8set_flagB8_
Line
Count
Source
105
583k
    pub(crate) fn set_flag(&mut self, a: Word) -> SimpleResult<()> {
106
583k
        let (SystemRegisters { flag, pc, .. }, _) = split_registers(&mut self.registers);
107
583k
        set_flag(flag, pc, a)
108
583k
    }
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1H_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_4blob8BlobBodyNtB4l_12BlobMetadataEE8set_flagB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1H_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6create10CreateBodyNtB4l_14CreateMetadataEE8set_flagB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1H_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6script10ScriptBodyNtB4l_14ScriptMetadataEE8set_flagB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1H_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6upload10UploadBodyNtB4l_14UploadMetadataEE8set_flagB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1H_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_7upgrade11UpgradeBodyNtB4l_15UpgradeMetadataEE8set_flagB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1J_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Z_6script10ScriptBodyNtB4v_14ScriptMetadataEE8set_flagB8_
109
110
326k
    pub(crate) const fn context(&self) -> &Context {
111
326k
        &self.context
112
326k
    }
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_4blob8BlobBodyNtB3R_12BlobMetadataEE7contextB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_6create10CreateBodyNtB3R_14CreateMetadataEE7contextB8_
_RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_6script10ScriptBodyNtB3R_14ScriptMetadataEE7contextB8_
Line
Count
Source
110
326k
    pub(crate) const fn context(&self) -> &Context {
111
326k
        &self.context
112
326k
    }
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1H_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_4blob8BlobBodyNtB4l_12BlobMetadataEE7contextB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1H_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6create10CreateBodyNtB4l_14CreateMetadataEE7contextB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1H_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6script10ScriptBodyNtB4l_14ScriptMetadataEE7contextB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1H_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6upload10UploadBodyNtB4l_14UploadMetadataEE7contextB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1H_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_7upgrade11UpgradeBodyNtB4l_15UpgradeMetadataEE7contextB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1J_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Z_6script10ScriptBodyNtB4v_14ScriptMetadataEE7contextB8_
113
114
387M
    pub(crate) const fn is_predicate(&self) -> bool {
115
387M
        matches!(
116
387M
            self.context,
117
            Context::PredicateEstimation { .. } | Context::PredicateVerification { .. }
118
        )
119
387M
    }
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_4blob8BlobBodyNtB3R_12BlobMetadataEE12is_predicateB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_6create10CreateBodyNtB3R_14CreateMetadataEE12is_predicateB8_
_RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_6script10ScriptBodyNtB3R_14ScriptMetadataEE12is_predicateB8_
Line
Count
Source
114
387M
    pub(crate) const fn is_predicate(&self) -> bool {
115
387M
        matches!(
116
387M
            self.context,
117
            Context::PredicateEstimation { .. } | Context::PredicateVerification { .. }
118
        )
119
387M
    }
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1H_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_4blob8BlobBodyNtB4l_12BlobMetadataEE12is_predicateB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1H_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6create10CreateBodyNtB4l_14CreateMetadataEE12is_predicateB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1H_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6script10ScriptBodyNtB4l_14ScriptMetadataEE12is_predicateB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1H_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6upload10UploadBodyNtB4l_14UploadMetadataEE12is_predicateB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1H_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_7upgrade11UpgradeBodyNtB4l_15UpgradeMetadataEE12is_predicateB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1J_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Z_6script10ScriptBodyNtB4v_14ScriptMetadataEE12is_predicateB8_
120
121
11.1k
    pub(crate) fn internal_contract(&self) -> Result<ContractId, PanicReason> {
122
11.1k
        internal_contract(&self.context, self.registers.fp(), self.memory.as_ref())
123
11.1k
    }
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_4blob8BlobBodyNtB3R_12BlobMetadataEE17internal_contractB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_6create10CreateBodyNtB3R_14CreateMetadataEE17internal_contractB8_
_RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_6script10ScriptBodyNtB3R_14ScriptMetadataEE17internal_contractB8_
Line
Count
Source
121
11.1k
    pub(crate) fn internal_contract(&self) -> Result<ContractId, PanicReason> {
122
11.1k
        internal_contract(&self.context, self.registers.fp(), self.memory.as_ref())
123
11.1k
    }
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1H_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_4blob8BlobBodyNtB4l_12BlobMetadataEE17internal_contractB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1H_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6create10CreateBodyNtB4l_14CreateMetadataEE17internal_contractB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1H_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6script10ScriptBodyNtB4l_14ScriptMetadataEE17internal_contractB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1H_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6upload10UploadBodyNtB4l_14UploadMetadataEE17internal_contractB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1H_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_7upgrade11UpgradeBodyNtB4l_15UpgradeMetadataEE17internal_contractB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1J_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Z_6script10ScriptBodyNtB4v_14ScriptMetadataEE17internal_contractB8_
124
125
326k
    pub(crate) fn get_block_height(&self) -> Result<BlockHeight, PanicReason> {
126
326k
        self.context()
127
326k
            .block_height()
128
326k
            .ok_or(PanicReason::TransactionValidity)
129
326k
    }
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_4blob8BlobBodyNtB3R_12BlobMetadataEE16get_block_heightB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_6create10CreateBodyNtB3R_14CreateMetadataEE16get_block_heightB8_
_RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_6script10ScriptBodyNtB3R_14ScriptMetadataEE16get_block_heightB8_
Line
Count
Source
125
326k
    pub(crate) fn get_block_height(&self) -> Result<BlockHeight, PanicReason> {
126
326k
        self.context()
127
326k
            .block_height()
128
326k
            .ok_or(PanicReason::TransactionValidity)
129
326k
    }
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1H_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_4blob8BlobBodyNtB4l_12BlobMetadataEE16get_block_heightB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1H_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6create10CreateBodyNtB4l_14CreateMetadataEE16get_block_heightB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1H_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6script10ScriptBodyNtB4l_14ScriptMetadataEE16get_block_heightB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1H_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6upload10UploadBodyNtB4l_14UploadMetadataEE16get_block_heightB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1H_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_7upgrade11UpgradeBodyNtB4l_15UpgradeMetadataEE16get_block_heightB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8internalINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1J_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Z_6script10ScriptBodyNtB4v_14ScriptMetadataEE16get_block_heightB8_
130
}
131
132
10.2k
pub(crate) fn clear_err(mut err: RegMut<ERR>) {
133
10.2k
    *err = 0;
134
10.2k
}
135
136
17.3k
pub(crate) fn set_err(mut err: RegMut<ERR>) {
137
17.3k
    *err = 1;
138
17.3k
}
139
140
583k
pub(crate) fn set_flag(
141
583k
    mut flag: RegMut<FLAG>,
142
583k
    pc: RegMut<PC>,
143
583k
    a: Word,
144
583k
) -> SimpleResult<()> {
145
583k
    let Some(flags) = Flags::from_bits(a) else {
146
1
        return Err(PanicReason::InvalidFlags.into())
147
    };
148
149
583k
    *flag = flags.bits();
150
583k
151
583k
    Ok(inc_pc(pc)?)
152
583k
}
153
154
312M
pub(crate) fn inc_pc(mut pc: RegMut<PC>) -> Result<(), PanicReason> {
155
312M
    pc.checked_add(Instruction::SIZE as Word)
156
312M
        .ok_or(PanicReason::MemoryOverflow)
157
312M
        .map(|i| *pc = i)
158
312M
}
159
160
88.9k
pub(crate) fn tx_id(memory: &MemoryInstance) -> Bytes32 {
161
88.9k
    Bytes32::new(memory.read_bytes(0u64).expect("Bytes32::LEN < MEM_SIZE"))
162
88.9k
}
163
164
/// Reduces the unspent balance of the base asset
165
88.7k
pub(crate) fn base_asset_balance_sub(
166
88.7k
    base_asset_id: &AssetId,
167
88.7k
    balances: &mut RuntimeBalances,
168
88.7k
    memory: &mut MemoryInstance,
169
88.7k
    value: Word,
170
88.7k
) -> SimpleResult<()> {
171
88.7k
    external_asset_id_balance_sub(balances, memory, base_asset_id, value)
172
88.7k
}
173
174
/// Reduces the unspent balance of a given asset ID
175
100k
pub(crate) fn external_asset_id_balance_sub(
176
100k
    balances: &mut RuntimeBalances,
177
100k
    memory: &mut MemoryInstance,
178
100k
    asset_id: &AssetId,
179
100k
    value: Word,
180
100k
) -> SimpleResult<()> {
181
100k
    balances
182
100k
        .checked_balance_sub(memory, asset_id, value)
183
100k
        .ok_or(PanicReason::NotEnoughBalance)?;
184
185
100k
    Ok(())
186
100k
}
187
188
1.28M
pub(crate) fn current_contract(
189
1.28M
    context: &Context,
190
1.28M
    fp: Reg<FP>,
191
1.28M
    memory: &MemoryInstance,
192
1.28M
) -> Result<Option<ContractId>, PanicReason> {
193
1.28M
    if context.is_internal() {
194
30.1k
        Ok(Some(ContractId::new(memory.read_bytes(*fp)?)))
195
    } else {
196
1.25M
        Ok(None)
197
    }
198
1.28M
}
199
200
834k
pub(crate) fn internal_contract(
201
834k
    context: &Context,
202
834k
    fp: Reg<FP>,
203
834k
    memory: &MemoryInstance,
204
834k
) -> Result<ContractId, PanicReason> {
205
834k
    current_contract(context, fp, memory)?.ok_or(PanicReason::ExpectedInternalContext)
206
834k
}
207
208
23.6k
pub(crate) fn set_frame_pointer(
209
23.6k
    context: &mut Context,
210
23.6k
    mut register: RegMut<FP>,
211
23.6k
    fp: Word,
212
23.6k
) {
213
23.6k
    context.update_from_frame_pointer(fp);
214
23.6k
215
23.6k
    *register = fp;
216
23.6k
}
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter/flow.rs
Line
Count
Source
1
use crate::{
2
    call::{
3
        Call,
4
        CallFrame,
5
    },
6
    constraints::reg_key::*,
7
    consts::*,
8
    context::Context,
9
    error::{
10
        IoResult,
11
        RuntimeError,
12
        SimpleResult,
13
    },
14
    interpreter::{
15
        contract::{
16
            balance_decrease,
17
            balance_increase,
18
            contract_size,
19
        },
20
        gas::{
21
            dependent_gas_charge_without_base,
22
            gas_charge,
23
            ProfileGas,
24
        },
25
        internal::{
26
            current_contract,
27
            external_asset_id_balance_sub,
28
            inc_pc,
29
            internal_contract,
30
            set_frame_pointer,
31
        },
32
        receipts::ReceiptsCtx,
33
        ExecutableTransaction,
34
        InputContracts,
35
        Interpreter,
36
        Memory,
37
        MemoryInstance,
38
        PanicContext,
39
        RuntimeBalances,
40
    },
41
    prelude::{
42
        Bug,
43
        BugVariant,
44
    },
45
    profiler::Profiler,
46
    storage::{
47
        ContractsAssetsStorage,
48
        ContractsRawCode,
49
        InterpreterStorage,
50
    },
51
};
52
use alloc::vec::Vec;
53
use core::cmp;
54
use fuel_asm::{
55
    Instruction,
56
    PanicInstruction,
57
    RegId,
58
};
59
use fuel_storage::{
60
    StorageAsRef,
61
    StorageRead,
62
    StorageSize,
63
};
64
use fuel_tx::{
65
    DependentCost,
66
    PanicReason,
67
    Receipt,
68
};
69
use fuel_types::{
70
    bytes::padded_len_usize,
71
    canonical::Serialize,
72
    AssetId,
73
    Bytes32,
74
    ContractId,
75
    Word,
76
};
77
78
#[cfg(test)]
79
mod jump_tests;
80
#[cfg(test)]
81
mod ret_tests;
82
#[cfg(test)]
83
mod tests;
84
85
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
86
where
87
    M: Memory,
88
    Tx: ExecutableTransaction,
89
{
90
92.5M
    pub(crate) fn jump(&mut self, args: JumpArgs) -> SimpleResult<()> {
91
92.5M
        let (SystemRegisters { pc, is, .. }, _) = split_registers(&mut self.registers);
92
92.5M
        args.jump(is.as_ref(), pc)
93
92.5M
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_4blob8BlobBodyNtB3L_12BlobMetadataEE4jumpB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6create10CreateBodyNtB3L_14CreateMetadataEE4jumpB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6script10ScriptBodyNtB3L_14ScriptMetadataEE4jumpB6_
Line
Count
Source
90
92.5M
    pub(crate) fn jump(&mut self, args: JumpArgs) -> SimpleResult<()> {
91
92.5M
        let (SystemRegisters { pc, is, .. }, _) = split_registers(&mut self.registers);
92
92.5M
        args.jump(is.as_ref(), pc)
93
92.5M
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_4blob8BlobBodyNtB4f_12BlobMetadataEE4jumpB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6create10CreateBodyNtB4f_14CreateMetadataEE4jumpB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6script10ScriptBodyNtB4f_14ScriptMetadataEE4jumpB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6upload10UploadBodyNtB4f_14UploadMetadataEE4jumpB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_7upgrade11UpgradeBodyNtB4f_15UpgradeMetadataEE4jumpB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1D_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2T_6script10ScriptBodyNtB4p_14ScriptMetadataEE4jumpB6_
94
95
27
    pub(crate) fn ret(&mut self, a: Word) -> SimpleResult<()> {
96
27
        let current_contract =
97
27
            current_contract(&self.context, self.registers.fp(), self.memory.as_ref())?;
98
27
        let input = RetCtx {
99
27
            receipts: &mut self.receipts,
100
27
            frames: &mut self.frames,
101
27
            registers: &mut self.registers,
102
27
            memory: self.memory.as_ref(),
103
27
            context: &mut self.context,
104
27
            current_contract,
105
27
        };
106
27
        input.ret(a)
107
27
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_4blob8BlobBodyNtB3L_12BlobMetadataEE3retB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6create10CreateBodyNtB3L_14CreateMetadataEE3retB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6script10ScriptBodyNtB3L_14ScriptMetadataEE3retB6_
Line
Count
Source
95
27
    pub(crate) fn ret(&mut self, a: Word) -> SimpleResult<()> {
96
27
        let current_contract =
97
27
            current_contract(&self.context, self.registers.fp(), self.memory.as_ref())?;
98
27
        let input = RetCtx {
99
27
            receipts: &mut self.receipts,
100
27
            frames: &mut self.frames,
101
27
            registers: &mut self.registers,
102
27
            memory: self.memory.as_ref(),
103
27
            context: &mut self.context,
104
27
            current_contract,
105
27
        };
106
27
        input.ret(a)
107
27
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_4blob8BlobBodyNtB4f_12BlobMetadataEE3retB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6create10CreateBodyNtB4f_14CreateMetadataEE3retB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6script10ScriptBodyNtB4f_14ScriptMetadataEE3retB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6upload10UploadBodyNtB4f_14UploadMetadataEE3retB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_7upgrade11UpgradeBodyNtB4f_15UpgradeMetadataEE3retB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1D_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2T_6script10ScriptBodyNtB4p_14ScriptMetadataEE3retB6_
108
109
11.3k
    pub(crate) fn ret_data(&mut self, a: Word, b: Word) -> SimpleResult<Bytes32> {
110
11.3k
        let current_contract =
111
11.3k
            current_contract(&self.context, self.registers.fp(), self.memory.as_ref())?;
112
11.3k
        let input = RetCtx {
113
11.3k
            frames: &mut self.frames,
114
11.3k
            registers: &mut self.registers,
115
11.3k
            memory: self.memory.as_mut(),
116
11.3k
            receipts: &mut self.receipts,
117
11.3k
            context: &mut self.context,
118
11.3k
            current_contract,
119
11.3k
        };
120
11.3k
        input.ret_data(a, b)
121
11.3k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_4blob8BlobBodyNtB3L_12BlobMetadataEE8ret_dataB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6create10CreateBodyNtB3L_14CreateMetadataEE8ret_dataB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6script10ScriptBodyNtB3L_14ScriptMetadataEE8ret_dataB6_
Line
Count
Source
109
11.3k
    pub(crate) fn ret_data(&mut self, a: Word, b: Word) -> SimpleResult<Bytes32> {
110
11.3k
        let current_contract =
111
11.3k
            current_contract(&self.context, self.registers.fp(), self.memory.as_ref())?;
112
11.3k
        let input = RetCtx {
113
11.3k
            frames: &mut self.frames,
114
11.3k
            registers: &mut self.registers,
115
11.3k
            memory: self.memory.as_mut(),
116
11.3k
            receipts: &mut self.receipts,
117
11.3k
            context: &mut self.context,
118
11.3k
            current_contract,
119
11.3k
        };
120
11.3k
        input.ret_data(a, b)
121
11.3k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_4blob8BlobBodyNtB4f_12BlobMetadataEE8ret_dataB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6create10CreateBodyNtB4f_14CreateMetadataEE8ret_dataB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6script10ScriptBodyNtB4f_14ScriptMetadataEE8ret_dataB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6upload10UploadBodyNtB4f_14UploadMetadataEE8ret_dataB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_7upgrade11UpgradeBodyNtB4f_15UpgradeMetadataEE8ret_dataB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1D_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2T_6script10ScriptBodyNtB4p_14ScriptMetadataEE8ret_dataB6_
122
123
10
    pub(crate) fn revert(&mut self, a: Word) -> SimpleResult<()> {
124
10
        let current_contract =
125
10
            current_contract(&self.context, self.registers.fp(), self.memory.as_ref())
126
10
                .unwrap_or(Some(ContractId::zeroed()));
127
10
        revert(
128
10
            &mut self.receipts,
129
10
            current_contract,
130
10
            self.registers.pc(),
131
10
            self.registers.is(),
132
10
            a,
133
10
        )
134
10
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_4blob8BlobBodyNtB3L_12BlobMetadataEE6revertB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6create10CreateBodyNtB3L_14CreateMetadataEE6revertB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6script10ScriptBodyNtB3L_14ScriptMetadataEE6revertB6_
Line
Count
Source
123
10
    pub(crate) fn revert(&mut self, a: Word) -> SimpleResult<()> {
124
10
        let current_contract =
125
10
            current_contract(&self.context, self.registers.fp(), self.memory.as_ref())
126
10
                .unwrap_or(Some(ContractId::zeroed()));
127
10
        revert(
128
10
            &mut self.receipts,
129
10
            current_contract,
130
10
            self.registers.pc(),
131
10
            self.registers.is(),
132
10
            a,
133
10
        )
134
10
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_4blob8BlobBodyNtB4f_12BlobMetadataEE6revertB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6create10CreateBodyNtB4f_14CreateMetadataEE6revertB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6script10ScriptBodyNtB4f_14ScriptMetadataEE6revertB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6upload10UploadBodyNtB4f_14UploadMetadataEE6revertB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_7upgrade11UpgradeBodyNtB4f_15UpgradeMetadataEE6revertB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1D_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2T_6script10ScriptBodyNtB4p_14ScriptMetadataEE6revertB6_
135
136
2.15k
    pub(crate) fn append_panic_receipt(&mut self, result: PanicInstruction) {
137
2.15k
        let pc = self.registers[RegId::PC];
138
2.15k
        let is = self.registers[RegId::IS];
139
2.15k
140
2.15k
        let mut receipt =
141
2.15k
            Receipt::panic(self.internal_contract().unwrap_or_default(), result, pc, is);
142
2.15k
143
2.15k
        match self.panic_context {
144
2.13k
            PanicContext::None => {}
145
17
            PanicContext::ContractId(contract_id) => {
146
17
                receipt = receipt.with_panic_contract_id(Some(contract_id));
147
17
            }
148
        };
149
2.15k
        self.panic_context = PanicContext::None;
150
2.15k
151
2.15k
        self.receipts
152
2.15k
            .push(receipt)
153
2.15k
            .expect("Appending a panic receipt cannot fail");
154
2.15k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_4blob8BlobBodyNtB3L_12BlobMetadataEE20append_panic_receiptB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6create10CreateBodyNtB3L_14CreateMetadataEE20append_panic_receiptB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6script10ScriptBodyNtB3L_14ScriptMetadataEE20append_panic_receiptB6_
Line
Count
Source
136
2.15k
    pub(crate) fn append_panic_receipt(&mut self, result: PanicInstruction) {
137
2.15k
        let pc = self.registers[RegId::PC];
138
2.15k
        let is = self.registers[RegId::IS];
139
2.15k
140
2.15k
        let mut receipt =
141
2.15k
            Receipt::panic(self.internal_contract().unwrap_or_default(), result, pc, is);
142
2.15k
143
2.15k
        match self.panic_context {
144
2.13k
            PanicContext::None => {}
145
17
            PanicContext::ContractId(contract_id) => {
146
17
                receipt = receipt.with_panic_contract_id(Some(contract_id));
147
17
            }
148
        };
149
2.15k
        self.panic_context = PanicContext::None;
150
2.15k
151
2.15k
        self.receipts
152
2.15k
            .push(receipt)
153
2.15k
            .expect("Appending a panic receipt cannot fail");
154
2.15k
    }
155
}
156
157
struct RetCtx<'vm> {
158
    frames: &'vm mut Vec<CallFrame>,
159
    registers: &'vm mut [Word; VM_REGISTER_COUNT],
160
    memory: &'vm MemoryInstance,
161
    receipts: &'vm mut ReceiptsCtx,
162
    context: &'vm mut Context,
163
    current_contract: Option<ContractId>,
164
}
165
166
impl RetCtx<'_> {
167
27
    pub(crate) fn ret(self, a: Word) -> SimpleResult<()> {
168
27
        let receipt = Receipt::ret(
169
27
            self.current_contract.unwrap_or_else(ContractId::zeroed),
170
27
            a,
171
27
            self.registers[RegId::PC],
172
27
            self.registers[RegId::IS],
173
27
        );
174
27
175
27
        self.registers[RegId::RET] = a;
176
27
        self.registers[RegId::RETL] = 0;
177
27
178
27
        // TODO if ret instruction is in memory boundary, inc_pc shouldn't fail
179
27
        self.return_from_context(receipt)
180
27
    }
181
182
11.3k
    pub(crate) fn return_from_context(mut self, receipt: Receipt) -> SimpleResult<()> {
183
11.3k
        if let Some(frame) = self.frames.pop() {
184
11.3k
            let registers = &mut self.registers;
185
11.3k
            let context = &mut self.context;
186
187
11.3k
            registers[RegId::CGAS] = registers[RegId::CGAS]
188
11.3k
                .checked_add(frame.context_gas())
189
11.3k
                .ok_or_else(|| Bug::new(BugVariant::ContextGasOverflow))?;
190
191
11.3k
            let cgas = registers[RegId::CGAS];
192
11.3k
            let ggas = registers[RegId::GGAS];
193
11.3k
            let ret = registers[RegId::RET];
194
11.3k
            let retl = registers[RegId::RETL];
195
11.3k
            let hp = registers[RegId::HP];
196
11.3k
197
11.3k
            registers.copy_from_slice(frame.registers());
198
11.3k
199
11.3k
            registers[RegId::CGAS] = cgas;
200
11.3k
            registers[RegId::GGAS] = ggas;
201
11.3k
            registers[RegId::RET] = ret;
202
11.3k
            registers[RegId::RETL] = retl;
203
11.3k
            registers[RegId::HP] = hp;
204
11.3k
205
11.3k
            let fp = registers[RegId::FP];
206
11.3k
            set_frame_pointer(context, registers.fp_mut(), fp);
207
27
        }
208
209
11.3k
        self.receipts.push(receipt)?;
210
211
11.3k
        Ok(inc_pc(self.registers.pc_mut())?)
212
11.3k
    }
213
214
11.3k
    pub(crate) fn ret_data(self, a: Word, b: Word) -> SimpleResult<Bytes32> {
215
11.3k
        let data = self.memory.read(a, b)?.to_vec();
216
11.3k
217
11.3k
        let receipt = Receipt::return_data(
218
11.3k
            self.current_contract.unwrap_or_else(ContractId::zeroed),
219
11.3k
            a,
220
11.3k
            self.registers[RegId::PC],
221
11.3k
            self.registers[RegId::IS],
222
11.3k
            data,
223
11.3k
        );
224
11.3k
        let digest = *receipt
225
11.3k
            .digest()
226
11.3k
            .expect("Receipt is created above and `digest` should exist");
227
11.3k
228
11.3k
        self.registers[RegId::RET] = a;
229
11.3k
        self.registers[RegId::RETL] = b;
230
11.3k
231
11.3k
        self.return_from_context(receipt)?;
232
233
11.3k
        Ok(digest)
234
11.3k
    }
235
}
236
237
10
pub(crate) fn revert(
238
10
    receipts: &mut ReceiptsCtx,
239
10
    current_contract: Option<ContractId>,
240
10
    pc: Reg<PC>,
241
10
    is: Reg<IS>,
242
10
    a: Word,
243
10
) -> SimpleResult<()> {
244
10
    let receipt = Receipt::revert(
245
10
        current_contract.unwrap_or_else(ContractId::zeroed),
246
10
        a,
247
10
        *pc,
248
10
        *is,
249
10
    );
250
10
251
10
    receipts.push(receipt)
252
10
}
253
254
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
255
pub enum JumpMode {
256
    /// `$pc = $is + address`
257
    Absolute,
258
    /// `$pc = $pc + address`
259
    RelativeForwards,
260
    /// `$pc = $pc - address`
261
    RelativeBackwards,
262
}
263
264
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
265
pub struct JumpArgs {
266
    /// Condition. The jump is performed only if this is true.
267
    condition: bool,
268
    /// The kind of jump performed
269
    mode: JumpMode,
270
    /// Dynamic part of the jump target, i.e. register value
271
    dynamic: Word,
272
    /// Fixed part of the jump target, i.e. immediate value
273
    fixed: Word,
274
}
275
276
impl JumpArgs {
277
92.5M
    pub(crate) fn new(mode: JumpMode) -> Self {
278
92.5M
        Self {
279
92.5M
            condition: true,
280
92.5M
            mode,
281
92.5M
            dynamic: 0,
282
92.5M
            fixed: 0,
283
92.5M
        }
284
92.5M
    }
285
286
46.6M
    pub(crate) fn with_condition(mut self, condition: bool) -> Self {
287
46.6M
        self.condition = condition;
288
46.6M
        self
289
46.6M
    }
290
291
92.5M
    pub(crate) fn to_address(mut self, addr: Word) -> Self {
292
92.5M
        self.dynamic = addr;
293
92.5M
        self
294
92.5M
    }
295
296
16.8M
    pub(crate) fn plus_fixed(mut self, addr: Word) -> Self {
297
16.8M
        self.fixed = addr;
298
16.8M
        self
299
16.8M
    }
300
301
92.5M
    pub(crate) fn jump(&self, is: Reg<IS>, mut pc: RegMut<PC>) -> SimpleResult<()> {
302
92.5M
        if !self.condition {
303
17.3M
            return Ok(inc_pc(pc)?)
304
75.2M
        }
305
306
75.2M
        let offset_instructions = match self.mode {
307
61.1M
            JumpMode::Absolute => self.dynamic.saturating_add(self.fixed),
308
            // Here +1 is added since jumping to the jump instruction itself doesn't make
309
            // sense
310
            JumpMode::RelativeForwards | JumpMode::RelativeBackwards => {
311
14.1M
                self.dynamic.saturating_add(self.fixed).saturating_add(1)
312
            }
313
        };
314
315
75.2M
        let offset_bytes = offset_instructions.saturating_mul(Instruction::SIZE as Word);
316
317
75.2M
        let target_addr = match self.mode {
318
61.1M
            JumpMode::Absolute => is.saturating_add(offset_bytes),
319
921k
            JumpMode::RelativeForwards => pc.saturating_add(offset_bytes),
320
13.1M
            JumpMode::RelativeBackwards => pc
321
13.1M
                .checked_sub(offset_bytes)
322
13.1M
                .ok_or(PanicReason::MemoryOverflow)?,
323
        };
324
325
75.2M
        if target_addr >= VM_MAX_RAM {
326
10
            return Err(PanicReason::MemoryOverflow.into())
327
75.2M
        }
328
75.2M
329
75.2M
        *pc = target_addr;
330
75.2M
        Ok(())
331
92.5M
    }
332
}
333
334
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
335
where
336
    M: Memory,
337
    S: InterpreterStorage,
338
    Tx: ExecutableTransaction,
339
{
340
    /// Prepare a call instruction for execution
341
12.3k
    pub fn prepare_call(
342
12.3k
        &mut self,
343
12.3k
        ra: RegId,
344
12.3k
        rb: RegId,
345
12.3k
        rc: RegId,
346
12.3k
        rd: RegId,
347
12.3k
    ) -> IoResult<(), S::DataError> {
348
12.3k
        self.prepare_call_inner(
349
12.3k
            self.registers[ra],
350
12.3k
            self.registers[rb],
351
12.3k
            self.registers[rc],
352
12.3k
            self.registers[rd],
353
12.3k
        )
354
12.3k
    }
Unexecuted instantiation: _RNvMs1_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2i_4blob8BlobBodyNtB3O_12BlobMetadataEE12prepare_callB9_
Unexecuted instantiation: _RNvMs1_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2i_6create10CreateBodyNtB3O_14CreateMetadataEE12prepare_callB9_
_RNvMs1_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2i_6script10ScriptBodyNtB3O_14ScriptMetadataEE12prepare_callB9_
Line
Count
Source
341
12.3k
    pub fn prepare_call(
342
12.3k
        &mut self,
343
12.3k
        ra: RegId,
344
12.3k
        rb: RegId,
345
12.3k
        rc: RegId,
346
12.3k
        rd: RegId,
347
12.3k
    ) -> IoResult<(), S::DataError> {
348
12.3k
        self.prepare_call_inner(
349
12.3k
            self.registers[ra],
350
12.3k
            self.registers[rb],
351
12.3k
            self.registers[rc],
352
12.3k
            self.registers[rd],
353
12.3k
        )
354
12.3k
    }
Unexecuted instantiation: _RNvMs1_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1E_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2M_4blob8BlobBodyNtB4i_12BlobMetadataEE12prepare_callB9_
Unexecuted instantiation: _RNvMs1_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1E_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2M_6create10CreateBodyNtB4i_14CreateMetadataEE12prepare_callB9_
Unexecuted instantiation: _RNvMs1_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1E_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2M_6script10ScriptBodyNtB4i_14ScriptMetadataEE12prepare_callB9_
Unexecuted instantiation: _RNvMs1_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1E_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2M_6upload10UploadBodyNtB4i_14UploadMetadataEE12prepare_callB9_
Unexecuted instantiation: _RNvMs1_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1E_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2M_7upgrade11UpgradeBodyNtB4i_15UpgradeMetadataEE12prepare_callB9_
Unexecuted instantiation: _RNvMs1_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtNtB1G_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2W_6script10ScriptBodyNtB4s_14ScriptMetadataEE12prepare_callB9_
355
356
    /// Prepare a call instruction for execution
357
12.3k
    fn prepare_call_inner(
358
12.3k
        &mut self,
359
12.3k
        call_params_pointer: Word,
360
12.3k
        amount_of_coins_to_forward: Word,
361
12.3k
        asset_id_pointer: Word,
362
12.3k
        amount_of_gas_to_forward: Word,
363
12.3k
    ) -> IoResult<(), S::DataError> {
364
12.3k
        let params = PrepareCallParams {
365
12.3k
            call_params_pointer,
366
12.3k
            asset_id_pointer,
367
12.3k
            amount_of_coins_to_forward,
368
12.3k
            amount_of_gas_to_forward,
369
12.3k
        };
370
12.3k
        let gas_cost = self.gas_costs().call();
371
12.3k
        let new_storage_gas_per_byte = self.gas_costs().new_storage_per_byte();
372
12.3k
        // Charge only for the `base` execution.
373
12.3k
        // We will charge for the frame size in the `prepare_call`.
374
12.3k
        self.gas_charge(gas_cost.base())?;
375
12.3k
        let current_contract =
376
12.3k
            current_contract(&self.context, self.registers.fp(), self.memory.as_ref())?;
377
378
12.3k
        PrepareCallCtx {
379
12.3k
            params,
380
12.3k
            registers: (&mut self.registers).into(),
381
12.3k
            memory: self.memory.as_mut(),
382
12.3k
            context: &mut self.context,
383
12.3k
            gas_cost,
384
12.3k
            runtime_balances: &mut self.balances,
385
12.3k
            storage: &mut self.storage,
386
12.3k
            input_contracts: InputContracts::new(
387
12.3k
                &self.input_contracts,
388
12.3k
                &mut self.panic_context,
389
12.3k
            ),
390
12.3k
            new_storage_gas_per_byte,
391
12.3k
            receipts: &mut self.receipts,
392
12.3k
            frames: &mut self.frames,
393
12.3k
            current_contract,
394
12.3k
            profiler: &mut self.profiler,
395
12.3k
        }
396
12.3k
        .prepare_call()
397
12.3k
    }
Unexecuted instantiation: _RNvMs1_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2i_4blob8BlobBodyNtB3O_12BlobMetadataEE18prepare_call_innerB9_
Unexecuted instantiation: _RNvMs1_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2i_6create10CreateBodyNtB3O_14CreateMetadataEE18prepare_call_innerB9_
_RNvMs1_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2i_6script10ScriptBodyNtB3O_14ScriptMetadataEE18prepare_call_innerB9_
Line
Count
Source
357
12.3k
    fn prepare_call_inner(
358
12.3k
        &mut self,
359
12.3k
        call_params_pointer: Word,
360
12.3k
        amount_of_coins_to_forward: Word,
361
12.3k
        asset_id_pointer: Word,
362
12.3k
        amount_of_gas_to_forward: Word,
363
12.3k
    ) -> IoResult<(), S::DataError> {
364
12.3k
        let params = PrepareCallParams {
365
12.3k
            call_params_pointer,
366
12.3k
            asset_id_pointer,
367
12.3k
            amount_of_coins_to_forward,
368
12.3k
            amount_of_gas_to_forward,
369
12.3k
        };
370
12.3k
        let gas_cost = self.gas_costs().call();
371
12.3k
        let new_storage_gas_per_byte = self.gas_costs().new_storage_per_byte();
372
12.3k
        // Charge only for the `base` execution.
373
12.3k
        // We will charge for the frame size in the `prepare_call`.
374
12.3k
        self.gas_charge(gas_cost.base())?;
375
12.3k
        let current_contract =
376
12.3k
            current_contract(&self.context, self.registers.fp(), self.memory.as_ref())?;
377
378
12.3k
        PrepareCallCtx {
379
12.3k
            params,
380
12.3k
            registers: (&mut self.registers).into(),
381
12.3k
            memory: self.memory.as_mut(),
382
12.3k
            context: &mut self.context,
383
12.3k
            gas_cost,
384
12.3k
            runtime_balances: &mut self.balances,
385
12.3k
            storage: &mut self.storage,
386
12.3k
            input_contracts: InputContracts::new(
387
12.3k
                &self.input_contracts,
388
12.3k
                &mut self.panic_context,
389
12.3k
            ),
390
12.3k
            new_storage_gas_per_byte,
391
12.3k
            receipts: &mut self.receipts,
392
12.3k
            frames: &mut self.frames,
393
12.3k
            current_contract,
394
12.3k
            profiler: &mut self.profiler,
395
12.3k
        }
396
12.3k
        .prepare_call()
397
12.3k
    }
Unexecuted instantiation: _RNvMs1_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1E_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2M_4blob8BlobBodyNtB4i_12BlobMetadataEE18prepare_call_innerB9_
Unexecuted instantiation: _RNvMs1_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1E_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2M_6create10CreateBodyNtB4i_14CreateMetadataEE18prepare_call_innerB9_
Unexecuted instantiation: _RNvMs1_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1E_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2M_6script10ScriptBodyNtB4i_14ScriptMetadataEE18prepare_call_innerB9_
Unexecuted instantiation: _RNvMs1_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1E_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2M_6upload10UploadBodyNtB4i_14UploadMetadataEE18prepare_call_innerB9_
Unexecuted instantiation: _RNvMs1_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1E_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2M_7upgrade11UpgradeBodyNtB4i_15UpgradeMetadataEE18prepare_call_innerB9_
Unexecuted instantiation: _RNvMs1_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtNtB1G_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2W_6script10ScriptBodyNtB4s_14ScriptMetadataEE18prepare_call_innerB9_
398
}
399
400
#[cfg_attr(test, derive(Default))]
401
struct PrepareCallParams {
402
    /// Register A of input
403
    pub call_params_pointer: Word,
404
    /// Register B of input
405
    pub amount_of_coins_to_forward: Word,
406
    /// Register C of input
407
    pub asset_id_pointer: Word,
408
    /// Register D of input
409
    pub amount_of_gas_to_forward: Word,
410
}
411
412
struct PrepareCallSystemRegisters<'a> {
413
    hp: Reg<'a, HP>,
414
    sp: RegMut<'a, SP>,
415
    ssp: RegMut<'a, SSP>,
416
    fp: RegMut<'a, FP>,
417
    pc: RegMut<'a, PC>,
418
    is: RegMut<'a, IS>,
419
    bal: RegMut<'a, BAL>,
420
    cgas: RegMut<'a, CGAS>,
421
    ggas: RegMut<'a, GGAS>,
422
    flag: RegMut<'a, FLAG>,
423
}
424
425
struct PrepareCallRegisters<'a> {
426
    system_registers: PrepareCallSystemRegisters<'a>,
427
    program_registers: ProgramRegistersRef<'a>,
428
    unused_registers: PrepareCallUnusedRegisters<'a>,
429
}
430
431
struct PrepareCallUnusedRegisters<'a> {
432
    zero: Reg<'a, ZERO>,
433
    one: Reg<'a, ONE>,
434
    of: Reg<'a, OF>,
435
    err: Reg<'a, ERR>,
436
    ret: Reg<'a, RET>,
437
    retl: Reg<'a, RETL>,
438
}
439
440
impl<'a> PrepareCallRegisters<'a> {
441
12.3k
    fn copy_registers(&self) -> [Word; VM_REGISTER_COUNT] {
442
12.3k
        copy_registers(&self.into(), &self.program_registers)
443
12.3k
    }
444
}
445
446
struct PrepareCallCtx<'vm, S> {
447
    params: PrepareCallParams,
448
    registers: PrepareCallRegisters<'vm>,
449
    memory: &'vm mut MemoryInstance,
450
    context: &'vm mut Context,
451
    gas_cost: DependentCost,
452
    runtime_balances: &'vm mut RuntimeBalances,
453
    new_storage_gas_per_byte: Word,
454
    storage: &'vm mut S,
455
    input_contracts: InputContracts<'vm>,
456
    receipts: &'vm mut ReceiptsCtx,
457
    frames: &'vm mut Vec<CallFrame>,
458
    current_contract: Option<ContractId>,
459
    profiler: &'vm mut Profiler,
460
}
461
462
impl<'vm, S> PrepareCallCtx<'vm, S>
463
where
464
    S: InterpreterStorage,
465
{
466
12.3k
    fn prepare_call(mut self) -> IoResult<(), S::DataError>
467
12.3k
    where
468
12.3k
        S: StorageSize<ContractsRawCode>
469
12.3k
            + ContractsAssetsStorage
470
12.3k
            + StorageRead<ContractsRawCode>
471
12.3k
            + StorageAsRef,
472
12.3k
    {
473
12.3k
        let call_bytes = self
474
12.3k
            .memory
475
12.3k
            .read(self.params.call_params_pointer, Call::LEN)?;
476
12.3k
        let call = Call::try_from(call_bytes)?;
477
12.3k
        let asset_id =
478
12.3k
            AssetId::new(self.memory.read_bytes(self.params.asset_id_pointer)?);
479
480
12.3k
        let code_size = contract_size(&self.storage, call.to())? as usize;
481
12.3k
        let code_size_padded =
482
12.3k
            padded_len_usize(code_size).ok_or(PanicReason::MemoryOverflow)?;
483
484
12.3k
        let total_size_in_stack = CallFrame::serialized_size()
485
12.3k
            .checked_add(code_size_padded)
486
12.3k
            .ok_or_else(|| Bug::new(BugVariant::CodeSizeOverflow))?;
Unexecuted instantiation: _RNCNvMs3_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB7_14PrepareCallCtxINtNtNtBb_7storage9predicate16PredicateStorageRNtB1e_12EmptyStorageEE12prepare_call0Bb_
Unexecuted instantiation: _RNCNvMs3_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB7_14PrepareCallCtxINtNtNtBb_7storage9predicate16PredicateStorageRNtNtB1g_6memory13MemoryStorageEE12prepare_call0Bb_
Unexecuted instantiation: _RNCNvMs3_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB7_14PrepareCallCtxNtNtNtBb_7storage6memory13MemoryStorageE12prepare_call0Bb_
487
488
12.3k
        let profiler = ProfileGas {
489
12.3k
            pc: self.registers.system_registers.pc.as_ref(),
490
12.3k
            is: self.registers.system_registers.is.as_ref(),
491
12.3k
            current_contract: self.current_contract,
492
12.3k
            profiler: self.profiler,
493
12.3k
        };
494
12.3k
        dependent_gas_charge_without_base(
495
12.3k
            self.registers.system_registers.cgas.as_mut(),
496
12.3k
            self.registers.system_registers.ggas.as_mut(),
497
12.3k
            profiler,
498
12.3k
            self.gas_cost,
499
12.3k
            code_size_padded as Word,
500
12.3k
        )?;
501
502
12.3k
        if let Some(source_contract) = self.current_contract {
503
890
            balance_decrease(
504
890
                self.storage,
505
890
                &source_contract,
506
890
                &asset_id,
507
890
                self.params.amount_of_coins_to_forward,
508
890
            )?;
509
        } else {
510
11.4k
            let amount = self.params.amount_of_coins_to_forward;
511
11.4k
            external_asset_id_balance_sub(
512
11.4k
                self.runtime_balances,
513
11.4k
                self.memory,
514
11.4k
                &asset_id,
515
11.4k
                amount,
516
11.4k
            )?;
517
        }
518
519
12.3k
        self.input_contracts.check(call.to())?;
520
521
        // credit contract asset_id balance
522
12.3k
        let (_, created_new_entry) = balance_increase(
523
12.3k
            self.storage,
524
12.3k
            call.to(),
525
12.3k
            &asset_id,
526
12.3k
            self.params.amount_of_coins_to_forward,
527
12.3k
        )?;
528
529
12.3k
        if created_new_entry {
530
            // If a new entry was created, we must charge gas for it
531
186
            let profiler = ProfileGas {
532
186
                pc: self.registers.system_registers.pc.as_ref(),
533
186
                is: self.registers.system_registers.is.as_ref(),
534
186
                current_contract: self.current_contract,
535
186
                profiler: self.profiler,
536
186
            };
537
186
            gas_charge(
538
186
                self.registers.system_registers.cgas.as_mut(),
539
186
                self.registers.system_registers.ggas.as_mut(),
540
186
                profiler,
541
186
                ((Bytes32::LEN + WORD_SIZE) as u64)
542
186
                    .saturating_mul(self.new_storage_gas_per_byte),
543
186
            )?;
544
12.1k
        }
545
546
12.3k
        let forward_gas_amount = cmp::min(
547
12.3k
            *self.registers.system_registers.cgas,
548
12.3k
            self.params.amount_of_gas_to_forward,
549
12.3k
        );
550
551
        // subtract gas
552
12.3k
        *self.registers.system_registers.cgas = (*self.registers.system_registers.cgas)
553
12.3k
            .checked_sub(forward_gas_amount)
554
12.3k
            .ok_or_else(|| Bug::new(BugVariant::ContextGasUnderflow))?;
Unexecuted instantiation: _RNCNvMs3_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB7_14PrepareCallCtxINtNtNtBb_7storage9predicate16PredicateStorageRNtB1e_12EmptyStorageEE12prepare_calls_0Bb_
Unexecuted instantiation: _RNCNvMs3_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB7_14PrepareCallCtxINtNtNtBb_7storage9predicate16PredicateStorageRNtNtB1g_6memory13MemoryStorageEE12prepare_calls_0Bb_
Unexecuted instantiation: _RNCNvMs3_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB7_14PrepareCallCtxNtNtNtBb_7storage6memory13MemoryStorageE12prepare_calls_0Bb_
555
556
        // Construct frame
557
12.3k
        let mut frame = CallFrame::new(
558
12.3k
            *call.to(),
559
12.3k
            asset_id,
560
12.3k
            self.registers.copy_registers(),
561
12.3k
            code_size_padded,
562
12.3k
            call.a(),
563
12.3k
            call.b(),
564
12.3k
        )
565
12.3k
        .ok_or(PanicReason::MemoryOverflow)?;
566
12.3k
        *frame.context_gas_mut() = *self.registers.system_registers.cgas;
567
12.3k
        *frame.global_gas_mut() = *self.registers.system_registers.ggas;
568
12.3k
569
12.3k
        // Allocate stack memory
570
12.3k
        let old_sp = *self.registers.system_registers.sp;
571
12.3k
        let new_sp = old_sp.saturating_add(total_size_in_stack as Word);
572
12.3k
        self.memory.grow_stack(new_sp)?;
573
12.3k
        *self.registers.system_registers.sp = new_sp;
574
12.3k
        *self.registers.system_registers.ssp = new_sp;
575
12.3k
576
12.3k
        let id = internal_contract(
577
12.3k
            self.context,
578
12.3k
            self.registers.system_registers.fp.as_ref(),
579
12.3k
            self.memory,
580
12.3k
        )
581
12.3k
        .unwrap_or_default();
582
12.3k
583
12.3k
        set_frame_pointer(
584
12.3k
            self.context,
585
12.3k
            self.registers.system_registers.fp.as_mut(),
586
12.3k
            old_sp,
587
12.3k
        );
588
589
        // Write the frame to memory
590
        // Ownership checks are disabled because we just allocated the memory above.
591
12.3k
        let dst = self.memory.write_noownerchecks(
592
12.3k
            *self.registers.system_registers.fp,
593
12.3k
            total_size_in_stack,
594
12.3k
        )?;
595
12.3k
        let (mem_frame, mem_code) = dst.split_at_mut(CallFrame::serialized_size());
596
12.3k
        mem_frame.copy_from_slice(&frame.to_bytes());
597
12.3k
        let (mem_code, mem_code_padding) = mem_code.split_at_mut(code_size);
598
12.3k
        read_contract(call.to(), self.storage, mem_code)?;
599
12.3k
        mem_code_padding.fill(0);
600
12.3k
601
12.3k
        #[allow(clippy::arithmetic_side_effects)] // Checked above
602
12.3k
        let code_start =
603
12.3k
            (*self.registers.system_registers.fp) + CallFrame::serialized_size() as Word;
604
12.3k
605
12.3k
        *self.registers.system_registers.pc = code_start;
606
12.3k
        *self.registers.system_registers.bal = self.params.amount_of_coins_to_forward;
607
12.3k
        *self.registers.system_registers.is = *self.registers.system_registers.pc;
608
12.3k
        *self.registers.system_registers.cgas = forward_gas_amount;
609
12.3k
        *self.registers.system_registers.flag = 0;
610
12.3k
611
12.3k
        let receipt = Receipt::call(
612
12.3k
            id,
613
12.3k
            *call.to(),
614
12.3k
            self.params.amount_of_coins_to_forward,
615
12.3k
            asset_id,
616
12.3k
            forward_gas_amount,
617
12.3k
            call.a(),
618
12.3k
            call.b(),
619
12.3k
            *self.registers.system_registers.pc,
620
12.3k
            *self.registers.system_registers.is,
621
12.3k
        );
622
12.3k
623
12.3k
        self.receipts.push(receipt)?;
624
625
12.3k
        self.frames.push(frame);
626
12.3k
627
12.3k
        Ok(())
628
12.3k
    }
Unexecuted instantiation: _RNvMs3_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB5_14PrepareCallCtxINtNtNtB9_7storage9predicate16PredicateStorageRNtB1c_12EmptyStorageEE12prepare_callB9_
Unexecuted instantiation: _RNvMs3_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB5_14PrepareCallCtxINtNtNtB9_7storage9predicate16PredicateStorageRNtNtB1e_6memory13MemoryStorageEE12prepare_callB9_
_RNvMs3_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flowINtB5_14PrepareCallCtxNtNtNtB9_7storage6memory13MemoryStorageE12prepare_callB9_
Line
Count
Source
466
12.3k
    fn prepare_call(mut self) -> IoResult<(), S::DataError>
467
12.3k
    where
468
12.3k
        S: StorageSize<ContractsRawCode>
469
12.3k
            + ContractsAssetsStorage
470
12.3k
            + StorageRead<ContractsRawCode>
471
12.3k
            + StorageAsRef,
472
12.3k
    {
473
12.3k
        let call_bytes = self
474
12.3k
            .memory
475
12.3k
            .read(self.params.call_params_pointer, Call::LEN)?;
476
12.3k
        let call = Call::try_from(call_bytes)?;
477
12.3k
        let asset_id =
478
12.3k
            AssetId::new(self.memory.read_bytes(self.params.asset_id_pointer)?);
479
480
12.3k
        let code_size = contract_size(&self.storage, call.to())? as usize;
481
12.3k
        let code_size_padded =
482
12.3k
            padded_len_usize(code_size).ok_or(PanicReason::MemoryOverflow)?;
483
484
12.3k
        let total_size_in_stack = CallFrame::serialized_size()
485
12.3k
            .checked_add(code_size_padded)
486
12.3k
            .ok_or_else(|| Bug::new(BugVariant::CodeSizeOverflow))?;
487
488
12.3k
        let profiler = ProfileGas {
489
12.3k
            pc: self.registers.system_registers.pc.as_ref(),
490
12.3k
            is: self.registers.system_registers.is.as_ref(),
491
12.3k
            current_contract: self.current_contract,
492
12.3k
            profiler: self.profiler,
493
12.3k
        };
494
12.3k
        dependent_gas_charge_without_base(
495
12.3k
            self.registers.system_registers.cgas.as_mut(),
496
12.3k
            self.registers.system_registers.ggas.as_mut(),
497
12.3k
            profiler,
498
12.3k
            self.gas_cost,
499
12.3k
            code_size_padded as Word,
500
12.3k
        )?;
501
502
12.3k
        if let Some(source_contract) = self.current_contract {
503
890
            balance_decrease(
504
890
                self.storage,
505
890
                &source_contract,
506
890
                &asset_id,
507
890
                self.params.amount_of_coins_to_forward,
508
890
            )?;
509
        } else {
510
11.4k
            let amount = self.params.amount_of_coins_to_forward;
511
11.4k
            external_asset_id_balance_sub(
512
11.4k
                self.runtime_balances,
513
11.4k
                self.memory,
514
11.4k
                &asset_id,
515
11.4k
                amount,
516
11.4k
            )?;
517
        }
518
519
12.3k
        self.input_contracts.check(call.to())?;
520
521
        // credit contract asset_id balance
522
12.3k
        let (_, created_new_entry) = balance_increase(
523
12.3k
            self.storage,
524
12.3k
            call.to(),
525
12.3k
            &asset_id,
526
12.3k
            self.params.amount_of_coins_to_forward,
527
12.3k
        )?;
528
529
12.3k
        if created_new_entry {
530
            // If a new entry was created, we must charge gas for it
531
186
            let profiler = ProfileGas {
532
186
                pc: self.registers.system_registers.pc.as_ref(),
533
186
                is: self.registers.system_registers.is.as_ref(),
534
186
                current_contract: self.current_contract,
535
186
                profiler: self.profiler,
536
186
            };
537
186
            gas_charge(
538
186
                self.registers.system_registers.cgas.as_mut(),
539
186
                self.registers.system_registers.ggas.as_mut(),
540
186
                profiler,
541
186
                ((Bytes32::LEN + WORD_SIZE) as u64)
542
186
                    .saturating_mul(self.new_storage_gas_per_byte),
543
186
            )?;
544
12.1k
        }
545
546
12.3k
        let forward_gas_amount = cmp::min(
547
12.3k
            *self.registers.system_registers.cgas,
548
12.3k
            self.params.amount_of_gas_to_forward,
549
12.3k
        );
550
551
        // subtract gas
552
12.3k
        *self.registers.system_registers.cgas = (*self.registers.system_registers.cgas)
553
12.3k
            .checked_sub(forward_gas_amount)
554
12.3k
            .ok_or_else(|| Bug::new(BugVariant::ContextGasUnderflow))?;
555
556
        // Construct frame
557
12.3k
        let mut frame = CallFrame::new(
558
12.3k
            *call.to(),
559
12.3k
            asset_id,
560
12.3k
            self.registers.copy_registers(),
561
12.3k
            code_size_padded,
562
12.3k
            call.a(),
563
12.3k
            call.b(),
564
12.3k
        )
565
12.3k
        .ok_or(PanicReason::MemoryOverflow)?;
566
12.3k
        *frame.context_gas_mut() = *self.registers.system_registers.cgas;
567
12.3k
        *frame.global_gas_mut() = *self.registers.system_registers.ggas;
568
12.3k
569
12.3k
        // Allocate stack memory
570
12.3k
        let old_sp = *self.registers.system_registers.sp;
571
12.3k
        let new_sp = old_sp.saturating_add(total_size_in_stack as Word);
572
12.3k
        self.memory.grow_stack(new_sp)?;
573
12.3k
        *self.registers.system_registers.sp = new_sp;
574
12.3k
        *self.registers.system_registers.ssp = new_sp;
575
12.3k
576
12.3k
        let id = internal_contract(
577
12.3k
            self.context,
578
12.3k
            self.registers.system_registers.fp.as_ref(),
579
12.3k
            self.memory,
580
12.3k
        )
581
12.3k
        .unwrap_or_default();
582
12.3k
583
12.3k
        set_frame_pointer(
584
12.3k
            self.context,
585
12.3k
            self.registers.system_registers.fp.as_mut(),
586
12.3k
            old_sp,
587
12.3k
        );
588
589
        // Write the frame to memory
590
        // Ownership checks are disabled because we just allocated the memory above.
591
12.3k
        let dst = self.memory.write_noownerchecks(
592
12.3k
            *self.registers.system_registers.fp,
593
12.3k
            total_size_in_stack,
594
12.3k
        )?;
595
12.3k
        let (mem_frame, mem_code) = dst.split_at_mut(CallFrame::serialized_size());
596
12.3k
        mem_frame.copy_from_slice(&frame.to_bytes());
597
12.3k
        let (mem_code, mem_code_padding) = mem_code.split_at_mut(code_size);
598
12.3k
        read_contract(call.to(), self.storage, mem_code)?;
599
12.3k
        mem_code_padding.fill(0);
600
12.3k
601
12.3k
        #[allow(clippy::arithmetic_side_effects)] // Checked above
602
12.3k
        let code_start =
603
12.3k
            (*self.registers.system_registers.fp) + CallFrame::serialized_size() as Word;
604
12.3k
605
12.3k
        *self.registers.system_registers.pc = code_start;
606
12.3k
        *self.registers.system_registers.bal = self.params.amount_of_coins_to_forward;
607
12.3k
        *self.registers.system_registers.is = *self.registers.system_registers.pc;
608
12.3k
        *self.registers.system_registers.cgas = forward_gas_amount;
609
12.3k
        *self.registers.system_registers.flag = 0;
610
12.3k
611
12.3k
        let receipt = Receipt::call(
612
12.3k
            id,
613
12.3k
            *call.to(),
614
12.3k
            self.params.amount_of_coins_to_forward,
615
12.3k
            asset_id,
616
12.3k
            forward_gas_amount,
617
12.3k
            call.a(),
618
12.3k
            call.b(),
619
12.3k
            *self.registers.system_registers.pc,
620
12.3k
            *self.registers.system_registers.is,
621
12.3k
        );
622
12.3k
623
12.3k
        self.receipts.push(receipt)?;
624
625
12.3k
        self.frames.push(frame);
626
12.3k
627
12.3k
        Ok(())
628
12.3k
    }
629
}
630
631
12.3k
fn read_contract<S>(
632
12.3k
    contract: &ContractId,
633
12.3k
    storage: &S,
634
12.3k
    dst: &mut [u8],
635
12.3k
) -> IoResult<(), S::Error>
636
12.3k
where
637
12.3k
    S: StorageSize<ContractsRawCode> + StorageRead<ContractsRawCode> + StorageAsRef,
638
12.3k
{
639
12.3k
    let bytes_read = storage
640
12.3k
        .storage::<ContractsRawCode>()
641
12.3k
        .read(contract, dst)
642
12.3k
        .map_err(RuntimeError::Storage)?
643
12.3k
        .ok_or(PanicReason::ContractNotFound)?;
644
12.3k
    if bytes_read != dst.len() {
645
0
        return Err(PanicReason::ContractMismatch.into())
646
12.3k
    }
647
12.3k
    Ok(())
648
12.3k
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flow13read_contractINtNtNtB6_7storage9predicate16PredicateStorageRNtB12_12EmptyStorageEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flow13read_contractINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB14_6memory13MemoryStorageEEB6_
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4flow13read_contractNtNtNtB6_7storage6memory13MemoryStorageEB6_
Line
Count
Source
631
12.3k
fn read_contract<S>(
632
12.3k
    contract: &ContractId,
633
12.3k
    storage: &S,
634
12.3k
    dst: &mut [u8],
635
12.3k
) -> IoResult<(), S::Error>
636
12.3k
where
637
12.3k
    S: StorageSize<ContractsRawCode> + StorageRead<ContractsRawCode> + StorageAsRef,
638
12.3k
{
639
12.3k
    let bytes_read = storage
640
12.3k
        .storage::<ContractsRawCode>()
641
12.3k
        .read(contract, dst)
642
12.3k
        .map_err(RuntimeError::Storage)?
643
12.3k
        .ok_or(PanicReason::ContractNotFound)?;
644
12.3k
    if bytes_read != dst.len() {
645
0
        return Err(PanicReason::ContractMismatch.into())
646
12.3k
    }
647
12.3k
    Ok(())
648
12.3k
}
649
650
impl<'a> From<&'a PrepareCallRegisters<'_>> for SystemRegistersRef<'a> {
651
12.3k
    fn from(registers: &'a PrepareCallRegisters) -> Self {
652
12.3k
        Self {
653
12.3k
            hp: registers.system_registers.hp,
654
12.3k
            sp: registers.system_registers.sp.as_ref(),
655
12.3k
            ssp: registers.system_registers.ssp.as_ref(),
656
12.3k
            fp: registers.system_registers.fp.as_ref(),
657
12.3k
            pc: registers.system_registers.pc.as_ref(),
658
12.3k
            is: registers.system_registers.is.as_ref(),
659
12.3k
            bal: registers.system_registers.bal.as_ref(),
660
12.3k
            cgas: registers.system_registers.cgas.as_ref(),
661
12.3k
            ggas: registers.system_registers.ggas.as_ref(),
662
12.3k
            flag: registers.system_registers.flag.as_ref(),
663
12.3k
            zero: registers.unused_registers.zero,
664
12.3k
            one: registers.unused_registers.one,
665
12.3k
            of: registers.unused_registers.of,
666
12.3k
            err: registers.unused_registers.err,
667
12.3k
            ret: registers.unused_registers.ret,
668
12.3k
            retl: registers.unused_registers.retl,
669
12.3k
        }
670
12.3k
    }
671
}
672
673
impl<'reg> From<&'reg mut [Word; VM_REGISTER_COUNT]> for PrepareCallRegisters<'reg> {
674
12.3k
    fn from(registers: &'reg mut [Word; VM_REGISTER_COUNT]) -> Self {
675
12.3k
        let (r, w) = split_registers(registers);
676
12.3k
        let (r, u) = r.into();
677
12.3k
        Self {
678
12.3k
            system_registers: r,
679
12.3k
            program_registers: w.into(),
680
12.3k
            unused_registers: u,
681
12.3k
        }
682
12.3k
    }
683
}
684
685
impl<'reg> From<SystemRegisters<'reg>>
686
    for (
687
        PrepareCallSystemRegisters<'reg>,
688
        PrepareCallUnusedRegisters<'reg>,
689
    )
690
{
691
12.3k
    fn from(registers: SystemRegisters<'reg>) -> Self {
692
12.3k
        let read = PrepareCallSystemRegisters {
693
12.3k
            hp: registers.hp.into(),
694
12.3k
            sp: registers.sp,
695
12.3k
            ssp: registers.ssp,
696
12.3k
            fp: registers.fp,
697
12.3k
            pc: registers.pc,
698
12.3k
            is: registers.is,
699
12.3k
            bal: registers.bal,
700
12.3k
            cgas: registers.cgas,
701
12.3k
            ggas: registers.ggas,
702
12.3k
            flag: registers.flag,
703
12.3k
        };
704
12.3k
705
12.3k
        (
706
12.3k
            read,
707
12.3k
            PrepareCallUnusedRegisters {
708
12.3k
                zero: registers.zero.into(),
709
12.3k
                one: registers.one.into(),
710
12.3k
                of: registers.of.into(),
711
12.3k
                err: registers.err.into(),
712
12.3k
                ret: registers.ret.into(),
713
12.3k
                retl: registers.retl.into(),
714
12.3k
            },
715
12.3k
        )
716
12.3k
    }
717
}
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter/metadata.rs
Line
Count
Source
1
use super::{
2
    internal::inc_pc,
3
    ExecutableTransaction,
4
    Interpreter,
5
    Memory,
6
};
7
use crate::{
8
    call::CallFrame,
9
    constraints::reg_key::*,
10
    consts::*,
11
    context::Context,
12
    convert,
13
    error::SimpleResult,
14
};
15
16
use fuel_asm::{
17
    GMArgs,
18
    GTFArgs,
19
    PanicReason,
20
    RegId,
21
};
22
use fuel_tx::{
23
    field::{
24
        BytecodeWitnessIndex,
25
        Salt,
26
        Script as ScriptField,
27
        ScriptData,
28
        ScriptGasLimit,
29
        StorageSlots,
30
    },
31
    policies::PolicyType,
32
    Input,
33
    InputRepr,
34
    Output,
35
    OutputRepr,
36
    UtxoId,
37
};
38
use fuel_types::{
39
    ChainId,
40
    Immediate12,
41
    Immediate18,
42
    RegisterId,
43
    Word,
44
};
45
46
#[cfg(test)]
47
mod tests;
48
49
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
50
where
51
    M: Memory,
52
    Tx: ExecutableTransaction,
53
{
54
1.61M
    pub(crate) fn metadata(
55
1.61M
        &mut self,
56
1.61M
        ra: RegisterId,
57
1.61M
        imm: Immediate18,
58
1.61M
    ) -> SimpleResult<()> {
59
1.61M
        let tx_offset = self.tx_offset() as Word;
60
1.61M
        let chain_id = self.chain_id();
61
1.61M
        let (SystemRegisters { pc, .. }, mut w) = split_registers(&mut self.registers);
62
1.61M
        let result = &mut w[WriteRegKey::try_from(ra)?];
63
1.61M
        metadata(
64
1.61M
            &self.context,
65
1.61M
            &self.frames,
66
1.61M
            pc,
67
1.61M
            result,
68
1.61M
            imm,
69
1.61M
            chain_id,
70
1.61M
            tx_offset,
71
1.61M
        )
72
1.61M
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2j_4blob8BlobBodyNtB3P_12BlobMetadataEE8metadataB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2j_6create10CreateBodyNtB3P_14CreateMetadataEE8metadataB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2j_6script10ScriptBodyNtB3P_14ScriptMetadataEE8metadataB6_
Line
Count
Source
54
1.61M
    pub(crate) fn metadata(
55
1.61M
        &mut self,
56
1.61M
        ra: RegisterId,
57
1.61M
        imm: Immediate18,
58
1.61M
    ) -> SimpleResult<()> {
59
1.61M
        let tx_offset = self.tx_offset() as Word;
60
1.61M
        let chain_id = self.chain_id();
61
1.61M
        let (SystemRegisters { pc, .. }, mut w) = split_registers(&mut self.registers);
62
1.61M
        let result = &mut w[WriteRegKey::try_from(ra)?];
63
1.61M
        metadata(
64
1.61M
            &self.context,
65
1.61M
            &self.frames,
66
1.61M
            pc,
67
1.61M
            result,
68
1.61M
            imm,
69
1.61M
            chain_id,
70
1.61M
            tx_offset,
71
1.61M
        )
72
1.61M
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1F_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2N_4blob8BlobBodyNtB4j_12BlobMetadataEE8metadataB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1F_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2N_6create10CreateBodyNtB4j_14CreateMetadataEE8metadataB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1F_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2N_6script10ScriptBodyNtB4j_14ScriptMetadataEE8metadataB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1F_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2N_6upload10UploadBodyNtB4j_14UploadMetadataEE8metadataB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1F_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2N_7upgrade11UpgradeBodyNtB4j_15UpgradeMetadataEE8metadataB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1H_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2X_6script10ScriptBodyNtB4t_14ScriptMetadataEE8metadataB6_
73
74
10.4M
    pub(crate) fn get_transaction_field(
75
10.4M
        &mut self,
76
10.4M
        ra: RegisterId,
77
10.4M
        b: Word,
78
10.4M
        imm: Immediate12,
79
10.4M
    ) -> SimpleResult<()> {
80
10.4M
        let tx_offset = self.tx_offset();
81
10.4M
        // Tx size is stored just below the tx bytes
82
10.4M
        let tx_size_ptr = tx_offset.checked_sub(8).expect("Tx offset is not valid");
83
10.4M
        let tx_size = Word::from_be_bytes(
84
10.4M
            self.memory()
85
10.4M
                .read_bytes(tx_size_ptr)
86
10.4M
                .expect("Tx length not in memory"),
87
10.4M
        );
88
10.4M
        let (SystemRegisters { pc, .. }, mut w) = split_registers(&mut self.registers);
89
10.4M
        let result = &mut w[WriteRegKey::try_from(ra)?];
90
10.4M
        let input = GTFInput {
91
10.4M
            tx: &self.tx,
92
10.4M
            input_contracts_index_to_output_index: &self
93
10.4M
                .input_contracts_index_to_output_index,
94
10.4M
            tx_offset,
95
10.4M
            tx_size,
96
10.4M
            pc,
97
10.4M
        };
98
10.4M
        input.get_transaction_field(result, b, imm)
99
10.4M
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2j_4blob8BlobBodyNtB3P_12BlobMetadataEE21get_transaction_fieldB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2j_6create10CreateBodyNtB3P_14CreateMetadataEE21get_transaction_fieldB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2j_6script10ScriptBodyNtB3P_14ScriptMetadataEE21get_transaction_fieldB6_
Line
Count
Source
74
10.4M
    pub(crate) fn get_transaction_field(
75
10.4M
        &mut self,
76
10.4M
        ra: RegisterId,
77
10.4M
        b: Word,
78
10.4M
        imm: Immediate12,
79
10.4M
    ) -> SimpleResult<()> {
80
10.4M
        let tx_offset = self.tx_offset();
81
10.4M
        // Tx size is stored just below the tx bytes
82
10.4M
        let tx_size_ptr = tx_offset.checked_sub(8).expect("Tx offset is not valid");
83
10.4M
        let tx_size = Word::from_be_bytes(
84
10.4M
            self.memory()
85
10.4M
                .read_bytes(tx_size_ptr)
86
10.4M
                .expect("Tx length not in memory"),
87
10.4M
        );
88
10.4M
        let (SystemRegisters { pc, .. }, mut w) = split_registers(&mut self.registers);
89
10.4M
        let result = &mut w[WriteRegKey::try_from(ra)?];
90
10.4M
        let input = GTFInput {
91
10.4M
            tx: &self.tx,
92
10.4M
            input_contracts_index_to_output_index: &self
93
10.4M
                .input_contracts_index_to_output_index,
94
10.4M
            tx_offset,
95
10.4M
            tx_size,
96
10.4M
            pc,
97
10.4M
        };
98
10.4M
        input.get_transaction_field(result, b, imm)
99
10.4M
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1F_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2N_4blob8BlobBodyNtB4j_12BlobMetadataEE21get_transaction_fieldB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1F_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2N_6create10CreateBodyNtB4j_14CreateMetadataEE21get_transaction_fieldB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1F_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2N_6script10ScriptBodyNtB4j_14ScriptMetadataEE21get_transaction_fieldB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1F_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2N_6upload10UploadBodyNtB4j_14UploadMetadataEE21get_transaction_fieldB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1F_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2N_7upgrade11UpgradeBodyNtB4j_15UpgradeMetadataEE21get_transaction_fieldB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1H_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2X_6script10ScriptBodyNtB4t_14ScriptMetadataEE21get_transaction_fieldB6_
100
}
101
102
1.61M
pub(crate) fn metadata(
103
1.61M
    context: &Context,
104
1.61M
    frames: &[CallFrame],
105
1.61M
    pc: RegMut<PC>,
106
1.61M
    result: &mut Word,
107
1.61M
    imm: Immediate18,
108
1.61M
    chain_id: ChainId,
109
1.61M
    tx_offset: Word,
110
1.61M
) -> SimpleResult<()> {
111
1.61M
    let parent = context
112
1.61M
        .is_internal()
113
1.61M
        .then(|| frames.last().map(|f| f.registers()[RegId::FP]))
114
1.61M
        .flatten();
115
1.61M
116
1.61M
    *result = match GMArgs::try_from(imm)? {
117
1
        GMArgs::GetVerifyingPredicate => context
118
1
            .predicate()
119
1
            .map(|p| p.idx() as Word)
120
1
            .ok_or(PanicReason::TransactionValidity)?,
121
833k
        GMArgs::GetChainId => chain_id.into(),
122
200k
        GMArgs::BaseAssetId => VM_MEMORY_BASE_ASSET_ID_OFFSET as Word,
123
583k
        GMArgs::TxStart => tx_offset,
124
1
        GMArgs::GetCaller => match parent {
125
0
            Some(0) => return Err(PanicReason::ExpectedNestedCaller.into()),
126
0
            Some(parent) => parent,
127
1
            None => return Err(PanicReason::ExpectedInternalContext.into()),
128
        },
129
1
        GMArgs::IsCallerExternal => match parent {
130
0
            Some(p) => (p == 0) as Word,
131
1
            None => return Err(PanicReason::ExpectedInternalContext.into()),
132
        },
133
    };
134
135
1.61M
    inc_pc(pc)?;
136
1.61M
    Ok(())
137
1.61M
}
138
139
struct GTFInput<'vm, Tx> {
140
    tx: &'vm Tx,
141
    input_contracts_index_to_output_index: &'vm alloc::collections::BTreeMap<u16, u16>,
142
    tx_offset: usize,
143
    tx_size: Word,
144
    pc: RegMut<'vm, PC>,
145
}
146
147
impl<Tx> GTFInput<'_, Tx> {
148
10.4M
    pub(crate) fn get_transaction_field(
149
10.4M
        self,
150
10.4M
        result: &mut Word,
151
10.4M
        b: Word,
152
10.4M
        imm: Immediate12,
153
10.4M
    ) -> SimpleResult<()>
154
10.4M
    where
155
10.4M
        Tx: ExecutableTransaction,
156
10.4M
    {
157
10.4M
        let b = convert::to_usize(b).ok_or(PanicReason::InvalidMetadataIdentifier)?;
158
10.4M
        let args = GTFArgs::try_from(imm)?;
159
10.4M
        let tx = self.tx;
160
10.4M
        let input_contract_to_output_index = self.input_contracts_index_to_output_index;
161
10.4M
        let ofs = self.tx_offset;
162
163
        // We use saturating_add with tx offset below.
164
        // In case any addition overflows, this function returns value
165
        // for the field that's above VM_MAX_RAM.
166
167
10.4M
        let a = match args {
168
83.3k
            GTFArgs::Type => Tx::transaction_type(),
169
170
            // General
171
194k
            GTFArgs::ScriptGasLimit => tx
172
194k
                .as_script()
173
194k
                .map(|script| *script.script_gas_limit())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_field0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_field0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_field0Ba_
Line
Count
Source
173
194k
                .map(|script| *script.script_gas_limit())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_field0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_field0Ba_
174
194k
                .unwrap_or_default(),
175
433k
            GTFArgs::PolicyTypes => tx.policies().bits() as Word,
176
1
            GTFArgs::PolicyTip => tx
177
1
                .policies()
178
1
                .get(PolicyType::Tip)
179
1
                .ok_or(PanicReason::PolicyIsNotSet)?,
180
1
            GTFArgs::PolicyWitnessLimit => tx
181
1
                .policies()
182
1
                .get(PolicyType::WitnessLimit)
183
1
                .ok_or(PanicReason::PolicyIsNotSet)?,
184
2
            GTFArgs::PolicyMaturity => tx
185
2
                .policies()
186
2
                .get(PolicyType::Maturity)
187
2
                .ok_or(PanicReason::PolicyIsNotSet)?,
188
83.3k
            GTFArgs::PolicyMaxFee => tx
189
83.3k
                .policies()
190
83.3k
                .get(PolicyType::MaxFee)
191
83.3k
                .ok_or(PanicReason::PolicyIsNotSet)?,
192
            GTFArgs::ScriptInputsCount | GTFArgs::CreateInputsCount => {
193
402k
                tx.inputs().len() as Word
194
            }
195
            GTFArgs::ScriptOutputsCount | GTFArgs::CreateOutputsCount => {
196
590k
                tx.outputs().len() as Word
197
            }
198
            GTFArgs::ScriptWitnessesCount | GTFArgs::CreateWitnessesCount => {
199
972k
                tx.witnesses().len() as Word
200
            }
201
405k
            GTFArgs::ScriptInputAtIndex | GTFArgs::CreateInputAtIndex => ofs
202
405k
                .saturating_add(tx.inputs_offset_at(b).ok_or(PanicReason::InputNotFound)?)
203
                as Word,
204
            GTFArgs::ScriptOutputAtIndex | GTFArgs::CreateOutputAtIndex => {
205
409k
                ofs.saturating_add(
206
409k
                    tx.outputs_offset_at(b).ok_or(PanicReason::OutputNotFound)?,
207
                ) as Word
208
            }
209
            GTFArgs::ScriptWitnessAtIndex | GTFArgs::CreateWitnessAtIndex => {
210
641k
                ofs.saturating_add(
211
641k
                    tx.witnesses_offset_at(b)
212
641k
                        .ok_or(PanicReason::WitnessNotFound)?,
213
                ) as Word
214
            }
215
101k
            GTFArgs::TxLength => self.tx_size,
216
217
            // Input
218
            GTFArgs::InputType => {
219
361k
                tx.inputs()
220
361k
                    .get(b)
221
361k
                    .map(InputRepr::from)
222
361k
                    .ok_or(PanicReason::InputNotFound)? as Word
223
            }
224
194k
            GTFArgs::InputCoinTxId => ofs.saturating_add(
225
194k
                tx.inputs()
226
194k
                    .get(b)
227
194k
                    .filter(|i| i.is_coin())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fields_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fields_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fields_0Ba_
Line
Count
Source
227
194k
                    .filter(|i| i.is_coin())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fields_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fields_0Ba_
228
194k
                    .map(Input::repr)
229
194k
                    .and_then(|r| r.utxo_id_offset())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fields0_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fields0_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fields0_0Ba_
Line
Count
Source
229
194k
                    .and_then(|r| r.utxo_id_offset())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fields0_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fields0_0Ba_
230
194k
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fields1_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fields1_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fields1_0Ba_
Line
Count
Source
230
194k
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fields1_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fields1_0Ba_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2K_12BlobMetadataEE21get_transaction_fields1_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2K_14CreateMetadataEE21get_transaction_fields1_00Bc_
_RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2K_14ScriptMetadataEE21get_transaction_fields1_00Bc_
Line
Count
Source
230
194k
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2K_14UploadMetadataEE21get_transaction_fields1_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2K_15UpgradeMetadataEE21get_transaction_fields1_00Bc_
231
194k
                    .ok_or(PanicReason::InputNotFound)?,
232
            ) as Word,
233
            GTFArgs::InputCoinOutputIndex => {
234
250k
                tx.inputs()
235
250k
                    .get(b)
236
250k
                    .filter(|i| i.is_coin())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fields2_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fields2_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fields2_0Ba_
Line
Count
Source
236
250k
                    .filter(|i| i.is_coin())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fields2_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fields2_0Ba_
237
250k
                    .and_then(Input::utxo_id)
238
250k
                    .map(UtxoId::output_index)
239
250k
                    .ok_or(PanicReason::InputNotFound)? as Word
240
            }
241
444k
            GTFArgs::InputCoinOwner => ofs.saturating_add(
242
444k
                tx.inputs()
243
444k
                    .get(b)
244
444k
                    .filter(|i| i.is_coin())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fields3_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fields3_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fields3_0Ba_
Line
Count
Source
244
444k
                    .filter(|i| i.is_coin())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fields3_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fields3_0Ba_
245
444k
                    .map(Input::repr)
246
444k
                    .and_then(|r| r.owner_offset())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fields4_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fields4_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fields4_0Ba_
Line
Count
Source
246
444k
                    .and_then(|r| r.owner_offset())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fields4_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fields4_0Ba_
247
444k
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fields5_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fields5_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fields5_0Ba_
Line
Count
Source
247
444k
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fields5_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fields5_0Ba_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2K_12BlobMetadataEE21get_transaction_fields5_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2K_14CreateMetadataEE21get_transaction_fields5_00Bc_
_RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2K_14ScriptMetadataEE21get_transaction_fields5_00Bc_
Line
Count
Source
247
444k
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2K_14UploadMetadataEE21get_transaction_fields5_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2K_15UpgradeMetadataEE21get_transaction_fields5_00Bc_
248
444k
                    .ok_or(PanicReason::InputNotFound)?,
249
            ) as Word,
250
211k
            GTFArgs::InputCoinAmount => tx
251
211k
                .inputs()
252
211k
                .get(b)
253
211k
                .filter(|i| i.is_coin())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fields6_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fields6_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fields6_0Ba_
Line
Count
Source
253
211k
                .filter(|i| i.is_coin())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fields6_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fields6_0Ba_
254
211k
                .and_then(Input::amount)
255
211k
                .ok_or(PanicReason::InputNotFound)?,
256
166k
            GTFArgs::InputCoinAssetId => ofs.saturating_add(
257
166k
                tx.inputs()
258
166k
                    .get(b)
259
166k
                    .filter(|i| i.is_coin())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fields7_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fields7_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fields7_0Ba_
Line
Count
Source
259
166k
                    .filter(|i| i.is_coin())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fields7_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fields7_0Ba_
260
166k
                    .map(Input::repr)
261
166k
                    .and_then(|r| r.asset_id_offset())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fields8_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fields8_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fields8_0Ba_
Line
Count
Source
261
166k
                    .and_then(|r| r.asset_id_offset())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fields8_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fields8_0Ba_
262
166k
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fields9_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fields9_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fields9_0Ba_
Line
Count
Source
262
166k
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fields9_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fields9_0Ba_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2K_12BlobMetadataEE21get_transaction_fields9_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2K_14CreateMetadataEE21get_transaction_fields9_00Bc_
_RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2K_14ScriptMetadataEE21get_transaction_fields9_00Bc_
Line
Count
Source
262
166k
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2K_14UploadMetadataEE21get_transaction_fields9_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2K_15UpgradeMetadataEE21get_transaction_fields9_00Bc_
263
166k
                    .ok_or(PanicReason::InputNotFound)?,
264
            ) as Word,
265
1.20M
            GTFArgs::InputCoinTxPointer => ofs.saturating_add(
266
1.20M
                tx.inputs()
267
1.20M
                    .get(b)
268
1.20M
                    .filter(|i| i.is_coin())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsa_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsa_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsa_0Ba_
Line
Count
Source
268
1.20M
                    .filter(|i| i.is_coin())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsa_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsa_0Ba_
269
1.20M
                    .map(Input::repr)
270
1.20M
                    .and_then(|r| r.tx_pointer_offset())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsb_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsb_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsb_0Ba_
Line
Count
Source
270
1.20M
                    .and_then(|r| r.tx_pointer_offset())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsb_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsb_0Ba_
271
1.20M
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsc_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsc_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsc_0Ba_
Line
Count
Source
271
1.20M
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsc_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsc_0Ba_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2K_12BlobMetadataEE21get_transaction_fieldsc_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2K_14CreateMetadataEE21get_transaction_fieldsc_00Bc_
_RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2K_14ScriptMetadataEE21get_transaction_fieldsc_00Bc_
Line
Count
Source
271
1.20M
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2K_14UploadMetadataEE21get_transaction_fieldsc_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2K_15UpgradeMetadataEE21get_transaction_fieldsc_00Bc_
272
1.20M
                    .ok_or(PanicReason::InputNotFound)?,
273
            ) as Word,
274
            GTFArgs::InputCoinWitnessIndex => {
275
208k
                tx.inputs()
276
208k
                    .get(b)
277
208k
                    .filter(|i| i.is_coin())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsd_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsd_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsd_0Ba_
Line
Count
Source
277
208k
                    .filter(|i| i.is_coin())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsd_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsd_0Ba_
278
208k
                    .and_then(Input::witness_index)
279
208k
                    .ok_or(PanicReason::InputNotFound)? as Word
280
            }
281
            GTFArgs::InputCoinPredicateLength => {
282
83.3k
                tx.inputs()
283
83.3k
                    .get(b)
284
83.3k
                    .filter(|i| i.is_coin())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldse_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldse_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldse_0Ba_
Line
Count
Source
284
83.3k
                    .filter(|i| i.is_coin())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldse_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldse_0Ba_
285
83.3k
                    .and_then(Input::predicate_len)
286
83.3k
                    .ok_or(PanicReason::InputNotFound)? as Word
287
            }
288
            GTFArgs::InputCoinPredicateDataLength => {
289
83.3k
                tx.inputs()
290
83.3k
                    .get(b)
291
83.3k
                    .filter(|i| i.is_coin())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsf_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsf_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsf_0Ba_
Line
Count
Source
291
83.3k
                    .filter(|i| i.is_coin())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsf_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsf_0Ba_
292
83.3k
                    .and_then(Input::predicate_data_len)
293
83.3k
                    .ok_or(PanicReason::InputNotFound)? as Word
294
            }
295
            GTFArgs::InputCoinPredicateGasUsed => {
296
3
                tx.inputs()
297
3
                    .get(b)
298
3
                    .filter(|i| i.is_coin())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsg_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsg_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsg_0Ba_
Line
Count
Source
298
2
                    .filter(|i| i.is_coin())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsg_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsg_0Ba_
299
3
                    .and_then(Input::predicate_gas_used)
300
3
                    .ok_or(PanicReason::InputNotFound)? as Word
301
            }
302
3
            GTFArgs::InputCoinPredicate => ofs.saturating_add(
303
3
                tx.inputs()
304
3
                    .get(b)
305
3
                    .filter(|i| i.is_coin())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsh_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsh_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsh_0Ba_
Line
Count
Source
305
2
                    .filter(|i| i.is_coin())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsh_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsh_0Ba_
306
3
                    .and_then(Input::predicate_offset)
307
3
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsi_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsi_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsi_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsi_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsi_0Ba_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2K_12BlobMetadataEE21get_transaction_fieldsi_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2K_14CreateMetadataEE21get_transaction_fieldsi_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2K_14ScriptMetadataEE21get_transaction_fieldsi_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2K_14UploadMetadataEE21get_transaction_fieldsi_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2K_15UpgradeMetadataEE21get_transaction_fieldsi_00Bc_
308
3
                    .ok_or(PanicReason::InputNotFound)?,
309
            ) as Word,
310
3
            GTFArgs::InputCoinPredicateData => ofs.saturating_add(
311
3
                tx.inputs()
312
3
                    .get(b)
313
3
                    .filter(|i| i.is_coin())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsj_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsj_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsj_0Ba_
Line
Count
Source
313
2
                    .filter(|i| i.is_coin())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsj_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsj_0Ba_
314
3
                    .and_then(Input::predicate_data_offset)
315
3
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsk_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsk_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsk_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsk_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsk_0Ba_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2K_12BlobMetadataEE21get_transaction_fieldsk_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2K_14CreateMetadataEE21get_transaction_fieldsk_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2K_14ScriptMetadataEE21get_transaction_fieldsk_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2K_14UploadMetadataEE21get_transaction_fieldsk_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2K_15UpgradeMetadataEE21get_transaction_fieldsk_00Bc_
316
3
                    .ok_or(PanicReason::InputNotFound)?,
317
            ) as Word,
318
200k
            GTFArgs::InputContractTxId => ofs.saturating_add(
319
200k
                tx.inputs()
320
200k
                    .get(b)
321
200k
                    .filter(|i| i.is_contract())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsl_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsl_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsl_0Ba_
Line
Count
Source
321
200k
                    .filter(|i| i.is_contract())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsl_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsl_0Ba_
322
200k
                    .map(Input::repr)
323
200k
                    .and_then(|r| r.utxo_id_offset())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsm_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsm_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsm_0Ba_
Line
Count
Source
323
200k
                    .and_then(|r| r.utxo_id_offset())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsm_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsm_0Ba_
324
200k
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsn_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsn_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsn_0Ba_
Line
Count
Source
324
200k
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsn_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsn_0Ba_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2K_12BlobMetadataEE21get_transaction_fieldsn_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2K_14CreateMetadataEE21get_transaction_fieldsn_00Bc_
_RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2K_14ScriptMetadataEE21get_transaction_fieldsn_00Bc_
Line
Count
Source
324
200k
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2K_14UploadMetadataEE21get_transaction_fieldsn_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2K_15UpgradeMetadataEE21get_transaction_fieldsn_00Bc_
325
200k
                    .ok_or(PanicReason::InputNotFound)?,
326
            ) as Word,
327
            GTFArgs::InputContractOutputIndex => {
328
250k
                let b = u16::try_from(b)
329
250k
                    .map_err(|_| PanicReason::InvalidMetadataIdentifier)?;
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldso_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldso_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldso_0Ba_
Line
Count
Source
329
1
                    .map_err(|_| PanicReason::InvalidMetadataIdentifier)?;
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldso_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldso_0Ba_
330
250k
                input_contract_to_output_index
331
250k
                    .get(&b)
332
250k
                    .copied()
333
250k
                    .ok_or(PanicReason::InputNotFound)? as Word
334
            }
335
250k
            GTFArgs::InputContractId => ofs.saturating_add(
336
250k
                tx.inputs()
337
250k
                    .get(b)
338
250k
                    .filter(|i| i.is_contract())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsp_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsp_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsp_0Ba_
Line
Count
Source
338
250k
                    .filter(|i| i.is_contract())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsp_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsp_0Ba_
339
250k
                    .map(Input::repr)
340
250k
                    .and_then(|r| r.contract_id_offset())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsq_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsq_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsq_0Ba_
Line
Count
Source
340
250k
                    .and_then(|r| r.contract_id_offset())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsq_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsq_0Ba_
341
250k
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsr_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsr_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsr_0Ba_
Line
Count
Source
341
250k
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsr_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsr_0Ba_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2K_12BlobMetadataEE21get_transaction_fieldsr_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2K_14CreateMetadataEE21get_transaction_fieldsr_00Bc_
_RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2K_14ScriptMetadataEE21get_transaction_fieldsr_00Bc_
Line
Count
Source
341
250k
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2K_14UploadMetadataEE21get_transaction_fieldsr_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2K_15UpgradeMetadataEE21get_transaction_fieldsr_00Bc_
342
250k
                    .ok_or(PanicReason::InputNotFound)?,
343
            ) as Word,
344
2
            GTFArgs::InputMessageSender => ofs.saturating_add(
345
2
                tx.inputs()
346
2
                    .get(b)
347
2
                    .filter(|i| i.is_message())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldss_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldss_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldss_0Ba_
Line
Count
Source
347
1
                    .filter(|i| i.is_message())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldss_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldss_0Ba_
348
2
                    .map(Input::repr)
349
2
                    .and_then(|r| r.message_sender_offset())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldst_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldst_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldst_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldst_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldst_0Ba_
350
2
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsu_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsu_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsu_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsu_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsu_0Ba_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2K_12BlobMetadataEE21get_transaction_fieldsu_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2K_14CreateMetadataEE21get_transaction_fieldsu_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2K_14ScriptMetadataEE21get_transaction_fieldsu_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2K_14UploadMetadataEE21get_transaction_fieldsu_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2K_15UpgradeMetadataEE21get_transaction_fieldsu_00Bc_
351
2
                    .ok_or(PanicReason::InputNotFound)?,
352
            ) as Word,
353
5
            GTFArgs::InputMessageRecipient => ofs.saturating_add(
354
5
                tx.inputs()
355
5
                    .get(b)
356
5
                    .filter(|i| i.is_message())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsv_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsv_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsv_0Ba_
Line
Count
Source
356
4
                    .filter(|i| i.is_message())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsv_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsv_0Ba_
357
5
                    .map(Input::repr)
358
5
                    .and_then(|r| r.message_recipient_offset())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsw_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsw_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsw_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsw_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsw_0Ba_
359
5
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsx_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsx_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsx_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsx_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsx_0Ba_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2K_12BlobMetadataEE21get_transaction_fieldsx_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2K_14CreateMetadataEE21get_transaction_fieldsx_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2K_14ScriptMetadataEE21get_transaction_fieldsx_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2K_14UploadMetadataEE21get_transaction_fieldsx_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2K_15UpgradeMetadataEE21get_transaction_fieldsx_00Bc_
360
5
                    .ok_or(PanicReason::InputNotFound)?,
361
            ) as Word,
362
2
            GTFArgs::InputMessageAmount => tx
363
2
                .inputs()
364
2
                .get(b)
365
2
                .filter(|i| i.is_message())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsy_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsy_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsy_0Ba_
Line
Count
Source
365
1
                .filter(|i| i.is_message())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsy_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsy_0Ba_
366
2
                .and_then(Input::amount)
367
2
                .ok_or(PanicReason::InputNotFound)?,
368
3
            GTFArgs::InputMessageNonce => ofs.saturating_add(
369
3
                tx.inputs()
370
3
                    .get(b)
371
3
                    .filter(|i| i.is_message())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsz_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsz_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsz_0Ba_
Line
Count
Source
371
2
                    .filter(|i| i.is_message())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsz_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsz_0Ba_
372
3
                    .map(Input::repr)
373
3
                    .and_then(|r| r.message_nonce_offset())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsA_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsA_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsA_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsA_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsA_0Ba_
374
3
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsB_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsB_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsB_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsB_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsB_0Ba_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2K_12BlobMetadataEE21get_transaction_fieldsB_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2K_14CreateMetadataEE21get_transaction_fieldsB_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2K_14ScriptMetadataEE21get_transaction_fieldsB_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2K_14UploadMetadataEE21get_transaction_fieldsB_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2K_15UpgradeMetadataEE21get_transaction_fieldsB_00Bc_
375
3
                    .ok_or(PanicReason::InputNotFound)?,
376
            ) as Word,
377
            GTFArgs::InputMessageWitnessIndex => {
378
2
                tx.inputs()
379
2
                    .get(b)
380
2
                    .filter(|i| i.is_message())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsC_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsC_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsC_0Ba_
Line
Count
Source
380
1
                    .filter(|i| i.is_message())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsC_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsC_0Ba_
381
2
                    .and_then(Input::witness_index)
382
2
                    .ok_or(PanicReason::InputNotFound)? as Word
383
            }
384
            GTFArgs::InputMessageDataLength => {
385
5
                tx.inputs()
386
5
                    .get(b)
387
5
                    .filter(|i| i.is_message())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsD_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsD_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsD_0Ba_
Line
Count
Source
387
4
                    .filter(|i| i.is_message())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsD_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsD_0Ba_
388
5
                    .and_then(Input::input_data_len)
389
5
                    .ok_or(PanicReason::InputNotFound)? as Word
390
            }
391
            GTFArgs::InputMessagePredicateLength => {
392
3
                tx.inputs()
393
3
                    .get(b)
394
3
                    .filter(|i| i.is_message())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsE_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsE_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsE_0Ba_
Line
Count
Source
394
2
                    .filter(|i| i.is_message())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsE_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsE_0Ba_
395
3
                    .and_then(Input::predicate_len)
396
3
                    .ok_or(PanicReason::InputNotFound)? as Word
397
            }
398
            GTFArgs::InputMessagePredicateDataLength => {
399
2
                tx.inputs()
400
2
                    .get(b)
401
2
                    .filter(|i| i.is_message())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsF_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsF_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsF_0Ba_
Line
Count
Source
401
1
                    .filter(|i| i.is_message())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsF_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsF_0Ba_
402
2
                    .and_then(Input::predicate_data_len)
403
2
                    .ok_or(PanicReason::InputNotFound)? as Word
404
            }
405
            GTFArgs::InputMessagePredicateGasUsed => {
406
2
                tx.inputs()
407
2
                    .get(b)
408
2
                    .filter(|i| i.is_message())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsG_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsG_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsG_0Ba_
Line
Count
Source
408
1
                    .filter(|i| i.is_message())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsG_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsG_0Ba_
409
2
                    .and_then(Input::predicate_gas_used)
410
2
                    .ok_or(PanicReason::InputNotFound)? as Word
411
            }
412
2
            GTFArgs::InputMessageData => ofs.saturating_add(
413
2
                tx.inputs()
414
2
                    .get(b)
415
2
                    .filter(|i| i.is_message())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsH_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsH_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsH_0Ba_
Line
Count
Source
415
1
                    .filter(|i| i.is_message())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsH_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsH_0Ba_
416
2
                    .map(Input::repr)
417
2
                    .and_then(|r| r.data_offset())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsI_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsI_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsI_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsI_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsI_0Ba_
418
2
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsJ_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsJ_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsJ_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsJ_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsJ_0Ba_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2K_12BlobMetadataEE21get_transaction_fieldsJ_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2K_14CreateMetadataEE21get_transaction_fieldsJ_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2K_14ScriptMetadataEE21get_transaction_fieldsJ_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2K_14UploadMetadataEE21get_transaction_fieldsJ_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2K_15UpgradeMetadataEE21get_transaction_fieldsJ_00Bc_
419
2
                    .ok_or(PanicReason::InputNotFound)?,
420
            ) as Word,
421
3
            GTFArgs::InputMessagePredicate => ofs.saturating_add(
422
3
                tx.inputs()
423
3
                    .get(b)
424
3
                    .filter(|i| i.is_message())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsK_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsK_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsK_0Ba_
Line
Count
Source
424
2
                    .filter(|i| i.is_message())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsK_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsK_0Ba_
425
3
                    .and_then(Input::predicate_offset)
426
3
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsL_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsL_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsL_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsL_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsL_0Ba_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2K_12BlobMetadataEE21get_transaction_fieldsL_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2K_14CreateMetadataEE21get_transaction_fieldsL_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2K_14ScriptMetadataEE21get_transaction_fieldsL_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2K_14UploadMetadataEE21get_transaction_fieldsL_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2K_15UpgradeMetadataEE21get_transaction_fieldsL_00Bc_
427
3
                    .ok_or(PanicReason::InputNotFound)?,
428
            ) as Word,
429
2
            GTFArgs::InputMessagePredicateData => ofs.saturating_add(
430
2
                tx.inputs()
431
2
                    .get(b)
432
2
                    .filter(|i| i.is_message())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsM_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsM_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsM_0Ba_
Line
Count
Source
432
1
                    .filter(|i| i.is_message())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsM_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsM_0Ba_
433
2
                    .and_then(Input::predicate_data_offset)
434
2
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsN_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsN_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsN_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsN_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsN_0Ba_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2K_12BlobMetadataEE21get_transaction_fieldsN_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2K_14CreateMetadataEE21get_transaction_fieldsN_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2K_14ScriptMetadataEE21get_transaction_fieldsN_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2K_14UploadMetadataEE21get_transaction_fieldsN_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2K_15UpgradeMetadataEE21get_transaction_fieldsN_00Bc_
435
2
                    .ok_or(PanicReason::InputNotFound)?,
436
            ) as Word,
437
438
            // Output
439
            GTFArgs::OutputType => {
440
166k
                tx.outputs()
441
166k
                    .get(b)
442
166k
                    .map(OutputRepr::from)
443
166k
                    .ok_or(PanicReason::OutputNotFound)? as Word
444
            }
445
450k
            GTFArgs::OutputCoinTo => ofs.saturating_add(
446
450k
                tx.outputs()
447
450k
                    .get(b)
448
450k
                    .filter(|o| o.is_coin() || o.is_change())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsO_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsO_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsO_0Ba_
Line
Count
Source
448
450k
                    .filter(|o| o.is_coin() || o.is_change())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsO_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsO_0Ba_
449
450k
                    .map(Output::repr)
450
450k
                    .and_then(|r| r.to_offset())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsP_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsP_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsP_0Ba_
Line
Count
Source
450
450k
                    .and_then(|r| r.to_offset())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsP_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsP_0Ba_
451
450k
                    .and_then(|ofs| {
452
450k
                        tx.outputs_offset_at(b).map(|o| o.saturating_add(ofs))
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2K_12BlobMetadataEE21get_transaction_fieldsQ_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2K_14CreateMetadataEE21get_transaction_fieldsQ_00Bc_
_RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2K_14ScriptMetadataEE21get_transaction_fieldsQ_00Bc_
Line
Count
Source
452
450k
                        tx.outputs_offset_at(b).map(|o| o.saturating_add(ofs))
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2K_14UploadMetadataEE21get_transaction_fieldsQ_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2K_15UpgradeMetadataEE21get_transaction_fieldsQ_00Bc_
453
450k
                    })
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsQ_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsQ_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsQ_0Ba_
Line
Count
Source
451
450k
                    .and_then(|ofs| {
452
450k
                        tx.outputs_offset_at(b).map(|o| o.saturating_add(ofs))
453
450k
                    })
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsQ_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsQ_0Ba_
454
450k
                    .ok_or(PanicReason::OutputNotFound)?,
455
            ) as Word,
456
4
            GTFArgs::OutputCoinAmount => tx
457
4
                .outputs()
458
4
                .get(b)
459
4
                .filter(|o| o.is_coin())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsR_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsR_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsR_0Ba_
Line
Count
Source
459
2
                .filter(|o| o.is_coin())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsR_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsR_0Ba_
460
4
                .and_then(Output::amount)
461
4
                .ok_or(PanicReason::OutputNotFound)?,
462
283k
            GTFArgs::OutputCoinAssetId => ofs.saturating_add(
463
283k
                tx.outputs()
464
283k
                    .get(b)
465
283k
                    .filter(|o| o.is_coin() || o.is_change())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsS_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsS_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsS_0Ba_
Line
Count
Source
465
283k
                    .filter(|o| o.is_coin() || o.is_change())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsS_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsS_0Ba_
466
283k
                    .map(Output::repr)
467
283k
                    .and_then(|r| r.asset_id_offset())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsT_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsT_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsT_0Ba_
Line
Count
Source
467
283k
                    .and_then(|r| r.asset_id_offset())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsT_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsT_0Ba_
468
283k
                    .and_then(|ofs| {
469
283k
                        tx.outputs_offset_at(b).map(|o| o.saturating_add(ofs))
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2K_12BlobMetadataEE21get_transaction_fieldsU_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2K_14CreateMetadataEE21get_transaction_fieldsU_00Bc_
_RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2K_14ScriptMetadataEE21get_transaction_fieldsU_00Bc_
Line
Count
Source
469
283k
                        tx.outputs_offset_at(b).map(|o| o.saturating_add(ofs))
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2K_14UploadMetadataEE21get_transaction_fieldsU_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2K_15UpgradeMetadataEE21get_transaction_fieldsU_00Bc_
470
283k
                    })
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsU_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsU_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsU_0Ba_
Line
Count
Source
468
283k
                    .and_then(|ofs| {
469
283k
                        tx.outputs_offset_at(b).map(|o| o.saturating_add(ofs))
470
283k
                    })
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsU_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsU_0Ba_
471
283k
                    .ok_or(PanicReason::OutputNotFound)?,
472
            ) as Word,
473
            GTFArgs::OutputContractInputIndex => {
474
83.3k
                tx.outputs()
475
83.3k
                    .get(b)
476
83.3k
                    .filter(|o| o.is_contract())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsV_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsV_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsV_0Ba_
Line
Count
Source
476
83.3k
                    .filter(|o| o.is_contract())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsV_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsV_0Ba_
477
83.3k
                    .and_then(Output::input_index)
478
83.3k
                    .ok_or(PanicReason::InputNotFound)? as Word
479
            }
480
2
            GTFArgs::OutputContractCreatedContractId => ofs.saturating_add(
481
2
                tx.outputs()
482
2
                    .get(b)
483
2
                    .filter(|o| o.is_contract_created())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsW_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsW_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsW_0Ba_
Line
Count
Source
483
1
                    .filter(|o| o.is_contract_created())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsW_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsW_0Ba_
484
2
                    .map(Output::repr)
485
2
                    .and_then(|r| r.contract_id_offset())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsX_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsX_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsX_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsX_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsX_0Ba_
486
2
                    .and_then(|ofs| {
487
0
                        tx.outputs_offset_at(b).map(|o| o.saturating_add(ofs))
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2K_12BlobMetadataEE21get_transaction_fieldsY_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2K_14CreateMetadataEE21get_transaction_fieldsY_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2K_14ScriptMetadataEE21get_transaction_fieldsY_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2K_14UploadMetadataEE21get_transaction_fieldsY_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2K_15UpgradeMetadataEE21get_transaction_fieldsY_00Bc_
488
2
                    })
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsY_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsY_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsY_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsY_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsY_0Ba_
489
2
                    .ok_or(PanicReason::OutputNotFound)?,
490
            ) as Word,
491
2
            GTFArgs::OutputContractCreatedStateRoot => ofs.saturating_add(
492
2
                tx.outputs()
493
2
                    .get(b)
494
2
                    .filter(|o| o.is_contract_created())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fieldsZ_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fieldsZ_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fieldsZ_0Ba_
Line
Count
Source
494
1
                    .filter(|o| o.is_contract_created())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fieldsZ_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fieldsZ_0Ba_
495
2
                    .map(Output::repr)
496
2
                    .and_then(|r| r.contract_created_state_root_offset())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fields10_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fields10_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fields10_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fields10_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fields10_0Ba_
497
2
                    .and_then(|ofs| {
498
0
                        tx.outputs_offset_at(b).map(|o| o.saturating_add(ofs))
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_4blob8BlobBodyNtB2K_12BlobMetadataEE21get_transaction_fields11_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6create10CreateBodyNtB2K_14CreateMetadataEE21get_transaction_fields11_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6script10ScriptBodyNtB2K_14ScriptMetadataEE21get_transaction_fields11_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_6upload10UploadBodyNtB2K_14UploadMetadataEE21get_transaction_fields11_00Bc_
Unexecuted instantiation: _RNCNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB8_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1e_7upgrade11UpgradeBodyNtB2K_15UpgradeMetadataEE21get_transaction_fields11_00Bc_
499
2
                    })
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fields11_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fields11_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fields11_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fields11_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fields11_0Ba_
500
2
                    .ok_or(PanicReason::OutputNotFound)?,
501
            ) as Word,
502
503
            // Witness
504
            GTFArgs::WitnessDataLength => {
505
83.3k
                tx.witnesses()
506
83.3k
                    .get(b)
507
83.3k
                    .map(|w| w.as_ref().len())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fields12_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fields12_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fields12_0Ba_
Line
Count
Source
507
83.3k
                    .map(|w| w.as_ref().len())
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fields12_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fields12_0Ba_
508
83.3k
                    .ok_or(PanicReason::WitnessNotFound)? as Word
509
            }
510
            GTFArgs::WitnessData => {
511
51.4k
                tx.witnesses_offset_at(b)
512
51.4k
                    .map(|w| ofs.saturating_add(w).saturating_add(WORD_SIZE))
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_4blob8BlobBodyNtB2I_12BlobMetadataEE21get_transaction_fields13_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6create10CreateBodyNtB2I_14CreateMetadataEE21get_transaction_fields13_0Ba_
_RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6script10ScriptBodyNtB2I_14ScriptMetadataEE21get_transaction_fields13_0Ba_
Line
Count
Source
512
51.4k
                    .map(|w| ofs.saturating_add(w).saturating_add(WORD_SIZE))
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_6upload10UploadBodyNtB2I_14UploadMetadataEE21get_transaction_fields13_0Ba_
Unexecuted instantiation: _RNCNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB6_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1c_7upgrade11UpgradeBodyNtB2I_15UpgradeMetadataEE21get_transaction_fields13_0Ba_
513
51.4k
                    .ok_or(PanicReason::WitnessNotFound)? as Word
514
            }
515
516
            // If it is not any above commands, it is something specific to the
517
            // transaction type.
518
1.07M
            specific_args => {
519
1.07M
                let as_script = tx.as_script();
520
1.07M
                let as_create = tx.as_create();
521
1.07M
                match (as_script, as_create, specific_args) {
522
                    // Script
523
83.3k
                    (Some(script), None, GTFArgs::ScriptLength) => {
524
83.3k
                        script.script().len() as Word
525
                    }
526
261k
                    (Some(script), None, GTFArgs::ScriptDataLength) => {
527
261k
                        script.script_data().len() as Word
528
                    }
529
381k
                    (Some(script), None, GTFArgs::Script) => {
530
381k
                        ofs.saturating_add(script.script_offset()) as Word
531
                    }
532
348k
                    (Some(script), None, GTFArgs::ScriptData) => {
533
348k
                        ofs.saturating_add(script.script_data_offset()) as Word
534
                    }
535
536
                    // Create
537
0
                    (None, Some(create), GTFArgs::CreateBytecodeWitnessIndex) => {
538
0
                        *create.bytecode_witness_index() as Word
539
                    }
540
0
                    (None, Some(create), GTFArgs::CreateStorageSlotsCount) => {
541
0
                        create.storage_slots().len() as Word
542
                    }
543
0
                    (None, Some(create), GTFArgs::CreateSalt) => {
544
0
                        ofs.saturating_add(create.salt_offset()) as Word
545
                    }
546
0
                    (None, Some(create), GTFArgs::CreateStorageSlotAtIndex) => {
547
0
                        // TODO: Maybe we need to return panic error
548
0
                        // `StorageSlotsNotFound`?
549
0
                        (ofs.saturating_add(
550
0
                            create.storage_slots_offset_at(b).unwrap_or_default(),
551
0
                        )) as Word
552
                    }
553
8
                    _ => return Err(PanicReason::InvalidMetadataIdentifier.into()),
554
                }
555
            }
556
        };
557
558
10.4M
        *result = a;
559
10.4M
560
10.4M
        inc_pc(self.pc)?;
561
10.4M
        Ok(())
562
10.4M
    }
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB4_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1a_4blob8BlobBodyNtB2G_12BlobMetadataEE21get_transaction_fieldB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB4_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1a_6create10CreateBodyNtB2G_14CreateMetadataEE21get_transaction_fieldB8_
_RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB4_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1a_6script10ScriptBodyNtB2G_14ScriptMetadataEE21get_transaction_fieldB8_
Line
Count
Source
148
10.4M
    pub(crate) fn get_transaction_field(
149
10.4M
        self,
150
10.4M
        result: &mut Word,
151
10.4M
        b: Word,
152
10.4M
        imm: Immediate12,
153
10.4M
    ) -> SimpleResult<()>
154
10.4M
    where
155
10.4M
        Tx: ExecutableTransaction,
156
10.4M
    {
157
10.4M
        let b = convert::to_usize(b).ok_or(PanicReason::InvalidMetadataIdentifier)?;
158
10.4M
        let args = GTFArgs::try_from(imm)?;
159
10.4M
        let tx = self.tx;
160
10.4M
        let input_contract_to_output_index = self.input_contracts_index_to_output_index;
161
10.4M
        let ofs = self.tx_offset;
162
163
        // We use saturating_add with tx offset below.
164
        // In case any addition overflows, this function returns value
165
        // for the field that's above VM_MAX_RAM.
166
167
10.4M
        let a = match args {
168
83.3k
            GTFArgs::Type => Tx::transaction_type(),
169
170
            // General
171
194k
            GTFArgs::ScriptGasLimit => tx
172
194k
                .as_script()
173
194k
                .map(|script| *script.script_gas_limit())
174
194k
                .unwrap_or_default(),
175
433k
            GTFArgs::PolicyTypes => tx.policies().bits() as Word,
176
1
            GTFArgs::PolicyTip => tx
177
1
                .policies()
178
1
                .get(PolicyType::Tip)
179
1
                .ok_or(PanicReason::PolicyIsNotSet)?,
180
1
            GTFArgs::PolicyWitnessLimit => tx
181
1
                .policies()
182
1
                .get(PolicyType::WitnessLimit)
183
1
                .ok_or(PanicReason::PolicyIsNotSet)?,
184
2
            GTFArgs::PolicyMaturity => tx
185
2
                .policies()
186
2
                .get(PolicyType::Maturity)
187
2
                .ok_or(PanicReason::PolicyIsNotSet)?,
188
83.3k
            GTFArgs::PolicyMaxFee => tx
189
83.3k
                .policies()
190
83.3k
                .get(PolicyType::MaxFee)
191
83.3k
                .ok_or(PanicReason::PolicyIsNotSet)?,
192
            GTFArgs::ScriptInputsCount | GTFArgs::CreateInputsCount => {
193
402k
                tx.inputs().len() as Word
194
            }
195
            GTFArgs::ScriptOutputsCount | GTFArgs::CreateOutputsCount => {
196
590k
                tx.outputs().len() as Word
197
            }
198
            GTFArgs::ScriptWitnessesCount | GTFArgs::CreateWitnessesCount => {
199
972k
                tx.witnesses().len() as Word
200
            }
201
405k
            GTFArgs::ScriptInputAtIndex | GTFArgs::CreateInputAtIndex => ofs
202
405k
                .saturating_add(tx.inputs_offset_at(b).ok_or(PanicReason::InputNotFound)?)
203
                as Word,
204
            GTFArgs::ScriptOutputAtIndex | GTFArgs::CreateOutputAtIndex => {
205
409k
                ofs.saturating_add(
206
409k
                    tx.outputs_offset_at(b).ok_or(PanicReason::OutputNotFound)?,
207
                ) as Word
208
            }
209
            GTFArgs::ScriptWitnessAtIndex | GTFArgs::CreateWitnessAtIndex => {
210
641k
                ofs.saturating_add(
211
641k
                    tx.witnesses_offset_at(b)
212
641k
                        .ok_or(PanicReason::WitnessNotFound)?,
213
                ) as Word
214
            }
215
101k
            GTFArgs::TxLength => self.tx_size,
216
217
            // Input
218
            GTFArgs::InputType => {
219
361k
                tx.inputs()
220
361k
                    .get(b)
221
361k
                    .map(InputRepr::from)
222
361k
                    .ok_or(PanicReason::InputNotFound)? as Word
223
            }
224
194k
            GTFArgs::InputCoinTxId => ofs.saturating_add(
225
194k
                tx.inputs()
226
194k
                    .get(b)
227
194k
                    .filter(|i| i.is_coin())
228
194k
                    .map(Input::repr)
229
194k
                    .and_then(|r| r.utxo_id_offset())
230
194k
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
231
194k
                    .ok_or(PanicReason::InputNotFound)?,
232
            ) as Word,
233
            GTFArgs::InputCoinOutputIndex => {
234
250k
                tx.inputs()
235
250k
                    .get(b)
236
250k
                    .filter(|i| i.is_coin())
237
250k
                    .and_then(Input::utxo_id)
238
250k
                    .map(UtxoId::output_index)
239
250k
                    .ok_or(PanicReason::InputNotFound)? as Word
240
            }
241
444k
            GTFArgs::InputCoinOwner => ofs.saturating_add(
242
444k
                tx.inputs()
243
444k
                    .get(b)
244
444k
                    .filter(|i| i.is_coin())
245
444k
                    .map(Input::repr)
246
444k
                    .and_then(|r| r.owner_offset())
247
444k
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
248
444k
                    .ok_or(PanicReason::InputNotFound)?,
249
            ) as Word,
250
211k
            GTFArgs::InputCoinAmount => tx
251
211k
                .inputs()
252
211k
                .get(b)
253
211k
                .filter(|i| i.is_coin())
254
211k
                .and_then(Input::amount)
255
211k
                .ok_or(PanicReason::InputNotFound)?,
256
166k
            GTFArgs::InputCoinAssetId => ofs.saturating_add(
257
166k
                tx.inputs()
258
166k
                    .get(b)
259
166k
                    .filter(|i| i.is_coin())
260
166k
                    .map(Input::repr)
261
166k
                    .and_then(|r| r.asset_id_offset())
262
166k
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
263
166k
                    .ok_or(PanicReason::InputNotFound)?,
264
            ) as Word,
265
1.20M
            GTFArgs::InputCoinTxPointer => ofs.saturating_add(
266
1.20M
                tx.inputs()
267
1.20M
                    .get(b)
268
1.20M
                    .filter(|i| i.is_coin())
269
1.20M
                    .map(Input::repr)
270
1.20M
                    .and_then(|r| r.tx_pointer_offset())
271
1.20M
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
272
1.20M
                    .ok_or(PanicReason::InputNotFound)?,
273
            ) as Word,
274
            GTFArgs::InputCoinWitnessIndex => {
275
208k
                tx.inputs()
276
208k
                    .get(b)
277
208k
                    .filter(|i| i.is_coin())
278
208k
                    .and_then(Input::witness_index)
279
208k
                    .ok_or(PanicReason::InputNotFound)? as Word
280
            }
281
            GTFArgs::InputCoinPredicateLength => {
282
83.3k
                tx.inputs()
283
83.3k
                    .get(b)
284
83.3k
                    .filter(|i| i.is_coin())
285
83.3k
                    .and_then(Input::predicate_len)
286
83.3k
                    .ok_or(PanicReason::InputNotFound)? as Word
287
            }
288
            GTFArgs::InputCoinPredicateDataLength => {
289
83.3k
                tx.inputs()
290
83.3k
                    .get(b)
291
83.3k
                    .filter(|i| i.is_coin())
292
83.3k
                    .and_then(Input::predicate_data_len)
293
83.3k
                    .ok_or(PanicReason::InputNotFound)? as Word
294
            }
295
            GTFArgs::InputCoinPredicateGasUsed => {
296
3
                tx.inputs()
297
3
                    .get(b)
298
3
                    .filter(|i| i.is_coin())
299
3
                    .and_then(Input::predicate_gas_used)
300
3
                    .ok_or(PanicReason::InputNotFound)? as Word
301
            }
302
3
            GTFArgs::InputCoinPredicate => ofs.saturating_add(
303
3
                tx.inputs()
304
3
                    .get(b)
305
3
                    .filter(|i| i.is_coin())
306
3
                    .and_then(Input::predicate_offset)
307
3
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
308
3
                    .ok_or(PanicReason::InputNotFound)?,
309
            ) as Word,
310
3
            GTFArgs::InputCoinPredicateData => ofs.saturating_add(
311
3
                tx.inputs()
312
3
                    .get(b)
313
3
                    .filter(|i| i.is_coin())
314
3
                    .and_then(Input::predicate_data_offset)
315
3
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
316
3
                    .ok_or(PanicReason::InputNotFound)?,
317
            ) as Word,
318
200k
            GTFArgs::InputContractTxId => ofs.saturating_add(
319
200k
                tx.inputs()
320
200k
                    .get(b)
321
200k
                    .filter(|i| i.is_contract())
322
200k
                    .map(Input::repr)
323
200k
                    .and_then(|r| r.utxo_id_offset())
324
200k
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
325
200k
                    .ok_or(PanicReason::InputNotFound)?,
326
            ) as Word,
327
            GTFArgs::InputContractOutputIndex => {
328
250k
                let b = u16::try_from(b)
329
250k
                    .map_err(|_| PanicReason::InvalidMetadataIdentifier)?;
330
250k
                input_contract_to_output_index
331
250k
                    .get(&b)
332
250k
                    .copied()
333
250k
                    .ok_or(PanicReason::InputNotFound)? as Word
334
            }
335
250k
            GTFArgs::InputContractId => ofs.saturating_add(
336
250k
                tx.inputs()
337
250k
                    .get(b)
338
250k
                    .filter(|i| i.is_contract())
339
250k
                    .map(Input::repr)
340
250k
                    .and_then(|r| r.contract_id_offset())
341
250k
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
342
250k
                    .ok_or(PanicReason::InputNotFound)?,
343
            ) as Word,
344
2
            GTFArgs::InputMessageSender => ofs.saturating_add(
345
2
                tx.inputs()
346
2
                    .get(b)
347
2
                    .filter(|i| i.is_message())
348
2
                    .map(Input::repr)
349
2
                    .and_then(|r| r.message_sender_offset())
350
2
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
351
2
                    .ok_or(PanicReason::InputNotFound)?,
352
            ) as Word,
353
5
            GTFArgs::InputMessageRecipient => ofs.saturating_add(
354
5
                tx.inputs()
355
5
                    .get(b)
356
5
                    .filter(|i| i.is_message())
357
5
                    .map(Input::repr)
358
5
                    .and_then(|r| r.message_recipient_offset())
359
5
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
360
5
                    .ok_or(PanicReason::InputNotFound)?,
361
            ) as Word,
362
2
            GTFArgs::InputMessageAmount => tx
363
2
                .inputs()
364
2
                .get(b)
365
2
                .filter(|i| i.is_message())
366
2
                .and_then(Input::amount)
367
2
                .ok_or(PanicReason::InputNotFound)?,
368
3
            GTFArgs::InputMessageNonce => ofs.saturating_add(
369
3
                tx.inputs()
370
3
                    .get(b)
371
3
                    .filter(|i| i.is_message())
372
3
                    .map(Input::repr)
373
3
                    .and_then(|r| r.message_nonce_offset())
374
3
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
375
3
                    .ok_or(PanicReason::InputNotFound)?,
376
            ) as Word,
377
            GTFArgs::InputMessageWitnessIndex => {
378
2
                tx.inputs()
379
2
                    .get(b)
380
2
                    .filter(|i| i.is_message())
381
2
                    .and_then(Input::witness_index)
382
2
                    .ok_or(PanicReason::InputNotFound)? as Word
383
            }
384
            GTFArgs::InputMessageDataLength => {
385
5
                tx.inputs()
386
5
                    .get(b)
387
5
                    .filter(|i| i.is_message())
388
5
                    .and_then(Input::input_data_len)
389
5
                    .ok_or(PanicReason::InputNotFound)? as Word
390
            }
391
            GTFArgs::InputMessagePredicateLength => {
392
3
                tx.inputs()
393
3
                    .get(b)
394
3
                    .filter(|i| i.is_message())
395
3
                    .and_then(Input::predicate_len)
396
3
                    .ok_or(PanicReason::InputNotFound)? as Word
397
            }
398
            GTFArgs::InputMessagePredicateDataLength => {
399
2
                tx.inputs()
400
2
                    .get(b)
401
2
                    .filter(|i| i.is_message())
402
2
                    .and_then(Input::predicate_data_len)
403
2
                    .ok_or(PanicReason::InputNotFound)? as Word
404
            }
405
            GTFArgs::InputMessagePredicateGasUsed => {
406
2
                tx.inputs()
407
2
                    .get(b)
408
2
                    .filter(|i| i.is_message())
409
2
                    .and_then(Input::predicate_gas_used)
410
2
                    .ok_or(PanicReason::InputNotFound)? as Word
411
            }
412
2
            GTFArgs::InputMessageData => ofs.saturating_add(
413
2
                tx.inputs()
414
2
                    .get(b)
415
2
                    .filter(|i| i.is_message())
416
2
                    .map(Input::repr)
417
2
                    .and_then(|r| r.data_offset())
418
2
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
419
2
                    .ok_or(PanicReason::InputNotFound)?,
420
            ) as Word,
421
3
            GTFArgs::InputMessagePredicate => ofs.saturating_add(
422
3
                tx.inputs()
423
3
                    .get(b)
424
3
                    .filter(|i| i.is_message())
425
3
                    .and_then(Input::predicate_offset)
426
3
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
427
3
                    .ok_or(PanicReason::InputNotFound)?,
428
            ) as Word,
429
2
            GTFArgs::InputMessagePredicateData => ofs.saturating_add(
430
2
                tx.inputs()
431
2
                    .get(b)
432
2
                    .filter(|i| i.is_message())
433
2
                    .and_then(Input::predicate_data_offset)
434
2
                    .and_then(|ofs| tx.inputs_offset_at(b).map(|o| o.saturating_add(ofs)))
435
2
                    .ok_or(PanicReason::InputNotFound)?,
436
            ) as Word,
437
438
            // Output
439
            GTFArgs::OutputType => {
440
166k
                tx.outputs()
441
166k
                    .get(b)
442
166k
                    .map(OutputRepr::from)
443
166k
                    .ok_or(PanicReason::OutputNotFound)? as Word
444
            }
445
450k
            GTFArgs::OutputCoinTo => ofs.saturating_add(
446
450k
                tx.outputs()
447
450k
                    .get(b)
448
450k
                    .filter(|o| o.is_coin() || o.is_change())
449
450k
                    .map(Output::repr)
450
450k
                    .and_then(|r| r.to_offset())
451
450k
                    .and_then(|ofs| {
452
                        tx.outputs_offset_at(b).map(|o| o.saturating_add(ofs))
453
450k
                    })
454
450k
                    .ok_or(PanicReason::OutputNotFound)?,
455
            ) as Word,
456
4
            GTFArgs::OutputCoinAmount => tx
457
4
                .outputs()
458
4
                .get(b)
459
4
                .filter(|o| o.is_coin())
460
4
                .and_then(Output::amount)
461
4
                .ok_or(PanicReason::OutputNotFound)?,
462
283k
            GTFArgs::OutputCoinAssetId => ofs.saturating_add(
463
283k
                tx.outputs()
464
283k
                    .get(b)
465
283k
                    .filter(|o| o.is_coin() || o.is_change())
466
283k
                    .map(Output::repr)
467
283k
                    .and_then(|r| r.asset_id_offset())
468
283k
                    .and_then(|ofs| {
469
                        tx.outputs_offset_at(b).map(|o| o.saturating_add(ofs))
470
283k
                    })
471
283k
                    .ok_or(PanicReason::OutputNotFound)?,
472
            ) as Word,
473
            GTFArgs::OutputContractInputIndex => {
474
83.3k
                tx.outputs()
475
83.3k
                    .get(b)
476
83.3k
                    .filter(|o| o.is_contract())
477
83.3k
                    .and_then(Output::input_index)
478
83.3k
                    .ok_or(PanicReason::InputNotFound)? as Word
479
            }
480
2
            GTFArgs::OutputContractCreatedContractId => ofs.saturating_add(
481
2
                tx.outputs()
482
2
                    .get(b)
483
2
                    .filter(|o| o.is_contract_created())
484
2
                    .map(Output::repr)
485
2
                    .and_then(|r| r.contract_id_offset())
486
2
                    .and_then(|ofs| {
487
                        tx.outputs_offset_at(b).map(|o| o.saturating_add(ofs))
488
2
                    })
489
2
                    .ok_or(PanicReason::OutputNotFound)?,
490
            ) as Word,
491
2
            GTFArgs::OutputContractCreatedStateRoot => ofs.saturating_add(
492
2
                tx.outputs()
493
2
                    .get(b)
494
2
                    .filter(|o| o.is_contract_created())
495
2
                    .map(Output::repr)
496
2
                    .and_then(|r| r.contract_created_state_root_offset())
497
2
                    .and_then(|ofs| {
498
                        tx.outputs_offset_at(b).map(|o| o.saturating_add(ofs))
499
2
                    })
500
2
                    .ok_or(PanicReason::OutputNotFound)?,
501
            ) as Word,
502
503
            // Witness
504
            GTFArgs::WitnessDataLength => {
505
83.3k
                tx.witnesses()
506
83.3k
                    .get(b)
507
83.3k
                    .map(|w| w.as_ref().len())
508
83.3k
                    .ok_or(PanicReason::WitnessNotFound)? as Word
509
            }
510
            GTFArgs::WitnessData => {
511
51.4k
                tx.witnesses_offset_at(b)
512
51.4k
                    .map(|w| ofs.saturating_add(w).saturating_add(WORD_SIZE))
513
51.4k
                    .ok_or(PanicReason::WitnessNotFound)? as Word
514
            }
515
516
            // If it is not any above commands, it is something specific to the
517
            // transaction type.
518
1.07M
            specific_args => {
519
1.07M
                let as_script = tx.as_script();
520
1.07M
                let as_create = tx.as_create();
521
1.07M
                match (as_script, as_create, specific_args) {
522
                    // Script
523
83.3k
                    (Some(script), None, GTFArgs::ScriptLength) => {
524
83.3k
                        script.script().len() as Word
525
                    }
526
261k
                    (Some(script), None, GTFArgs::ScriptDataLength) => {
527
261k
                        script.script_data().len() as Word
528
                    }
529
381k
                    (Some(script), None, GTFArgs::Script) => {
530
381k
                        ofs.saturating_add(script.script_offset()) as Word
531
                    }
532
348k
                    (Some(script), None, GTFArgs::ScriptData) => {
533
348k
                        ofs.saturating_add(script.script_data_offset()) as Word
534
                    }
535
536
                    // Create
537
0
                    (None, Some(create), GTFArgs::CreateBytecodeWitnessIndex) => {
538
0
                        *create.bytecode_witness_index() as Word
539
                    }
540
0
                    (None, Some(create), GTFArgs::CreateStorageSlotsCount) => {
541
0
                        create.storage_slots().len() as Word
542
                    }
543
0
                    (None, Some(create), GTFArgs::CreateSalt) => {
544
0
                        ofs.saturating_add(create.salt_offset()) as Word
545
                    }
546
0
                    (None, Some(create), GTFArgs::CreateStorageSlotAtIndex) => {
547
0
                        // TODO: Maybe we need to return panic error
548
0
                        // `StorageSlotsNotFound`?
549
0
                        (ofs.saturating_add(
550
0
                            create.storage_slots_offset_at(b).unwrap_or_default(),
551
0
                        )) as Word
552
                    }
553
8
                    _ => return Err(PanicReason::InvalidMetadataIdentifier.into()),
554
                }
555
            }
556
        };
557
558
10.4M
        *result = a;
559
10.4M
560
10.4M
        inc_pc(self.pc)?;
561
10.4M
        Ok(())
562
10.4M
    }
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB4_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1a_6upload10UploadBodyNtB2G_14UploadMetadataEE21get_transaction_fieldB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8metadataINtB4_8GTFInputINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1a_7upgrade11UpgradeBodyNtB2G_15UpgradeMetadataEE21get_transaction_fieldB8_
563
}
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter/alu.rs
Line
Count
Source
1
use super::{
2
    internal::inc_pc,
3
    is_unsafe_math,
4
    is_wrapping,
5
    ExecutableTransaction,
6
    Interpreter,
7
};
8
use crate::{
9
    constraints::reg_key::*,
10
    error::SimpleResult,
11
};
12
13
use fuel_asm::PanicReason;
14
use fuel_types::{
15
    RegisterId,
16
    Word,
17
};
18
19
mod muldiv;
20
mod wideint;
21
22
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
23
where
24
    Tx: ExecutableTransaction,
25
{
26
    /// Stores the overflowed wrapped value into RegId::OF
27
73.7M
    pub(crate) fn alu_capture_overflow<F, B, C>(
28
73.7M
        &mut self,
29
73.7M
        ra: RegisterId,
30
73.7M
        f: F,
31
73.7M
        b: B,
32
73.7M
        c: C,
33
73.7M
    ) -> SimpleResult<()>
34
73.7M
    where
35
73.7M
        F: FnOnce(B, C) -> (u128, bool),
36
73.7M
    {
37
73.7M
        let (
38
73.7M
            SystemRegisters {
39
73.7M
                flag, of, err, pc, ..
40
73.7M
            },
41
73.7M
            mut w,
42
73.7M
        ) = split_registers(&mut self.registers);
43
73.7M
        let dest = &mut w[ra.try_into()?];
44
73.7M
        let common = AluCommonReg { of, err, pc };
45
73.7M
        alu_capture_overflow(dest, flag.as_ref(), common, f, b, c)
46
73.7M
    }
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_4blob8BlobBodyNtB3L_12BlobMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_addooEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_4blob8BlobBodyNtB3L_12BlobMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_mulooEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_4blob8BlobBodyNtB3L_12BlobMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_subooEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6create10CreateBodyNtB3L_14CreateMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_addooEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6create10CreateBodyNtB3L_14CreateMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_mulooEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6create10CreateBodyNtB3L_14CreateMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_subooEB7_
_RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6script10ScriptBodyNtB3L_14ScriptMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_addooEB7_
Line
Count
Source
27
65.0M
    pub(crate) fn alu_capture_overflow<F, B, C>(
28
65.0M
        &mut self,
29
65.0M
        ra: RegisterId,
30
65.0M
        f: F,
31
65.0M
        b: B,
32
65.0M
        c: C,
33
65.0M
    ) -> SimpleResult<()>
34
65.0M
    where
35
65.0M
        F: FnOnce(B, C) -> (u128, bool),
36
65.0M
    {
37
65.0M
        let (
38
65.0M
            SystemRegisters {
39
65.0M
                flag, of, err, pc, ..
40
65.0M
            },
41
65.0M
            mut w,
42
65.0M
        ) = split_registers(&mut self.registers);
43
65.0M
        let dest = &mut w[ra.try_into()?];
44
65.0M
        let common = AluCommonReg { of, err, pc };
45
65.0M
        alu_capture_overflow(dest, flag.as_ref(), common, f, b, c)
46
65.0M
    }
_RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6script10ScriptBodyNtB3L_14ScriptMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_mulooEB7_
Line
Count
Source
27
5.36M
    pub(crate) fn alu_capture_overflow<F, B, C>(
28
5.36M
        &mut self,
29
5.36M
        ra: RegisterId,
30
5.36M
        f: F,
31
5.36M
        b: B,
32
5.36M
        c: C,
33
5.36M
    ) -> SimpleResult<()>
34
5.36M
    where
35
5.36M
        F: FnOnce(B, C) -> (u128, bool),
36
5.36M
    {
37
5.36M
        let (
38
5.36M
            SystemRegisters {
39
5.36M
                flag, of, err, pc, ..
40
5.36M
            },
41
5.36M
            mut w,
42
5.36M
        ) = split_registers(&mut self.registers);
43
5.36M
        let dest = &mut w[ra.try_into()?];
44
5.36M
        let common = AluCommonReg { of, err, pc };
45
5.36M
        alu_capture_overflow(dest, flag.as_ref(), common, f, b, c)
46
5.36M
    }
_RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6script10ScriptBodyNtB3L_14ScriptMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_subooEB7_
Line
Count
Source
27
3.36M
    pub(crate) fn alu_capture_overflow<F, B, C>(
28
3.36M
        &mut self,
29
3.36M
        ra: RegisterId,
30
3.36M
        f: F,
31
3.36M
        b: B,
32
3.36M
        c: C,
33
3.36M
    ) -> SimpleResult<()>
34
3.36M
    where
35
3.36M
        F: FnOnce(B, C) -> (u128, bool),
36
3.36M
    {
37
3.36M
        let (
38
3.36M
            SystemRegisters {
39
3.36M
                flag, of, err, pc, ..
40
3.36M
            },
41
3.36M
            mut w,
42
3.36M
        ) = split_registers(&mut self.registers);
43
3.36M
        let dest = &mut w[ra.try_into()?];
44
3.36M
        let common = AluCommonReg { of, err, pc };
45
3.36M
        alu_capture_overflow(dest, flag.as_ref(), common, f, b, c)
46
3.36M
    }
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_4blob8BlobBodyNtB4f_12BlobMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_addooEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_4blob8BlobBodyNtB4f_12BlobMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_mulooEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_4blob8BlobBodyNtB4f_12BlobMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_subooEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6create10CreateBodyNtB4f_14CreateMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_addooEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6create10CreateBodyNtB4f_14CreateMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_mulooEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6create10CreateBodyNtB4f_14CreateMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_subooEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6script10ScriptBodyNtB4f_14ScriptMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_addooEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6script10ScriptBodyNtB4f_14ScriptMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_mulooEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6script10ScriptBodyNtB4f_14ScriptMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_subooEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6upload10UploadBodyNtB4f_14UploadMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_addooEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6upload10UploadBodyNtB4f_14UploadMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_mulooEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6upload10UploadBodyNtB4f_14UploadMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_subooEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_7upgrade11UpgradeBodyNtB4f_15UpgradeMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_addooEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_7upgrade11UpgradeBodyNtB4f_15UpgradeMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_mulooEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_7upgrade11UpgradeBodyNtB4f_15UpgradeMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_subooEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtNtB1D_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2T_6script10ScriptBodyNtB4p_14ScriptMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_addooEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtNtB1D_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2T_6script10ScriptBodyNtB4p_14ScriptMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_mulooEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtNtB1D_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2T_6script10ScriptBodyNtB4p_14ScriptMetadataEE20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_subooEB7_
47
48
    /// Set RegId::OF to true and zero the result register if overflow occurred.
49
3.33M
    pub(crate) fn alu_boolean_overflow<F, B, C>(
50
3.33M
        &mut self,
51
3.33M
        ra: RegisterId,
52
3.33M
        f: F,
53
3.33M
        b: B,
54
3.33M
        c: C,
55
3.33M
    ) -> SimpleResult<()>
56
3.33M
    where
57
3.33M
        F: FnOnce(B, C) -> (Word, bool),
58
3.33M
    {
59
3.33M
        let (
60
3.33M
            SystemRegisters {
61
3.33M
                flag, of, err, pc, ..
62
3.33M
            },
63
3.33M
            mut w,
64
3.33M
        ) = split_registers(&mut self.registers);
65
3.33M
        let dest = &mut w[ra.try_into()?];
66
3.33M
        let common = AluCommonReg { of, err, pc };
67
3.33M
        alu_boolean_overflow(dest, flag.as_ref(), common, f, b, c)
68
3.33M
    }
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_4blob8BlobBodyNtB3L_12BlobMetadataEE20alu_boolean_overflowNvB3_3expyyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_4blob8BlobBodyNtB3L_12BlobMetadataEE20alu_boolean_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_powymEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6create10CreateBodyNtB3L_14CreateMetadataEE20alu_boolean_overflowNvB3_3expyyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6create10CreateBodyNtB3L_14CreateMetadataEE20alu_boolean_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_powymEB7_
_RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6script10ScriptBodyNtB3L_14ScriptMetadataEE20alu_boolean_overflowNvB3_3expyyEB7_
Line
Count
Source
49
1.59M
    pub(crate) fn alu_boolean_overflow<F, B, C>(
50
1.59M
        &mut self,
51
1.59M
        ra: RegisterId,
52
1.59M
        f: F,
53
1.59M
        b: B,
54
1.59M
        c: C,
55
1.59M
    ) -> SimpleResult<()>
56
1.59M
    where
57
1.59M
        F: FnOnce(B, C) -> (Word, bool),
58
1.59M
    {
59
1.59M
        let (
60
1.59M
            SystemRegisters {
61
1.59M
                flag, of, err, pc, ..
62
1.59M
            },
63
1.59M
            mut w,
64
1.59M
        ) = split_registers(&mut self.registers);
65
1.59M
        let dest = &mut w[ra.try_into()?];
66
1.59M
        let common = AluCommonReg { of, err, pc };
67
1.59M
        alu_boolean_overflow(dest, flag.as_ref(), common, f, b, c)
68
1.59M
    }
_RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6script10ScriptBodyNtB3L_14ScriptMetadataEE20alu_boolean_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_powymEB7_
Line
Count
Source
49
1.74M
    pub(crate) fn alu_boolean_overflow<F, B, C>(
50
1.74M
        &mut self,
51
1.74M
        ra: RegisterId,
52
1.74M
        f: F,
53
1.74M
        b: B,
54
1.74M
        c: C,
55
1.74M
    ) -> SimpleResult<()>
56
1.74M
    where
57
1.74M
        F: FnOnce(B, C) -> (Word, bool),
58
1.74M
    {
59
1.74M
        let (
60
1.74M
            SystemRegisters {
61
1.74M
                flag, of, err, pc, ..
62
1.74M
            },
63
1.74M
            mut w,
64
1.74M
        ) = split_registers(&mut self.registers);
65
1.74M
        let dest = &mut w[ra.try_into()?];
66
1.74M
        let common = AluCommonReg { of, err, pc };
67
1.74M
        alu_boolean_overflow(dest, flag.as_ref(), common, f, b, c)
68
1.74M
    }
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_4blob8BlobBodyNtB4f_12BlobMetadataEE20alu_boolean_overflowNvB3_3expyyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_4blob8BlobBodyNtB4f_12BlobMetadataEE20alu_boolean_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_powymEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6create10CreateBodyNtB4f_14CreateMetadataEE20alu_boolean_overflowNvB3_3expyyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6create10CreateBodyNtB4f_14CreateMetadataEE20alu_boolean_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_powymEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6script10ScriptBodyNtB4f_14ScriptMetadataEE20alu_boolean_overflowNvB3_3expyyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6script10ScriptBodyNtB4f_14ScriptMetadataEE20alu_boolean_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_powymEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6upload10UploadBodyNtB4f_14UploadMetadataEE20alu_boolean_overflowNvB3_3expyyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6upload10UploadBodyNtB4f_14UploadMetadataEE20alu_boolean_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_powymEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_7upgrade11UpgradeBodyNtB4f_15UpgradeMetadataEE20alu_boolean_overflowNvB3_3expyyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_7upgrade11UpgradeBodyNtB4f_15UpgradeMetadataEE20alu_boolean_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_powymEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtNtB1D_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2T_6script10ScriptBodyNtB4p_14ScriptMetadataEE20alu_boolean_overflowNvB3_3expyyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtNtB1D_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2T_6script10ScriptBodyNtB4p_14ScriptMetadataEE20alu_boolean_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_powymEB7_
69
70
10.7M
    pub(crate) fn alu_error<F, B, C>(
71
10.7M
        &mut self,
72
10.7M
        ra: RegisterId,
73
10.7M
        f: F,
74
10.7M
        b: B,
75
10.7M
        c: C,
76
10.7M
        err_bool: bool,
77
10.7M
    ) -> SimpleResult<()>
78
10.7M
    where
79
10.7M
        F: FnOnce(B, C) -> Word,
80
10.7M
    {
81
10.7M
        let (
82
10.7M
            SystemRegisters {
83
10.7M
                flag, of, err, pc, ..
84
10.7M
            },
85
10.7M
            mut w,
86
10.7M
        ) = split_registers(&mut self.registers);
87
10.7M
        let dest = &mut w[ra.try_into()?];
88
10.7M
        let common = AluCommonReg { of, err, pc };
89
10.7M
        alu_error(dest, flag.as_ref(), common, f, b, c, err_bool)
90
10.7M
    }
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_4blob8BlobBodyNtB3L_12BlobMetadataEE9alu_errorNCNvMNtNtB5_9executors11instructionBK_17instruction_inners0_0yyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_4blob8BlobBodyNtB3L_12BlobMetadataEE9alu_errorNCNvMNtNtB5_9executors11instructionBK_17instruction_inners_0yyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_4blob8BlobBodyNtB3L_12BlobMetadataEE9alu_errorNvMs7_NtCsd3UI3IJrzMw_4core3numy12wrapping_remyyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_4blob8BlobBodyNtB3L_12BlobMetadataEE9alu_errorNvYyNtNtNtCsd3UI3IJrzMw_4core3ops5arith3Div3divyyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6create10CreateBodyNtB3L_14CreateMetadataEE9alu_errorNCNvMNtNtB5_9executors11instructionBK_17instruction_inners0_0yyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6create10CreateBodyNtB3L_14CreateMetadataEE9alu_errorNCNvMNtNtB5_9executors11instructionBK_17instruction_inners_0yyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6create10CreateBodyNtB3L_14CreateMetadataEE9alu_errorNvMs7_NtCsd3UI3IJrzMw_4core3numy12wrapping_remyyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6create10CreateBodyNtB3L_14CreateMetadataEE9alu_errorNvYyNtNtNtCsd3UI3IJrzMw_4core3ops5arith3Div3divyyEB7_
_RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6script10ScriptBodyNtB3L_14ScriptMetadataEE9alu_errorNCNvMNtNtB5_9executors11instructionBK_17instruction_inners0_0yyEB7_
Line
Count
Source
70
1.48M
    pub(crate) fn alu_error<F, B, C>(
71
1.48M
        &mut self,
72
1.48M
        ra: RegisterId,
73
1.48M
        f: F,
74
1.48M
        b: B,
75
1.48M
        c: C,
76
1.48M
        err_bool: bool,
77
1.48M
    ) -> SimpleResult<()>
78
1.48M
    where
79
1.48M
        F: FnOnce(B, C) -> Word,
80
1.48M
    {
81
1.48M
        let (
82
1.48M
            SystemRegisters {
83
1.48M
                flag, of, err, pc, ..
84
1.48M
            },
85
1.48M
            mut w,
86
1.48M
        ) = split_registers(&mut self.registers);
87
1.48M
        let dest = &mut w[ra.try_into()?];
88
1.48M
        let common = AluCommonReg { of, err, pc };
89
1.48M
        alu_error(dest, flag.as_ref(), common, f, b, c, err_bool)
90
1.48M
    }
_RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6script10ScriptBodyNtB3L_14ScriptMetadataEE9alu_errorNCNvMNtNtB5_9executors11instructionBK_17instruction_inners_0yyEB7_
Line
Count
Source
70
1.04M
    pub(crate) fn alu_error<F, B, C>(
71
1.04M
        &mut self,
72
1.04M
        ra: RegisterId,
73
1.04M
        f: F,
74
1.04M
        b: B,
75
1.04M
        c: C,
76
1.04M
        err_bool: bool,
77
1.04M
    ) -> SimpleResult<()>
78
1.04M
    where
79
1.04M
        F: FnOnce(B, C) -> Word,
80
1.04M
    {
81
1.04M
        let (
82
1.04M
            SystemRegisters {
83
1.04M
                flag, of, err, pc, ..
84
1.04M
            },
85
1.04M
            mut w,
86
1.04M
        ) = split_registers(&mut self.registers);
87
1.04M
        let dest = &mut w[ra.try_into()?];
88
1.04M
        let common = AluCommonReg { of, err, pc };
89
1.04M
        alu_error(dest, flag.as_ref(), common, f, b, c, err_bool)
90
1.04M
    }
_RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6script10ScriptBodyNtB3L_14ScriptMetadataEE9alu_errorNvMs7_NtCsd3UI3IJrzMw_4core3numy12wrapping_remyyEB7_
Line
Count
Source
70
2.62M
    pub(crate) fn alu_error<F, B, C>(
71
2.62M
        &mut self,
72
2.62M
        ra: RegisterId,
73
2.62M
        f: F,
74
2.62M
        b: B,
75
2.62M
        c: C,
76
2.62M
        err_bool: bool,
77
2.62M
    ) -> SimpleResult<()>
78
2.62M
    where
79
2.62M
        F: FnOnce(B, C) -> Word,
80
2.62M
    {
81
2.62M
        let (
82
2.62M
            SystemRegisters {
83
2.62M
                flag, of, err, pc, ..
84
2.62M
            },
85
2.62M
            mut w,
86
2.62M
        ) = split_registers(&mut self.registers);
87
2.62M
        let dest = &mut w[ra.try_into()?];
88
2.62M
        let common = AluCommonReg { of, err, pc };
89
2.62M
        alu_error(dest, flag.as_ref(), common, f, b, c, err_bool)
90
2.62M
    }
_RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6script10ScriptBodyNtB3L_14ScriptMetadataEE9alu_errorNvYyNtNtNtCsd3UI3IJrzMw_4core3ops5arith3Div3divyyEB7_
Line
Count
Source
70
5.62M
    pub(crate) fn alu_error<F, B, C>(
71
5.62M
        &mut self,
72
5.62M
        ra: RegisterId,
73
5.62M
        f: F,
74
5.62M
        b: B,
75
5.62M
        c: C,
76
5.62M
        err_bool: bool,
77
5.62M
    ) -> SimpleResult<()>
78
5.62M
    where
79
5.62M
        F: FnOnce(B, C) -> Word,
80
5.62M
    {
81
5.62M
        let (
82
5.62M
            SystemRegisters {
83
5.62M
                flag, of, err, pc, ..
84
5.62M
            },
85
5.62M
            mut w,
86
5.62M
        ) = split_registers(&mut self.registers);
87
5.62M
        let dest = &mut w[ra.try_into()?];
88
5.62M
        let common = AluCommonReg { of, err, pc };
89
5.62M
        alu_error(dest, flag.as_ref(), common, f, b, c, err_bool)
90
5.62M
    }
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_4blob8BlobBodyNtB4f_12BlobMetadataEE9alu_errorNCNvMNtNtB5_9executors11instructionBK_17instruction_inners0_0yyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_4blob8BlobBodyNtB4f_12BlobMetadataEE9alu_errorNCNvMNtNtB5_9executors11instructionBK_17instruction_inners_0yyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_4blob8BlobBodyNtB4f_12BlobMetadataEE9alu_errorNvMs7_NtCsd3UI3IJrzMw_4core3numy12wrapping_remyyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_4blob8BlobBodyNtB4f_12BlobMetadataEE9alu_errorNvYyNtNtNtCsd3UI3IJrzMw_4core3ops5arith3Div3divyyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6create10CreateBodyNtB4f_14CreateMetadataEE9alu_errorNCNvMNtNtB5_9executors11instructionBK_17instruction_inners0_0yyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6create10CreateBodyNtB4f_14CreateMetadataEE9alu_errorNCNvMNtNtB5_9executors11instructionBK_17instruction_inners_0yyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6create10CreateBodyNtB4f_14CreateMetadataEE9alu_errorNvMs7_NtCsd3UI3IJrzMw_4core3numy12wrapping_remyyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6create10CreateBodyNtB4f_14CreateMetadataEE9alu_errorNvYyNtNtNtCsd3UI3IJrzMw_4core3ops5arith3Div3divyyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6script10ScriptBodyNtB4f_14ScriptMetadataEE9alu_errorNCNvMNtNtB5_9executors11instructionBK_17instruction_inners0_0yyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6script10ScriptBodyNtB4f_14ScriptMetadataEE9alu_errorNCNvMNtNtB5_9executors11instructionBK_17instruction_inners_0yyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6script10ScriptBodyNtB4f_14ScriptMetadataEE9alu_errorNvMs7_NtCsd3UI3IJrzMw_4core3numy12wrapping_remyyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6script10ScriptBodyNtB4f_14ScriptMetadataEE9alu_errorNvYyNtNtNtCsd3UI3IJrzMw_4core3ops5arith3Div3divyyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6upload10UploadBodyNtB4f_14UploadMetadataEE9alu_errorNCNvMNtNtB5_9executors11instructionBK_17instruction_inners0_0yyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6upload10UploadBodyNtB4f_14UploadMetadataEE9alu_errorNCNvMNtNtB5_9executors11instructionBK_17instruction_inners_0yyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6upload10UploadBodyNtB4f_14UploadMetadataEE9alu_errorNvMs7_NtCsd3UI3IJrzMw_4core3numy12wrapping_remyyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6upload10UploadBodyNtB4f_14UploadMetadataEE9alu_errorNvYyNtNtNtCsd3UI3IJrzMw_4core3ops5arith3Div3divyyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_7upgrade11UpgradeBodyNtB4f_15UpgradeMetadataEE9alu_errorNCNvMNtNtB5_9executors11instructionBK_17instruction_inners0_0yyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_7upgrade11UpgradeBodyNtB4f_15UpgradeMetadataEE9alu_errorNCNvMNtNtB5_9executors11instructionBK_17instruction_inners_0yyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_7upgrade11UpgradeBodyNtB4f_15UpgradeMetadataEE9alu_errorNvMs7_NtCsd3UI3IJrzMw_4core3numy12wrapping_remyyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_7upgrade11UpgradeBodyNtB4f_15UpgradeMetadataEE9alu_errorNvYyNtNtNtCsd3UI3IJrzMw_4core3ops5arith3Div3divyyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtNtB1D_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2T_6script10ScriptBodyNtB4p_14ScriptMetadataEE9alu_errorNCNvMNtNtB5_9executors11instructionBK_17instruction_inners0_0yyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtNtB1D_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2T_6script10ScriptBodyNtB4p_14ScriptMetadataEE9alu_errorNCNvMNtNtB5_9executors11instructionBK_17instruction_inners_0yyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtNtB1D_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2T_6script10ScriptBodyNtB4p_14ScriptMetadataEE9alu_errorNvMs7_NtCsd3UI3IJrzMw_4core3numy12wrapping_remyyEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtNtB1D_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2T_6script10ScriptBodyNtB4p_14ScriptMetadataEE9alu_errorNvYyNtNtNtCsd3UI3IJrzMw_4core3ops5arith3Div3divyyEB7_
91
92
69.6M
    pub(crate) fn alu_set(&mut self, ra: RegisterId, b: Word) -> SimpleResult<()> {
93
69.6M
        let (SystemRegisters { of, err, pc, .. }, mut w) =
94
69.6M
            split_registers(&mut self.registers);
95
69.6M
        let dest = &mut w[ra.try_into()?];
96
69.6M
        let common = AluCommonReg { of, err, pc };
97
69.6M
        alu_set(dest, common, b)
98
69.6M
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_4blob8BlobBodyNtB3K_12BlobMetadataEE7alu_setB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_6create10CreateBodyNtB3K_14CreateMetadataEE7alu_setB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_6script10ScriptBodyNtB3K_14ScriptMetadataEE7alu_setB6_
Line
Count
Source
92
69.6M
    pub(crate) fn alu_set(&mut self, ra: RegisterId, b: Word) -> SimpleResult<()> {
93
69.6M
        let (SystemRegisters { of, err, pc, .. }, mut w) =
94
69.6M
            split_registers(&mut self.registers);
95
69.6M
        let dest = &mut w[ra.try_into()?];
96
69.6M
        let common = AluCommonReg { of, err, pc };
97
69.6M
        alu_set(dest, common, b)
98
69.6M
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_4blob8BlobBodyNtB4e_12BlobMetadataEE7alu_setB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6create10CreateBodyNtB4e_14CreateMetadataEE7alu_setB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6script10ScriptBodyNtB4e_14ScriptMetadataEE7alu_setB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6upload10UploadBodyNtB4e_14UploadMetadataEE7alu_setB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_7upgrade11UpgradeBodyNtB4e_15UpgradeMetadataEE7alu_setB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1C_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6script10ScriptBodyNtB4o_14ScriptMetadataEE7alu_setB6_
99
100
447k
    pub(crate) fn alu_clear(&mut self) -> SimpleResult<()> {
101
447k
        let (SystemRegisters { of, err, pc, .. }, _) =
102
447k
            split_registers(&mut self.registers);
103
447k
        let common = AluCommonReg { of, err, pc };
104
447k
        alu_clear(common)
105
447k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_4blob8BlobBodyNtB3K_12BlobMetadataEE9alu_clearB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_6create10CreateBodyNtB3K_14CreateMetadataEE9alu_clearB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_6script10ScriptBodyNtB3K_14ScriptMetadataEE9alu_clearB6_
Line
Count
Source
100
447k
    pub(crate) fn alu_clear(&mut self) -> SimpleResult<()> {
101
447k
        let (SystemRegisters { of, err, pc, .. }, _) =
102
447k
            split_registers(&mut self.registers);
103
447k
        let common = AluCommonReg { of, err, pc };
104
447k
        alu_clear(common)
105
447k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_4blob8BlobBodyNtB4e_12BlobMetadataEE9alu_clearB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6create10CreateBodyNtB4e_14CreateMetadataEE9alu_clearB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6script10ScriptBodyNtB4e_14ScriptMetadataEE9alu_clearB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6upload10UploadBodyNtB4e_14UploadMetadataEE9alu_clearB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_7upgrade11UpgradeBodyNtB4e_15UpgradeMetadataEE9alu_clearB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3aluINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1C_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6script10ScriptBodyNtB4o_14ScriptMetadataEE9alu_clearB6_
106
}
107
108
1.59M
pub(crate) fn exp(b: Word, c: Word) -> (Word, bool) {
109
1.59M
    if let Ok(expo) = u32::try_from(c) {
110
1.36M
        Word::overflowing_pow(b, expo)
111
232k
    } else if b < 2 {
112
232k
        (b, false)
113
    } else {
114
1
        (0, true)
115
    }
116
1.59M
}
117
118
pub(crate) struct AluCommonReg<'a> {
119
    pub of: RegMut<'a, OF>,
120
    pub err: RegMut<'a, ERR>,
121
    pub pc: RegMut<'a, PC>,
122
}
123
124
/// Stores the overflowed wrapped value into RegId::OF
125
73.7M
pub(crate) fn alu_capture_overflow<F, B, C>(
126
73.7M
    dest: &mut Word,
127
73.7M
    flag: Reg<FLAG>,
128
73.7M
    mut common: AluCommonReg,
129
73.7M
    f: F,
130
73.7M
    b: B,
131
73.7M
    c: C,
132
73.7M
) -> SimpleResult<()>
133
73.7M
where
134
73.7M
    F: FnOnce(B, C) -> (u128, bool),
135
73.7M
{
136
73.7M
    let (result, _overflow) = f(b, c);
137
73.7M
138
73.7M
    if result > Word::MAX as u128 && !is_wrapping(flag) {
139
20
        return Err(PanicReason::ArithmeticOverflow.into())
140
73.7M
    }
141
73.7M
142
73.7M
    // set the OF register to high bits of the u128 result
143
73.7M
    *common.of = (result >> 64) as u64;
144
73.7M
    *common.err = 0;
145
73.7M
146
73.7M
    // set the return value to the low bits of the u128 result
147
73.7M
    *dest = u64::try_from(result & Word::MAX as u128)
148
73.7M
        .expect("We already truncated the result");
149
73.7M
150
73.7M
    Ok(inc_pc(common.pc)?)
151
73.7M
}
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_addooEB6_
Line
Count
Source
125
65.0M
pub(crate) fn alu_capture_overflow<F, B, C>(
126
65.0M
    dest: &mut Word,
127
65.0M
    flag: Reg<FLAG>,
128
65.0M
    mut common: AluCommonReg,
129
65.0M
    f: F,
130
65.0M
    b: B,
131
65.0M
    c: C,
132
65.0M
) -> SimpleResult<()>
133
65.0M
where
134
65.0M
    F: FnOnce(B, C) -> (u128, bool),
135
65.0M
{
136
65.0M
    let (result, _overflow) = f(b, c);
137
65.0M
138
65.0M
    if result > Word::MAX as u128 && !is_wrapping(flag) {
139
4
        return Err(PanicReason::ArithmeticOverflow.into())
140
65.0M
    }
141
65.0M
142
65.0M
    // set the OF register to high bits of the u128 result
143
65.0M
    *common.of = (result >> 64) as u64;
144
65.0M
    *common.err = 0;
145
65.0M
146
65.0M
    // set the return value to the low bits of the u128 result
147
65.0M
    *dest = u64::try_from(result & Word::MAX as u128)
148
65.0M
        .expect("We already truncated the result");
149
65.0M
150
65.0M
    Ok(inc_pc(common.pc)?)
151
65.0M
}
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_mulooEB6_
Line
Count
Source
125
5.36M
pub(crate) fn alu_capture_overflow<F, B, C>(
126
5.36M
    dest: &mut Word,
127
5.36M
    flag: Reg<FLAG>,
128
5.36M
    mut common: AluCommonReg,
129
5.36M
    f: F,
130
5.36M
    b: B,
131
5.36M
    c: C,
132
5.36M
) -> SimpleResult<()>
133
5.36M
where
134
5.36M
    F: FnOnce(B, C) -> (u128, bool),
135
5.36M
{
136
5.36M
    let (result, _overflow) = f(b, c);
137
5.36M
138
5.36M
    if result > Word::MAX as u128 && !is_wrapping(flag) {
139
12
        return Err(PanicReason::ArithmeticOverflow.into())
140
5.36M
    }
141
5.36M
142
5.36M
    // set the OF register to high bits of the u128 result
143
5.36M
    *common.of = (result >> 64) as u64;
144
5.36M
    *common.err = 0;
145
5.36M
146
5.36M
    // set the return value to the low bits of the u128 result
147
5.36M
    *dest = u64::try_from(result & Word::MAX as u128)
148
5.36M
        .expect("We already truncated the result");
149
5.36M
150
5.36M
    Ok(inc_pc(common.pc)?)
151
5.36M
}
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu20alu_capture_overflowNvMs8_NtCsd3UI3IJrzMw_4core3numo15overflowing_subooEB6_
Line
Count
Source
125
3.36M
pub(crate) fn alu_capture_overflow<F, B, C>(
126
3.36M
    dest: &mut Word,
127
3.36M
    flag: Reg<FLAG>,
128
3.36M
    mut common: AluCommonReg,
129
3.36M
    f: F,
130
3.36M
    b: B,
131
3.36M
    c: C,
132
3.36M
) -> SimpleResult<()>
133
3.36M
where
134
3.36M
    F: FnOnce(B, C) -> (u128, bool),
135
3.36M
{
136
3.36M
    let (result, _overflow) = f(b, c);
137
3.36M
138
3.36M
    if result > Word::MAX as u128 && !is_wrapping(flag) {
139
4
        return Err(PanicReason::ArithmeticOverflow.into())
140
3.36M
    }
141
3.36M
142
3.36M
    // set the OF register to high bits of the u128 result
143
3.36M
    *common.of = (result >> 64) as u64;
144
3.36M
    *common.err = 0;
145
3.36M
146
3.36M
    // set the return value to the low bits of the u128 result
147
3.36M
    *dest = u64::try_from(result & Word::MAX as u128)
148
3.36M
        .expect("We already truncated the result");
149
3.36M
150
3.36M
    Ok(inc_pc(common.pc)?)
151
3.36M
}
152
153
/// Set RegId::OF to true and zero the result register if overflow occurred.
154
3.33M
pub(crate) fn alu_boolean_overflow<F, B, C>(
155
3.33M
    dest: &mut Word,
156
3.33M
    flag: Reg<FLAG>,
157
3.33M
    mut common: AluCommonReg,
158
3.33M
    f: F,
159
3.33M
    b: B,
160
3.33M
    c: C,
161
3.33M
) -> SimpleResult<()>
162
3.33M
where
163
3.33M
    F: FnOnce(B, C) -> (Word, bool),
164
3.33M
{
165
3.33M
    let (result, overflow) = f(b, c);
166
3.33M
167
3.33M
    if overflow && !is_wrapping(flag) {
168
7
        return Err(PanicReason::ArithmeticOverflow.into())
169
3.33M
    }
170
3.33M
171
3.33M
    // set the OF register to 1 if an overflow occurred
172
3.33M
    *common.of = overflow as Word;
173
3.33M
    *common.err = 0;
174
3.33M
175
3.33M
    *dest = if overflow { 0 } else { result };
176
177
3.33M
    Ok(inc_pc(common.pc)?)
178
3.33M
}
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu20alu_boolean_overflowNvB2_3expyyEB6_
Line
Count
Source
154
1.59M
pub(crate) fn alu_boolean_overflow<F, B, C>(
155
1.59M
    dest: &mut Word,
156
1.59M
    flag: Reg<FLAG>,
157
1.59M
    mut common: AluCommonReg,
158
1.59M
    f: F,
159
1.59M
    b: B,
160
1.59M
    c: C,
161
1.59M
) -> SimpleResult<()>
162
1.59M
where
163
1.59M
    F: FnOnce(B, C) -> (Word, bool),
164
1.59M
{
165
1.59M
    let (result, overflow) = f(b, c);
166
1.59M
167
1.59M
    if overflow && !is_wrapping(flag) {
168
3
        return Err(PanicReason::ArithmeticOverflow.into())
169
1.59M
    }
170
1.59M
171
1.59M
    // set the OF register to 1 if an overflow occurred
172
1.59M
    *common.of = overflow as Word;
173
1.59M
    *common.err = 0;
174
1.59M
175
1.59M
    *dest = if overflow { 0 } else { result };
176
177
1.59M
    Ok(inc_pc(common.pc)?)
178
1.59M
}
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu20alu_boolean_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_powymEB6_
Line
Count
Source
154
1.74M
pub(crate) fn alu_boolean_overflow<F, B, C>(
155
1.74M
    dest: &mut Word,
156
1.74M
    flag: Reg<FLAG>,
157
1.74M
    mut common: AluCommonReg,
158
1.74M
    f: F,
159
1.74M
    b: B,
160
1.74M
    c: C,
161
1.74M
) -> SimpleResult<()>
162
1.74M
where
163
1.74M
    F: FnOnce(B, C) -> (Word, bool),
164
1.74M
{
165
1.74M
    let (result, overflow) = f(b, c);
166
1.74M
167
1.74M
    if overflow && !is_wrapping(flag) {
168
4
        return Err(PanicReason::ArithmeticOverflow.into())
169
1.74M
    }
170
1.74M
171
1.74M
    // set the OF register to 1 if an overflow occurred
172
1.74M
    *common.of = overflow as Word;
173
1.74M
    *common.err = 0;
174
1.74M
175
1.74M
    *dest = if overflow { 0 } else { result };
176
177
1.74M
    Ok(inc_pc(common.pc)?)
178
1.74M
}
179
180
10.7M
pub(crate) fn alu_error<F, B, C>(
181
10.7M
    dest: &mut Word,
182
10.7M
    flag: Reg<FLAG>,
183
10.7M
    mut common: AluCommonReg,
184
10.7M
    f: F,
185
10.7M
    b: B,
186
10.7M
    c: C,
187
10.7M
    err_bool: bool,
188
10.7M
) -> SimpleResult<()>
189
10.7M
where
190
10.7M
    F: FnOnce(B, C) -> Word,
191
10.7M
{
192
10.7M
    if err_bool && !is_unsafe_math(flag) {
193
14
        return Err(PanicReason::ArithmeticError.into())
194
10.7M
    }
195
10.7M
196
10.7M
    *common.of = 0;
197
10.7M
    *common.err = err_bool as Word;
198
10.7M
199
10.7M
    *dest = if err_bool { 0 } else { f(b, c) };
200
201
10.7M
    Ok(inc_pc(common.pc)?)
202
10.7M
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu9alu_errorNCNvMNtNtB4_9executors11instructionINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2X_4blob8BlobBodyNtB4t_12BlobMetadataEE17instruction_inners0_0yyEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu9alu_errorNCNvMNtNtB4_9executors11instructionINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2X_4blob8BlobBodyNtB4t_12BlobMetadataEE17instruction_inners_0yyEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu9alu_errorNCNvMNtNtB4_9executors11instructionINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2X_6create10CreateBodyNtB4t_14CreateMetadataEE17instruction_inners0_0yyEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu9alu_errorNCNvMNtNtB4_9executors11instructionINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2X_6create10CreateBodyNtB4t_14CreateMetadataEE17instruction_inners_0yyEB6_
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu9alu_errorNCNvMNtNtB4_9executors11instructionINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2X_6script10ScriptBodyNtB4t_14ScriptMetadataEE17instruction_inners0_0yyEB6_
Line
Count
Source
180
1.48M
pub(crate) fn alu_error<F, B, C>(
181
1.48M
    dest: &mut Word,
182
1.48M
    flag: Reg<FLAG>,
183
1.48M
    mut common: AluCommonReg,
184
1.48M
    f: F,
185
1.48M
    b: B,
186
1.48M
    c: C,
187
1.48M
    err_bool: bool,
188
1.48M
) -> SimpleResult<()>
189
1.48M
where
190
1.48M
    F: FnOnce(B, C) -> Word,
191
1.48M
{
192
1.48M
    if err_bool && !is_unsafe_math(flag) {
193
2
        return Err(PanicReason::ArithmeticError.into())
194
1.48M
    }
195
1.48M
196
1.48M
    *common.of = 0;
197
1.48M
    *common.err = err_bool as Word;
198
1.48M
199
1.48M
    *dest = if err_bool { 0 } else { f(b, c) };
200
201
1.48M
    Ok(inc_pc(common.pc)?)
202
1.48M
}
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu9alu_errorNCNvMNtNtB4_9executors11instructionINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2X_6script10ScriptBodyNtB4t_14ScriptMetadataEE17instruction_inners_0yyEB6_
Line
Count
Source
180
1.04M
pub(crate) fn alu_error<F, B, C>(
181
1.04M
    dest: &mut Word,
182
1.04M
    flag: Reg<FLAG>,
183
1.04M
    mut common: AluCommonReg,
184
1.04M
    f: F,
185
1.04M
    b: B,
186
1.04M
    c: C,
187
1.04M
    err_bool: bool,
188
1.04M
) -> SimpleResult<()>
189
1.04M
where
190
1.04M
    F: FnOnce(B, C) -> Word,
191
1.04M
{
192
1.04M
    if err_bool && !is_unsafe_math(flag) {
193
4
        return Err(PanicReason::ArithmeticError.into())
194
1.04M
    }
195
1.04M
196
1.04M
    *common.of = 0;
197
1.04M
    *common.err = err_bool as Word;
198
1.04M
199
1.04M
    *dest = if err_bool { 0 } else { f(b, c) };
200
201
1.04M
    Ok(inc_pc(common.pc)?)
202
1.04M
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu9alu_errorNCNvMNtNtB4_9executors11instructionINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB2j_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3r_4blob8BlobBodyNtB4X_12BlobMetadataEE17instruction_inners0_0yyEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu9alu_errorNCNvMNtNtB4_9executors11instructionINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB2j_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3r_4blob8BlobBodyNtB4X_12BlobMetadataEE17instruction_inners_0yyEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu9alu_errorNCNvMNtNtB4_9executors11instructionINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB2j_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3r_6create10CreateBodyNtB4X_14CreateMetadataEE17instruction_inners0_0yyEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu9alu_errorNCNvMNtNtB4_9executors11instructionINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB2j_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3r_6create10CreateBodyNtB4X_14CreateMetadataEE17instruction_inners_0yyEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu9alu_errorNCNvMNtNtB4_9executors11instructionINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB2j_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3r_6script10ScriptBodyNtB4X_14ScriptMetadataEE17instruction_inners0_0yyEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu9alu_errorNCNvMNtNtB4_9executors11instructionINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB2j_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3r_6script10ScriptBodyNtB4X_14ScriptMetadataEE17instruction_inners_0yyEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu9alu_errorNCNvMNtNtB4_9executors11instructionINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB2j_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3r_6upload10UploadBodyNtB4X_14UploadMetadataEE17instruction_inners0_0yyEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu9alu_errorNCNvMNtNtB4_9executors11instructionINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB2j_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3r_6upload10UploadBodyNtB4X_14UploadMetadataEE17instruction_inners_0yyEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu9alu_errorNCNvMNtNtB4_9executors11instructionINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB2j_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3r_7upgrade11UpgradeBodyNtB4X_15UpgradeMetadataEE17instruction_inners0_0yyEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu9alu_errorNCNvMNtNtB4_9executors11instructionINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB2j_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3r_7upgrade11UpgradeBodyNtB4X_15UpgradeMetadataEE17instruction_inners_0yyEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu9alu_errorNCNvMNtNtB4_9executors11instructionINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB2l_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3B_6script10ScriptBodyNtB57_14ScriptMetadataEE17instruction_inners0_0yyEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu9alu_errorNCNvMNtNtB4_9executors11instructionINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB2l_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3B_6script10ScriptBodyNtB57_14ScriptMetadataEE17instruction_inners_0yyEB6_
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu9alu_errorNvMs7_NtCsd3UI3IJrzMw_4core3numy12wrapping_remyyEB6_
Line
Count
Source
180
2.62M
pub(crate) fn alu_error<F, B, C>(
181
2.62M
    dest: &mut Word,
182
2.62M
    flag: Reg<FLAG>,
183
2.62M
    mut common: AluCommonReg,
184
2.62M
    f: F,
185
2.62M
    b: B,
186
2.62M
    c: C,
187
2.62M
    err_bool: bool,
188
2.62M
) -> SimpleResult<()>
189
2.62M
where
190
2.62M
    F: FnOnce(B, C) -> Word,
191
2.62M
{
192
2.62M
    if err_bool && !is_unsafe_math(flag) {
193
4
        return Err(PanicReason::ArithmeticError.into())
194
2.62M
    }
195
2.62M
196
2.62M
    *common.of = 0;
197
2.62M
    *common.err = err_bool as Word;
198
2.62M
199
2.62M
    *dest = if err_bool { 0 } else { f(b, c) };
200
201
2.62M
    Ok(inc_pc(common.pc)?)
202
2.62M
}
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu9alu_errorNvYyNtNtNtCsd3UI3IJrzMw_4core3ops5arith3Div3divyyEB6_
Line
Count
Source
180
5.62M
pub(crate) fn alu_error<F, B, C>(
181
5.62M
    dest: &mut Word,
182
5.62M
    flag: Reg<FLAG>,
183
5.62M
    mut common: AluCommonReg,
184
5.62M
    f: F,
185
5.62M
    b: B,
186
5.62M
    c: C,
187
5.62M
    err_bool: bool,
188
5.62M
) -> SimpleResult<()>
189
5.62M
where
190
5.62M
    F: FnOnce(B, C) -> Word,
191
5.62M
{
192
5.62M
    if err_bool && !is_unsafe_math(flag) {
193
4
        return Err(PanicReason::ArithmeticError.into())
194
5.62M
    }
195
5.62M
196
5.62M
    *common.of = 0;
197
5.62M
    *common.err = err_bool as Word;
198
5.62M
199
5.62M
    *dest = if err_bool { 0 } else { f(b, c) };
200
201
5.62M
    Ok(inc_pc(common.pc)?)
202
5.62M
}
203
204
69.6M
pub(crate) fn alu_set(
205
69.6M
    dest: &mut Word,
206
69.6M
    mut common: AluCommonReg,
207
69.6M
    b: Word,
208
69.6M
) -> SimpleResult<()> {
209
69.6M
    *common.of = 0;
210
69.6M
    *common.err = 0;
211
69.6M
212
69.6M
    *dest = b;
213
69.6M
214
69.6M
    Ok(inc_pc(common.pc)?)
215
69.6M
}
216
217
447k
pub(crate) fn alu_clear(mut common: AluCommonReg) -> SimpleResult<()> {
218
447k
    *common.of = 0;
219
447k
    *common.err = 0;
220
447k
221
447k
    Ok(inc_pc(common.pc)?)
222
447k
}
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter/blockchain.rs
Line
Count
Source
1
use crate::{
2
    call::CallFrame,
3
    constraints::reg_key::*,
4
    consts::*,
5
    context::Context,
6
    convert,
7
    error::{
8
        IoResult,
9
        RuntimeError,
10
        SimpleResult,
11
    },
12
    interpreter::{
13
        contract::{
14
            balance,
15
            balance_decrease,
16
            contract_size,
17
        },
18
        gas::{
19
            dependent_gas_charge_without_base,
20
            gas_charge,
21
            ProfileGas,
22
        },
23
        internal::{
24
            base_asset_balance_sub,
25
            current_contract,
26
            inc_pc,
27
            internal_contract,
28
            tx_id,
29
        },
30
        memory::{
31
            copy_from_slice_zero_fill,
32
            OwnershipRegisters,
33
        },
34
        receipts::ReceiptsCtx,
35
        ExecutableTransaction,
36
        InputContracts,
37
        Interpreter,
38
        Memory,
39
        MemoryInstance,
40
        RuntimeBalances,
41
    },
42
    prelude::Profiler,
43
    storage::{
44
        BlobData,
45
        ContractsAssetsStorage,
46
        ContractsRawCode,
47
        ContractsStateData,
48
        InterpreterStorage,
49
    },
50
};
51
use alloc::vec::Vec;
52
use fuel_asm::{
53
    Imm06,
54
    PanicReason,
55
};
56
use fuel_storage::{
57
    StorageInspect,
58
    StorageSize,
59
};
60
use fuel_tx::{
61
    consts::BALANCE_ENTRY_SIZE,
62
    BlobId,
63
    ContractIdExt,
64
    DependentCost,
65
    Receipt,
66
};
67
use fuel_types::{
68
    bytes::{
69
        self,
70
        padded_len_word,
71
    },
72
    Address,
73
    AssetId,
74
    BlockHeight,
75
    Bytes32,
76
    ContractId,
77
    RegisterId,
78
    Word,
79
};
80
81
#[cfg(test)]
82
mod code_tests;
83
#[cfg(test)]
84
mod croo_tests;
85
#[cfg(test)]
86
mod other_tests;
87
#[cfg(test)]
88
mod smo_tests;
89
#[cfg(test)]
90
mod test;
91
92
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
93
where
94
    M: Memory,
95
    Tx: ExecutableTransaction,
96
    S: InterpreterStorage,
97
{
98
    /// Loads contract ID pointed by `contract_id_addr`, and then for that contract,
99
    /// copies `length_unpadded` bytes from it starting from offset `contract_offset` into
100
    /// the stack.
101
    ///
102
    /// ```txt
103
    /// contract_id = mem[$rA, 32]
104
    /// contract_code = contracts[contract_id]
105
    /// mem[$ssp, $rC] = contract_code[$rB, $rC]
106
    /// ```
107
597k
    pub(crate) fn load_contract_code(
108
597k
        &mut self,
109
597k
        addr: Word,
110
597k
        offset: Word,
111
597k
        length_unpadded: Word,
112
597k
        mode: Imm06,
113
597k
    ) -> IoResult<(), S::DataError> {
114
597k
        let gas_cost = self.gas_costs().ldc();
115
597k
        // Charge only for the `base` execution.
116
597k
        // We will charge for the contracts size in the `load_contract_code`.
117
597k
        self.gas_charge(gas_cost.base())?;
118
597k
        let contract_max_size = self.contract_max_size();
119
597k
        let (
120
597k
            SystemRegisters {
121
597k
                cgas,
122
597k
                ggas,
123
597k
                ssp,
124
597k
                sp,
125
597k
                hp,
126
597k
                fp,
127
597k
                pc,
128
597k
                is,
129
597k
                ..
130
597k
            },
131
597k
            _,
132
597k
        ) = split_registers(&mut self.registers);
133
597k
        let input = LoadContractCodeCtx {
134
597k
            memory: self.memory.as_mut(),
135
597k
            context: &self.context,
136
597k
            profiler: &mut self.profiler,
137
597k
            storage: &mut self.storage,
138
597k
            contract_max_size,
139
597k
            input_contracts: InputContracts::new(
140
597k
                &self.input_contracts,
141
597k
                &mut self.panic_context,
142
597k
            ),
143
597k
            gas_cost,
144
597k
            cgas,
145
597k
            ggas,
146
597k
            ssp,
147
597k
            sp,
148
597k
            hp: hp.as_ref(),
149
597k
            fp: fp.as_ref(),
150
597k
            pc,
151
597k
            is: is.as_ref(),
152
597k
        };
153
597k
154
597k
        match mode.to_u8() {
155
368k
            0 => input.load_contract_code(addr, offset, length_unpadded),
156
5
            1 => input.load_blob_code(addr, offset, length_unpadded),
157
229k
            2 => input.load_memory_code(addr, offset, length_unpadded),
158
4
            _ => Err(PanicReason::InvalidImmediateValue.into()),
159
        }
160
597k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_4blob8BlobBodyNtB3S_12BlobMetadataEE18load_contract_codeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6create10CreateBodyNtB3S_14CreateMetadataEE18load_contract_codeB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6script10ScriptBodyNtB3S_14ScriptMetadataEE18load_contract_codeB6_
Line
Count
Source
107
597k
    pub(crate) fn load_contract_code(
108
597k
        &mut self,
109
597k
        addr: Word,
110
597k
        offset: Word,
111
597k
        length_unpadded: Word,
112
597k
        mode: Imm06,
113
597k
    ) -> IoResult<(), S::DataError> {
114
597k
        let gas_cost = self.gas_costs().ldc();
115
597k
        // Charge only for the `base` execution.
116
597k
        // We will charge for the contracts size in the `load_contract_code`.
117
597k
        self.gas_charge(gas_cost.base())?;
118
597k
        let contract_max_size = self.contract_max_size();
119
597k
        let (
120
597k
            SystemRegisters {
121
597k
                cgas,
122
597k
                ggas,
123
597k
                ssp,
124
597k
                sp,
125
597k
                hp,
126
597k
                fp,
127
597k
                pc,
128
597k
                is,
129
597k
                ..
130
597k
            },
131
597k
            _,
132
597k
        ) = split_registers(&mut self.registers);
133
597k
        let input = LoadContractCodeCtx {
134
597k
            memory: self.memory.as_mut(),
135
597k
            context: &self.context,
136
597k
            profiler: &mut self.profiler,
137
597k
            storage: &mut self.storage,
138
597k
            contract_max_size,
139
597k
            input_contracts: InputContracts::new(
140
597k
                &self.input_contracts,
141
597k
                &mut self.panic_context,
142
597k
            ),
143
597k
            gas_cost,
144
597k
            cgas,
145
597k
            ggas,
146
597k
            ssp,
147
597k
            sp,
148
597k
            hp: hp.as_ref(),
149
597k
            fp: fp.as_ref(),
150
597k
            pc,
151
597k
            is: is.as_ref(),
152
597k
        };
153
597k
154
597k
        match mode.to_u8() {
155
368k
            0 => input.load_contract_code(addr, offset, length_unpadded),
156
5
            1 => input.load_blob_code(addr, offset, length_unpadded),
157
229k
            2 => input.load_memory_code(addr, offset, length_unpadded),
158
4
            _ => Err(PanicReason::InvalidImmediateValue.into()),
159
        }
160
597k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_4blob8BlobBodyNtB4m_12BlobMetadataEE18load_contract_codeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6create10CreateBodyNtB4m_14CreateMetadataEE18load_contract_codeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6script10ScriptBodyNtB4m_14ScriptMetadataEE18load_contract_codeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6upload10UploadBodyNtB4m_14UploadMetadataEE18load_contract_codeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_7upgrade11UpgradeBodyNtB4m_15UpgradeMetadataEE18load_contract_codeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1K_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_6script10ScriptBodyNtB4w_14ScriptMetadataEE18load_contract_codeB6_
161
162
116
    pub(crate) fn burn(&mut self, a: Word, b: Word) -> IoResult<(), S::DataError> {
163
116
        let (SystemRegisters { fp, pc, is, .. }, _) =
164
116
            split_registers(&mut self.registers);
165
116
        BurnCtx {
166
116
            storage: &mut self.storage,
167
116
            context: &self.context,
168
116
            memory: self.memory.as_ref(),
169
116
            receipts: &mut self.receipts,
170
116
            fp: fp.as_ref(),
171
116
            pc,
172
116
            is: is.as_ref(),
173
116
        }
174
116
        .burn(a, b)
175
116
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_4blob8BlobBodyNtB3S_12BlobMetadataEE4burnB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6create10CreateBodyNtB3S_14CreateMetadataEE4burnB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6script10ScriptBodyNtB3S_14ScriptMetadataEE4burnB6_
Line
Count
Source
162
116
    pub(crate) fn burn(&mut self, a: Word, b: Word) -> IoResult<(), S::DataError> {
163
116
        let (SystemRegisters { fp, pc, is, .. }, _) =
164
116
            split_registers(&mut self.registers);
165
116
        BurnCtx {
166
116
            storage: &mut self.storage,
167
116
            context: &self.context,
168
116
            memory: self.memory.as_ref(),
169
116
            receipts: &mut self.receipts,
170
116
            fp: fp.as_ref(),
171
116
            pc,
172
116
            is: is.as_ref(),
173
116
        }
174
116
        .burn(a, b)
175
116
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_4blob8BlobBodyNtB4m_12BlobMetadataEE4burnB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6create10CreateBodyNtB4m_14CreateMetadataEE4burnB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6script10ScriptBodyNtB4m_14ScriptMetadataEE4burnB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6upload10UploadBodyNtB4m_14UploadMetadataEE4burnB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_7upgrade11UpgradeBodyNtB4m_15UpgradeMetadataEE4burnB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1K_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_6script10ScriptBodyNtB4w_14ScriptMetadataEE4burnB6_
176
177
47
    pub(crate) fn mint(&mut self, a: Word, b: Word) -> IoResult<(), S::DataError> {
178
47
        let new_storage_gas_per_byte = self.gas_costs().new_storage_per_byte();
179
47
        let (
180
47
            SystemRegisters {
181
47
                cgas,
182
47
                ggas,
183
47
                fp,
184
47
                pc,
185
47
                is,
186
47
                ..
187
47
            },
188
47
            _,
189
47
        ) = split_registers(&mut self.registers);
190
47
        MintCtx {
191
47
            storage: &mut self.storage,
192
47
            context: &self.context,
193
47
            memory: self.memory.as_ref(),
194
47
            receipts: &mut self.receipts,
195
47
            profiler: &mut self.profiler,
196
47
            new_storage_gas_per_byte,
197
47
            cgas,
198
47
            ggas,
199
47
            fp: fp.as_ref(),
200
47
            pc,
201
47
            is: is.as_ref(),
202
47
        }
203
47
        .mint(a, b)
204
47
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_4blob8BlobBodyNtB3S_12BlobMetadataEE4mintB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6create10CreateBodyNtB3S_14CreateMetadataEE4mintB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6script10ScriptBodyNtB3S_14ScriptMetadataEE4mintB6_
Line
Count
Source
177
47
    pub(crate) fn mint(&mut self, a: Word, b: Word) -> IoResult<(), S::DataError> {
178
47
        let new_storage_gas_per_byte = self.gas_costs().new_storage_per_byte();
179
47
        let (
180
47
            SystemRegisters {
181
47
                cgas,
182
47
                ggas,
183
47
                fp,
184
47
                pc,
185
47
                is,
186
47
                ..
187
47
            },
188
47
            _,
189
47
        ) = split_registers(&mut self.registers);
190
47
        MintCtx {
191
47
            storage: &mut self.storage,
192
47
            context: &self.context,
193
47
            memory: self.memory.as_ref(),
194
47
            receipts: &mut self.receipts,
195
47
            profiler: &mut self.profiler,
196
47
            new_storage_gas_per_byte,
197
47
            cgas,
198
47
            ggas,
199
47
            fp: fp.as_ref(),
200
47
            pc,
201
47
            is: is.as_ref(),
202
47
        }
203
47
        .mint(a, b)
204
47
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_4blob8BlobBodyNtB4m_12BlobMetadataEE4mintB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6create10CreateBodyNtB4m_14CreateMetadataEE4mintB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6script10ScriptBodyNtB4m_14ScriptMetadataEE4mintB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6upload10UploadBodyNtB4m_14UploadMetadataEE4mintB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_7upgrade11UpgradeBodyNtB4m_15UpgradeMetadataEE4mintB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1K_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_6script10ScriptBodyNtB4w_14ScriptMetadataEE4mintB6_
205
206
14
    pub(crate) fn code_copy(
207
14
        &mut self,
208
14
        a: Word,
209
14
        b: Word,
210
14
        c: Word,
211
14
        d: Word,
212
14
    ) -> IoResult<(), S::DataError> {
213
14
        let gas_cost = self.gas_costs().ccp();
214
14
        // Charge only for the `base` execution.
215
14
        // We will charge for the contract's size in the `code_copy`.
216
14
        self.gas_charge(gas_cost.base())?;
217
218
14
        let current_contract =
219
14
            current_contract(&self.context, self.registers.fp(), self.memory.as_ref())?;
220
14
        let owner = self.ownership_registers();
221
14
        let (
222
14
            SystemRegisters {
223
14
                cgas, ggas, pc, is, ..
224
14
            },
225
14
            _,
226
14
        ) = split_registers(&mut self.registers);
227
14
        let input = CodeCopyCtx {
228
14
            memory: self.memory.as_mut(),
229
14
            input_contracts: InputContracts::new(
230
14
                &self.input_contracts,
231
14
                &mut self.panic_context,
232
14
            ),
233
14
            storage: &mut self.storage,
234
14
            profiler: &mut self.profiler,
235
14
            current_contract,
236
14
            owner,
237
14
            gas_cost,
238
14
            cgas,
239
14
            ggas,
240
14
            pc,
241
14
            is: is.as_ref(),
242
14
        };
243
14
        input.code_copy(a, b, c, d)
244
14
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_4blob8BlobBodyNtB3S_12BlobMetadataEE9code_copyB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6create10CreateBodyNtB3S_14CreateMetadataEE9code_copyB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6script10ScriptBodyNtB3S_14ScriptMetadataEE9code_copyB6_
Line
Count
Source
206
14
    pub(crate) fn code_copy(
207
14
        &mut self,
208
14
        a: Word,
209
14
        b: Word,
210
14
        c: Word,
211
14
        d: Word,
212
14
    ) -> IoResult<(), S::DataError> {
213
14
        let gas_cost = self.gas_costs().ccp();
214
14
        // Charge only for the `base` execution.
215
14
        // We will charge for the contract's size in the `code_copy`.
216
14
        self.gas_charge(gas_cost.base())?;
217
218
14
        let current_contract =
219
14
            current_contract(&self.context, self.registers.fp(), self.memory.as_ref())?;
220
14
        let owner = self.ownership_registers();
221
14
        let (
222
14
            SystemRegisters {
223
14
                cgas, ggas, pc, is, ..
224
14
            },
225
14
            _,
226
14
        ) = split_registers(&mut self.registers);
227
14
        let input = CodeCopyCtx {
228
14
            memory: self.memory.as_mut(),
229
14
            input_contracts: InputContracts::new(
230
14
                &self.input_contracts,
231
14
                &mut self.panic_context,
232
14
            ),
233
14
            storage: &mut self.storage,
234
14
            profiler: &mut self.profiler,
235
14
            current_contract,
236
14
            owner,
237
14
            gas_cost,
238
14
            cgas,
239
14
            ggas,
240
14
            pc,
241
14
            is: is.as_ref(),
242
14
        };
243
14
        input.code_copy(a, b, c, d)
244
14
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_4blob8BlobBodyNtB4m_12BlobMetadataEE9code_copyB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6create10CreateBodyNtB4m_14CreateMetadataEE9code_copyB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6script10ScriptBodyNtB4m_14ScriptMetadataEE9code_copyB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6upload10UploadBodyNtB4m_14UploadMetadataEE9code_copyB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_7upgrade11UpgradeBodyNtB4m_15UpgradeMetadataEE9code_copyB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1K_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_6script10ScriptBodyNtB4w_14ScriptMetadataEE9code_copyB6_
245
246
72.8k
    pub(crate) fn block_hash(&mut self, a: Word, b: Word) -> IoResult<(), S::DataError> {
247
72.8k
        let owner = self.ownership_registers();
248
72.8k
        block_hash(
249
72.8k
            &self.storage,
250
72.8k
            self.memory.as_mut(),
251
72.8k
            owner,
252
72.8k
            self.registers.pc_mut(),
253
72.8k
            a,
254
72.8k
            b,
255
72.8k
        )
256
72.8k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_4blob8BlobBodyNtB3S_12BlobMetadataEE10block_hashB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6create10CreateBodyNtB3S_14CreateMetadataEE10block_hashB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6script10ScriptBodyNtB3S_14ScriptMetadataEE10block_hashB6_
Line
Count
Source
246
72.8k
    pub(crate) fn block_hash(&mut self, a: Word, b: Word) -> IoResult<(), S::DataError> {
247
72.8k
        let owner = self.ownership_registers();
248
72.8k
        block_hash(
249
72.8k
            &self.storage,
250
72.8k
            self.memory.as_mut(),
251
72.8k
            owner,
252
72.8k
            self.registers.pc_mut(),
253
72.8k
            a,
254
72.8k
            b,
255
72.8k
        )
256
72.8k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_4blob8BlobBodyNtB4m_12BlobMetadataEE10block_hashB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6create10CreateBodyNtB4m_14CreateMetadataEE10block_hashB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6script10ScriptBodyNtB4m_14ScriptMetadataEE10block_hashB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6upload10UploadBodyNtB4m_14UploadMetadataEE10block_hashB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_7upgrade11UpgradeBodyNtB4m_15UpgradeMetadataEE10block_hashB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1K_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_6script10ScriptBodyNtB4w_14ScriptMetadataEE10block_hashB6_
257
258
174k
    pub(crate) fn block_height(&mut self, ra: RegisterId) -> IoResult<(), S::DataError> {
259
174k
        let (SystemRegisters { pc, .. }, mut w) = split_registers(&mut self.registers);
260
174k
        let result = &mut w[WriteRegKey::try_from(ra)?];
261
174k
        Ok(block_height(&self.context, pc, result)?)
262
174k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_4blob8BlobBodyNtB3S_12BlobMetadataEE12block_heightB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6create10CreateBodyNtB3S_14CreateMetadataEE12block_heightB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6script10ScriptBodyNtB3S_14ScriptMetadataEE12block_heightB6_
Line
Count
Source
258
174k
    pub(crate) fn block_height(&mut self, ra: RegisterId) -> IoResult<(), S::DataError> {
259
174k
        let (SystemRegisters { pc, .. }, mut w) = split_registers(&mut self.registers);
260
174k
        let result = &mut w[WriteRegKey::try_from(ra)?];
261
174k
        Ok(block_height(&self.context, pc, result)?)
262
174k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_4blob8BlobBodyNtB4m_12BlobMetadataEE12block_heightB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6create10CreateBodyNtB4m_14CreateMetadataEE12block_heightB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6script10ScriptBodyNtB4m_14ScriptMetadataEE12block_heightB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6upload10UploadBodyNtB4m_14UploadMetadataEE12block_heightB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_7upgrade11UpgradeBodyNtB4m_15UpgradeMetadataEE12block_heightB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1K_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_6script10ScriptBodyNtB4w_14ScriptMetadataEE12block_heightB6_
263
264
231k
    pub(crate) fn block_proposer(&mut self, a: Word) -> IoResult<(), S::DataError> {
265
231k
        let owner = self.ownership_registers();
266
231k
        coinbase(
267
231k
            &self.storage,
268
231k
            self.memory.as_mut(),
269
231k
            owner,
270
231k
            self.registers.pc_mut(),
271
231k
            a,
272
231k
        )
273
231k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_4blob8BlobBodyNtB3S_12BlobMetadataEE14block_proposerB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6create10CreateBodyNtB3S_14CreateMetadataEE14block_proposerB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6script10ScriptBodyNtB3S_14ScriptMetadataEE14block_proposerB6_
Line
Count
Source
264
231k
    pub(crate) fn block_proposer(&mut self, a: Word) -> IoResult<(), S::DataError> {
265
231k
        let owner = self.ownership_registers();
266
231k
        coinbase(
267
231k
            &self.storage,
268
231k
            self.memory.as_mut(),
269
231k
            owner,
270
231k
            self.registers.pc_mut(),
271
231k
            a,
272
231k
        )
273
231k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_4blob8BlobBodyNtB4m_12BlobMetadataEE14block_proposerB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6create10CreateBodyNtB4m_14CreateMetadataEE14block_proposerB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6script10ScriptBodyNtB4m_14ScriptMetadataEE14block_proposerB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6upload10UploadBodyNtB4m_14UploadMetadataEE14block_proposerB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_7upgrade11UpgradeBodyNtB4m_15UpgradeMetadataEE14block_proposerB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1K_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_6script10ScriptBodyNtB4w_14ScriptMetadataEE14block_proposerB6_
274
275
7
    pub(crate) fn code_root(&mut self, a: Word, b: Word) -> IoResult<(), S::DataError> {
276
7
        let gas_cost = self.gas_costs().croo();
277
7
        self.gas_charge(gas_cost.base())?;
278
7
        let current_contract =
279
7
            current_contract(&self.context, self.registers.fp(), self.memory.as_ref())?;
280
7
        let owner = self.ownership_registers();
281
7
        let (
282
7
            SystemRegisters {
283
7
                cgas, ggas, pc, is, ..
284
7
            },
285
7
            _,
286
7
        ) = split_registers(&mut self.registers);
287
7
        CodeRootCtx {
288
7
            memory: self.memory.as_mut(),
289
7
            storage: &mut self.storage,
290
7
            gas_cost,
291
7
            profiler: &mut self.profiler,
292
7
            input_contracts: InputContracts::new(
293
7
                &self.input_contracts,
294
7
                &mut self.panic_context,
295
7
            ),
296
7
            current_contract,
297
7
            cgas,
298
7
            ggas,
299
7
            owner,
300
7
            pc,
301
7
            is: is.as_ref(),
302
7
        }
303
7
        .code_root(a, b)
304
7
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_4blob8BlobBodyNtB3S_12BlobMetadataEE9code_rootB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6create10CreateBodyNtB3S_14CreateMetadataEE9code_rootB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6script10ScriptBodyNtB3S_14ScriptMetadataEE9code_rootB6_
Line
Count
Source
275
7
    pub(crate) fn code_root(&mut self, a: Word, b: Word) -> IoResult<(), S::DataError> {
276
7
        let gas_cost = self.gas_costs().croo();
277
7
        self.gas_charge(gas_cost.base())?;
278
7
        let current_contract =
279
7
            current_contract(&self.context, self.registers.fp(), self.memory.as_ref())?;
280
7
        let owner = self.ownership_registers();
281
7
        let (
282
7
            SystemRegisters {
283
7
                cgas, ggas, pc, is, ..
284
7
            },
285
7
            _,
286
7
        ) = split_registers(&mut self.registers);
287
7
        CodeRootCtx {
288
7
            memory: self.memory.as_mut(),
289
7
            storage: &mut self.storage,
290
7
            gas_cost,
291
7
            profiler: &mut self.profiler,
292
7
            input_contracts: InputContracts::new(
293
7
                &self.input_contracts,
294
7
                &mut self.panic_context,
295
7
            ),
296
7
            current_contract,
297
7
            cgas,
298
7
            ggas,
299
7
            owner,
300
7
            pc,
301
7
            is: is.as_ref(),
302
7
        }
303
7
        .code_root(a, b)
304
7
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_4blob8BlobBodyNtB4m_12BlobMetadataEE9code_rootB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6create10CreateBodyNtB4m_14CreateMetadataEE9code_rootB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6script10ScriptBodyNtB4m_14ScriptMetadataEE9code_rootB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6upload10UploadBodyNtB4m_14UploadMetadataEE9code_rootB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_7upgrade11UpgradeBodyNtB4m_15UpgradeMetadataEE9code_rootB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1K_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_6script10ScriptBodyNtB4w_14ScriptMetadataEE9code_rootB6_
305
306
4
    pub(crate) fn code_size(
307
4
        &mut self,
308
4
        ra: RegisterId,
309
4
        b: Word,
310
4
    ) -> IoResult<(), S::DataError> {
311
4
        let gas_cost = self.gas_costs().csiz();
312
4
        // Charge only for the `base` execution.
313
4
        // We will charge for the contracts size in the `code_size`.
314
4
        self.gas_charge(gas_cost.base())?;
315
4
        let current_contract =
316
4
            current_contract(&self.context, self.registers.fp(), self.memory.as_ref())?;
317
        let (
318
            SystemRegisters {
319
4
                cgas, ggas, pc, is, ..
320
4
            },
321
4
            mut w,
322
4
        ) = split_registers(&mut self.registers);
323
4
        let result = &mut w[WriteRegKey::try_from(ra)?];
324
2
        let input = CodeSizeCtx {
325
2
            memory: self.memory.as_mut(),
326
2
            storage: &mut self.storage,
327
2
            gas_cost,
328
2
            profiler: &mut self.profiler,
329
2
            input_contracts: InputContracts::new(
330
2
                &self.input_contracts,
331
2
                &mut self.panic_context,
332
2
            ),
333
2
            current_contract,
334
2
            cgas,
335
2
            ggas,
336
2
            pc,
337
2
            is: is.as_ref(),
338
2
        };
339
2
        input.code_size(result, b)
340
4
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_4blob8BlobBodyNtB3S_12BlobMetadataEE9code_sizeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6create10CreateBodyNtB3S_14CreateMetadataEE9code_sizeB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6script10ScriptBodyNtB3S_14ScriptMetadataEE9code_sizeB6_
Line
Count
Source
306
4
    pub(crate) fn code_size(
307
4
        &mut self,
308
4
        ra: RegisterId,
309
4
        b: Word,
310
4
    ) -> IoResult<(), S::DataError> {
311
4
        let gas_cost = self.gas_costs().csiz();
312
4
        // Charge only for the `base` execution.
313
4
        // We will charge for the contracts size in the `code_size`.
314
4
        self.gas_charge(gas_cost.base())?;
315
4
        let current_contract =
316
4
            current_contract(&self.context, self.registers.fp(), self.memory.as_ref())?;
317
        let (
318
            SystemRegisters {
319
4
                cgas, ggas, pc, is, ..
320
4
            },
321
4
            mut w,
322
4
        ) = split_registers(&mut self.registers);
323
4
        let result = &mut w[WriteRegKey::try_from(ra)?];
324
2
        let input = CodeSizeCtx {
325
2
            memory: self.memory.as_mut(),
326
2
            storage: &mut self.storage,
327
2
            gas_cost,
328
2
            profiler: &mut self.profiler,
329
2
            input_contracts: InputContracts::new(
330
2
                &self.input_contracts,
331
2
                &mut self.panic_context,
332
2
            ),
333
2
            current_contract,
334
2
            cgas,
335
2
            ggas,
336
2
            pc,
337
2
            is: is.as_ref(),
338
2
        };
339
2
        input.code_size(result, b)
340
4
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_4blob8BlobBodyNtB4m_12BlobMetadataEE9code_sizeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6create10CreateBodyNtB4m_14CreateMetadataEE9code_sizeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6script10ScriptBodyNtB4m_14ScriptMetadataEE9code_sizeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6upload10UploadBodyNtB4m_14UploadMetadataEE9code_sizeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_7upgrade11UpgradeBodyNtB4m_15UpgradeMetadataEE9code_sizeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1K_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_6script10ScriptBodyNtB4w_14ScriptMetadataEE9code_sizeB6_
341
342
5.17k
    pub(crate) fn state_clear_qword(
343
5.17k
        &mut self,
344
5.17k
        a: Word,
345
5.17k
        rb: RegisterId,
346
5.17k
        c: Word,
347
5.17k
    ) -> IoResult<(), S::DataError> {
348
5.17k
        let contract_id = self.internal_contract();
349
5.17k
        let (SystemRegisters { pc, .. }, mut w) = split_registers(&mut self.registers);
350
5.17k
        let result = &mut w[WriteRegKey::try_from(rb)?];
351
352
5.17k
        let input = StateClearQWord::new(a, c)?;
353
        let Self {
354
5.17k
            ref mut storage,
355
5.17k
            ref memory,
356
5.17k
            ..
357
5.17k
        } = self;
358
5.17k
359
5.17k
        state_clear_qword(&contract_id?, storage, memory.as_ref(), pc, result, input)
360
5.17k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_4blob8BlobBodyNtB3S_12BlobMetadataEE17state_clear_qwordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6create10CreateBodyNtB3S_14CreateMetadataEE17state_clear_qwordB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6script10ScriptBodyNtB3S_14ScriptMetadataEE17state_clear_qwordB6_
Line
Count
Source
342
5.17k
    pub(crate) fn state_clear_qword(
343
5.17k
        &mut self,
344
5.17k
        a: Word,
345
5.17k
        rb: RegisterId,
346
5.17k
        c: Word,
347
5.17k
    ) -> IoResult<(), S::DataError> {
348
5.17k
        let contract_id = self.internal_contract();
349
5.17k
        let (SystemRegisters { pc, .. }, mut w) = split_registers(&mut self.registers);
350
5.17k
        let result = &mut w[WriteRegKey::try_from(rb)?];
351
352
5.17k
        let input = StateClearQWord::new(a, c)?;
353
        let Self {
354
5.17k
            ref mut storage,
355
5.17k
            ref memory,
356
5.17k
            ..
357
5.17k
        } = self;
358
5.17k
359
5.17k
        state_clear_qword(&contract_id?, storage, memory.as_ref(), pc, result, input)
360
5.17k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_4blob8BlobBodyNtB4m_12BlobMetadataEE17state_clear_qwordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6create10CreateBodyNtB4m_14CreateMetadataEE17state_clear_qwordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6script10ScriptBodyNtB4m_14ScriptMetadataEE17state_clear_qwordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6upload10UploadBodyNtB4m_14UploadMetadataEE17state_clear_qwordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_7upgrade11UpgradeBodyNtB4m_15UpgradeMetadataEE17state_clear_qwordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1K_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_6script10ScriptBodyNtB4w_14ScriptMetadataEE17state_clear_qwordB6_
361
362
2.04k
    pub(crate) fn state_read_word(
363
2.04k
        &mut self,
364
2.04k
        ra: RegisterId,
365
2.04k
        rb: RegisterId,
366
2.04k
        c: Word,
367
2.04k
    ) -> IoResult<(), S::DataError> {
368
2.04k
        let (SystemRegisters { fp, pc, .. }, mut w) =
369
2.04k
            split_registers(&mut self.registers);
370
2.04k
        let (result, got_result) = w
371
2.04k
            .get_mut_two(WriteRegKey::try_from(ra)?, WriteRegKey::try_from(rb)?)
372
2.04k
            .ok_or(RuntimeError::Recoverable(
373
2.04k
                PanicReason::ReservedRegisterNotWritable,
374
2.04k
            ))?;
375
        let Self {
376
2.04k
            ref mut storage,
377
2.04k
            ref memory,
378
2.04k
            ref context,
379
2.04k
            ..
380
2.04k
        } = self;
381
2.04k
        state_read_word(
382
2.04k
            StateReadWordCtx {
383
2.04k
                storage,
384
2.04k
                memory: memory.as_ref(),
385
2.04k
                context,
386
2.04k
                fp: fp.as_ref(),
387
2.04k
                pc,
388
2.04k
            },
389
2.04k
            result,
390
2.04k
            got_result,
391
2.04k
            c,
392
2.04k
        )
393
2.04k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_4blob8BlobBodyNtB3S_12BlobMetadataEE15state_read_wordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6create10CreateBodyNtB3S_14CreateMetadataEE15state_read_wordB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6script10ScriptBodyNtB3S_14ScriptMetadataEE15state_read_wordB6_
Line
Count
Source
362
2.04k
    pub(crate) fn state_read_word(
363
2.04k
        &mut self,
364
2.04k
        ra: RegisterId,
365
2.04k
        rb: RegisterId,
366
2.04k
        c: Word,
367
2.04k
    ) -> IoResult<(), S::DataError> {
368
2.04k
        let (SystemRegisters { fp, pc, .. }, mut w) =
369
2.04k
            split_registers(&mut self.registers);
370
2.04k
        let (result, got_result) = w
371
2.04k
            .get_mut_two(WriteRegKey::try_from(ra)?, WriteRegKey::try_from(rb)?)
372
2.04k
            .ok_or(RuntimeError::Recoverable(
373
2.04k
                PanicReason::ReservedRegisterNotWritable,
374
2.04k
            ))?;
375
        let Self {
376
2.04k
            ref mut storage,
377
2.04k
            ref memory,
378
2.04k
            ref context,
379
2.04k
            ..
380
2.04k
        } = self;
381
2.04k
        state_read_word(
382
2.04k
            StateReadWordCtx {
383
2.04k
                storage,
384
2.04k
                memory: memory.as_ref(),
385
2.04k
                context,
386
2.04k
                fp: fp.as_ref(),
387
2.04k
                pc,
388
2.04k
            },
389
2.04k
            result,
390
2.04k
            got_result,
391
2.04k
            c,
392
2.04k
        )
393
2.04k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_4blob8BlobBodyNtB4m_12BlobMetadataEE15state_read_wordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6create10CreateBodyNtB4m_14CreateMetadataEE15state_read_wordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6script10ScriptBodyNtB4m_14ScriptMetadataEE15state_read_wordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6upload10UploadBodyNtB4m_14UploadMetadataEE15state_read_wordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_7upgrade11UpgradeBodyNtB4m_15UpgradeMetadataEE15state_read_wordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1K_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_6script10ScriptBodyNtB4w_14ScriptMetadataEE15state_read_wordB6_
394
395
890
    pub(crate) fn state_read_qword(
396
890
        &mut self,
397
890
        a: Word,
398
890
        rb: RegisterId,
399
890
        c: Word,
400
890
        d: Word,
401
890
    ) -> IoResult<(), S::DataError> {
402
890
        let owner = self.ownership_registers();
403
890
        let (SystemRegisters { pc, fp, .. }, mut w) =
404
890
            split_registers(&mut self.registers);
405
890
        let result = &mut w[WriteRegKey::try_from(rb)?];
406
407
        let Self {
408
887
            ref storage,
409
887
            ref context,
410
887
            ref mut memory,
411
887
            ..
412
887
        } = self;
413
887
414
887
        state_read_qword(
415
887
            storage,
416
887
            context,
417
887
            memory.as_mut(),
418
887
            pc,
419
887
            fp.as_ref(),
420
887
            owner,
421
887
            result,
422
887
            StateReadQWordParams {
423
887
                destination_pointer: a,
424
887
                origin_key_pointer: c,
425
887
                num_slots: d,
426
887
            },
427
887
        )
428
890
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_4blob8BlobBodyNtB3S_12BlobMetadataEE16state_read_qwordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6create10CreateBodyNtB3S_14CreateMetadataEE16state_read_qwordB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6script10ScriptBodyNtB3S_14ScriptMetadataEE16state_read_qwordB6_
Line
Count
Source
395
890
    pub(crate) fn state_read_qword(
396
890
        &mut self,
397
890
        a: Word,
398
890
        rb: RegisterId,
399
890
        c: Word,
400
890
        d: Word,
401
890
    ) -> IoResult<(), S::DataError> {
402
890
        let owner = self.ownership_registers();
403
890
        let (SystemRegisters { pc, fp, .. }, mut w) =
404
890
            split_registers(&mut self.registers);
405
890
        let result = &mut w[WriteRegKey::try_from(rb)?];
406
407
        let Self {
408
887
            ref storage,
409
887
            ref context,
410
887
            ref mut memory,
411
887
            ..
412
887
        } = self;
413
887
414
887
        state_read_qword(
415
887
            storage,
416
887
            context,
417
887
            memory.as_mut(),
418
887
            pc,
419
887
            fp.as_ref(),
420
887
            owner,
421
887
            result,
422
887
            StateReadQWordParams {
423
887
                destination_pointer: a,
424
887
                origin_key_pointer: c,
425
887
                num_slots: d,
426
887
            },
427
887
        )
428
890
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_4blob8BlobBodyNtB4m_12BlobMetadataEE16state_read_qwordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6create10CreateBodyNtB4m_14CreateMetadataEE16state_read_qwordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6script10ScriptBodyNtB4m_14ScriptMetadataEE16state_read_qwordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6upload10UploadBodyNtB4m_14UploadMetadataEE16state_read_qwordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_7upgrade11UpgradeBodyNtB4m_15UpgradeMetadataEE16state_read_qwordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1K_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_6script10ScriptBodyNtB4w_14ScriptMetadataEE16state_read_qwordB6_
429
430
352
    pub(crate) fn state_write_word(
431
352
        &mut self,
432
352
        a: Word,
433
352
        rb: RegisterId,
434
352
        c: Word,
435
352
    ) -> IoResult<(), S::DataError> {
436
352
        let new_storage_gas_per_byte = self.gas_costs().new_storage_per_byte();
437
352
        let (
438
352
            SystemRegisters {
439
352
                cgas,
440
352
                ggas,
441
352
                is,
442
352
                fp,
443
352
                pc,
444
352
                ..
445
352
            },
446
352
            mut w,
447
352
        ) = split_registers(&mut self.registers);
448
352
        let exists = &mut w[WriteRegKey::try_from(rb)?];
449
        let Self {
450
350
            ref mut storage,
451
350
            ref memory,
452
350
            ref context,
453
350
            ..
454
350
        } = self;
455
350
        state_write_word(
456
350
            StateWriteWordCtx {
457
350
                storage,
458
350
                memory: memory.as_ref(),
459
350
                context,
460
350
                profiler: &mut self.profiler,
461
350
                new_storage_gas_per_byte,
462
350
                current_contract: self.frames.last().map(|frame| frame.to()).copied(),
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_4blob8BlobBodyNtB3U_12BlobMetadataEE16state_write_word0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6create10CreateBodyNtB3U_14CreateMetadataEE16state_write_word0B8_
_RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6script10ScriptBodyNtB3U_14ScriptMetadataEE16state_write_word0B8_
Line
Count
Source
462
347
                current_contract: self.frames.last().map(|frame| frame.to()).copied(),
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_4blob8BlobBodyNtB4o_12BlobMetadataEE16state_write_word0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6create10CreateBodyNtB4o_14CreateMetadataEE16state_write_word0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6script10ScriptBodyNtB4o_14ScriptMetadataEE16state_write_word0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6upload10UploadBodyNtB4o_14UploadMetadataEE16state_write_word0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_7upgrade11UpgradeBodyNtB4o_15UpgradeMetadataEE16state_write_word0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1M_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB32_6script10ScriptBodyNtB4y_14ScriptMetadataEE16state_write_word0B8_
463
350
                cgas,
464
350
                ggas,
465
350
                is: is.as_ref(),
466
350
                fp: fp.as_ref(),
467
350
                pc,
468
350
            },
469
350
            a,
470
350
            exists,
471
350
            c,
472
350
        )
473
352
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_4blob8BlobBodyNtB3S_12BlobMetadataEE16state_write_wordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6create10CreateBodyNtB3S_14CreateMetadataEE16state_write_wordB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6script10ScriptBodyNtB3S_14ScriptMetadataEE16state_write_wordB6_
Line
Count
Source
430
352
    pub(crate) fn state_write_word(
431
352
        &mut self,
432
352
        a: Word,
433
352
        rb: RegisterId,
434
352
        c: Word,
435
352
    ) -> IoResult<(), S::DataError> {
436
352
        let new_storage_gas_per_byte = self.gas_costs().new_storage_per_byte();
437
352
        let (
438
352
            SystemRegisters {
439
352
                cgas,
440
352
                ggas,
441
352
                is,
442
352
                fp,
443
352
                pc,
444
352
                ..
445
352
            },
446
352
            mut w,
447
352
        ) = split_registers(&mut self.registers);
448
352
        let exists = &mut w[WriteRegKey::try_from(rb)?];
449
        let Self {
450
350
            ref mut storage,
451
350
            ref memory,
452
350
            ref context,
453
350
            ..
454
350
        } = self;
455
350
        state_write_word(
456
350
            StateWriteWordCtx {
457
350
                storage,
458
350
                memory: memory.as_ref(),
459
350
                context,
460
350
                profiler: &mut self.profiler,
461
350
                new_storage_gas_per_byte,
462
350
                current_contract: self.frames.last().map(|frame| frame.to()).copied(),
463
350
                cgas,
464
350
                ggas,
465
350
                is: is.as_ref(),
466
350
                fp: fp.as_ref(),
467
350
                pc,
468
350
            },
469
350
            a,
470
350
            exists,
471
350
            c,
472
350
        )
473
352
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_4blob8BlobBodyNtB4m_12BlobMetadataEE16state_write_wordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6create10CreateBodyNtB4m_14CreateMetadataEE16state_write_wordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6script10ScriptBodyNtB4m_14ScriptMetadataEE16state_write_wordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6upload10UploadBodyNtB4m_14UploadMetadataEE16state_write_wordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_7upgrade11UpgradeBodyNtB4m_15UpgradeMetadataEE16state_write_wordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1K_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_6script10ScriptBodyNtB4w_14ScriptMetadataEE16state_write_wordB6_
474
475
3.77k
    pub(crate) fn state_write_qword(
476
3.77k
        &mut self,
477
3.77k
        a: Word,
478
3.77k
        rb: RegisterId,
479
3.77k
        c: Word,
480
3.77k
        d: Word,
481
3.77k
    ) -> IoResult<(), S::DataError> {
482
3.77k
        let new_storage_per_byte = self.gas_costs().new_storage_per_byte();
483
3.77k
        let contract_id = self.internal_contract();
484
3.77k
        let (
485
3.77k
            SystemRegisters {
486
3.77k
                is, cgas, ggas, pc, ..
487
3.77k
            },
488
3.77k
            mut w,
489
3.77k
        ) = split_registers(&mut self.registers);
490
3.77k
        let result = &mut w[WriteRegKey::try_from(rb)?];
491
492
3.77k
        let input = StateWriteQWord {
493
3.77k
            starting_storage_key_pointer: a,
494
3.77k
            source_pointer: c,
495
3.77k
            num_slots: d,
496
3.77k
        };
497
3.77k
498
3.77k
        let Self {
499
3.77k
            ref mut storage,
500
3.77k
            ref mut memory,
501
3.77k
            ..
502
3.77k
        } = self;
503
3.77k
504
3.77k
        state_write_qword(
505
3.77k
            &contract_id?,
506
3.77k
            storage,
507
3.77k
            memory.as_ref(),
508
3.77k
            &mut self.profiler,
509
3.77k
            new_storage_per_byte,
510
3.77k
            self.frames.last().map(|frame| frame.to()).copied(),
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_4blob8BlobBodyNtB3U_12BlobMetadataEE17state_write_qword0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6create10CreateBodyNtB3U_14CreateMetadataEE17state_write_qword0B8_
_RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6script10ScriptBodyNtB3U_14ScriptMetadataEE17state_write_qword0B8_
Line
Count
Source
510
3.77k
            self.frames.last().map(|frame| frame.to()).copied(),
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_4blob8BlobBodyNtB4o_12BlobMetadataEE17state_write_qword0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6create10CreateBodyNtB4o_14CreateMetadataEE17state_write_qword0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6script10ScriptBodyNtB4o_14ScriptMetadataEE17state_write_qword0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6upload10UploadBodyNtB4o_14UploadMetadataEE17state_write_qword0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_7upgrade11UpgradeBodyNtB4o_15UpgradeMetadataEE17state_write_qword0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1M_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB32_6script10ScriptBodyNtB4y_14ScriptMetadataEE17state_write_qword0B8_
511
3.77k
            cgas,
512
3.77k
            ggas,
513
3.77k
            is.as_ref(),
514
3.77k
            pc,
515
3.77k
            result,
516
3.77k
            input,
517
3.77k
        )
518
3.77k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_4blob8BlobBodyNtB3S_12BlobMetadataEE17state_write_qwordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6create10CreateBodyNtB3S_14CreateMetadataEE17state_write_qwordB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6script10ScriptBodyNtB3S_14ScriptMetadataEE17state_write_qwordB6_
Line
Count
Source
475
3.77k
    pub(crate) fn state_write_qword(
476
3.77k
        &mut self,
477
3.77k
        a: Word,
478
3.77k
        rb: RegisterId,
479
3.77k
        c: Word,
480
3.77k
        d: Word,
481
3.77k
    ) -> IoResult<(), S::DataError> {
482
3.77k
        let new_storage_per_byte = self.gas_costs().new_storage_per_byte();
483
3.77k
        let contract_id = self.internal_contract();
484
3.77k
        let (
485
3.77k
            SystemRegisters {
486
3.77k
                is, cgas, ggas, pc, ..
487
3.77k
            },
488
3.77k
            mut w,
489
3.77k
        ) = split_registers(&mut self.registers);
490
3.77k
        let result = &mut w[WriteRegKey::try_from(rb)?];
491
492
3.77k
        let input = StateWriteQWord {
493
3.77k
            starting_storage_key_pointer: a,
494
3.77k
            source_pointer: c,
495
3.77k
            num_slots: d,
496
3.77k
        };
497
3.77k
498
3.77k
        let Self {
499
3.77k
            ref mut storage,
500
3.77k
            ref mut memory,
501
3.77k
            ..
502
3.77k
        } = self;
503
3.77k
504
3.77k
        state_write_qword(
505
3.77k
            &contract_id?,
506
3.77k
            storage,
507
3.77k
            memory.as_ref(),
508
3.77k
            &mut self.profiler,
509
3.77k
            new_storage_per_byte,
510
3.77k
            self.frames.last().map(|frame| frame.to()).copied(),
511
3.77k
            cgas,
512
3.77k
            ggas,
513
3.77k
            is.as_ref(),
514
3.77k
            pc,
515
3.77k
            result,
516
3.77k
            input,
517
3.77k
        )
518
3.77k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_4blob8BlobBodyNtB4m_12BlobMetadataEE17state_write_qwordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6create10CreateBodyNtB4m_14CreateMetadataEE17state_write_qwordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6script10ScriptBodyNtB4m_14ScriptMetadataEE17state_write_qwordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6upload10UploadBodyNtB4m_14UploadMetadataEE17state_write_qwordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_7upgrade11UpgradeBodyNtB4m_15UpgradeMetadataEE17state_write_qwordB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1K_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_6script10ScriptBodyNtB4w_14ScriptMetadataEE17state_write_qwordB6_
519
520
326k
    pub(crate) fn timestamp(
521
326k
        &mut self,
522
326k
        ra: RegisterId,
523
326k
        b: Word,
524
326k
    ) -> IoResult<(), S::DataError> {
525
326k
        let block_height = self.get_block_height()?;
526
326k
        let (SystemRegisters { pc, .. }, mut w) = split_registers(&mut self.registers);
527
326k
        let result = &mut w[WriteRegKey::try_from(ra)?];
528
326k
        timestamp(&self.storage, block_height, pc, result, b)
529
326k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_4blob8BlobBodyNtB3S_12BlobMetadataEE9timestampB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6create10CreateBodyNtB3S_14CreateMetadataEE9timestampB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6script10ScriptBodyNtB3S_14ScriptMetadataEE9timestampB6_
Line
Count
Source
520
326k
    pub(crate) fn timestamp(
521
326k
        &mut self,
522
326k
        ra: RegisterId,
523
326k
        b: Word,
524
326k
    ) -> IoResult<(), S::DataError> {
525
326k
        let block_height = self.get_block_height()?;
526
326k
        let (SystemRegisters { pc, .. }, mut w) = split_registers(&mut self.registers);
527
326k
        let result = &mut w[WriteRegKey::try_from(ra)?];
528
326k
        timestamp(&self.storage, block_height, pc, result, b)
529
326k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_4blob8BlobBodyNtB4m_12BlobMetadataEE9timestampB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6create10CreateBodyNtB4m_14CreateMetadataEE9timestampB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6script10ScriptBodyNtB4m_14ScriptMetadataEE9timestampB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6upload10UploadBodyNtB4m_14UploadMetadataEE9timestampB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_7upgrade11UpgradeBodyNtB4m_15UpgradeMetadataEE9timestampB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1K_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_6script10ScriptBodyNtB4w_14ScriptMetadataEE9timestampB6_
530
531
88.9k
    pub(crate) fn message_output(
532
88.9k
        &mut self,
533
88.9k
        a: Word,
534
88.9k
        b: Word,
535
88.9k
        c: Word,
536
88.9k
        d: Word,
537
88.9k
    ) -> IoResult<(), S::DataError> {
538
88.9k
        let base_asset_id = self.interpreter_params.base_asset_id;
539
88.9k
        let max_message_data_length = self.max_message_data_length();
540
88.9k
        let (SystemRegisters { fp, pc, .. }, _) = split_registers(&mut self.registers);
541
88.9k
        let input = MessageOutputCtx {
542
88.9k
            base_asset_id,
543
88.9k
            max_message_data_length,
544
88.9k
            memory: self.memory.as_mut(),
545
88.9k
            receipts: &mut self.receipts,
546
88.9k
            balances: &mut self.balances,
547
88.9k
            storage: &mut self.storage,
548
88.9k
            current_contract: self.frames.last().map(|frame| frame.to()).copied(),
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_4blob8BlobBodyNtB3U_12BlobMetadataEE14message_output0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6create10CreateBodyNtB3U_14CreateMetadataEE14message_output0B8_
_RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6script10ScriptBodyNtB3U_14ScriptMetadataEE14message_output0B8_
Line
Count
Source
548
161
            current_contract: self.frames.last().map(|frame| frame.to()).copied(),
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_4blob8BlobBodyNtB4o_12BlobMetadataEE14message_output0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6create10CreateBodyNtB4o_14CreateMetadataEE14message_output0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6script10ScriptBodyNtB4o_14ScriptMetadataEE14message_output0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6upload10UploadBodyNtB4o_14UploadMetadataEE14message_output0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_7upgrade11UpgradeBodyNtB4o_15UpgradeMetadataEE14message_output0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1M_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB32_6script10ScriptBodyNtB4y_14ScriptMetadataEE14message_output0B8_
549
88.9k
            fp: fp.as_ref(),
550
88.9k
            pc,
551
88.9k
            recipient_mem_address: a,
552
88.9k
            msg_data_ptr: b,
553
88.9k
            msg_data_len: c,
554
88.9k
            amount_coins_to_send: d,
555
88.9k
        };
556
88.9k
        input.message_output()
557
88.9k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_4blob8BlobBodyNtB3S_12BlobMetadataEE14message_outputB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6create10CreateBodyNtB3S_14CreateMetadataEE14message_outputB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6script10ScriptBodyNtB3S_14ScriptMetadataEE14message_outputB6_
Line
Count
Source
531
88.9k
    pub(crate) fn message_output(
532
88.9k
        &mut self,
533
88.9k
        a: Word,
534
88.9k
        b: Word,
535
88.9k
        c: Word,
536
88.9k
        d: Word,
537
88.9k
    ) -> IoResult<(), S::DataError> {
538
88.9k
        let base_asset_id = self.interpreter_params.base_asset_id;
539
88.9k
        let max_message_data_length = self.max_message_data_length();
540
88.9k
        let (SystemRegisters { fp, pc, .. }, _) = split_registers(&mut self.registers);
541
88.9k
        let input = MessageOutputCtx {
542
88.9k
            base_asset_id,
543
88.9k
            max_message_data_length,
544
88.9k
            memory: self.memory.as_mut(),
545
88.9k
            receipts: &mut self.receipts,
546
88.9k
            balances: &mut self.balances,
547
88.9k
            storage: &mut self.storage,
548
88.9k
            current_contract: self.frames.last().map(|frame| frame.to()).copied(),
549
88.9k
            fp: fp.as_ref(),
550
88.9k
            pc,
551
88.9k
            recipient_mem_address: a,
552
88.9k
            msg_data_ptr: b,
553
88.9k
            msg_data_len: c,
554
88.9k
            amount_coins_to_send: d,
555
88.9k
        };
556
88.9k
        input.message_output()
557
88.9k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_4blob8BlobBodyNtB4m_12BlobMetadataEE14message_outputB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6create10CreateBodyNtB4m_14CreateMetadataEE14message_outputB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6script10ScriptBodyNtB4m_14ScriptMetadataEE14message_outputB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6upload10UploadBodyNtB4m_14UploadMetadataEE14message_outputB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_7upgrade11UpgradeBodyNtB4m_15UpgradeMetadataEE14message_outputB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1K_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_6script10ScriptBodyNtB4w_14ScriptMetadataEE14message_outputB6_
558
}
559
560
struct LoadContractCodeCtx<'vm, S> {
561
    contract_max_size: u64,
562
    memory: &'vm mut MemoryInstance,
563
    context: &'vm Context,
564
    profiler: &'vm mut Profiler,
565
    input_contracts: InputContracts<'vm>,
566
    storage: &'vm S,
567
    gas_cost: DependentCost,
568
    cgas: RegMut<'vm, CGAS>,
569
    ggas: RegMut<'vm, GGAS>,
570
    ssp: RegMut<'vm, SSP>,
571
    sp: RegMut<'vm, SP>,
572
    hp: Reg<'vm, HP>,
573
    fp: Reg<'vm, FP>,
574
    pc: RegMut<'vm, PC>,
575
    is: Reg<'vm, IS>,
576
}
577
578
impl<'vm, S> LoadContractCodeCtx<'vm, S>
579
where
580
    S: InterpreterStorage,
581
{
582
    /// Loads contract ID pointed by `a`, and then for that contract,
583
    /// copies `c` bytes from it starting from offset `b` into the stack.
584
    /// ```txt
585
    /// contract_id = mem[$rA, 32]
586
    /// contract_code = contracts[contract_id]
587
    /// mem[$ssp, $rC] = contract_code[$rB, $rC]
588
    /// ```
589
368k
    pub(crate) fn load_contract_code(
590
368k
        mut self,
591
368k
        contract_id_addr: Word,
592
368k
        contract_offset: Word,
593
368k
        length_unpadded: Word,
594
368k
    ) -> IoResult<(), S::DataError>
595
368k
    where
596
368k
        S: InterpreterStorage,
597
368k
    {
598
368k
        let ssp = *self.ssp;
599
368k
        let sp = *self.sp;
600
368k
        let region_start = ssp;
601
368k
602
368k
        // only blobs are allowed in predicates
603
368k
        if self.context.is_predicate() {
604
0
            return Err(PanicReason::ContractInstructionNotAllowed.into())
605
368k
        }
606
368k
607
368k
        if ssp != sp {
608
3
            return Err(PanicReason::ExpectedUnallocatedStack.into())
609
368k
        }
610
611
368k
        let contract_id = ContractId::from(self.memory.read_bytes(contract_id_addr)?);
612
368k
        let current_contract = current_contract(self.context, self.fp, self.memory)?;
613
614
368k
        let length =
615
368k
            padded_len_word(length_unpadded).ok_or(PanicReason::MemoryOverflow)?;
616
617
368k
        if length > self.contract_max_size {
618
3
            return Err(PanicReason::ContractMaxSize.into())
619
368k
        }
620
368k
621
368k
        self.input_contracts.check(&contract_id)?;
622
623
        // Fetch the storage contract
624
368k
        let profiler = ProfileGas {
625
368k
            pc: self.pc.as_ref(),
626
368k
            is: self.is,
627
368k
            current_contract,
628
368k
            profiler: self.profiler,
629
368k
        };
630
368k
        let contract_len = contract_size(&self.storage, &contract_id)?;
631
368k
        let charge_len = core::cmp::max(contract_len as u64, length);
632
368k
        dependent_gas_charge_without_base(
633
368k
            self.cgas,
634
368k
            self.ggas,
635
368k
            profiler,
636
368k
            self.gas_cost,
637
368k
            charge_len,
638
368k
        )?;
639
368k
        let contract = super::contract::contract(self.storage, &contract_id)?;
640
368k
        let contract_bytes = contract.as_ref().as_ref();
641
368k
642
368k
        let new_sp = ssp.saturating_add(length);
643
368k
        self.memory.grow_stack(new_sp)?;
644
645
        // Set up ownership registers for the copy using old ssp
646
368k
        let owner =
647
368k
            OwnershipRegisters::only_allow_stack_write(new_sp, *self.ssp, *self.hp);
648
368k
649
368k
        // Mark stack space as allocated
650
368k
        *self.sp = new_sp;
651
368k
        *self.ssp = new_sp;
652
368k
653
368k
        // Copy the code.
654
368k
        copy_from_slice_zero_fill(
655
368k
            self.memory,
656
368k
            owner,
657
368k
            contract_bytes,
658
368k
            region_start,
659
368k
            contract_offset,
660
368k
            length,
661
368k
        )?;
662
663
        // Update frame code size, if we have a stack frame (i.e. fp > 0)
664
368k
        if self.context.is_internal() {
665
1.48k
            let code_size_ptr =
666
1.48k
                (*self.fp).saturating_add(CallFrame::code_size_offset() as Word);
667
1.48k
            let old_code_size =
668
1.48k
                Word::from_be_bytes(self.memory.read_bytes(code_size_ptr)?);
669
1.48k
            let old_code_size =
670
1.48k
                padded_len_word(old_code_size).ok_or(PanicReason::MemoryOverflow)?;
671
1.48k
            let new_code_size = old_code_size
672
1.48k
                .checked_add(length as Word)
673
1.48k
                .ok_or(PanicReason::MemoryOverflow)?;
674
675
1.48k
            self.memory
676
1.48k
                .write_bytes_noownerchecks(code_size_ptr, new_code_size.to_be_bytes())?;
677
366k
        }
678
679
368k
        inc_pc(self.pc)?;
680
681
368k
        Ok(())
682
368k
    }
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_19LoadContractCodeCtxINtNtNtB8_7storage9predicate16PredicateStorageRNtB1n_12EmptyStorageEE18load_contract_codeB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_19LoadContractCodeCtxINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1p_6memory13MemoryStorageEE18load_contract_codeB8_
_RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_19LoadContractCodeCtxNtNtNtB8_7storage6memory13MemoryStorageE18load_contract_codeB8_
Line
Count
Source
589
368k
    pub(crate) fn load_contract_code(
590
368k
        mut self,
591
368k
        contract_id_addr: Word,
592
368k
        contract_offset: Word,
593
368k
        length_unpadded: Word,
594
368k
    ) -> IoResult<(), S::DataError>
595
368k
    where
596
368k
        S: InterpreterStorage,
597
368k
    {
598
368k
        let ssp = *self.ssp;
599
368k
        let sp = *self.sp;
600
368k
        let region_start = ssp;
601
368k
602
368k
        // only blobs are allowed in predicates
603
368k
        if self.context.is_predicate() {
604
0
            return Err(PanicReason::ContractInstructionNotAllowed.into())
605
368k
        }
606
368k
607
368k
        if ssp != sp {
608
3
            return Err(PanicReason::ExpectedUnallocatedStack.into())
609
368k
        }
610
611
368k
        let contract_id = ContractId::from(self.memory.read_bytes(contract_id_addr)?);
612
368k
        let current_contract = current_contract(self.context, self.fp, self.memory)?;
613
614
368k
        let length =
615
368k
            padded_len_word(length_unpadded).ok_or(PanicReason::MemoryOverflow)?;
616
617
368k
        if length > self.contract_max_size {
618
3
            return Err(PanicReason::ContractMaxSize.into())
619
368k
        }
620
368k
621
368k
        self.input_contracts.check(&contract_id)?;
622
623
        // Fetch the storage contract
624
368k
        let profiler = ProfileGas {
625
368k
            pc: self.pc.as_ref(),
626
368k
            is: self.is,
627
368k
            current_contract,
628
368k
            profiler: self.profiler,
629
368k
        };
630
368k
        let contract_len = contract_size(&self.storage, &contract_id)?;
631
368k
        let charge_len = core::cmp::max(contract_len as u64, length);
632
368k
        dependent_gas_charge_without_base(
633
368k
            self.cgas,
634
368k
            self.ggas,
635
368k
            profiler,
636
368k
            self.gas_cost,
637
368k
            charge_len,
638
368k
        )?;
639
368k
        let contract = super::contract::contract(self.storage, &contract_id)?;
640
368k
        let contract_bytes = contract.as_ref().as_ref();
641
368k
642
368k
        let new_sp = ssp.saturating_add(length);
643
368k
        self.memory.grow_stack(new_sp)?;
644
645
        // Set up ownership registers for the copy using old ssp
646
368k
        let owner =
647
368k
            OwnershipRegisters::only_allow_stack_write(new_sp, *self.ssp, *self.hp);
648
368k
649
368k
        // Mark stack space as allocated
650
368k
        *self.sp = new_sp;
651
368k
        *self.ssp = new_sp;
652
368k
653
368k
        // Copy the code.
654
368k
        copy_from_slice_zero_fill(
655
368k
            self.memory,
656
368k
            owner,
657
368k
            contract_bytes,
658
368k
            region_start,
659
368k
            contract_offset,
660
368k
            length,
661
368k
        )?;
662
663
        // Update frame code size, if we have a stack frame (i.e. fp > 0)
664
368k
        if self.context.is_internal() {
665
1.48k
            let code_size_ptr =
666
1.48k
                (*self.fp).saturating_add(CallFrame::code_size_offset() as Word);
667
1.48k
            let old_code_size =
668
1.48k
                Word::from_be_bytes(self.memory.read_bytes(code_size_ptr)?);
669
1.48k
            let old_code_size =
670
1.48k
                padded_len_word(old_code_size).ok_or(PanicReason::MemoryOverflow)?;
671
1.48k
            let new_code_size = old_code_size
672
1.48k
                .checked_add(length as Word)
673
1.48k
                .ok_or(PanicReason::MemoryOverflow)?;
674
675
1.48k
            self.memory
676
1.48k
                .write_bytes_noownerchecks(code_size_ptr, new_code_size.to_be_bytes())?;
677
366k
        }
678
679
368k
        inc_pc(self.pc)?;
680
681
368k
        Ok(())
682
368k
    }
683
684
    /// Loads blob ID pointed by `a`, and then for that blob,
685
    /// copies `c` bytes from it starting from offset `b` into the stack.
686
    /// ```txt
687
    /// blob_id = mem[$rA, 32]
688
    /// blob_code = blobs[blob_id]
689
    /// mem[$ssp, $rC] = blob_code[$rB, $rC]
690
    /// ```
691
5
    pub(crate) fn load_blob_code(
692
5
        mut self,
693
5
        blob_id_addr: Word,
694
5
        blob_offset: Word,
695
5
        length_unpadded: Word,
696
5
    ) -> IoResult<(), S::DataError>
697
5
    where
698
5
        S: InterpreterStorage,
699
5
    {
700
5
        let ssp = *self.ssp;
701
5
        let sp = *self.sp;
702
5
        let region_start = ssp;
703
5
704
5
        if ssp != sp {
705
1
            return Err(PanicReason::ExpectedUnallocatedStack.into())
706
4
        }
707
708
4
        let blob_id = BlobId::from(self.memory.read_bytes(blob_id_addr)?);
709
710
3
        let current_contract = current_contract(self.context, self.fp, self.memory)?;
711
712
3
        let length = bytes::padded_len_word(length_unpadded).unwrap_or(Word::MAX);
713
714
0
        let blob_len =
715
3
            <S as StorageSize<BlobData>>::size_of_value(self.storage, &blob_id)
716
3
                .map_err(RuntimeError::Storage)?
717
3
                .ok_or(PanicReason::BlobNotFound)?;
718
719
        // Fetch the storage blob
720
0
        let profiler = ProfileGas {
721
0
            pc: self.pc.as_ref(),
722
0
            is: self.is,
723
0
            current_contract,
724
0
            profiler: self.profiler,
725
0
        };
726
0
        let charge_len = core::cmp::max(blob_len as u64, length);
727
0
        dependent_gas_charge_without_base(
728
0
            self.cgas,
729
0
            self.ggas,
730
0
            profiler,
731
0
            self.gas_cost,
732
0
            charge_len,
733
0
        )?;
734
0
        let blob = <S as StorageInspect<BlobData>>::get(self.storage, &blob_id)
735
0
            .map_err(RuntimeError::Storage)?
736
0
            .ok_or(PanicReason::BlobNotFound)?;
737
0
        let blob_bytes = blob.as_ref().as_ref();
738
0
739
0
        let new_sp = ssp.saturating_add(length);
740
0
        self.memory.grow_stack(new_sp)?;
741
742
        // Set up ownership registers for the copy using old ssp
743
0
        let owner =
744
0
            OwnershipRegisters::only_allow_stack_write(new_sp, *self.ssp, *self.hp);
745
0
746
0
        // Mark stack space as allocated
747
0
        *self.sp = new_sp;
748
0
        *self.ssp = new_sp;
749
0
750
0
        // Copy the code.
751
0
        copy_from_slice_zero_fill(
752
0
            self.memory,
753
0
            owner,
754
0
            blob_bytes,
755
0
            region_start,
756
0
            blob_offset,
757
0
            length,
758
0
        )?;
759
760
        // Update frame code size, if we have a stack frame (i.e. fp > 0)
761
0
        if self.context.is_internal() {
762
0
            let code_size_ptr =
763
0
                (*self.fp).saturating_add(CallFrame::code_size_offset() as Word);
764
0
            let old_code_size =
765
0
                Word::from_be_bytes(self.memory.read_bytes(code_size_ptr)?);
766
0
            let old_code_size = padded_len_word(old_code_size)
767
0
                .expect("Code size cannot overflow with padding");
768
0
            let new_code_size = old_code_size
769
0
                .checked_add(length as Word)
770
0
                .ok_or(PanicReason::MemoryOverflow)?;
771
772
0
            self.memory
773
0
                .write_bytes_noownerchecks(code_size_ptr, new_code_size.to_be_bytes())?;
774
0
        }
775
776
0
        inc_pc(self.pc)?;
777
778
0
        Ok(())
779
5
    }
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_19LoadContractCodeCtxINtNtNtB8_7storage9predicate16PredicateStorageRNtB1n_12EmptyStorageEE14load_blob_codeB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_19LoadContractCodeCtxINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1p_6memory13MemoryStorageEE14load_blob_codeB8_
_RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_19LoadContractCodeCtxNtNtNtB8_7storage6memory13MemoryStorageE14load_blob_codeB8_
Line
Count
Source
691
5
    pub(crate) fn load_blob_code(
692
5
        mut self,
693
5
        blob_id_addr: Word,
694
5
        blob_offset: Word,
695
5
        length_unpadded: Word,
696
5
    ) -> IoResult<(), S::DataError>
697
5
    where
698
5
        S: InterpreterStorage,
699
5
    {
700
5
        let ssp = *self.ssp;
701
5
        let sp = *self.sp;
702
5
        let region_start = ssp;
703
5
704
5
        if ssp != sp {
705
1
            return Err(PanicReason::ExpectedUnallocatedStack.into())
706
4
        }
707
708
4
        let blob_id = BlobId::from(self.memory.read_bytes(blob_id_addr)?);
709
710
3
        let current_contract = current_contract(self.context, self.fp, self.memory)?;
711
712
3
        let length = bytes::padded_len_word(length_unpadded).unwrap_or(Word::MAX);
713
714
0
        let blob_len =
715
3
            <S as StorageSize<BlobData>>::size_of_value(self.storage, &blob_id)
716
3
                .map_err(RuntimeError::Storage)?
717
3
                .ok_or(PanicReason::BlobNotFound)?;
718
719
        // Fetch the storage blob
720
0
        let profiler = ProfileGas {
721
0
            pc: self.pc.as_ref(),
722
0
            is: self.is,
723
0
            current_contract,
724
0
            profiler: self.profiler,
725
0
        };
726
0
        let charge_len = core::cmp::max(blob_len as u64, length);
727
0
        dependent_gas_charge_without_base(
728
0
            self.cgas,
729
0
            self.ggas,
730
0
            profiler,
731
0
            self.gas_cost,
732
0
            charge_len,
733
0
        )?;
734
0
        let blob = <S as StorageInspect<BlobData>>::get(self.storage, &blob_id)
735
0
            .map_err(RuntimeError::Storage)?
736
0
            .ok_or(PanicReason::BlobNotFound)?;
737
0
        let blob_bytes = blob.as_ref().as_ref();
738
0
739
0
        let new_sp = ssp.saturating_add(length);
740
0
        self.memory.grow_stack(new_sp)?;
741
742
        // Set up ownership registers for the copy using old ssp
743
0
        let owner =
744
0
            OwnershipRegisters::only_allow_stack_write(new_sp, *self.ssp, *self.hp);
745
0
746
0
        // Mark stack space as allocated
747
0
        *self.sp = new_sp;
748
0
        *self.ssp = new_sp;
749
0
750
0
        // Copy the code.
751
0
        copy_from_slice_zero_fill(
752
0
            self.memory,
753
0
            owner,
754
0
            blob_bytes,
755
0
            region_start,
756
0
            blob_offset,
757
0
            length,
758
0
        )?;
759
760
        // Update frame code size, if we have a stack frame (i.e. fp > 0)
761
0
        if self.context.is_internal() {
762
0
            let code_size_ptr =
763
0
                (*self.fp).saturating_add(CallFrame::code_size_offset() as Word);
764
0
            let old_code_size =
765
0
                Word::from_be_bytes(self.memory.read_bytes(code_size_ptr)?);
766
0
            let old_code_size = padded_len_word(old_code_size)
767
0
                .expect("Code size cannot overflow with padding");
768
0
            let new_code_size = old_code_size
769
0
                .checked_add(length as Word)
770
0
                .ok_or(PanicReason::MemoryOverflow)?;
771
772
0
            self.memory
773
0
                .write_bytes_noownerchecks(code_size_ptr, new_code_size.to_be_bytes())?;
774
0
        }
775
776
0
        inc_pc(self.pc)?;
777
778
0
        Ok(())
779
5
    }
780
781
    /// Copies `c` bytes from starting the memory `a` and offset `b` into the
782
    /// stack.
783
    ///
784
    /// ```txt
785
    /// mem[$ssp, $rC] = memory[$rA + $rB, $rC]
786
    /// ```
787
229k
    pub(crate) fn load_memory_code(
788
229k
        mut self,
789
229k
        input_src_addr: Word,
790
229k
        input_offset: Word,
791
229k
        length_unpadded: Word,
792
229k
    ) -> IoResult<(), S::DataError>
793
229k
    where
794
229k
        S: InterpreterStorage,
795
229k
    {
796
229k
        let ssp = *self.ssp;
797
229k
        let sp = *self.sp;
798
229k
        let dst = ssp;
799
229k
800
229k
        if ssp != sp {
801
1
            return Err(PanicReason::ExpectedUnallocatedStack.into())
802
229k
        }
803
229k
804
229k
        if length_unpadded == 0 {
805
167k
            inc_pc(self.pc)?;
806
167k
            return Ok(())
807
62.2k
        }
808
809
62.2k
        let current_contract = current_contract(self.context, self.fp, self.memory)?;
810
811
62.2k
        let length = bytes::padded_len_word(length_unpadded).unwrap_or(Word::MAX);
812
62.2k
813
62.2k
        // Fetch the storage blob
814
62.2k
        let profiler = ProfileGas {
815
62.2k
            pc: self.pc.as_ref(),
816
62.2k
            is: self.is,
817
62.2k
            current_contract,
818
62.2k
            profiler: self.profiler,
819
62.2k
        };
820
62.2k
        let charge_len = length;
821
62.2k
        dependent_gas_charge_without_base(
822
62.2k
            self.cgas,
823
62.2k
            self.ggas,
824
62.2k
            profiler,
825
62.2k
            self.gas_cost,
826
62.2k
            charge_len,
827
62.2k
        )?;
828
829
62.2k
        let new_sp = ssp.saturating_add(length);
830
62.2k
        self.memory.grow_stack(new_sp)?;
831
832
        // Set up ownership registers for the copy using old ssp
833
62.2k
        let owner = OwnershipRegisters::only_allow_stack_write(new_sp, ssp, *self.hp);
834
62.2k
        let src = input_src_addr.saturating_add(input_offset);
835
62.2k
836
62.2k
        // Copy the code.
837
62.2k
        self.memory.memcopy(dst, src, length, owner)?;
838
839
        // Mark stack space as allocated
840
62.2k
        *self.sp = new_sp;
841
62.2k
        *self.ssp = new_sp;
842
62.2k
843
62.2k
        // Update frame code size, if we have a stack frame (i.e. fp > 0)
844
62.2k
        if self.context.is_internal() {
845
185
            let code_size_ptr =
846
185
                (*self.fp).saturating_add(CallFrame::code_size_offset() as Word);
847
185
            let old_code_size =
848
185
                Word::from_be_bytes(self.memory.read_bytes(code_size_ptr)?);
849
185
            let old_code_size = padded_len_word(old_code_size)
850
185
                .expect("Code size cannot overflow with padding");
851
185
            let new_code_size = old_code_size
852
185
                .checked_add(length as Word)
853
185
                .ok_or(PanicReason::MemoryOverflow)?;
854
855
185
            self.memory
856
185
                .write_bytes_noownerchecks(code_size_ptr, new_code_size.to_be_bytes())?;
857
62.0k
        }
858
859
62.2k
        inc_pc(self.pc)?;
860
861
62.2k
        Ok(())
862
229k
    }
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_19LoadContractCodeCtxINtNtNtB8_7storage9predicate16PredicateStorageRNtB1n_12EmptyStorageEE16load_memory_codeB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_19LoadContractCodeCtxINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1p_6memory13MemoryStorageEE16load_memory_codeB8_
_RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB4_19LoadContractCodeCtxNtNtNtB8_7storage6memory13MemoryStorageE16load_memory_codeB8_
Line
Count
Source
787
229k
    pub(crate) fn load_memory_code(
788
229k
        mut self,
789
229k
        input_src_addr: Word,
790
229k
        input_offset: Word,
791
229k
        length_unpadded: Word,
792
229k
    ) -> IoResult<(), S::DataError>
793
229k
    where
794
229k
        S: InterpreterStorage,
795
229k
    {
796
229k
        let ssp = *self.ssp;
797
229k
        let sp = *self.sp;
798
229k
        let dst = ssp;
799
229k
800
229k
        if ssp != sp {
801
1
            return Err(PanicReason::ExpectedUnallocatedStack.into())
802
229k
        }
803
229k
804
229k
        if length_unpadded == 0 {
805
167k
            inc_pc(self.pc)?;
806
167k
            return Ok(())
807
62.2k
        }
808
809
62.2k
        let current_contract = current_contract(self.context, self.fp, self.memory)?;
810
811
62.2k
        let length = bytes::padded_len_word(length_unpadded).unwrap_or(Word::MAX);
812
62.2k
813
62.2k
        // Fetch the storage blob
814
62.2k
        let profiler = ProfileGas {
815
62.2k
            pc: self.pc.as_ref(),
816
62.2k
            is: self.is,
817
62.2k
            current_contract,
818
62.2k
            profiler: self.profiler,
819
62.2k
        };
820
62.2k
        let charge_len = length;
821
62.2k
        dependent_gas_charge_without_base(
822
62.2k
            self.cgas,
823
62.2k
            self.ggas,
824
62.2k
            profiler,
825
62.2k
            self.gas_cost,
826
62.2k
            charge_len,
827
62.2k
        )?;
828
829
62.2k
        let new_sp = ssp.saturating_add(length);
830
62.2k
        self.memory.grow_stack(new_sp)?;
831
832
        // Set up ownership registers for the copy using old ssp
833
62.2k
        let owner = OwnershipRegisters::only_allow_stack_write(new_sp, ssp, *self.hp);
834
62.2k
        let src = input_src_addr.saturating_add(input_offset);
835
62.2k
836
62.2k
        // Copy the code.
837
62.2k
        self.memory.memcopy(dst, src, length, owner)?;
838
839
        // Mark stack space as allocated
840
62.2k
        *self.sp = new_sp;
841
62.2k
        *self.ssp = new_sp;
842
62.2k
843
62.2k
        // Update frame code size, if we have a stack frame (i.e. fp > 0)
844
62.2k
        if self.context.is_internal() {
845
185
            let code_size_ptr =
846
185
                (*self.fp).saturating_add(CallFrame::code_size_offset() as Word);
847
185
            let old_code_size =
848
185
                Word::from_be_bytes(self.memory.read_bytes(code_size_ptr)?);
849
185
            let old_code_size = padded_len_word(old_code_size)
850
185
                .expect("Code size cannot overflow with padding");
851
185
            let new_code_size = old_code_size
852
185
                .checked_add(length as Word)
853
185
                .ok_or(PanicReason::MemoryOverflow)?;
854
855
185
            self.memory
856
185
                .write_bytes_noownerchecks(code_size_ptr, new_code_size.to_be_bytes())?;
857
62.0k
        }
858
859
62.2k
        inc_pc(self.pc)?;
860
861
62.2k
        Ok(())
862
229k
    }
863
}
864
865
struct BurnCtx<'vm, S> {
866
    storage: &'vm mut S,
867
    context: &'vm Context,
868
    memory: &'vm MemoryInstance,
869
    receipts: &'vm mut ReceiptsCtx,
870
    fp: Reg<'vm, FP>,
871
    pc: RegMut<'vm, PC>,
872
    is: Reg<'vm, IS>,
873
}
874
875
impl<'vm, S> BurnCtx<'vm, S>
876
where
877
    S: ContractsAssetsStorage,
878
{
879
116
    pub(crate) fn burn(self, a: Word, b: Word) -> IoResult<(), S::Error> {
880
116
        let contract_id = internal_contract(self.context, self.fp, self.memory)?;
881
114
        let sub_id = Bytes32::new(self.memory.read_bytes(b)?);
882
113
        let asset_id = contract_id.asset_id(&sub_id);
883
884
113
        let balance = balance(self.storage, &contract_id, &asset_id)?;
885
113
        let balance = balance
886
113
            .checked_sub(a)
887
113
            .ok_or(PanicReason::NotEnoughBalance)?;
888
889
112
        self.storage
890
112
            .contract_asset_id_balance_insert(&contract_id, &asset_id, balance)
891
112
            .map_err(RuntimeError::Storage)?;
892
893
112
        let receipt = Receipt::burn(sub_id, contract_id, a, *self.pc, *self.is);
894
112
895
112
        self.receipts.push(receipt)?;
896
897
112
        Ok(inc_pc(self.pc)?)
898
116
    }
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB5_7BurnCtxINtNtNtB9_7storage9predicate16PredicateStorageRNtB1b_12EmptyStorageEE4burnB9_
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB5_7BurnCtxINtNtNtB9_7storage9predicate16PredicateStorageRNtNtB1d_6memory13MemoryStorageEE4burnB9_
_RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB5_7BurnCtxNtNtNtB9_7storage6memory13MemoryStorageE4burnB9_
Line
Count
Source
879
116
    pub(crate) fn burn(self, a: Word, b: Word) -> IoResult<(), S::Error> {
880
116
        let contract_id = internal_contract(self.context, self.fp, self.memory)?;
881
114
        let sub_id = Bytes32::new(self.memory.read_bytes(b)?);
882
113
        let asset_id = contract_id.asset_id(&sub_id);
883
884
113
        let balance = balance(self.storage, &contract_id, &asset_id)?;
885
113
        let balance = balance
886
113
            .checked_sub(a)
887
113
            .ok_or(PanicReason::NotEnoughBalance)?;
888
889
112
        self.storage
890
112
            .contract_asset_id_balance_insert(&contract_id, &asset_id, balance)
891
112
            .map_err(RuntimeError::Storage)?;
892
893
112
        let receipt = Receipt::burn(sub_id, contract_id, a, *self.pc, *self.is);
894
112
895
112
        self.receipts.push(receipt)?;
896
897
112
        Ok(inc_pc(self.pc)?)
898
116
    }
899
}
900
901
struct MintCtx<'vm, S> {
902
    storage: &'vm mut S,
903
    context: &'vm Context,
904
    memory: &'vm MemoryInstance,
905
    profiler: &'vm mut Profiler,
906
    receipts: &'vm mut ReceiptsCtx,
907
    new_storage_gas_per_byte: Word,
908
    cgas: RegMut<'vm, CGAS>,
909
    ggas: RegMut<'vm, GGAS>,
910
    fp: Reg<'vm, FP>,
911
    pc: RegMut<'vm, PC>,
912
    is: Reg<'vm, IS>,
913
}
914
915
impl<'vm, S> MintCtx<'vm, S>
916
where
917
    S: ContractsAssetsStorage,
918
{
919
47
    pub(crate) fn mint(self, a: Word, b: Word) -> Result<(), RuntimeError<S::Error>> {
920
47
        let contract_id = internal_contract(self.context, self.fp, self.memory)?;
921
45
        let sub_id = Bytes32::new(self.memory.read_bytes(b)?);
922
44
        let asset_id = contract_id.asset_id(&sub_id);
923
924
44
        let balance = balance(self.storage, &contract_id, &asset_id)?;
925
44
        let balance = balance.checked_add(a).ok_or(PanicReason::BalanceOverflow)?;
926
927
44
        let old_value = self
928
44
            .storage
929
44
            .contract_asset_id_balance_replace(&contract_id, &asset_id, balance)
930
44
            .map_err(RuntimeError::Storage)?;
931
932
44
        if old_value.is_none() {
933
            // New data was written, charge gas for it
934
11
            let profiler = ProfileGas {
935
11
                pc: self.pc.as_ref(),
936
11
                is: self.is,
937
11
                current_contract: Some(contract_id),
938
11
                profiler: self.profiler,
939
11
            };
940
11
            gas_charge(
941
11
                self.cgas,
942
11
                self.ggas,
943
11
                profiler,
944
11
                (BALANCE_ENTRY_SIZE as u64).saturating_mul(self.new_storage_gas_per_byte),
945
11
            )?;
946
33
        }
947
948
44
        let receipt = Receipt::mint(sub_id, contract_id, a, *self.pc, *self.is);
949
44
950
44
        self.receipts.push(receipt)?;
951
952
44
        Ok(inc_pc(self.pc)?)
953
47
    }
Unexecuted instantiation: _RNvMs1_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB5_7MintCtxINtNtNtB9_7storage9predicate16PredicateStorageRNtB1b_12EmptyStorageEE4mintB9_
Unexecuted instantiation: _RNvMs1_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB5_7MintCtxINtNtNtB9_7storage9predicate16PredicateStorageRNtNtB1d_6memory13MemoryStorageEE4mintB9_
_RNvMs1_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB5_7MintCtxNtNtNtB9_7storage6memory13MemoryStorageE4mintB9_
Line
Count
Source
919
47
    pub(crate) fn mint(self, a: Word, b: Word) -> Result<(), RuntimeError<S::Error>> {
920
47
        let contract_id = internal_contract(self.context, self.fp, self.memory)?;
921
45
        let sub_id = Bytes32::new(self.memory.read_bytes(b)?);
922
44
        let asset_id = contract_id.asset_id(&sub_id);
923
924
44
        let balance = balance(self.storage, &contract_id, &asset_id)?;
925
44
        let balance = balance.checked_add(a).ok_or(PanicReason::BalanceOverflow)?;
926
927
44
        let old_value = self
928
44
            .storage
929
44
            .contract_asset_id_balance_replace(&contract_id, &asset_id, balance)
930
44
            .map_err(RuntimeError::Storage)?;
931
932
44
        if old_value.is_none() {
933
            // New data was written, charge gas for it
934
11
            let profiler = ProfileGas {
935
11
                pc: self.pc.as_ref(),
936
11
                is: self.is,
937
11
                current_contract: Some(contract_id),
938
11
                profiler: self.profiler,
939
11
            };
940
11
            gas_charge(
941
11
                self.cgas,
942
11
                self.ggas,
943
11
                profiler,
944
11
                (BALANCE_ENTRY_SIZE as u64).saturating_mul(self.new_storage_gas_per_byte),
945
11
            )?;
946
33
        }
947
948
44
        let receipt = Receipt::mint(sub_id, contract_id, a, *self.pc, *self.is);
949
44
950
44
        self.receipts.push(receipt)?;
951
952
44
        Ok(inc_pc(self.pc)?)
953
47
    }
954
}
955
956
struct CodeCopyCtx<'vm, S> {
957
    memory: &'vm mut MemoryInstance,
958
    input_contracts: InputContracts<'vm>,
959
    storage: &'vm S,
960
    profiler: &'vm mut Profiler,
961
    current_contract: Option<ContractId>,
962
    owner: OwnershipRegisters,
963
    gas_cost: DependentCost,
964
    cgas: RegMut<'vm, CGAS>,
965
    ggas: RegMut<'vm, GGAS>,
966
    pc: RegMut<'vm, PC>,
967
    is: Reg<'vm, IS>,
968
}
969
970
impl<'vm, S> CodeCopyCtx<'vm, S>
971
where
972
    S: InterpreterStorage,
973
{
974
14
    pub(crate) fn code_copy(
975
14
        mut self,
976
14
        dst_addr: Word,
977
14
        contract_id_addr: Word,
978
14
        contract_offset: Word,
979
14
        length: Word,
980
14
    ) -> IoResult<(), S::DataError>
981
14
    where
982
14
        S: InterpreterStorage,
983
14
    {
984
14
        let contract_id = ContractId::from(self.memory.read_bytes(contract_id_addr)?);
985
986
12
        self.memory.write(self.owner, dst_addr, length)?;
987
4
        self.input_contracts.check(&contract_id)?;
988
989
0
        let contract = super::contract::contract(self.storage, &contract_id)?;
990
0
        let contract_bytes = contract.as_ref().as_ref();
991
0
        let contract_len = contract_bytes.len();
992
0
        let charge_len = core::cmp::max(contract_len as u64, length);
993
0
        let profiler = ProfileGas {
994
0
            pc: self.pc.as_ref(),
995
0
            is: self.is,
996
0
            current_contract: self.current_contract,
997
0
            profiler: self.profiler,
998
0
        };
999
0
        dependent_gas_charge_without_base(
1000
0
            self.cgas,
1001
0
            self.ggas,
1002
0
            profiler,
1003
0
            self.gas_cost,
1004
0
            charge_len,
1005
0
        )?;
1006
1007
        // Owner checks already performed above
1008
0
        copy_from_slice_zero_fill(
1009
0
            self.memory,
1010
0
            self.owner,
1011
0
            contract.as_ref().as_ref(),
1012
0
            dst_addr,
1013
0
            contract_offset,
1014
0
            length,
1015
0
        )?;
1016
1017
0
        Ok(inc_pc(self.pc)?)
1018
14
    }
Unexecuted instantiation: _RNvMs2_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB5_11CodeCopyCtxINtNtNtB9_7storage9predicate16PredicateStorageRNtB1g_12EmptyStorageEE9code_copyB9_
Unexecuted instantiation: _RNvMs2_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB5_11CodeCopyCtxINtNtNtB9_7storage9predicate16PredicateStorageRNtNtB1i_6memory13MemoryStorageEE9code_copyB9_
_RNvMs2_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB5_11CodeCopyCtxNtNtNtB9_7storage6memory13MemoryStorageE9code_copyB9_
Line
Count
Source
974
14
    pub(crate) fn code_copy(
975
14
        mut self,
976
14
        dst_addr: Word,
977
14
        contract_id_addr: Word,
978
14
        contract_offset: Word,
979
14
        length: Word,
980
14
    ) -> IoResult<(), S::DataError>
981
14
    where
982
14
        S: InterpreterStorage,
983
14
    {
984
14
        let contract_id = ContractId::from(self.memory.read_bytes(contract_id_addr)?);
985
986
12
        self.memory.write(self.owner, dst_addr, length)?;
987
4
        self.input_contracts.check(&contract_id)?;
988
989
0
        let contract = super::contract::contract(self.storage, &contract_id)?;
990
0
        let contract_bytes = contract.as_ref().as_ref();
991
0
        let contract_len = contract_bytes.len();
992
0
        let charge_len = core::cmp::max(contract_len as u64, length);
993
0
        let profiler = ProfileGas {
994
0
            pc: self.pc.as_ref(),
995
0
            is: self.is,
996
0
            current_contract: self.current_contract,
997
0
            profiler: self.profiler,
998
0
        };
999
0
        dependent_gas_charge_without_base(
1000
0
            self.cgas,
1001
0
            self.ggas,
1002
0
            profiler,
1003
0
            self.gas_cost,
1004
0
            charge_len,
1005
0
        )?;
1006
1007
        // Owner checks already performed above
1008
0
        copy_from_slice_zero_fill(
1009
0
            self.memory,
1010
0
            self.owner,
1011
0
            contract.as_ref().as_ref(),
1012
0
            dst_addr,
1013
0
            contract_offset,
1014
0
            length,
1015
0
        )?;
1016
1017
0
        Ok(inc_pc(self.pc)?)
1018
14
    }
1019
}
1020
1021
72.8k
pub(crate) fn block_hash<S: InterpreterStorage>(
1022
72.8k
    storage: &S,
1023
72.8k
    memory: &mut MemoryInstance,
1024
72.8k
    owner: OwnershipRegisters,
1025
72.8k
    pc: RegMut<PC>,
1026
72.8k
    a: Word,
1027
72.8k
    b: Word,
1028
72.8k
) -> IoResult<(), S::DataError> {
1029
72.8k
    let height = u32::try_from(b)
1030
72.8k
        .map_err(|_| PanicReason::InvalidBlockHeight)?
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain10block_hashINtNtNtB8_7storage9predicate16PredicateStorageRNtB18_12EmptyStorageEE0B8_
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain10block_hashINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1a_6memory13MemoryStorageEE0B8_
_RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain10block_hashNtNtNtB8_7storage6memory13MemoryStorageE0B8_
Line
Count
Source
1030
1
        .map_err(|_| PanicReason::InvalidBlockHeight)?
1031
72.8k
        .into();
1032
72.8k
    let hash = storage.block_hash(height).map_err(RuntimeError::Storage)?;
1033
1034
72.8k
    memory.write_bytes(owner, a, *hash)?;
1035
1036
72.8k
    inc_pc(pc)?;
1037
72.8k
    Ok(())
1038
72.8k
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain10block_hashINtNtNtB6_7storage9predicate16PredicateStorageRNtB16_12EmptyStorageEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain10block_hashINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB18_6memory13MemoryStorageEEB6_
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain10block_hashNtNtNtB6_7storage6memory13MemoryStorageEB6_
Line
Count
Source
1021
72.8k
pub(crate) fn block_hash<S: InterpreterStorage>(
1022
72.8k
    storage: &S,
1023
72.8k
    memory: &mut MemoryInstance,
1024
72.8k
    owner: OwnershipRegisters,
1025
72.8k
    pc: RegMut<PC>,
1026
72.8k
    a: Word,
1027
72.8k
    b: Word,
1028
72.8k
) -> IoResult<(), S::DataError> {
1029
72.8k
    let height = u32::try_from(b)
1030
72.8k
        .map_err(|_| PanicReason::InvalidBlockHeight)?
1031
72.8k
        .into();
1032
72.8k
    let hash = storage.block_hash(height).map_err(RuntimeError::Storage)?;
1033
1034
72.8k
    memory.write_bytes(owner, a, *hash)?;
1035
1036
72.8k
    inc_pc(pc)?;
1037
72.8k
    Ok(())
1038
72.8k
}
1039
1040
174k
pub(crate) fn block_height(
1041
174k
    context: &Context,
1042
174k
    pc: RegMut<PC>,
1043
174k
    result: &mut Word,
1044
174k
) -> SimpleResult<()> {
1045
174k
    context
1046
174k
        .block_height()
1047
174k
        .map(|h| *h as Word)
1048
174k
        .map(|h| *result = h)
1049
174k
        .ok_or(PanicReason::TransactionValidity)?;
1050
1051
174k
    inc_pc(pc)?;
1052
174k
    Ok(())
1053
174k
}
1054
1055
231k
pub(crate) fn coinbase<S: InterpreterStorage>(
1056
231k
    storage: &S,
1057
231k
    memory: &mut MemoryInstance,
1058
231k
    owner: OwnershipRegisters,
1059
231k
    pc: RegMut<PC>,
1060
231k
    a: Word,
1061
231k
) -> IoResult<(), S::DataError> {
1062
231k
    let coinbase = storage.coinbase().map_err(RuntimeError::Storage)?;
1063
231k
    memory.write_bytes(owner, a, *coinbase)?;
1064
231k
    inc_pc(pc)?;
1065
231k
    Ok(())
1066
231k
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain8coinbaseINtNtNtB6_7storage9predicate16PredicateStorageRNtB13_12EmptyStorageEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain8coinbaseINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB15_6memory13MemoryStorageEEB6_
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain8coinbaseNtNtNtB6_7storage6memory13MemoryStorageEB6_
Line
Count
Source
1055
231k
pub(crate) fn coinbase<S: InterpreterStorage>(
1056
231k
    storage: &S,
1057
231k
    memory: &mut MemoryInstance,
1058
231k
    owner: OwnershipRegisters,
1059
231k
    pc: RegMut<PC>,
1060
231k
    a: Word,
1061
231k
) -> IoResult<(), S::DataError> {
1062
231k
    let coinbase = storage.coinbase().map_err(RuntimeError::Storage)?;
1063
231k
    memory.write_bytes(owner, a, *coinbase)?;
1064
231k
    inc_pc(pc)?;
1065
231k
    Ok(())
1066
231k
}
1067
1068
struct CodeRootCtx<'vm, S> {
1069
    storage: &'vm S,
1070
    memory: &'vm mut MemoryInstance,
1071
    gas_cost: DependentCost,
1072
    profiler: &'vm mut Profiler,
1073
    input_contracts: InputContracts<'vm>,
1074
    current_contract: Option<ContractId>,
1075
    cgas: RegMut<'vm, CGAS>,
1076
    ggas: RegMut<'vm, GGAS>,
1077
    owner: OwnershipRegisters,
1078
    pc: RegMut<'vm, PC>,
1079
    is: Reg<'vm, IS>,
1080
}
1081
1082
impl<'vm, S> CodeRootCtx<'vm, S> {
1083
7
    pub(crate) fn code_root(mut self, a: Word, b: Word) -> IoResult<(), S::DataError>
1084
7
    where
1085
7
        S: InterpreterStorage,
1086
7
    {
1087
7
        self.memory.write_noownerchecks(a, Bytes32::LEN)?;
1088
1089
4
        let contract_id = ContractId::new(self.memory.read_bytes(b)?);
1090
1091
2
        self.input_contracts.check(&contract_id)?;
1092
1093
0
        let len = contract_size(self.storage, &contract_id)?;
1094
0
        let profiler = ProfileGas {
1095
0
            pc: self.pc.as_ref(),
1096
0
            is: self.is,
1097
0
            current_contract: self.current_contract,
1098
0
            profiler: self.profiler,
1099
0
        };
1100
0
        dependent_gas_charge_without_base(
1101
0
            self.cgas,
1102
0
            self.ggas,
1103
0
            profiler,
1104
0
            self.gas_cost,
1105
0
            len as u64,
1106
0
        )?;
1107
0
        let root = self
1108
0
            .storage
1109
0
            .storage_contract(&contract_id)
1110
0
            .transpose()
1111
0
            .ok_or(PanicReason::ContractNotFound)?
1112
0
            .map_err(RuntimeError::Storage)?
1113
0
            .root();
1114
0
1115
0
        self.memory.write_bytes(self.owner, a, *root)?;
1116
1117
0
        Ok(inc_pc(self.pc)?)
1118
7
    }
Unexecuted instantiation: _RNvMs3_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB5_11CodeRootCtxINtNtNtB9_7storage9predicate16PredicateStorageRNtB1g_12EmptyStorageEE9code_rootB9_
Unexecuted instantiation: _RNvMs3_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB5_11CodeRootCtxINtNtNtB9_7storage9predicate16PredicateStorageRNtNtB1i_6memory13MemoryStorageEE9code_rootB9_
_RNvMs3_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB5_11CodeRootCtxNtNtNtB9_7storage6memory13MemoryStorageE9code_rootB9_
Line
Count
Source
1083
7
    pub(crate) fn code_root(mut self, a: Word, b: Word) -> IoResult<(), S::DataError>
1084
7
    where
1085
7
        S: InterpreterStorage,
1086
7
    {
1087
7
        self.memory.write_noownerchecks(a, Bytes32::LEN)?;
1088
1089
4
        let contract_id = ContractId::new(self.memory.read_bytes(b)?);
1090
1091
2
        self.input_contracts.check(&contract_id)?;
1092
1093
0
        let len = contract_size(self.storage, &contract_id)?;
1094
0
        let profiler = ProfileGas {
1095
0
            pc: self.pc.as_ref(),
1096
0
            is: self.is,
1097
0
            current_contract: self.current_contract,
1098
0
            profiler: self.profiler,
1099
0
        };
1100
0
        dependent_gas_charge_without_base(
1101
0
            self.cgas,
1102
0
            self.ggas,
1103
0
            profiler,
1104
0
            self.gas_cost,
1105
0
            len as u64,
1106
0
        )?;
1107
0
        let root = self
1108
0
            .storage
1109
0
            .storage_contract(&contract_id)
1110
0
            .transpose()
1111
0
            .ok_or(PanicReason::ContractNotFound)?
1112
0
            .map_err(RuntimeError::Storage)?
1113
0
            .root();
1114
0
1115
0
        self.memory.write_bytes(self.owner, a, *root)?;
1116
1117
0
        Ok(inc_pc(self.pc)?)
1118
7
    }
1119
}
1120
1121
struct CodeSizeCtx<'vm, S> {
1122
    storage: &'vm S,
1123
    memory: &'vm mut MemoryInstance,
1124
    gas_cost: DependentCost,
1125
    profiler: &'vm mut Profiler,
1126
    input_contracts: InputContracts<'vm>,
1127
    current_contract: Option<ContractId>,
1128
    cgas: RegMut<'vm, CGAS>,
1129
    ggas: RegMut<'vm, GGAS>,
1130
    pc: RegMut<'vm, PC>,
1131
    is: Reg<'vm, IS>,
1132
}
1133
1134
impl<'vm, S> CodeSizeCtx<'vm, S> {
1135
2
    pub(crate) fn code_size(
1136
2
        mut self,
1137
2
        result: &mut Word,
1138
2
        b: Word,
1139
2
    ) -> Result<(), RuntimeError<S::Error>>
1140
2
    where
1141
2
        S: StorageSize<ContractsRawCode>,
1142
2
    {
1143
2
        let contract_id = ContractId::new(self.memory.read_bytes(b)?);
1144
1145
1
        self.input_contracts.check(&contract_id)?;
1146
1147
0
        let len = contract_size(self.storage, &contract_id)?;
1148
0
        let profiler = ProfileGas {
1149
0
            pc: self.pc.as_ref(),
1150
0
            is: self.is,
1151
0
            current_contract: self.current_contract,
1152
0
            profiler: self.profiler,
1153
0
        };
1154
0
        dependent_gas_charge_without_base(
1155
0
            self.cgas,
1156
0
            self.ggas,
1157
0
            profiler,
1158
0
            self.gas_cost,
1159
0
            len as u64,
1160
0
        )?;
1161
0
        *result = len as u64;
1162
0
1163
0
        Ok(inc_pc(self.pc)?)
1164
2
    }
Unexecuted instantiation: _RNvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB5_11CodeSizeCtxINtNtNtB9_7storage9predicate16PredicateStorageRNtB1g_12EmptyStorageEE9code_sizeB9_
Unexecuted instantiation: _RNvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB5_11CodeSizeCtxINtNtNtB9_7storage9predicate16PredicateStorageRNtNtB1i_6memory13MemoryStorageEE9code_sizeB9_
_RNvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB5_11CodeSizeCtxNtNtNtB9_7storage6memory13MemoryStorageE9code_sizeB9_
Line
Count
Source
1135
2
    pub(crate) fn code_size(
1136
2
        mut self,
1137
2
        result: &mut Word,
1138
2
        b: Word,
1139
2
    ) -> Result<(), RuntimeError<S::Error>>
1140
2
    where
1141
2
        S: StorageSize<ContractsRawCode>,
1142
2
    {
1143
2
        let contract_id = ContractId::new(self.memory.read_bytes(b)?);
1144
1145
1
        self.input_contracts.check(&contract_id)?;
1146
1147
0
        let len = contract_size(self.storage, &contract_id)?;
1148
0
        let profiler = ProfileGas {
1149
0
            pc: self.pc.as_ref(),
1150
0
            is: self.is,
1151
0
            current_contract: self.current_contract,
1152
0
            profiler: self.profiler,
1153
0
        };
1154
0
        dependent_gas_charge_without_base(
1155
0
            self.cgas,
1156
0
            self.ggas,
1157
0
            profiler,
1158
0
            self.gas_cost,
1159
0
            len as u64,
1160
0
        )?;
1161
0
        *result = len as u64;
1162
0
1163
0
        Ok(inc_pc(self.pc)?)
1164
2
    }
1165
}
1166
1167
pub(crate) struct StateReadWordCtx<'vm, S> {
1168
    pub storage: &'vm mut S,
1169
    pub memory: &'vm MemoryInstance,
1170
    pub context: &'vm Context,
1171
    pub fp: Reg<'vm, FP>,
1172
    pub pc: RegMut<'vm, PC>,
1173
}
1174
1175
2.04k
pub(crate) fn state_read_word<S: InterpreterStorage>(
1176
2.04k
    StateReadWordCtx {
1177
2.04k
        storage,
1178
2.04k
        memory,
1179
2.04k
        context,
1180
2.04k
        fp,
1181
2.04k
        pc,
1182
2.04k
        ..
1183
2.04k
    }: StateReadWordCtx<S>,
1184
2.04k
    result: &mut Word,
1185
2.04k
    got_result: &mut Word,
1186
2.04k
    c: Word,
1187
2.04k
) -> IoResult<(), S::DataError> {
1188
2.04k
    let key = Bytes32::new(memory.read_bytes(c)?);
1189
2.04k
    let contract = internal_contract(context, fp, memory)?;
1190
1191
2.03k
    let value = storage
1192
2.03k
        .contract_state(&contract, &key)
1193
2.03k
        .map_err(RuntimeError::Storage)?
1194
2.03k
        .map(|bytes| {
1195
0
            Word::from_be_bytes(
1196
0
                bytes.as_ref().as_ref()[..8]
1197
0
                    .try_into()
1198
0
                    .expect("8 bytes can be converted to a Word"),
1199
0
            )
1200
2.03k
        });
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain15state_read_wordINtNtNtB8_7storage9predicate16PredicateStorageRNtB1d_12EmptyStorageEE0B8_
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain15state_read_wordINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1f_6memory13MemoryStorageEE0B8_
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain15state_read_wordNtNtNtB8_7storage6memory13MemoryStorageE0B8_
1201
2.03k
1202
2.03k
    *result = value.unwrap_or(0);
1203
2.03k
    *got_result = value.is_some() as Word;
1204
2.03k
1205
2.03k
    Ok(inc_pc(pc)?)
1206
2.04k
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain15state_read_wordINtNtNtB6_7storage9predicate16PredicateStorageRNtB1b_12EmptyStorageEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain15state_read_wordINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1d_6memory13MemoryStorageEEB6_
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain15state_read_wordNtNtNtB6_7storage6memory13MemoryStorageEB6_
Line
Count
Source
1175
2.04k
pub(crate) fn state_read_word<S: InterpreterStorage>(
1176
2.04k
    StateReadWordCtx {
1177
2.04k
        storage,
1178
2.04k
        memory,
1179
2.04k
        context,
1180
2.04k
        fp,
1181
2.04k
        pc,
1182
2.04k
        ..
1183
2.04k
    }: StateReadWordCtx<S>,
1184
2.04k
    result: &mut Word,
1185
2.04k
    got_result: &mut Word,
1186
2.04k
    c: Word,
1187
2.04k
) -> IoResult<(), S::DataError> {
1188
2.04k
    let key = Bytes32::new(memory.read_bytes(c)?);
1189
2.04k
    let contract = internal_contract(context, fp, memory)?;
1190
1191
2.03k
    let value = storage
1192
2.03k
        .contract_state(&contract, &key)
1193
2.03k
        .map_err(RuntimeError::Storage)?
1194
2.03k
        .map(|bytes| {
1195
            Word::from_be_bytes(
1196
                bytes.as_ref().as_ref()[..8]
1197
                    .try_into()
1198
                    .expect("8 bytes can be converted to a Word"),
1199
            )
1200
2.03k
        });
1201
2.03k
1202
2.03k
    *result = value.unwrap_or(0);
1203
2.03k
    *got_result = value.is_some() as Word;
1204
2.03k
1205
2.03k
    Ok(inc_pc(pc)?)
1206
2.04k
}
1207
1208
pub(crate) struct StateWriteWordCtx<'vm, S> {
1209
    pub storage: &'vm mut S,
1210
    pub memory: &'vm MemoryInstance,
1211
    pub context: &'vm Context,
1212
    pub profiler: &'vm mut Profiler,
1213
    pub new_storage_gas_per_byte: Word,
1214
    pub current_contract: Option<ContractId>,
1215
    pub cgas: RegMut<'vm, CGAS>,
1216
    pub ggas: RegMut<'vm, GGAS>,
1217
    pub is: Reg<'vm, IS>,
1218
    pub fp: Reg<'vm, FP>,
1219
    pub pc: RegMut<'vm, PC>,
1220
}
1221
1222
350
pub(crate) fn state_write_word<S: InterpreterStorage>(
1223
350
    StateWriteWordCtx {
1224
350
        storage,
1225
350
        memory,
1226
350
        context,
1227
350
        profiler,
1228
350
        new_storage_gas_per_byte,
1229
350
        current_contract,
1230
350
        cgas,
1231
350
        ggas,
1232
350
        is,
1233
350
        fp,
1234
350
        pc,
1235
350
    }: StateWriteWordCtx<S>,
1236
350
    a: Word,
1237
350
    created_new: &mut Word,
1238
350
    c: Word,
1239
350
) -> IoResult<(), S::DataError> {
1240
350
    let key = Bytes32::new(memory.read_bytes(a)?);
1241
348
    let contract = internal_contract(context, fp, memory)?;
1242
1243
347
    let mut value = Bytes32::zeroed();
1244
347
    value.as_mut()[..WORD_SIZE].copy_from_slice(&c.to_be_bytes());
1245
1246
347
    let prev = storage
1247
347
        .contract_state_replace(&contract, &key, value.as_ref())
1248
347
        .map_err(RuntimeError::Storage)?;
1249
1250
347
    *created_new = prev.is_none() as Word;
1251
347
1252
347
    if prev.is_none() {
1253
        // New data was written, charge gas for it
1254
12
        let profiler = ProfileGas {
1255
12
            pc: pc.as_ref(),
1256
12
            is,
1257
12
            current_contract,
1258
12
            profiler,
1259
12
        };
1260
12
        gas_charge(
1261
12
            cgas,
1262
12
            ggas,
1263
12
            profiler,
1264
12
            (Bytes32::LEN as u64)
1265
12
                .saturating_mul(2)
1266
12
                .saturating_mul(new_storage_gas_per_byte),
1267
12
        )?;
1268
335
    }
1269
1270
345
    Ok(inc_pc(pc)?)
1271
350
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain16state_write_wordINtNtNtB6_7storage9predicate16PredicateStorageRNtB1c_12EmptyStorageEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain16state_write_wordINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1e_6memory13MemoryStorageEEB6_
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain16state_write_wordNtNtNtB6_7storage6memory13MemoryStorageEB6_
Line
Count
Source
1222
350
pub(crate) fn state_write_word<S: InterpreterStorage>(
1223
350
    StateWriteWordCtx {
1224
350
        storage,
1225
350
        memory,
1226
350
        context,
1227
350
        profiler,
1228
350
        new_storage_gas_per_byte,
1229
350
        current_contract,
1230
350
        cgas,
1231
350
        ggas,
1232
350
        is,
1233
350
        fp,
1234
350
        pc,
1235
350
    }: StateWriteWordCtx<S>,
1236
350
    a: Word,
1237
350
    created_new: &mut Word,
1238
350
    c: Word,
1239
350
) -> IoResult<(), S::DataError> {
1240
350
    let key = Bytes32::new(memory.read_bytes(a)?);
1241
348
    let contract = internal_contract(context, fp, memory)?;
1242
1243
347
    let mut value = Bytes32::zeroed();
1244
347
    value.as_mut()[..WORD_SIZE].copy_from_slice(&c.to_be_bytes());
1245
1246
347
    let prev = storage
1247
347
        .contract_state_replace(&contract, &key, value.as_ref())
1248
347
        .map_err(RuntimeError::Storage)?;
1249
1250
347
    *created_new = prev.is_none() as Word;
1251
347
1252
347
    if prev.is_none() {
1253
        // New data was written, charge gas for it
1254
12
        let profiler = ProfileGas {
1255
12
            pc: pc.as_ref(),
1256
12
            is,
1257
12
            current_contract,
1258
12
            profiler,
1259
12
        };
1260
12
        gas_charge(
1261
12
            cgas,
1262
12
            ggas,
1263
12
            profiler,
1264
12
            (Bytes32::LEN as u64)
1265
12
                .saturating_mul(2)
1266
12
                .saturating_mul(new_storage_gas_per_byte),
1267
12
        )?;
1268
335
    }
1269
1270
345
    Ok(inc_pc(pc)?)
1271
350
}
1272
1273
326k
pub(crate) fn timestamp<S: InterpreterStorage>(
1274
326k
    storage: &S,
1275
326k
    block_height: BlockHeight,
1276
326k
    pc: RegMut<PC>,
1277
326k
    result: &mut Word,
1278
326k
    b: Word,
1279
326k
) -> IoResult<(), S::DataError> {
1280
326k
    let b = u32::try_from(b)
1281
326k
        .map_err(|_| PanicReason::InvalidBlockHeight)?
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain9timestampINtNtNtB8_7storage9predicate16PredicateStorageRNtB16_12EmptyStorageEE0B8_
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain9timestampINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB18_6memory13MemoryStorageEE0B8_
_RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain9timestampNtNtNtB8_7storage6memory13MemoryStorageE0B8_
Line
Count
Source
1281
1
        .map_err(|_| PanicReason::InvalidBlockHeight)?
1282
326k
        .into();
1283
326k
    (b <= block_height)
1284
326k
        .then_some(())
1285
326k
        .ok_or(PanicReason::TransactionValidity)?;
1286
1287
326k
    *result = storage.timestamp(b).map_err(RuntimeError::Storage)?;
1288
1289
326k
    Ok(inc_pc(pc)?)
1290
326k
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain9timestampINtNtNtB6_7storage9predicate16PredicateStorageRNtB14_12EmptyStorageEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain9timestampINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB16_6memory13MemoryStorageEEB6_
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain9timestampNtNtNtB6_7storage6memory13MemoryStorageEB6_
Line
Count
Source
1273
326k
pub(crate) fn timestamp<S: InterpreterStorage>(
1274
326k
    storage: &S,
1275
326k
    block_height: BlockHeight,
1276
326k
    pc: RegMut<PC>,
1277
326k
    result: &mut Word,
1278
326k
    b: Word,
1279
326k
) -> IoResult<(), S::DataError> {
1280
326k
    let b = u32::try_from(b)
1281
326k
        .map_err(|_| PanicReason::InvalidBlockHeight)?
1282
326k
        .into();
1283
326k
    (b <= block_height)
1284
326k
        .then_some(())
1285
326k
        .ok_or(PanicReason::TransactionValidity)?;
1286
1287
326k
    *result = storage.timestamp(b).map_err(RuntimeError::Storage)?;
1288
1289
326k
    Ok(inc_pc(pc)?)
1290
326k
}
1291
struct MessageOutputCtx<'vm, S>
1292
where
1293
    S: ContractsAssetsStorage + ?Sized,
1294
{
1295
    base_asset_id: AssetId,
1296
    max_message_data_length: u64,
1297
    memory: &'vm mut MemoryInstance,
1298
    receipts: &'vm mut ReceiptsCtx,
1299
    balances: &'vm mut RuntimeBalances,
1300
    storage: &'vm mut S,
1301
    current_contract: Option<ContractId>,
1302
    fp: Reg<'vm, FP>,
1303
    pc: RegMut<'vm, PC>,
1304
    /// A
1305
    recipient_mem_address: Word,
1306
    /// B
1307
    msg_data_ptr: Word,
1308
    /// C
1309
    msg_data_len: Word,
1310
    /// D
1311
    amount_coins_to_send: Word,
1312
}
1313
1314
impl<S> MessageOutputCtx<'_, S>
1315
where
1316
    S: ContractsAssetsStorage + ?Sized,
1317
{
1318
88.9k
    pub(crate) fn message_output(self) -> Result<(), RuntimeError<S::Error>> {
1319
88.9k
        if self.msg_data_len > self.max_message_data_length {
1320
2
            return Err(RuntimeError::Recoverable(PanicReason::MessageDataTooLong));
1321
88.9k
        }
1322
1323
88.9k
        let msg_data = self
1324
88.9k
            .memory
1325
88.9k
            .read(self.msg_data_ptr, self.msg_data_len)?
1326
88.9k
            .to_vec();
1327
88.9k
        let recipient = Address::new(self.memory.read_bytes(self.recipient_mem_address)?);
1328
88.9k
        let sender = Address::new(self.memory.read_bytes(*self.fp)?);
1329
1330
        // validations passed, perform the mutations
1331
1332
88.9k
        if let Some(source_contract) = self.current_contract {
1333
161
            balance_decrease(
1334
161
                self.storage,
1335
161
                &source_contract,
1336
161
                &self.base_asset_id,
1337
161
                self.amount_coins_to_send,
1338
161
            )?;
1339
        } else {
1340
88.7k
            base_asset_balance_sub(
1341
88.7k
                &self.base_asset_id,
1342
88.7k
                self.balances,
1343
88.7k
                self.memory,
1344
88.7k
                self.amount_coins_to_send,
1345
88.7k
            )?;
1346
        }
1347
1348
88.9k
        let txid = tx_id(self.memory);
1349
88.9k
        let receipt = Receipt::message_out(
1350
88.9k
            &txid,
1351
88.9k
            self.receipts.len() as Word,
1352
88.9k
            sender,
1353
88.9k
            recipient,
1354
88.9k
            self.amount_coins_to_send,
1355
88.9k
            msg_data,
1356
88.9k
        );
1357
88.9k
1358
88.9k
        self.receipts.push(receipt)?;
1359
1360
88.9k
        Ok(inc_pc(self.pc)?)
1361
88.9k
    }
Unexecuted instantiation: _RNvMs5_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB5_16MessageOutputCtxINtNtNtB9_7storage9predicate16PredicateStorageRNtB1l_12EmptyStorageEE14message_outputB9_
Unexecuted instantiation: _RNvMs5_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB5_16MessageOutputCtxINtNtNtB9_7storage9predicate16PredicateStorageRNtNtB1n_6memory13MemoryStorageEE14message_outputB9_
_RNvMs5_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchainINtB5_16MessageOutputCtxNtNtNtB9_7storage6memory13MemoryStorageE14message_outputB9_
Line
Count
Source
1318
88.9k
    pub(crate) fn message_output(self) -> Result<(), RuntimeError<S::Error>> {
1319
88.9k
        if self.msg_data_len > self.max_message_data_length {
1320
2
            return Err(RuntimeError::Recoverable(PanicReason::MessageDataTooLong));
1321
88.9k
        }
1322
1323
88.9k
        let msg_data = self
1324
88.9k
            .memory
1325
88.9k
            .read(self.msg_data_ptr, self.msg_data_len)?
1326
88.9k
            .to_vec();
1327
88.9k
        let recipient = Address::new(self.memory.read_bytes(self.recipient_mem_address)?);
1328
88.9k
        let sender = Address::new(self.memory.read_bytes(*self.fp)?);
1329
1330
        // validations passed, perform the mutations
1331
1332
88.9k
        if let Some(source_contract) = self.current_contract {
1333
161
            balance_decrease(
1334
161
                self.storage,
1335
161
                &source_contract,
1336
161
                &self.base_asset_id,
1337
161
                self.amount_coins_to_send,
1338
161
            )?;
1339
        } else {
1340
88.7k
            base_asset_balance_sub(
1341
88.7k
                &self.base_asset_id,
1342
88.7k
                self.balances,
1343
88.7k
                self.memory,
1344
88.7k
                self.amount_coins_to_send,
1345
88.7k
            )?;
1346
        }
1347
1348
88.9k
        let txid = tx_id(self.memory);
1349
88.9k
        let receipt = Receipt::message_out(
1350
88.9k
            &txid,
1351
88.9k
            self.receipts.len() as Word,
1352
88.9k
            sender,
1353
88.9k
            recipient,
1354
88.9k
            self.amount_coins_to_send,
1355
88.9k
            msg_data,
1356
88.9k
        );
1357
88.9k
1358
88.9k
        self.receipts.push(receipt)?;
1359
1360
88.9k
        Ok(inc_pc(self.pc)?)
1361
88.9k
    }
1362
}
1363
1364
struct StateReadQWordParams {
1365
    destination_pointer: Word,
1366
    origin_key_pointer: Word,
1367
    num_slots: Word,
1368
}
1369
1370
#[allow(clippy::too_many_arguments)]
1371
887
fn state_read_qword<S: InterpreterStorage>(
1372
887
    storage: &S,
1373
887
    context: &Context,
1374
887
    memory: &mut MemoryInstance,
1375
887
    pc: RegMut<PC>,
1376
887
    fp: Reg<FP>,
1377
887
    ownership_registers: OwnershipRegisters,
1378
887
    result_register: &mut Word,
1379
887
    params: StateReadQWordParams,
1380
887
) -> IoResult<(), S::DataError> {
1381
887
    let StateReadQWordParams {
1382
887
        destination_pointer,
1383
887
        origin_key_pointer,
1384
887
        num_slots,
1385
887
    } = params;
1386
1387
887
    let contract_id = internal_contract(context, fp, memory)?;
1388
884
    let num_slots = convert::to_usize(num_slots).ok_or(PanicReason::TooManySlots)?;
1389
884
    let slots_len = Bytes32::LEN.saturating_mul(num_slots);
1390
884
    let origin_key = Bytes32::new(memory.read_bytes(origin_key_pointer)?);
1391
883
    let dst = memory.write(ownership_registers, destination_pointer, slots_len)?;
1392
1393
880
    let mut all_set = true;
1394
880
    let result: Vec<u8> = storage
1395
880
        .contract_state_range(&contract_id, &origin_key, num_slots)
1396
880
        .map_err(RuntimeError::Storage)?
1397
880
        .into_iter()
1398
23.6k
        .flat_map(|bytes| match bytes {
1399
0
            Some(bytes) => bytes.into_owned(),
1400
            None => {
1401
23.6k
                all_set = false;
1402
23.6k
                ContractsStateData::from(Bytes32::zeroed().as_ref())
1403
            }
1404
23.6k
        })
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain16state_read_qwordINtNtNtB8_7storage9predicate16PredicateStorageRNtB1e_12EmptyStorageEE0B8_
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain16state_read_qwordINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1g_6memory13MemoryStorageEE0B8_
_RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain16state_read_qwordNtNtNtB8_7storage6memory13MemoryStorageE0B8_
Line
Count
Source
1398
23.6k
        .flat_map(|bytes| match bytes {
1399
0
            Some(bytes) => bytes.into_owned(),
1400
            None => {
1401
23.6k
                all_set = false;
1402
23.6k
                ContractsStateData::from(Bytes32::zeroed().as_ref())
1403
            }
1404
23.6k
        })
1405
880
        .collect();
1406
880
1407
880
    *result_register = all_set as Word;
1408
880
1409
880
    dst.copy_from_slice(&result);
1410
880
1411
880
    inc_pc(pc)?;
1412
1413
880
    Ok(())
1414
887
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain16state_read_qwordINtNtNtB6_7storage9predicate16PredicateStorageRNtB1c_12EmptyStorageEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain16state_read_qwordINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1e_6memory13MemoryStorageEEB6_
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain16state_read_qwordNtNtNtB6_7storage6memory13MemoryStorageEB6_
Line
Count
Source
1371
887
fn state_read_qword<S: InterpreterStorage>(
1372
887
    storage: &S,
1373
887
    context: &Context,
1374
887
    memory: &mut MemoryInstance,
1375
887
    pc: RegMut<PC>,
1376
887
    fp: Reg<FP>,
1377
887
    ownership_registers: OwnershipRegisters,
1378
887
    result_register: &mut Word,
1379
887
    params: StateReadQWordParams,
1380
887
) -> IoResult<(), S::DataError> {
1381
887
    let StateReadQWordParams {
1382
887
        destination_pointer,
1383
887
        origin_key_pointer,
1384
887
        num_slots,
1385
887
    } = params;
1386
1387
887
    let contract_id = internal_contract(context, fp, memory)?;
1388
884
    let num_slots = convert::to_usize(num_slots).ok_or(PanicReason::TooManySlots)?;
1389
884
    let slots_len = Bytes32::LEN.saturating_mul(num_slots);
1390
884
    let origin_key = Bytes32::new(memory.read_bytes(origin_key_pointer)?);
1391
883
    let dst = memory.write(ownership_registers, destination_pointer, slots_len)?;
1392
1393
880
    let mut all_set = true;
1394
880
    let result: Vec<u8> = storage
1395
880
        .contract_state_range(&contract_id, &origin_key, num_slots)
1396
880
        .map_err(RuntimeError::Storage)?
1397
880
        .into_iter()
1398
880
        .flat_map(|bytes| match bytes {
1399
            Some(bytes) => bytes.into_owned(),
1400
            None => {
1401
                all_set = false;
1402
                ContractsStateData::from(Bytes32::zeroed().as_ref())
1403
            }
1404
880
        })
1405
880
        .collect();
1406
880
1407
880
    *result_register = all_set as Word;
1408
880
1409
880
    dst.copy_from_slice(&result);
1410
880
1411
880
    inc_pc(pc)?;
1412
1413
880
    Ok(())
1414
887
}
1415
1416
struct StateWriteQWord {
1417
    /// The starting storage key location is stored in this range of memory.
1418
    starting_storage_key_pointer: Word,
1419
    /// The source data memory address is stored in this range of memory.
1420
    source_pointer: Word,
1421
    /// How many slots to write.
1422
    num_slots: Word,
1423
}
1424
1425
#[allow(clippy::too_many_arguments)]
1426
3.77k
fn state_write_qword<'vm, S: InterpreterStorage>(
1427
3.77k
    contract_id: &ContractId,
1428
3.77k
    storage: &mut S,
1429
3.77k
    memory: &MemoryInstance,
1430
3.77k
    profiler: &'vm mut Profiler,
1431
3.77k
    new_storage_gas_per_byte: Word,
1432
3.77k
    current_contract: Option<ContractId>,
1433
3.77k
    cgas: RegMut<'vm, CGAS>,
1434
3.77k
    ggas: RegMut<'vm, GGAS>,
1435
3.77k
    is: Reg<'vm, IS>,
1436
3.77k
    pc: RegMut<PC>,
1437
3.77k
    result_register: &mut Word,
1438
3.77k
    input: StateWriteQWord,
1439
3.77k
) -> IoResult<(), S::DataError> {
1440
3.76k
    let destination_key =
1441
3.77k
        Bytes32::new(memory.read_bytes(input.starting_storage_key_pointer)?);
1442
1443
3.76k
    let values = memory
1444
3.76k
        .read(
1445
3.76k
            input.source_pointer,
1446
3.76k
            (Bytes32::LEN as Word).saturating_mul(input.num_slots),
1447
3.76k
        )?
1448
3.76k
        .chunks_exact(Bytes32::LEN);
1449
1450
3.76k
    let unset_count = storage
1451
3.76k
        .contract_state_insert_range(contract_id, &destination_key, values)
1452
3.76k
        .map_err(RuntimeError::Storage)?;
1453
3.76k
    *result_register = unset_count as Word;
1454
3.76k
1455
3.76k
    if unset_count > 0 {
1456
        // New data was written, charge gas for it
1457
162
        let profiler = ProfileGas {
1458
162
            pc: pc.as_ref(),
1459
162
            is,
1460
162
            current_contract,
1461
162
            profiler,
1462
162
        };
1463
162
        gas_charge(
1464
162
            cgas,
1465
162
            ggas,
1466
162
            profiler,
1467
162
            (unset_count as u64)
1468
162
                .saturating_mul(2)
1469
162
                .saturating_mul(Bytes32::LEN as u64)
1470
162
                .saturating_mul(new_storage_gas_per_byte),
1471
162
        )?;
1472
3.60k
    }
1473
1474
3.76k
    inc_pc(pc)?;
1475
1476
3.76k
    Ok(())
1477
3.77k
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain17state_write_qwordINtNtNtB6_7storage9predicate16PredicateStorageRNtB1d_12EmptyStorageEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain17state_write_qwordINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1f_6memory13MemoryStorageEEB6_
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain17state_write_qwordNtNtNtB6_7storage6memory13MemoryStorageEB6_
Line
Count
Source
1426
3.77k
fn state_write_qword<'vm, S: InterpreterStorage>(
1427
3.77k
    contract_id: &ContractId,
1428
3.77k
    storage: &mut S,
1429
3.77k
    memory: &MemoryInstance,
1430
3.77k
    profiler: &'vm mut Profiler,
1431
3.77k
    new_storage_gas_per_byte: Word,
1432
3.77k
    current_contract: Option<ContractId>,
1433
3.77k
    cgas: RegMut<'vm, CGAS>,
1434
3.77k
    ggas: RegMut<'vm, GGAS>,
1435
3.77k
    is: Reg<'vm, IS>,
1436
3.77k
    pc: RegMut<PC>,
1437
3.77k
    result_register: &mut Word,
1438
3.77k
    input: StateWriteQWord,
1439
3.77k
) -> IoResult<(), S::DataError> {
1440
3.76k
    let destination_key =
1441
3.77k
        Bytes32::new(memory.read_bytes(input.starting_storage_key_pointer)?);
1442
1443
3.76k
    let values = memory
1444
3.76k
        .read(
1445
3.76k
            input.source_pointer,
1446
3.76k
            (Bytes32::LEN as Word).saturating_mul(input.num_slots),
1447
3.76k
        )?
1448
3.76k
        .chunks_exact(Bytes32::LEN);
1449
1450
3.76k
    let unset_count = storage
1451
3.76k
        .contract_state_insert_range(contract_id, &destination_key, values)
1452
3.76k
        .map_err(RuntimeError::Storage)?;
1453
3.76k
    *result_register = unset_count as Word;
1454
3.76k
1455
3.76k
    if unset_count > 0 {
1456
        // New data was written, charge gas for it
1457
162
        let profiler = ProfileGas {
1458
162
            pc: pc.as_ref(),
1459
162
            is,
1460
162
            current_contract,
1461
162
            profiler,
1462
162
        };
1463
162
        gas_charge(
1464
162
            cgas,
1465
162
            ggas,
1466
162
            profiler,
1467
162
            (unset_count as u64)
1468
162
                .saturating_mul(2)
1469
162
                .saturating_mul(Bytes32::LEN as u64)
1470
162
                .saturating_mul(new_storage_gas_per_byte),
1471
162
        )?;
1472
3.60k
    }
1473
1474
3.76k
    inc_pc(pc)?;
1475
1476
3.76k
    Ok(())
1477
3.77k
}
1478
1479
struct StateClearQWord {
1480
    /// The starting storage key location is stored in this address.
1481
    start_storage_key_pointer: Word,
1482
    /// Number of slots to read.
1483
    num_slots: usize,
1484
}
1485
1486
impl StateClearQWord {
1487
5.17k
    fn new(start_storage_key_pointer: Word, num_slots: Word) -> SimpleResult<Self> {
1488
5.17k
        let num_slots = convert::to_usize(num_slots).ok_or(PanicReason::TooManySlots)?;
1489
5.17k
        Ok(Self {
1490
5.17k
            start_storage_key_pointer,
1491
5.17k
            num_slots,
1492
5.17k
        })
1493
5.17k
    }
1494
}
1495
1496
5.17k
fn state_clear_qword<S: InterpreterStorage>(
1497
5.17k
    contract_id: &ContractId,
1498
5.17k
    storage: &mut S,
1499
5.17k
    memory: &MemoryInstance,
1500
5.17k
    pc: RegMut<PC>,
1501
5.17k
    result_register: &mut Word,
1502
5.17k
    input: StateClearQWord,
1503
5.17k
) -> IoResult<(), S::DataError> {
1504
5.17k
    let start_key = Bytes32::new(memory.read_bytes(input.start_storage_key_pointer)?);
1505
1506
5.17k
    let all_previously_set = storage
1507
5.17k
        .contract_state_remove_range(contract_id, &start_key, input.num_slots)
1508
5.17k
        .map_err(RuntimeError::Storage)?
1509
5.17k
        .is_some();
1510
5.17k
1511
5.17k
    *result_register = all_previously_set as Word;
1512
5.17k
1513
5.17k
    inc_pc(pc)?;
1514
1515
5.17k
    Ok(())
1516
5.17k
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain17state_clear_qwordINtNtNtB6_7storage9predicate16PredicateStorageRNtB1d_12EmptyStorageEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain17state_clear_qwordINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1f_6memory13MemoryStorageEEB6_
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter10blockchain17state_clear_qwordNtNtNtB6_7storage6memory13MemoryStorageEB6_
Line
Count
Source
1496
5.17k
fn state_clear_qword<S: InterpreterStorage>(
1497
5.17k
    contract_id: &ContractId,
1498
5.17k
    storage: &mut S,
1499
5.17k
    memory: &MemoryInstance,
1500
5.17k
    pc: RegMut<PC>,
1501
5.17k
    result_register: &mut Word,
1502
5.17k
    input: StateClearQWord,
1503
5.17k
) -> IoResult<(), S::DataError> {
1504
5.17k
    let start_key = Bytes32::new(memory.read_bytes(input.start_storage_key_pointer)?);
1505
1506
5.17k
    let all_previously_set = storage
1507
5.17k
        .contract_state_remove_range(contract_id, &start_key, input.num_slots)
1508
5.17k
        .map_err(RuntimeError::Storage)?
1509
5.17k
        .is_some();
1510
5.17k
1511
5.17k
    *result_register = all_previously_set as Word;
1512
5.17k
1513
5.17k
    inc_pc(pc)?;
1514
1515
5.17k
    Ok(())
1516
5.17k
}
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter/debug.rs
Line
Count
Source
1
use super::Interpreter;
2
use crate::prelude::*;
3
use fuel_asm::RegId;
4
5
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
6
where
7
    Tx: ExecutableTransaction,
8
{
9
    /// Get single-stepping mode
10
0
    pub const fn single_stepping(&self) -> bool {
11
0
        self.debugger.single_stepping()
12
0
    }
13
14
    /// Set single-stepping mode
15
0
    pub fn set_single_stepping(&mut self, single_stepping: bool) {
16
0
        self.debugger.set_single_stepping(single_stepping)
17
0
    }
18
19
    /// Clear all set breakpoints.
20
0
    pub fn clear_breakpoints(&mut self) {
21
0
        self.debugger.clear_breakpoints();
22
0
    }
23
24
    /// Set a new breakpoint for the provided location.
25
0
    pub fn set_breakpoint(&mut self, breakpoint: Breakpoint) {
26
0
        self.debugger.set_breakpoint(breakpoint)
27
0
    }
28
29
    /// Overwrite all breakpoints with a new set of breakpoints.
30
0
    pub fn overwrite_breakpoints(&mut self, breakpoints: &[Breakpoint]) {
31
0
        self.debugger.clear_breakpoints();
32
0
        for bp in breakpoints {
33
0
            self.debugger.set_breakpoint(*bp);
34
0
        }
35
0
    }
36
37
    /// Remove a previously set breakpoint.
38
0
    pub fn remove_breakpoint(&mut self, breakpoint: &Breakpoint) {
39
0
        self.debugger.remove_breakpoint(breakpoint)
40
0
    }
41
42
0
    pub(crate) fn eval_debugger_state(&mut self) -> DebugEval {
43
0
        let debugger = &mut self.debugger;
44
0
45
0
        let contract = self.frames.last().map(CallFrame::to);
46
0
        let pc = self.registers[RegId::PC].saturating_sub(self.registers[RegId::IS]);
47
0
48
0
        debugger.eval_state(contract, pc)
49
0
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter5debugINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2g_4blob8BlobBodyNtB3M_12BlobMetadataEE19eval_debugger_stateB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter5debugINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2g_6create10CreateBodyNtB3M_14CreateMetadataEE19eval_debugger_stateB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter5debugINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2g_6script10ScriptBodyNtB3M_14ScriptMetadataEE19eval_debugger_stateB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter5debugINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1C_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2K_4blob8BlobBodyNtB4g_12BlobMetadataEE19eval_debugger_stateB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter5debugINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1C_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2K_6create10CreateBodyNtB4g_14CreateMetadataEE19eval_debugger_stateB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter5debugINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1C_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2K_6script10ScriptBodyNtB4g_14ScriptMetadataEE19eval_debugger_stateB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter5debugINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1C_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2K_6upload10UploadBodyNtB4g_14UploadMetadataEE19eval_debugger_stateB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter5debugINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1C_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2K_7upgrade11UpgradeBodyNtB4g_15UpgradeMetadataEE19eval_debugger_stateB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter5debugINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1E_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6script10ScriptBodyNtB4q_14ScriptMetadataEE19eval_debugger_stateB6_
50
51
0
    pub(crate) fn debugger_set_last_state(&mut self, state: ProgramState) {
52
0
        self.debugger.set_last_state(state)
53
0
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter5debugINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2g_4blob8BlobBodyNtB3M_12BlobMetadataEE23debugger_set_last_stateB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter5debugINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2g_6create10CreateBodyNtB3M_14CreateMetadataEE23debugger_set_last_stateB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter5debugINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2g_6script10ScriptBodyNtB3M_14ScriptMetadataEE23debugger_set_last_stateB6_
54
55
0
    pub(crate) const fn debugger_last_state(&self) -> &Option<ProgramState> {
56
0
        self.debugger.last_state()
57
0
    }
58
}
59
60
#[cfg(test)]
61
mod tests {
62
    use alloc::{
63
        vec,
64
        vec::Vec,
65
    };
66
67
    use super::Interpreter;
68
    use crate::prelude::*;
69
    use fuel_asm::RegId;
70
71
    #[test]
72
    fn breakpoint_script() {
73
        use fuel_asm::op;
74
        use fuel_tx::ConsensusParameters;
75
76
        let mut vm = Interpreter::<_, _, _>::with_memory_storage();
77
78
        let gas_limit = 1_000_000;
79
        let gas_price = 0;
80
        let height = Default::default();
81
82
        let script = [
83
            op::addi(0x10, RegId::ZERO, 8),
84
            op::addi(0x11, RegId::ZERO, 16),
85
            op::addi(0x12, RegId::ZERO, 32),
86
            op::addi(0x13, RegId::ZERO, 64),
87
            op::addi(0x14, RegId::ZERO, 128),
88
            op::ret(0x10),
89
        ]
90
        .into_iter()
91
        .collect();
92
93
        let consensus_params = ConsensusParameters::standard();
94
95
        let tx = TransactionBuilder::script(script, vec![])
96
            .script_gas_limit(gas_limit)
97
            .add_fee_input()
98
            .finalize()
99
            .into_checked(height, &consensus_params)
100
            .expect("failed to generate checked tx")
101
            .into_ready(
102
                gas_price,
103
                consensus_params.gas_costs(),
104
                consensus_params.fee_params(),
105
            )
106
            .unwrap();
107
108
        let suite = vec![
109
            (
110
                Breakpoint::script(0),
111
                vec![(0x10, 0), (0x11, 0), (0x12, 0), (0x13, 0), (0x14, 0)],
112
            ),
113
            (
114
                Breakpoint::script(2),
115
                vec![(0x10, 8), (0x11, 16), (0x12, 0), (0x13, 0), (0x14, 0)],
116
            ),
117
            (
118
                Breakpoint::script(3),
119
                vec![(0x10, 8), (0x11, 16), (0x12, 32), (0x13, 0), (0x14, 0)],
120
            ),
121
            (
122
                Breakpoint::script(5),
123
                vec![(0x10, 8), (0x11, 16), (0x12, 32), (0x13, 64), (0x14, 128)],
124
            ),
125
        ];
126
127
        suite.iter().for_each(|(b, _)| vm.set_breakpoint(*b));
128
129
        let state = vm
130
            .transact(tx)
131
            .map(ProgramState::from)
132
            .expect("Failed to execute script!");
133
134
        suite
135
            .into_iter()
136
            .fold(state, |state, (breakpoint, registers)| {
137
                let debug = state.debug_ref().expect("Expected breakpoint");
138
                let b = debug
139
                    .breakpoint()
140
                    .expect("State without expected breakpoint");
141
142
                assert_eq!(&breakpoint, b);
143
                registers.into_iter().for_each(|(r, w)| {
144
                    assert_eq!(w, vm.registers()[r]);
145
                });
146
147
                vm.resume().expect("Failed to resume")
148
            });
149
    }
150
151
    #[test]
152
    fn single_stepping() {
153
        use fuel_asm::op;
154
        use fuel_tx::ConsensusParameters;
155
156
        let mut vm = Interpreter::<_, _, _>::with_memory_storage();
157
158
        let gas_limit = 1_000_000;
159
        let height = Default::default();
160
        let gas_price = 0;
161
162
        // Repeats the middle two instructions five times
163
        let script = [
164
            op::addi(0x10, RegId::ZERO, 5),
165
            op::addi(0x11, 0x11, 1),
166
            op::jnei(0x10, 0x11, 1),
167
            op::ret(0x10),
168
        ]
169
        .into_iter()
170
        .collect();
171
172
        let consensus_params = ConsensusParameters::standard();
173
174
        let tx = TransactionBuilder::script(script, vec![])
175
            .script_gas_limit(gas_limit)
176
            .add_fee_input()
177
            .finalize()
178
            .into_checked(height, &consensus_params)
179
            .expect("failed to generate checked tx")
180
            .into_ready(
181
                gas_price,
182
                consensus_params.gas_costs(),
183
                consensus_params.fee_params(),
184
            )
185
            .unwrap();
186
187
        vm.set_single_stepping(true);
188
189
        let mut state = vm
190
            .transact(tx)
191
            .map(ProgramState::from)
192
            .expect("Failed to execute script!");
193
194
        let mut stops = Vec::new();
195
196
        while let Some(debug) = state.debug_ref() {
197
            let b = debug
198
                .breakpoint()
199
                .expect("State without expected breakpoint");
200
201
            stops.push(b.pc());
202
203
            state = vm.resume().expect("Failed to resume");
204
        }
205
206
        assert_eq!(stops, vec![0, 4, 8, 4, 8, 4, 8, 4, 8, 4, 8, 12]);
207
    }
208
209
    #[test]
210
    fn resume_without_debug() {
211
        use fuel_asm::op;
212
        use fuel_tx::ConsensusParameters;
213
214
        let mut vm = Interpreter::<_, _, _>::with_memory_storage();
215
        vm.resume()
216
            .expect_err("Expected error when resuming without debug");
217
218
        let gas_limit = 1_000_000;
219
        let height = Default::default();
220
        let gas_price = 0;
221
222
        // Just returns
223
        let script: Vec<u8> = [op::ret(0x10)].into_iter().collect();
224
225
        let consensus_params = ConsensusParameters::standard();
226
227
        let tx = TransactionBuilder::script(script, vec![])
228
            .script_gas_limit(gas_limit)
229
            .add_fee_input()
230
            .finalize()
231
            .into_checked(height, &consensus_params)
232
            .expect("failed to generate checked tx")
233
            .into_ready(
234
                gas_price,
235
                consensus_params.gas_costs(),
236
                consensus_params.fee_params(),
237
            )
238
            .unwrap();
239
240
        let _ = vm
241
            .transact(tx)
242
            .map(ProgramState::from)
243
            .expect("Failed to execute script!");
244
245
        vm.resume()
246
            .expect_err("Expected error when resuming without debug");
247
    }
248
}
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter/gas.rs
Line
Count
Source
1
use super::Interpreter;
2
use crate::{
3
    constraints::reg_key::*,
4
    error::SimpleResult,
5
    prelude::{
6
        Bug,
7
        BugVariant,
8
    },
9
    profiler::Profiler,
10
};
11
12
use fuel_asm::{
13
    PanicReason,
14
    RegId,
15
};
16
use fuel_tx::DependentCost;
17
use fuel_types::{
18
    ContractId,
19
    Word,
20
};
21
22
#[cfg(test)]
23
mod tests;
24
25
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal> {
26
    /// Global remaining gas amount
27
2.19k
    pub fn remaining_gas(&self) -> Word {
28
2.19k
        self.registers[RegId::GGAS]
29
2.19k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_4blob8BlobBodyNtB4e_12BlobMetadataEE13remaining_gasB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6create10CreateBodyNtB4e_14CreateMetadataEE13remaining_gasB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1C_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6script10ScriptBodyNtB4o_14ScriptMetadataEE13remaining_gasB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6script10ScriptBodyNtB4e_14ScriptMetadataEE13remaining_gasB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6upload10UploadBodyNtB4e_14UploadMetadataEE13remaining_gasB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_7upgrade11UpgradeBodyNtB4e_15UpgradeMetadataEE13remaining_gasB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_4blob8BlobBodyNtB3K_12BlobMetadataEE13remaining_gasB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_6create10CreateBodyNtB3K_14CreateMetadataEE13remaining_gasB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_6script10ScriptBodyNtB3K_14ScriptMetadataEE13remaining_gasB6_
Line
Count
Source
27
2.19k
    pub fn remaining_gas(&self) -> Word {
28
2.19k
        self.registers[RegId::GGAS]
29
2.19k
    }
30
31
    /// Sets the amount of gas available for execution to both CGAS and GGAS.
32
    /// Only useful in contexts where CGAS and GGAS are the same,
33
    /// i.e. predicates and testing.
34
4.38k
    pub(crate) fn set_gas(&mut self, gas: Word) {
35
4.38k
        self.registers[RegId::GGAS] = gas;
36
4.38k
        self.registers[RegId::CGAS] = gas;
37
4.38k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_4blob8BlobBodyNtB3K_12BlobMetadataEE7set_gasB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_6create10CreateBodyNtB3K_14CreateMetadataEE7set_gasB6_
Line
Count
Source
34
2.19k
    pub(crate) fn set_gas(&mut self, gas: Word) {
35
2.19k
        self.registers[RegId::GGAS] = gas;
36
2.19k
        self.registers[RegId::CGAS] = gas;
37
2.19k
    }
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_6script10ScriptBodyNtB3K_14ScriptMetadataEE7set_gasB6_
Line
Count
Source
34
2.19k
    pub(crate) fn set_gas(&mut self, gas: Word) {
35
2.19k
        self.registers[RegId::GGAS] = gas;
36
2.19k
        self.registers[RegId::CGAS] = gas;
37
2.19k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_4blob8BlobBodyNtB4e_12BlobMetadataEE7set_gasB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6create10CreateBodyNtB4e_14CreateMetadataEE7set_gasB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6script10ScriptBodyNtB4e_14ScriptMetadataEE7set_gasB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6upload10UploadBodyNtB4e_14UploadMetadataEE7set_gasB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_7upgrade11UpgradeBodyNtB4e_15UpgradeMetadataEE7set_gasB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1C_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6script10ScriptBodyNtB4o_14ScriptMetadataEE7set_gasB6_
38
39
25.9M
    pub(crate) fn dependent_gas_charge(
40
25.9M
        &mut self,
41
25.9M
        gas_cost: DependentCost,
42
25.9M
        arg: Word,
43
25.9M
    ) -> SimpleResult<()> {
44
25.9M
        let current_contract = self.contract_id();
45
25.9M
        let SystemRegisters {
46
25.9M
            pc, ggas, cgas, is, ..
47
25.9M
        } = split_registers(&mut self.registers).0;
48
25.9M
        let profiler = ProfileGas {
49
25.9M
            pc: pc.as_ref(),
50
25.9M
            is: is.as_ref(),
51
25.9M
            current_contract,
52
25.9M
            profiler: &mut self.profiler,
53
25.9M
        };
54
25.9M
        dependent_gas_charge(cgas, ggas, profiler, gas_cost, arg)
55
25.9M
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_4blob8BlobBodyNtB3K_12BlobMetadataEE20dependent_gas_chargeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_6create10CreateBodyNtB3K_14CreateMetadataEE20dependent_gas_chargeB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_6script10ScriptBodyNtB3K_14ScriptMetadataEE20dependent_gas_chargeB6_
Line
Count
Source
39
25.9M
    pub(crate) fn dependent_gas_charge(
40
25.9M
        &mut self,
41
25.9M
        gas_cost: DependentCost,
42
25.9M
        arg: Word,
43
25.9M
    ) -> SimpleResult<()> {
44
25.9M
        let current_contract = self.contract_id();
45
25.9M
        let SystemRegisters {
46
25.9M
            pc, ggas, cgas, is, ..
47
25.9M
        } = split_registers(&mut self.registers).0;
48
25.9M
        let profiler = ProfileGas {
49
25.9M
            pc: pc.as_ref(),
50
25.9M
            is: is.as_ref(),
51
25.9M
            current_contract,
52
25.9M
            profiler: &mut self.profiler,
53
25.9M
        };
54
25.9M
        dependent_gas_charge(cgas, ggas, profiler, gas_cost, arg)
55
25.9M
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_4blob8BlobBodyNtB4e_12BlobMetadataEE20dependent_gas_chargeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6create10CreateBodyNtB4e_14CreateMetadataEE20dependent_gas_chargeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6script10ScriptBodyNtB4e_14ScriptMetadataEE20dependent_gas_chargeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6upload10UploadBodyNtB4e_14UploadMetadataEE20dependent_gas_chargeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_7upgrade11UpgradeBodyNtB4e_15UpgradeMetadataEE20dependent_gas_chargeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1C_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6script10ScriptBodyNtB4o_14ScriptMetadataEE20dependent_gas_chargeB6_
56
57
0
    pub(crate) fn dependent_gas_charge_without_base(
58
0
        &mut self,
59
0
        gas_cost: DependentCost,
60
0
        arg: Word,
61
0
    ) -> SimpleResult<()> {
62
0
        let current_contract = self.contract_id();
63
0
        let SystemRegisters {
64
0
            pc, ggas, cgas, is, ..
65
0
        } = split_registers(&mut self.registers).0;
66
0
        let profiler = ProfileGas {
67
0
            pc: pc.as_ref(),
68
0
            is: is.as_ref(),
69
0
            current_contract,
70
0
            profiler: &mut self.profiler,
71
0
        };
72
0
        dependent_gas_charge_without_base(cgas, ggas, profiler, gas_cost, arg)
73
0
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_4blob8BlobBodyNtB3K_12BlobMetadataEE33dependent_gas_charge_without_baseB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_6create10CreateBodyNtB3K_14CreateMetadataEE33dependent_gas_charge_without_baseB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_6script10ScriptBodyNtB3K_14ScriptMetadataEE33dependent_gas_charge_without_baseB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_4blob8BlobBodyNtB4e_12BlobMetadataEE33dependent_gas_charge_without_baseB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6create10CreateBodyNtB4e_14CreateMetadataEE33dependent_gas_charge_without_baseB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6script10ScriptBodyNtB4e_14ScriptMetadataEE33dependent_gas_charge_without_baseB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6upload10UploadBodyNtB4e_14UploadMetadataEE33dependent_gas_charge_without_baseB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_7upgrade11UpgradeBodyNtB4e_15UpgradeMetadataEE33dependent_gas_charge_without_baseB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1C_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6script10ScriptBodyNtB4o_14ScriptMetadataEE33dependent_gas_charge_without_baseB6_
74
75
    /// Do a gas charge with the given amount, panicing when running out of gas.
76
361M
    pub fn gas_charge(&mut self, gas: Word) -> SimpleResult<()> {
77
361M
        let current_contract = self.contract_id();
78
361M
        let SystemRegisters {
79
361M
            pc, ggas, cgas, is, ..
80
361M
        } = split_registers(&mut self.registers).0;
81
361M
82
361M
        let profiler = ProfileGas {
83
361M
            pc: pc.as_ref(),
84
361M
            is: is.as_ref(),
85
361M
            current_contract,
86
361M
            profiler: &mut self.profiler,
87
361M
        };
88
361M
        gas_charge(cgas, ggas, profiler, gas)
89
361M
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_4blob8BlobBodyNtB3K_12BlobMetadataEE10gas_chargeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_6create10CreateBodyNtB3K_14CreateMetadataEE10gas_chargeB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_6script10ScriptBodyNtB3K_14ScriptMetadataEE10gas_chargeB6_
Line
Count
Source
76
361M
    pub fn gas_charge(&mut self, gas: Word) -> SimpleResult<()> {
77
361M
        let current_contract = self.contract_id();
78
361M
        let SystemRegisters {
79
361M
            pc, ggas, cgas, is, ..
80
361M
        } = split_registers(&mut self.registers).0;
81
361M
82
361M
        let profiler = ProfileGas {
83
361M
            pc: pc.as_ref(),
84
361M
            is: is.as_ref(),
85
361M
            current_contract,
86
361M
            profiler: &mut self.profiler,
87
361M
        };
88
361M
        gas_charge(cgas, ggas, profiler, gas)
89
361M
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_4blob8BlobBodyNtB4e_12BlobMetadataEE10gas_chargeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6create10CreateBodyNtB4e_14CreateMetadataEE10gas_chargeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6script10ScriptBodyNtB4e_14ScriptMetadataEE10gas_chargeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6upload10UploadBodyNtB4e_14UploadMetadataEE10gas_chargeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_7upgrade11UpgradeBodyNtB4e_15UpgradeMetadataEE10gas_chargeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3gasINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1C_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6script10ScriptBodyNtB4o_14ScriptMetadataEE10gas_chargeB6_
90
}
91
92
442k
pub(crate) fn dependent_gas_charge_without_base(
93
442k
    mut cgas: RegMut<CGAS>,
94
442k
    ggas: RegMut<GGAS>,
95
442k
    mut profiler: ProfileGas<'_>,
96
442k
    gas_cost: DependentCost,
97
442k
    arg: Word,
98
442k
) -> SimpleResult<()> {
99
442k
    let cost = gas_cost.resolve_without_base(arg);
100
442k
    profiler.profile(cgas.as_ref(), cost);
101
442k
    gas_charge_inner(cgas.as_mut(), ggas, cost)
102
442k
}
103
104
25.9M
pub(crate) fn dependent_gas_charge(
105
25.9M
    mut cgas: RegMut<CGAS>,
106
25.9M
    ggas: RegMut<GGAS>,
107
25.9M
    mut profiler: ProfileGas<'_>,
108
25.9M
    gas_cost: DependentCost,
109
25.9M
    arg: Word,
110
25.9M
) -> SimpleResult<()> {
111
25.9M
    let cost = gas_cost.resolve(arg);
112
25.9M
    profiler.profile(cgas.as_ref(), cost);
113
25.9M
    gas_charge_inner(cgas.as_mut(), ggas, cost)
114
25.9M
}
115
116
361M
pub(crate) fn gas_charge(
117
361M
    cgas: RegMut<CGAS>,
118
361M
    ggas: RegMut<GGAS>,
119
361M
    mut profiler: ProfileGas<'_>,
120
361M
    gas: Word,
121
361M
) -> SimpleResult<()> {
122
361M
    profiler.profile(cgas.as_ref(), gas);
123
361M
    gas_charge_inner(cgas, ggas, gas)
124
361M
}
125
126
388M
fn gas_charge_inner(
127
388M
    mut cgas: RegMut<CGAS>,
128
388M
    mut ggas: RegMut<GGAS>,
129
388M
    gas: Word,
130
388M
) -> SimpleResult<()> {
131
388M
    if *cgas > *ggas {
132
0
        Err(Bug::new(BugVariant::GlobalGasLessThanContext).into())
133
388M
    } else if gas > *cgas {
134
625
        *ggas = (*ggas)
135
625
            .checked_sub(*cgas)
136
625
            .ok_or_else(|| Bug::new(BugVariant::GlobalGasUnderflow))?;
137
625
        *cgas = 0;
138
625
139
625
        Err(PanicReason::OutOfGas.into())
140
    } else {
141
388M
        *cgas = (*cgas)
142
388M
            .checked_sub(gas)
143
388M
            .ok_or_else(|| Bug::new(BugVariant::ContextGasUnderflow))?;
144
388M
        *ggas = (*ggas)
145
388M
            .checked_sub(gas)
146
388M
            .ok_or_else(|| Bug::new(BugVariant::GlobalGasUnderflow))?;
147
148
388M
        Ok(())
149
    }
150
388M
}
151
152
#[allow(dead_code)]
153
pub(crate) struct ProfileGas<'a> {
154
    pub pc: Reg<'a, PC>,
155
    pub is: Reg<'a, IS>,
156
    pub current_contract: Option<ContractId>,
157
    pub profiler: &'a mut Profiler,
158
}
159
160
impl<'a> ProfileGas<'a> {
161
    #[allow(unused_variables)]
162
388M
    pub(crate) fn profile(&mut self, cgas: Reg<CGAS>, gas: Word) {
163
388M
        #[cfg(feature = "profile-coverage")]
164
388M
        {
165
388M
            let location =
166
388M
                super::current_location(self.current_contract, self.pc, self.is);
167
388M
            self.profiler.set_coverage(location);
168
388M
        }
169
388M
170
388M
        #[cfg(feature = "profile-gas")]
171
388M
        {
172
388M
            let gas_use = gas.min(*cgas);
173
388M
            let location =
174
388M
                super::current_location(self.current_contract, self.pc, self.is);
175
388M
            self.profiler.add_gas(location, gas_use);
176
388M
        }
177
388M
    }
178
}
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter/contract.rs
Line
Count
Source
1
//! This module contains logic on contract management.
2
3
use super::{
4
    gas::{
5
        gas_charge,
6
        ProfileGas,
7
    },
8
    internal::{
9
        external_asset_id_balance_sub,
10
        inc_pc,
11
        internal_contract,
12
        set_variable_output,
13
    },
14
    ExecutableTransaction,
15
    Interpreter,
16
    Memory,
17
    MemoryInstance,
18
    RuntimeBalances,
19
};
20
use crate::{
21
    constraints::reg_key::*,
22
    consts::*,
23
    context::Context,
24
    convert,
25
    error::{
26
        IoResult,
27
        RuntimeError,
28
    },
29
    interpreter::{
30
        receipts::ReceiptsCtx,
31
        InputContracts,
32
    },
33
    prelude::Profiler,
34
    storage::{
35
        ContractsAssetsStorage,
36
        ContractsRawCode,
37
        InterpreterStorage,
38
    },
39
};
40
use fuel_asm::{
41
    PanicReason,
42
    RegisterId,
43
    Word,
44
};
45
use fuel_storage::StorageSize;
46
use fuel_tx::{
47
    Contract,
48
    Output,
49
    Receipt,
50
};
51
use fuel_types::{
52
    Address,
53
    AssetId,
54
    Bytes32,
55
    ContractId,
56
};
57
58
use alloc::borrow::Cow;
59
60
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
61
where
62
    M: Memory,
63
    S: InterpreterStorage,
64
    Tx: ExecutableTransaction,
65
{
66
7
    pub(crate) fn contract_balance(
67
7
        &mut self,
68
7
        ra: RegisterId,
69
7
        b: Word,
70
7
        c: Word,
71
7
    ) -> Result<(), RuntimeError<S::DataError>> {
72
7
        let (SystemRegisters { pc, .. }, mut w) = split_registers(&mut self.registers);
73
7
        let result = &mut w[WriteRegKey::try_from(ra)?];
74
5
        let input = ContractBalanceCtx {
75
5
            storage: &self.storage,
76
5
            memory: self.memory.as_mut(),
77
5
            pc,
78
5
            input_contracts: InputContracts::new(
79
5
                &self.input_contracts,
80
5
                &mut self.panic_context,
81
5
            ),
82
5
        };
83
5
        input.contract_balance(result, b, c)?;
84
0
        Ok(())
85
7
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2j_4blob8BlobBodyNtB3P_12BlobMetadataEE16contract_balanceB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2j_6create10CreateBodyNtB3P_14CreateMetadataEE16contract_balanceB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2j_6script10ScriptBodyNtB3P_14ScriptMetadataEE16contract_balanceB6_
Line
Count
Source
66
7
    pub(crate) fn contract_balance(
67
7
        &mut self,
68
7
        ra: RegisterId,
69
7
        b: Word,
70
7
        c: Word,
71
7
    ) -> Result<(), RuntimeError<S::DataError>> {
72
7
        let (SystemRegisters { pc, .. }, mut w) = split_registers(&mut self.registers);
73
7
        let result = &mut w[WriteRegKey::try_from(ra)?];
74
5
        let input = ContractBalanceCtx {
75
5
            storage: &self.storage,
76
5
            memory: self.memory.as_mut(),
77
5
            pc,
78
5
            input_contracts: InputContracts::new(
79
5
                &self.input_contracts,
80
5
                &mut self.panic_context,
81
5
            ),
82
5
        };
83
5
        input.contract_balance(result, b, c)?;
84
0
        Ok(())
85
7
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1F_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2N_4blob8BlobBodyNtB4j_12BlobMetadataEE16contract_balanceB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1F_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2N_6create10CreateBodyNtB4j_14CreateMetadataEE16contract_balanceB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1F_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2N_6script10ScriptBodyNtB4j_14ScriptMetadataEE16contract_balanceB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1F_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2N_6upload10UploadBodyNtB4j_14UploadMetadataEE16contract_balanceB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1F_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2N_7upgrade11UpgradeBodyNtB4j_15UpgradeMetadataEE16contract_balanceB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1H_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2X_6script10ScriptBodyNtB4t_14ScriptMetadataEE16contract_balanceB6_
86
87
8
    pub(crate) fn transfer(
88
8
        &mut self,
89
8
        a: Word,
90
8
        b: Word,
91
8
        c: Word,
92
8
    ) -> IoResult<(), S::DataError> {
93
8
        let new_storage_gas_per_byte = self.gas_costs().new_storage_per_byte();
94
8
        let tx_offset = self.tx_offset();
95
8
        let (
96
8
            SystemRegisters {
97
8
                cgas,
98
8
                ggas,
99
8
                fp,
100
8
                is,
101
8
                pc,
102
8
                ..
103
8
            },
104
8
            _,
105
8
        ) = split_registers(&mut self.registers);
106
8
        let input = TransferCtx {
107
8
            storage: &mut self.storage,
108
8
            memory: self.memory.as_mut(),
109
8
            context: &self.context,
110
8
            balances: &mut self.balances,
111
8
            receipts: &mut self.receipts,
112
8
            profiler: &mut self.profiler,
113
8
            new_storage_gas_per_byte,
114
8
            tx: &mut self.tx,
115
8
            input_contracts: InputContracts::new(
116
8
                &self.input_contracts,
117
8
                &mut self.panic_context,
118
8
            ),
119
8
            tx_offset,
120
8
            cgas,
121
8
            ggas,
122
8
            fp: fp.as_ref(),
123
8
            is: is.as_ref(),
124
8
            pc,
125
8
        };
126
8
        input.transfer(a, b, c)
127
8
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2j_4blob8BlobBodyNtB3P_12BlobMetadataEE8transferB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2j_6create10CreateBodyNtB3P_14CreateMetadataEE8transferB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2j_6script10ScriptBodyNtB3P_14ScriptMetadataEE8transferB6_
Line
Count
Source
87
8
    pub(crate) fn transfer(
88
8
        &mut self,
89
8
        a: Word,
90
8
        b: Word,
91
8
        c: Word,
92
8
    ) -> IoResult<(), S::DataError> {
93
8
        let new_storage_gas_per_byte = self.gas_costs().new_storage_per_byte();
94
8
        let tx_offset = self.tx_offset();
95
8
        let (
96
8
            SystemRegisters {
97
8
                cgas,
98
8
                ggas,
99
8
                fp,
100
8
                is,
101
8
                pc,
102
8
                ..
103
8
            },
104
8
            _,
105
8
        ) = split_registers(&mut self.registers);
106
8
        let input = TransferCtx {
107
8
            storage: &mut self.storage,
108
8
            memory: self.memory.as_mut(),
109
8
            context: &self.context,
110
8
            balances: &mut self.balances,
111
8
            receipts: &mut self.receipts,
112
8
            profiler: &mut self.profiler,
113
8
            new_storage_gas_per_byte,
114
8
            tx: &mut self.tx,
115
8
            input_contracts: InputContracts::new(
116
8
                &self.input_contracts,
117
8
                &mut self.panic_context,
118
8
            ),
119
8
            tx_offset,
120
8
            cgas,
121
8
            ggas,
122
8
            fp: fp.as_ref(),
123
8
            is: is.as_ref(),
124
8
            pc,
125
8
        };
126
8
        input.transfer(a, b, c)
127
8
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1F_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2N_4blob8BlobBodyNtB4j_12BlobMetadataEE8transferB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1F_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2N_6create10CreateBodyNtB4j_14CreateMetadataEE8transferB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1F_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2N_6script10ScriptBodyNtB4j_14ScriptMetadataEE8transferB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1F_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2N_6upload10UploadBodyNtB4j_14UploadMetadataEE8transferB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1F_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2N_7upgrade11UpgradeBodyNtB4j_15UpgradeMetadataEE8transferB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1H_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2X_6script10ScriptBodyNtB4t_14ScriptMetadataEE8transferB6_
128
129
13
    pub(crate) fn transfer_output(
130
13
        &mut self,
131
13
        a: Word,
132
13
        b: Word,
133
13
        c: Word,
134
13
        d: Word,
135
13
    ) -> IoResult<(), S::DataError> {
136
13
        let tx_offset = self.tx_offset();
137
13
        let new_storage_gas_per_byte = self.gas_costs().new_storage_per_byte();
138
13
        let (
139
13
            SystemRegisters {
140
13
                cgas,
141
13
                ggas,
142
13
                fp,
143
13
                is,
144
13
                pc,
145
13
                ..
146
13
            },
147
13
            _,
148
13
        ) = split_registers(&mut self.registers);
149
13
        let input = TransferCtx {
150
13
            storage: &mut self.storage,
151
13
            memory: self.memory.as_mut(),
152
13
            context: &self.context,
153
13
            balances: &mut self.balances,
154
13
            receipts: &mut self.receipts,
155
13
            profiler: &mut self.profiler,
156
13
            new_storage_gas_per_byte,
157
13
            tx: &mut self.tx,
158
13
            input_contracts: InputContracts::new(
159
13
                &self.input_contracts,
160
13
                &mut self.panic_context,
161
13
            ),
162
13
            tx_offset,
163
13
            cgas,
164
13
            ggas,
165
13
            fp: fp.as_ref(),
166
13
            is: is.as_ref(),
167
13
            pc,
168
13
        };
169
13
        input.transfer_output(a, b, c, d)
170
13
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2j_4blob8BlobBodyNtB3P_12BlobMetadataEE15transfer_outputB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2j_6create10CreateBodyNtB3P_14CreateMetadataEE15transfer_outputB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2j_6script10ScriptBodyNtB3P_14ScriptMetadataEE15transfer_outputB6_
Line
Count
Source
129
13
    pub(crate) fn transfer_output(
130
13
        &mut self,
131
13
        a: Word,
132
13
        b: Word,
133
13
        c: Word,
134
13
        d: Word,
135
13
    ) -> IoResult<(), S::DataError> {
136
13
        let tx_offset = self.tx_offset();
137
13
        let new_storage_gas_per_byte = self.gas_costs().new_storage_per_byte();
138
13
        let (
139
13
            SystemRegisters {
140
13
                cgas,
141
13
                ggas,
142
13
                fp,
143
13
                is,
144
13
                pc,
145
13
                ..
146
13
            },
147
13
            _,
148
13
        ) = split_registers(&mut self.registers);
149
13
        let input = TransferCtx {
150
13
            storage: &mut self.storage,
151
13
            memory: self.memory.as_mut(),
152
13
            context: &self.context,
153
13
            balances: &mut self.balances,
154
13
            receipts: &mut self.receipts,
155
13
            profiler: &mut self.profiler,
156
13
            new_storage_gas_per_byte,
157
13
            tx: &mut self.tx,
158
13
            input_contracts: InputContracts::new(
159
13
                &self.input_contracts,
160
13
                &mut self.panic_context,
161
13
            ),
162
13
            tx_offset,
163
13
            cgas,
164
13
            ggas,
165
13
            fp: fp.as_ref(),
166
13
            is: is.as_ref(),
167
13
            pc,
168
13
        };
169
13
        input.transfer_output(a, b, c, d)
170
13
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1F_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2N_4blob8BlobBodyNtB4j_12BlobMetadataEE15transfer_outputB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1F_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2N_6create10CreateBodyNtB4j_14CreateMetadataEE15transfer_outputB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1F_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2N_6script10ScriptBodyNtB4j_14ScriptMetadataEE15transfer_outputB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1F_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2N_6upload10UploadBodyNtB4j_14UploadMetadataEE15transfer_outputB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1F_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2N_7upgrade11UpgradeBodyNtB4j_15UpgradeMetadataEE15transfer_outputB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1H_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2X_6script10ScriptBodyNtB4t_14ScriptMetadataEE15transfer_outputB6_
171
172
2.19k
    pub(crate) fn check_contract_exists(
173
2.19k
        &self,
174
2.19k
        contract: &ContractId,
175
2.19k
    ) -> IoResult<bool, S::DataError> {
176
2.19k
        self.storage
177
2.19k
            .storage_contract_exists(contract)
178
2.19k
            .map_err(RuntimeError::Storage)
179
2.19k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2j_4blob8BlobBodyNtB3P_12BlobMetadataEE21check_contract_existsB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2j_6create10CreateBodyNtB3P_14CreateMetadataEE21check_contract_existsB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2j_6script10ScriptBodyNtB3P_14ScriptMetadataEE21check_contract_existsB6_
Line
Count
Source
172
2.19k
    pub(crate) fn check_contract_exists(
173
2.19k
        &self,
174
2.19k
        contract: &ContractId,
175
2.19k
    ) -> IoResult<bool, S::DataError> {
176
2.19k
        self.storage
177
2.19k
            .storage_contract_exists(contract)
178
2.19k
            .map_err(RuntimeError::Storage)
179
2.19k
    }
180
}
181
182
368k
pub(crate) fn contract<'s, S>(
183
368k
    storage: &'s S,
184
368k
    contract: &ContractId,
185
368k
) -> IoResult<Cow<'s, Contract>, S::DataError>
186
368k
where
187
368k
    S: InterpreterStorage,
188
368k
{
189
368k
    storage
190
368k
        .storage_contract(contract)
191
368k
        .map_err(RuntimeError::Storage)?
192
368k
        .ok_or_else(|| PanicReason::ContractNotFound.into())
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract8contractINtNtNtB8_7storage9predicate16PredicateStorageRNtB12_12EmptyStorageEE0B8_
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract8contractINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB14_6memory13MemoryStorageEE0B8_
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract8contractNtNtNtB8_7storage6memory13MemoryStorageE0B8_
193
368k
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract8contractINtNtNtB6_7storage9predicate16PredicateStorageRNtB10_12EmptyStorageEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract8contractINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB12_6memory13MemoryStorageEEB6_
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract8contractNtNtNtB6_7storage6memory13MemoryStorageEB6_
Line
Count
Source
182
368k
pub(crate) fn contract<'s, S>(
183
368k
    storage: &'s S,
184
368k
    contract: &ContractId,
185
368k
) -> IoResult<Cow<'s, Contract>, S::DataError>
186
368k
where
187
368k
    S: InterpreterStorage,
188
368k
{
189
368k
    storage
190
368k
        .storage_contract(contract)
191
368k
        .map_err(RuntimeError::Storage)?
192
368k
        .ok_or_else(|| PanicReason::ContractNotFound.into())
193
368k
}
194
195
struct ContractBalanceCtx<'vm, S> {
196
    storage: &'vm S,
197
    memory: &'vm mut MemoryInstance,
198
    pc: RegMut<'vm, PC>,
199
    input_contracts: InputContracts<'vm>,
200
}
201
202
impl<'vm, S> ContractBalanceCtx<'vm, S> {
203
5
    pub(crate) fn contract_balance(
204
5
        mut self,
205
5
        result: &mut Word,
206
5
        b: Word,
207
5
        c: Word,
208
5
    ) -> IoResult<(), S::Error>
209
5
    where
210
5
        S: ContractsAssetsStorage,
211
5
    {
212
5
        let asset_id = AssetId::new(self.memory.read_bytes(b)?);
213
4
        let contract = ContractId::new(self.memory.read_bytes(c)?);
214
215
2
        self.input_contracts.check(&contract)?;
216
217
0
        let balance = balance(self.storage, &contract, &asset_id)?;
218
219
0
        *result = balance;
220
0
221
0
        Ok(inc_pc(self.pc)?)
222
5
    }
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_18ContractBalanceCtxINtNtNtB8_7storage9predicate16PredicateStorageRNtB1j_12EmptyStorageEE16contract_balanceB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_18ContractBalanceCtxINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1l_6memory13MemoryStorageEE16contract_balanceB8_
_RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB4_18ContractBalanceCtxNtNtNtB8_7storage6memory13MemoryStorageE16contract_balanceB8_
Line
Count
Source
203
5
    pub(crate) fn contract_balance(
204
5
        mut self,
205
5
        result: &mut Word,
206
5
        b: Word,
207
5
        c: Word,
208
5
    ) -> IoResult<(), S::Error>
209
5
    where
210
5
        S: ContractsAssetsStorage,
211
5
    {
212
5
        let asset_id = AssetId::new(self.memory.read_bytes(b)?);
213
4
        let contract = ContractId::new(self.memory.read_bytes(c)?);
214
215
2
        self.input_contracts.check(&contract)?;
216
217
0
        let balance = balance(self.storage, &contract, &asset_id)?;
218
219
0
        *result = balance;
220
0
221
0
        Ok(inc_pc(self.pc)?)
222
5
    }
223
}
224
struct TransferCtx<'vm, S, Tx> {
225
    storage: &'vm mut S,
226
    memory: &'vm mut MemoryInstance,
227
    context: &'vm Context,
228
    balances: &'vm mut RuntimeBalances,
229
    receipts: &'vm mut ReceiptsCtx,
230
    profiler: &'vm mut Profiler,
231
    new_storage_gas_per_byte: Word,
232
    tx: &'vm mut Tx,
233
    input_contracts: InputContracts<'vm>,
234
    tx_offset: usize,
235
    cgas: RegMut<'vm, CGAS>,
236
    ggas: RegMut<'vm, GGAS>,
237
    fp: Reg<'vm, FP>,
238
    is: Reg<'vm, IS>,
239
    pc: RegMut<'vm, PC>,
240
}
241
242
impl<'vm, S, Tx> TransferCtx<'vm, S, Tx> {
243
    /// In Fuel specs:
244
    /// Transfer $rB coins with asset ID at $rC to contract with ID at $rA.
245
    /// $rA -> recipient_contract_id_offset
246
    /// $rB -> transfer_amount
247
    /// $rC -> asset_id_offset
248
8
    pub(crate) fn transfer(
249
8
        mut self,
250
8
        recipient_contract_id_offset: Word,
251
8
        transfer_amount: Word,
252
8
        asset_id_offset: Word,
253
8
    ) -> IoResult<(), S::Error>
254
8
    where
255
8
        Tx: ExecutableTransaction,
256
8
        S: ContractsAssetsStorage,
257
8
    {
258
8
        let amount = transfer_amount;
259
6
        let destination =
260
8
            ContractId::from(self.memory.read_bytes(recipient_contract_id_offset)?);
261
6
        let asset_id = AssetId::from(self.memory.read_bytes(asset_id_offset)?);
262
263
4
        self.input_contracts.check(&destination)?;
264
265
3
        if amount == 0 {
266
1
            return Err(PanicReason::TransferZeroCoins.into())
267
2
        }
268
269
2
        let internal_context = match internal_contract(self.context, self.fp, self.memory)
270
        {
271
            // optimistically attempt to load the internal contract id
272
1
            Ok(source_contract) => Some(source_contract),
273
            // revert to external context if no internal contract is set
274
1
            Err(PanicReason::ExpectedInternalContext) => None,
275
            // bubble up any other kind of errors
276
0
            Err(e) => return Err(e.into()),
277
        };
278
279
2
        if let Some(source_contract) = internal_context {
280
            // debit funding source (source contract balance)
281
1
            balance_decrease(self.storage, &source_contract, &asset_id, amount)?;
282
        } else {
283
            // debit external funding source (i.e. free balance)
284
1
            external_asset_id_balance_sub(self.balances, self.memory, &asset_id, amount)?;
285
        }
286
        // credit destination contract
287
0
        let (_, created_new_entry) =
288
0
            balance_increase(self.storage, &destination, &asset_id, amount)?;
289
0
        if created_new_entry {
290
            // If a new entry was created, we must charge gas for it
291
0
            let profiler = ProfileGas {
292
0
                pc: self.pc.as_ref(),
293
0
                is: self.is,
294
0
                current_contract: internal_context,
295
0
                profiler: self.profiler,
296
0
            };
297
0
            gas_charge(
298
0
                self.cgas,
299
0
                self.ggas,
300
0
                profiler,
301
0
                ((Bytes32::LEN + WORD_SIZE) as u64)
302
0
                    .saturating_mul(self.new_storage_gas_per_byte),
303
0
            )?;
304
0
        }
305
306
0
        let receipt = Receipt::transfer(
307
0
            internal_context.unwrap_or_default(),
308
0
            destination,
309
0
            amount,
310
0
            asset_id,
311
0
            *self.pc,
312
0
            *self.is,
313
0
        );
314
0
315
0
        self.receipts.push(receipt)?;
316
317
0
        Ok(inc_pc(self.pc)?)
318
8
    }
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB5_11TransferCtxINtNtNtB9_7storage9predicate16PredicateStorageRNtB1d_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_4blob8BlobBodyNtB3R_12BlobMetadataEE8transferB9_
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB5_11TransferCtxINtNtNtB9_7storage9predicate16PredicateStorageRNtB1d_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_6create10CreateBodyNtB3R_14CreateMetadataEE8transferB9_
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB5_11TransferCtxINtNtNtB9_7storage9predicate16PredicateStorageRNtB1d_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_6script10ScriptBodyNtB3R_14ScriptMetadataEE8transferB9_
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB5_11TransferCtxINtNtNtB9_7storage9predicate16PredicateStorageRNtB1d_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_6upload10UploadBodyNtB3R_14UploadMetadataEE8transferB9_
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB5_11TransferCtxINtNtNtB9_7storage9predicate16PredicateStorageRNtB1d_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_7upgrade11UpgradeBodyNtB3R_15UpgradeMetadataEE8transferB9_
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB5_11TransferCtxINtNtNtB9_7storage9predicate16PredicateStorageRNtNtB1f_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2v_6script10ScriptBodyNtB41_14ScriptMetadataEE8transferB9_
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB5_11TransferCtxNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1S_4blob8BlobBodyNtB3o_12BlobMetadataEE8transferB9_
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB5_11TransferCtxNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1S_6create10CreateBodyNtB3o_14CreateMetadataEE8transferB9_
_RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB5_11TransferCtxNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1S_6script10ScriptBodyNtB3o_14ScriptMetadataEE8transferB9_
Line
Count
Source
248
8
    pub(crate) fn transfer(
249
8
        mut self,
250
8
        recipient_contract_id_offset: Word,
251
8
        transfer_amount: Word,
252
8
        asset_id_offset: Word,
253
8
    ) -> IoResult<(), S::Error>
254
8
    where
255
8
        Tx: ExecutableTransaction,
256
8
        S: ContractsAssetsStorage,
257
8
    {
258
8
        let amount = transfer_amount;
259
6
        let destination =
260
8
            ContractId::from(self.memory.read_bytes(recipient_contract_id_offset)?);
261
6
        let asset_id = AssetId::from(self.memory.read_bytes(asset_id_offset)?);
262
263
4
        self.input_contracts.check(&destination)?;
264
265
3
        if amount == 0 {
266
1
            return Err(PanicReason::TransferZeroCoins.into())
267
2
        }
268
269
2
        let internal_context = match internal_contract(self.context, self.fp, self.memory)
270
        {
271
            // optimistically attempt to load the internal contract id
272
1
            Ok(source_contract) => Some(source_contract),
273
            // revert to external context if no internal contract is set
274
1
            Err(PanicReason::ExpectedInternalContext) => None,
275
            // bubble up any other kind of errors
276
0
            Err(e) => return Err(e.into()),
277
        };
278
279
2
        if let Some(source_contract) = internal_context {
280
            // debit funding source (source contract balance)
281
1
            balance_decrease(self.storage, &source_contract, &asset_id, amount)?;
282
        } else {
283
            // debit external funding source (i.e. free balance)
284
1
            external_asset_id_balance_sub(self.balances, self.memory, &asset_id, amount)?;
285
        }
286
        // credit destination contract
287
0
        let (_, created_new_entry) =
288
0
            balance_increase(self.storage, &destination, &asset_id, amount)?;
289
0
        if created_new_entry {
290
            // If a new entry was created, we must charge gas for it
291
0
            let profiler = ProfileGas {
292
0
                pc: self.pc.as_ref(),
293
0
                is: self.is,
294
0
                current_contract: internal_context,
295
0
                profiler: self.profiler,
296
0
            };
297
0
            gas_charge(
298
0
                self.cgas,
299
0
                self.ggas,
300
0
                profiler,
301
0
                ((Bytes32::LEN + WORD_SIZE) as u64)
302
0
                    .saturating_mul(self.new_storage_gas_per_byte),
303
0
            )?;
304
0
        }
305
306
0
        let receipt = Receipt::transfer(
307
0
            internal_context.unwrap_or_default(),
308
0
            destination,
309
0
            amount,
310
0
            asset_id,
311
0
            *self.pc,
312
0
            *self.is,
313
0
        );
314
0
315
0
        self.receipts.push(receipt)?;
316
317
0
        Ok(inc_pc(self.pc)?)
318
8
    }
319
320
    /// In Fuel specs:
321
    /// Transfer $rC coins with asset ID at $rD to address at $rA, with output $rB.
322
    /// $rA -> recipient_offset
323
    /// $rB -> output_index
324
    /// $rC -> transfer_amount
325
    /// $rD -> asset_id_offset
326
13
    pub(crate) fn transfer_output(
327
13
        self,
328
13
        recipient_offset: Word,
329
13
        output_index: Word,
330
13
        transfer_amount: Word,
331
13
        asset_id_offset: Word,
332
13
    ) -> IoResult<(), S::Error>
333
13
    where
334
13
        Tx: ExecutableTransaction,
335
13
        S: ContractsAssetsStorage,
336
13
    {
337
11
        let out_idx =
338
13
            convert::to_usize(output_index).ok_or(PanicReason::OutputNotFound)?;
339
11
        let to = Address::from(self.memory.read_bytes(recipient_offset)?);
340
10
        let asset_id = AssetId::from(self.memory.read_bytes(asset_id_offset)?);
341
8
        let amount = transfer_amount;
342
8
343
8
        if amount == 0 {
344
2
            return Err(PanicReason::TransferZeroCoins.into())
345
6
        }
346
347
6
        let internal_context = match internal_contract(self.context, self.fp, self.memory)
348
        {
349
            // optimistically attempt to load the internal contract id
350
1
            Ok(source_contract) => Some(source_contract),
351
            // revert to external context if no internal contract is set
352
5
            Err(PanicReason::ExpectedInternalContext) => None,
353
            // bubble up any other kind of errors
354
0
            Err(e) => return Err(e.into()),
355
        };
356
357
6
        if let Some(source_contract) = internal_context {
358
            // debit funding source (source contract balance)
359
1
            balance_decrease(self.storage, &source_contract, &asset_id, amount)?;
360
        } else {
361
            // debit external funding source (i.e. UTXOs)
362
5
            external_asset_id_balance_sub(self.balances, self.memory, &asset_id, amount)?;
363
        }
364
365
        // credit variable output
366
0
        let variable = Output::variable(to, amount, asset_id);
367
0
368
0
        set_variable_output(self.tx, self.memory, self.tx_offset, out_idx, variable)?;
369
370
0
        let receipt = Receipt::transfer_out(
371
0
            internal_context.unwrap_or_default(),
372
0
            to,
373
0
            amount,
374
0
            asset_id,
375
0
            *self.pc,
376
0
            *self.is,
377
0
        );
378
0
379
0
        self.receipts.push(receipt)?;
380
381
0
        Ok(inc_pc(self.pc)?)
382
13
    }
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB5_11TransferCtxINtNtNtB9_7storage9predicate16PredicateStorageRNtB1d_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_4blob8BlobBodyNtB3R_12BlobMetadataEE15transfer_outputB9_
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB5_11TransferCtxINtNtNtB9_7storage9predicate16PredicateStorageRNtB1d_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_6create10CreateBodyNtB3R_14CreateMetadataEE15transfer_outputB9_
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB5_11TransferCtxINtNtNtB9_7storage9predicate16PredicateStorageRNtB1d_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_6script10ScriptBodyNtB3R_14ScriptMetadataEE15transfer_outputB9_
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB5_11TransferCtxINtNtNtB9_7storage9predicate16PredicateStorageRNtB1d_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_6upload10UploadBodyNtB3R_14UploadMetadataEE15transfer_outputB9_
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB5_11TransferCtxINtNtNtB9_7storage9predicate16PredicateStorageRNtB1d_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2l_7upgrade11UpgradeBodyNtB3R_15UpgradeMetadataEE15transfer_outputB9_
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB5_11TransferCtxINtNtNtB9_7storage9predicate16PredicateStorageRNtNtB1f_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2v_6script10ScriptBodyNtB41_14ScriptMetadataEE15transfer_outputB9_
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB5_11TransferCtxNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1S_4blob8BlobBodyNtB3o_12BlobMetadataEE15transfer_outputB9_
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB5_11TransferCtxNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1S_6create10CreateBodyNtB3o_14CreateMetadataEE15transfer_outputB9_
_RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contractINtB5_11TransferCtxNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1S_6script10ScriptBodyNtB3o_14ScriptMetadataEE15transfer_outputB9_
Line
Count
Source
326
13
    pub(crate) fn transfer_output(
327
13
        self,
328
13
        recipient_offset: Word,
329
13
        output_index: Word,
330
13
        transfer_amount: Word,
331
13
        asset_id_offset: Word,
332
13
    ) -> IoResult<(), S::Error>
333
13
    where
334
13
        Tx: ExecutableTransaction,
335
13
        S: ContractsAssetsStorage,
336
13
    {
337
11
        let out_idx =
338
13
            convert::to_usize(output_index).ok_or(PanicReason::OutputNotFound)?;
339
11
        let to = Address::from(self.memory.read_bytes(recipient_offset)?);
340
10
        let asset_id = AssetId::from(self.memory.read_bytes(asset_id_offset)?);
341
8
        let amount = transfer_amount;
342
8
343
8
        if amount == 0 {
344
2
            return Err(PanicReason::TransferZeroCoins.into())
345
6
        }
346
347
6
        let internal_context = match internal_contract(self.context, self.fp, self.memory)
348
        {
349
            // optimistically attempt to load the internal contract id
350
1
            Ok(source_contract) => Some(source_contract),
351
            // revert to external context if no internal contract is set
352
5
            Err(PanicReason::ExpectedInternalContext) => None,
353
            // bubble up any other kind of errors
354
0
            Err(e) => return Err(e.into()),
355
        };
356
357
6
        if let Some(source_contract) = internal_context {
358
            // debit funding source (source contract balance)
359
1
            balance_decrease(self.storage, &source_contract, &asset_id, amount)?;
360
        } else {
361
            // debit external funding source (i.e. UTXOs)
362
5
            external_asset_id_balance_sub(self.balances, self.memory, &asset_id, amount)?;
363
        }
364
365
        // credit variable output
366
0
        let variable = Output::variable(to, amount, asset_id);
367
0
368
0
        set_variable_output(self.tx, self.memory, self.tx_offset, out_idx, variable)?;
369
370
0
        let receipt = Receipt::transfer_out(
371
0
            internal_context.unwrap_or_default(),
372
0
            to,
373
0
            amount,
374
0
            asset_id,
375
0
            *self.pc,
376
0
            *self.is,
377
0
        );
378
0
379
0
        self.receipts.push(receipt)?;
380
381
0
        Ok(inc_pc(self.pc)?)
382
13
    }
383
}
384
385
380k
pub(crate) fn contract_size<S>(
386
380k
    storage: &S,
387
380k
    contract: &ContractId,
388
380k
) -> IoResult<u32, S::Error>
389
380k
where
390
380k
    S: StorageSize<ContractsRawCode> + ?Sized,
391
380k
{
392
380k
    let size = storage
393
380k
        .size_of_value(contract)
394
380k
        .map_err(RuntimeError::Storage)?
395
380k
        .ok_or(PanicReason::ContractNotFound)?;
396
380k
    Ok(u32::try_from(size).map_err(|_| PanicReason::MemoryOverflow)?)
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract13contract_sizeINtNtNtB8_7storage9predicate16PredicateStorageRNtB18_12EmptyStorageEE0B8_
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract13contract_sizeINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1a_6memory13MemoryStorageEE0B8_
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract13contract_sizeNtNtNtB8_7storage6memory13MemoryStorageE0B8_
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract13contract_sizeQINtNtNtB8_7storage9predicate16PredicateStorageRNtB19_12EmptyStorageEE0B8_
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract13contract_sizeQINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1b_6memory13MemoryStorageEE0B8_
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract13contract_sizeQNtNtNtB8_7storage6memory13MemoryStorageE0B8_
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract13contract_sizeRINtNtNtB8_7storage9predicate16PredicateStorageRNtB19_12EmptyStorageEE0B8_
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract13contract_sizeRINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1b_6memory13MemoryStorageEE0B8_
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract13contract_sizeRNtNtNtB8_7storage6memory13MemoryStorageE0B8_
397
380k
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract13contract_sizeINtNtNtB6_7storage9predicate16PredicateStorageRNtB16_12EmptyStorageEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract13contract_sizeINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB18_6memory13MemoryStorageEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract13contract_sizeNtNtNtB6_7storage6memory13MemoryStorageEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract13contract_sizeQINtNtNtB6_7storage9predicate16PredicateStorageRNtB17_12EmptyStorageEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract13contract_sizeQINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB19_6memory13MemoryStorageEEB6_
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract13contract_sizeQNtNtNtB6_7storage6memory13MemoryStorageEB6_
Line
Count
Source
385
12.3k
pub(crate) fn contract_size<S>(
386
12.3k
    storage: &S,
387
12.3k
    contract: &ContractId,
388
12.3k
) -> IoResult<u32, S::Error>
389
12.3k
where
390
12.3k
    S: StorageSize<ContractsRawCode> + ?Sized,
391
12.3k
{
392
12.3k
    let size = storage
393
12.3k
        .size_of_value(contract)
394
12.3k
        .map_err(RuntimeError::Storage)?
395
12.3k
        .ok_or(PanicReason::ContractNotFound)?;
396
12.3k
    Ok(u32::try_from(size).map_err(|_| PanicReason::MemoryOverflow)?)
397
12.3k
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract13contract_sizeRINtNtNtB6_7storage9predicate16PredicateStorageRNtB17_12EmptyStorageEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract13contract_sizeRINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB19_6memory13MemoryStorageEEB6_
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract13contract_sizeRNtNtNtB6_7storage6memory13MemoryStorageEB6_
Line
Count
Source
385
368k
pub(crate) fn contract_size<S>(
386
368k
    storage: &S,
387
368k
    contract: &ContractId,
388
368k
) -> IoResult<u32, S::Error>
389
368k
where
390
368k
    S: StorageSize<ContractsRawCode> + ?Sized,
391
368k
{
392
368k
    let size = storage
393
368k
        .size_of_value(contract)
394
368k
        .map_err(RuntimeError::Storage)?
395
368k
        .ok_or(PanicReason::ContractNotFound)?;
396
368k
    Ok(u32::try_from(size).map_err(|_| PanicReason::MemoryOverflow)?)
397
368k
}
398
399
13.5k
pub(crate) fn balance<S>(
400
13.5k
    storage: &S,
401
13.5k
    contract: &ContractId,
402
13.5k
    asset_id: &AssetId,
403
13.5k
) -> IoResult<Word, S::Error>
404
13.5k
where
405
13.5k
    S: ContractsAssetsStorage + ?Sized,
406
13.5k
{
407
13.5k
    Ok(storage
408
13.5k
        .contract_asset_id_balance(contract, asset_id)
409
13.5k
        .map_err(RuntimeError::Storage)?
410
13.5k
        .unwrap_or_default())
411
13.5k
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract7balanceINtNtNtB6_7storage9predicate16PredicateStorageRNtBZ_12EmptyStorageEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract7balanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB11_6memory13MemoryStorageEEB6_
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract7balanceNtNtNtB6_7storage6memory13MemoryStorageEB6_
Line
Count
Source
399
13.5k
pub(crate) fn balance<S>(
400
13.5k
    storage: &S,
401
13.5k
    contract: &ContractId,
402
13.5k
    asset_id: &AssetId,
403
13.5k
) -> IoResult<Word, S::Error>
404
13.5k
where
405
13.5k
    S: ContractsAssetsStorage + ?Sized,
406
13.5k
{
407
13.5k
    Ok(storage
408
13.5k
        .contract_asset_id_balance(contract, asset_id)
409
13.5k
        .map_err(RuntimeError::Storage)?
410
13.5k
        .unwrap_or_default())
411
13.5k
}
412
413
/// Increase the asset balance for a contract.
414
/// Returns new balance, and a boolean indicating if a new entry was created.
415
12.3k
pub fn balance_increase<S>(
416
12.3k
    storage: &mut S,
417
12.3k
    contract: &ContractId,
418
12.3k
    asset_id: &AssetId,
419
12.3k
    amount: Word,
420
12.3k
) -> IoResult<(Word, bool), S::Error>
421
12.3k
where
422
12.3k
    S: ContractsAssetsStorage + ?Sized,
423
12.3k
{
424
12.3k
    let balance = balance(storage, contract, asset_id)?;
425
12.3k
    let balance = balance
426
12.3k
        .checked_add(amount)
427
12.3k
        .ok_or(PanicReason::BalanceOverflow)?;
428
429
12.3k
    let old_value = storage
430
12.3k
        .contract_asset_id_balance_replace(contract, asset_id, balance)
431
12.3k
        .map_err(RuntimeError::Storage)?;
432
433
12.3k
    Ok((balance, old_value.is_none()))
434
12.3k
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract16balance_increaseINtNtNtB6_7storage9predicate16PredicateStorageRNtB19_12EmptyStorageEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract16balance_increaseINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1b_6memory13MemoryStorageEEB6_
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract16balance_increaseNtNtNtB6_7storage6memory13MemoryStorageEB6_
Line
Count
Source
415
12.3k
pub fn balance_increase<S>(
416
12.3k
    storage: &mut S,
417
12.3k
    contract: &ContractId,
418
12.3k
    asset_id: &AssetId,
419
12.3k
    amount: Word,
420
12.3k
) -> IoResult<(Word, bool), S::Error>
421
12.3k
where
422
12.3k
    S: ContractsAssetsStorage + ?Sized,
423
12.3k
{
424
12.3k
    let balance = balance(storage, contract, asset_id)?;
425
12.3k
    let balance = balance
426
12.3k
        .checked_add(amount)
427
12.3k
        .ok_or(PanicReason::BalanceOverflow)?;
428
429
12.3k
    let old_value = storage
430
12.3k
        .contract_asset_id_balance_replace(contract, asset_id, balance)
431
12.3k
        .map_err(RuntimeError::Storage)?;
432
433
12.3k
    Ok((balance, old_value.is_none()))
434
12.3k
}
435
436
/// Decrease the asset balance for a contract.
437
1.05k
pub fn balance_decrease<S>(
438
1.05k
    storage: &mut S,
439
1.05k
    contract: &ContractId,
440
1.05k
    asset_id: &AssetId,
441
1.05k
    amount: Word,
442
1.05k
) -> IoResult<Word, S::Error>
443
1.05k
where
444
1.05k
    S: ContractsAssetsStorage + ?Sized,
445
1.05k
{
446
1.05k
    let balance = balance(storage, contract, asset_id)?;
447
1.05k
    let balance = balance
448
1.05k
        .checked_sub(amount)
449
1.05k
        .ok_or(PanicReason::NotEnoughBalance)?;
450
1.04k
    storage
451
1.04k
        .contract_asset_id_balance_insert(contract, asset_id, balance)
452
1.04k
        .map_err(RuntimeError::Storage)?;
453
1.04k
    Ok(balance)
454
1.05k
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract16balance_decreaseINtNtNtB6_7storage9predicate16PredicateStorageRNtB19_12EmptyStorageEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract16balance_decreaseINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1b_6memory13MemoryStorageEEB6_
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8contract16balance_decreaseNtNtNtB6_7storage6memory13MemoryStorageEB6_
Line
Count
Source
437
1.05k
pub fn balance_decrease<S>(
438
1.05k
    storage: &mut S,
439
1.05k
    contract: &ContractId,
440
1.05k
    asset_id: &AssetId,
441
1.05k
    amount: Word,
442
1.05k
) -> IoResult<Word, S::Error>
443
1.05k
where
444
1.05k
    S: ContractsAssetsStorage + ?Sized,
445
1.05k
{
446
1.05k
    let balance = balance(storage, contract, asset_id)?;
447
1.05k
    let balance = balance
448
1.05k
        .checked_sub(amount)
449
1.05k
        .ok_or(PanicReason::NotEnoughBalance)?;
450
1.04k
    storage
451
1.04k
        .contract_asset_id_balance_insert(contract, asset_id, balance)
452
1.04k
        .map_err(RuntimeError::Storage)?;
453
1.04k
    Ok(balance)
454
1.05k
}
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter/log.rs
Line
Count
Source
1
use super::{
2
    internal::{
3
        inc_pc,
4
        internal_contract,
5
    },
6
    receipts::ReceiptsCtx,
7
    ExecutableTransaction,
8
    Interpreter,
9
    Memory,
10
    MemoryInstance,
11
};
12
use crate::{
13
    constraints::reg_key::*,
14
    context::Context,
15
    error::SimpleResult,
16
};
17
18
use fuel_tx::Receipt;
19
use fuel_types::Word;
20
21
#[cfg(test)]
22
mod tests;
23
24
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
25
where
26
    M: Memory,
27
    Tx: ExecutableTransaction,
28
{
29
631k
    pub(crate) fn log(&mut self, a: Word, b: Word, c: Word, d: Word) -> SimpleResult<()> {
30
631k
        let (SystemRegisters { fp, is, pc, .. }, _) =
31
631k
            split_registers(&mut self.registers);
32
631k
        let input = LogInput {
33
631k
            memory: self.memory.as_mut(),
34
631k
            context: &self.context,
35
631k
            receipts: &mut self.receipts,
36
631k
            fp: fp.as_ref(),
37
631k
            is: is.as_ref(),
38
631k
            pc,
39
631k
        };
40
631k
        input.log(a, b, c, d)
41
631k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3logINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_4blob8BlobBodyNtB3K_12BlobMetadataEE3logB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3logINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_6create10CreateBodyNtB3K_14CreateMetadataEE3logB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3logINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_6script10ScriptBodyNtB3K_14ScriptMetadataEE3logB6_
Line
Count
Source
29
631k
    pub(crate) fn log(&mut self, a: Word, b: Word, c: Word, d: Word) -> SimpleResult<()> {
30
631k
        let (SystemRegisters { fp, is, pc, .. }, _) =
31
631k
            split_registers(&mut self.registers);
32
631k
        let input = LogInput {
33
631k
            memory: self.memory.as_mut(),
34
631k
            context: &self.context,
35
631k
            receipts: &mut self.receipts,
36
631k
            fp: fp.as_ref(),
37
631k
            is: is.as_ref(),
38
631k
            pc,
39
631k
        };
40
631k
        input.log(a, b, c, d)
41
631k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3logINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_4blob8BlobBodyNtB4e_12BlobMetadataEE3logB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3logINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6create10CreateBodyNtB4e_14CreateMetadataEE3logB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3logINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6script10ScriptBodyNtB4e_14ScriptMetadataEE3logB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3logINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6upload10UploadBodyNtB4e_14UploadMetadataEE3logB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3logINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_7upgrade11UpgradeBodyNtB4e_15UpgradeMetadataEE3logB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3logINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1C_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6script10ScriptBodyNtB4o_14ScriptMetadataEE3logB6_
42
43
176k
    pub(crate) fn log_data(
44
176k
        &mut self,
45
176k
        a: Word,
46
176k
        b: Word,
47
176k
        c: Word,
48
176k
        d: Word,
49
176k
    ) -> SimpleResult<()> {
50
176k
        let (SystemRegisters { fp, is, pc, .. }, _) =
51
176k
            split_registers(&mut self.registers);
52
176k
        let input = LogInput {
53
176k
            memory: self.memory.as_mut(),
54
176k
            context: &self.context,
55
176k
            receipts: &mut self.receipts,
56
176k
            fp: fp.as_ref(),
57
176k
            is: is.as_ref(),
58
176k
            pc,
59
176k
        };
60
176k
        input.log_data(a, b, c, d)
61
176k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3logINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_4blob8BlobBodyNtB3K_12BlobMetadataEE8log_dataB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3logINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_6create10CreateBodyNtB3K_14CreateMetadataEE8log_dataB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3logINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2e_6script10ScriptBodyNtB3K_14ScriptMetadataEE8log_dataB6_
Line
Count
Source
43
176k
    pub(crate) fn log_data(
44
176k
        &mut self,
45
176k
        a: Word,
46
176k
        b: Word,
47
176k
        c: Word,
48
176k
        d: Word,
49
176k
    ) -> SimpleResult<()> {
50
176k
        let (SystemRegisters { fp, is, pc, .. }, _) =
51
176k
            split_registers(&mut self.registers);
52
176k
        let input = LogInput {
53
176k
            memory: self.memory.as_mut(),
54
176k
            context: &self.context,
55
176k
            receipts: &mut self.receipts,
56
176k
            fp: fp.as_ref(),
57
176k
            is: is.as_ref(),
58
176k
            pc,
59
176k
        };
60
176k
        input.log_data(a, b, c, d)
61
176k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3logINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_4blob8BlobBodyNtB4e_12BlobMetadataEE8log_dataB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3logINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6create10CreateBodyNtB4e_14CreateMetadataEE8log_dataB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3logINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6script10ScriptBodyNtB4e_14ScriptMetadataEE8log_dataB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3logINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_6upload10UploadBodyNtB4e_14UploadMetadataEE8log_dataB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3logINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1A_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2I_7upgrade11UpgradeBodyNtB4e_15UpgradeMetadataEE8log_dataB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3logINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1C_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6script10ScriptBodyNtB4o_14ScriptMetadataEE8log_dataB6_
62
}
63
64
struct LogInput<'vm> {
65
    memory: &'vm MemoryInstance,
66
    context: &'vm Context,
67
    receipts: &'vm mut ReceiptsCtx,
68
    fp: Reg<'vm, FP>,
69
    is: Reg<'vm, IS>,
70
    pc: RegMut<'vm, PC>,
71
}
72
73
impl LogInput<'_> {
74
631k
    pub(crate) fn log(self, a: Word, b: Word, c: Word, d: Word) -> SimpleResult<()> {
75
631k
        let receipt = Receipt::log(
76
631k
            internal_contract(self.context, self.fp, self.memory).unwrap_or_default(),
77
631k
            a,
78
631k
            b,
79
631k
            c,
80
631k
            d,
81
631k
            *self.pc,
82
631k
            *self.is,
83
631k
        );
84
631k
85
631k
        self.receipts.push(receipt)?;
86
87
631k
        Ok(inc_pc(self.pc)?)
88
631k
    }
89
90
176k
    pub(crate) fn log_data(self, a: Word, b: Word, c: Word, d: Word) -> SimpleResult<()> {
91
176k
        let data = self.memory.read(c, d)?.to_vec();
92
176k
93
176k
        let receipt = Receipt::log_data(
94
176k
            internal_contract(self.context, self.fp, self.memory).unwrap_or_default(),
95
176k
            a,
96
176k
            b,
97
176k
            c,
98
176k
            *self.pc,
99
176k
            *self.is,
100
176k
            data,
101
176k
        );
102
176k
103
176k
        self.receipts.push(receipt)?;
104
105
176k
        Ok(inc_pc(self.pc)?)
106
176k
    }
107
}
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter/constructors.rs
Line
Count
Source
1
//! Exposed constructors API for the [`Interpreter`]
2
#![allow(clippy::default_constructed_unit_structs)] // need for ::default() depends on cfg
3
4
#[cfg(any(test, feature = "test-helpers"))]
5
use super::{
6
    ExecutableTransaction,
7
    MemoryInstance,
8
};
9
use super::{
10
    Interpreter,
11
    RuntimeBalances,
12
};
13
use crate::{
14
    consts::*,
15
    context::Context,
16
    interpreter::{
17
        InterpreterParams,
18
        PanicContext,
19
    },
20
    state::Debugger,
21
};
22
23
use alloc::vec;
24
25
#[cfg(feature = "profile-any")]
26
use crate::profiler::ProfileReceiver;
27
28
use crate::profiler::Profiler;
29
30
#[cfg(feature = "test-helpers")]
31
use crate::{
32
    interpreter::EcalHandler,
33
    storage::MemoryStorage,
34
};
35
36
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
37
where
38
    Tx: Default,
39
    Ecal: Default,
40
{
41
    /// Create a new interpreter instance out of a storage implementation.
42
    ///
43
    /// If the provided storage implements
44
    /// [`crate::storage::InterpreterStorage`], the returned interpreter
45
    /// will provide full functionality.
46
4.38k
    pub fn with_storage(
47
4.38k
        memory: M,
48
4.38k
        storage: S,
49
4.38k
        interpreter_params: InterpreterParams,
50
4.38k
    ) -> Self {
51
4.38k
        Self::with_storage_and_ecal(memory, storage, interpreter_params, Ecal::default())
52
4.38k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter12constructorsINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_4blob8BlobBodyNtB4o_12BlobMetadataEE12with_storageB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter12constructorsINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6create10CreateBodyNtB4o_14CreateMetadataEE12with_storageB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter12constructorsINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1M_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB32_6script10ScriptBodyNtB4y_14ScriptMetadataEE12with_storageB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter12constructorsINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6script10ScriptBodyNtB4o_14ScriptMetadataEE12with_storageB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter12constructorsINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6upload10UploadBodyNtB4o_14UploadMetadataEE12with_storageB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter12constructorsINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_7upgrade11UpgradeBodyNtB4o_15UpgradeMetadataEE12with_storageB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter12constructorsINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_4blob8BlobBodyNtB3U_12BlobMetadataEE12with_storageB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter12constructorsINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6create10CreateBodyNtB3U_14CreateMetadataEE12with_storageB6_
Line
Count
Source
46
2.19k
    pub fn with_storage(
47
2.19k
        memory: M,
48
2.19k
        storage: S,
49
2.19k
        interpreter_params: InterpreterParams,
50
2.19k
    ) -> Self {
51
2.19k
        Self::with_storage_and_ecal(memory, storage, interpreter_params, Ecal::default())
52
2.19k
    }
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter12constructorsINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6script10ScriptBodyNtB3U_14ScriptMetadataEE12with_storageB6_
Line
Count
Source
46
2.19k
    pub fn with_storage(
47
2.19k
        memory: M,
48
2.19k
        storage: S,
49
2.19k
        interpreter_params: InterpreterParams,
50
2.19k
    ) -> Self {
51
2.19k
        Self::with_storage_and_ecal(memory, storage, interpreter_params, Ecal::default())
52
2.19k
    }
53
}
54
55
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
56
where
57
    Tx: Default,
58
{
59
    /// Create a new interpreter instance out of a storage implementation.
60
    ///
61
    /// If the provided storage implements
62
    /// [`crate::storage::InterpreterStorage`], the returned interpreter
63
    /// will provide full functionality.
64
4.38k
    pub fn with_storage_and_ecal(
65
4.38k
        memory: M,
66
4.38k
        storage: S,
67
4.38k
        interpreter_params: InterpreterParams,
68
4.38k
        ecal_state: Ecal,
69
4.38k
    ) -> Self {
70
4.38k
        Self {
71
4.38k
            registers: [0; VM_REGISTER_COUNT],
72
4.38k
            memory,
73
4.38k
            frames: vec![],
74
4.38k
            receipts: Default::default(),
75
4.38k
            tx: Default::default(),
76
4.38k
            input_contracts: Default::default(),
77
4.38k
            input_contracts_index_to_output_index: Default::default(),
78
4.38k
            initial_balances: Default::default(),
79
4.38k
            storage,
80
4.38k
            debugger: Debugger::default(),
81
4.38k
            context: Context::default(),
82
4.38k
            balances: RuntimeBalances::default(),
83
4.38k
            profiler: Profiler::default(),
84
4.38k
            interpreter_params,
85
4.38k
            panic_context: PanicContext::None,
86
4.38k
            ecal_state,
87
4.38k
        }
88
4.38k
    }
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter12constructorsINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_4blob8BlobBodyNtB3W_12BlobMetadataEE21with_storage_and_ecalB8_
_RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter12constructorsINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_6create10CreateBodyNtB3W_14CreateMetadataEE21with_storage_and_ecalB8_
Line
Count
Source
64
2.19k
    pub fn with_storage_and_ecal(
65
2.19k
        memory: M,
66
2.19k
        storage: S,
67
2.19k
        interpreter_params: InterpreterParams,
68
2.19k
        ecal_state: Ecal,
69
2.19k
    ) -> Self {
70
2.19k
        Self {
71
2.19k
            registers: [0; VM_REGISTER_COUNT],
72
2.19k
            memory,
73
2.19k
            frames: vec![],
74
2.19k
            receipts: Default::default(),
75
2.19k
            tx: Default::default(),
76
2.19k
            input_contracts: Default::default(),
77
2.19k
            input_contracts_index_to_output_index: Default::default(),
78
2.19k
            initial_balances: Default::default(),
79
2.19k
            storage,
80
2.19k
            debugger: Debugger::default(),
81
2.19k
            context: Context::default(),
82
2.19k
            balances: RuntimeBalances::default(),
83
2.19k
            profiler: Profiler::default(),
84
2.19k
            interpreter_params,
85
2.19k
            panic_context: PanicContext::None,
86
2.19k
            ecal_state,
87
2.19k
        }
88
2.19k
    }
_RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter12constructorsINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_6script10ScriptBodyNtB3W_14ScriptMetadataEE21with_storage_and_ecalB8_
Line
Count
Source
64
2.19k
    pub fn with_storage_and_ecal(
65
2.19k
        memory: M,
66
2.19k
        storage: S,
67
2.19k
        interpreter_params: InterpreterParams,
68
2.19k
        ecal_state: Ecal,
69
2.19k
    ) -> Self {
70
2.19k
        Self {
71
2.19k
            registers: [0; VM_REGISTER_COUNT],
72
2.19k
            memory,
73
2.19k
            frames: vec![],
74
2.19k
            receipts: Default::default(),
75
2.19k
            tx: Default::default(),
76
2.19k
            input_contracts: Default::default(),
77
2.19k
            input_contracts_index_to_output_index: Default::default(),
78
2.19k
            initial_balances: Default::default(),
79
2.19k
            storage,
80
2.19k
            debugger: Debugger::default(),
81
2.19k
            context: Context::default(),
82
2.19k
            balances: RuntimeBalances::default(),
83
2.19k
            profiler: Profiler::default(),
84
2.19k
            interpreter_params,
85
2.19k
            panic_context: PanicContext::None,
86
2.19k
            ecal_state,
87
2.19k
        }
88
2.19k
    }
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter12constructorsINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_4blob8BlobBodyNtB4q_12BlobMetadataEE21with_storage_and_ecalB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter12constructorsINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6create10CreateBodyNtB4q_14CreateMetadataEE21with_storage_and_ecalB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter12constructorsINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6script10ScriptBodyNtB4q_14ScriptMetadataEE21with_storage_and_ecalB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter12constructorsINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6upload10UploadBodyNtB4q_14UploadMetadataEE21with_storage_and_ecalB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter12constructorsINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_7upgrade11UpgradeBodyNtB4q_15UpgradeMetadataEE21with_storage_and_ecalB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter12constructorsINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1O_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB34_6script10ScriptBodyNtB4A_14ScriptMetadataEE21with_storage_and_ecalB8_
89
}
90
91
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal> {
92
    /// Sets a profiler for the VM
93
    #[cfg(feature = "profile-any")]
94
    pub fn with_profiler<P>(&mut self, receiver: P) -> &mut Self
95
    where
96
        P: ProfileReceiver + Send + Sync + 'static,
97
    {
98
        self.profiler.set_receiver(alloc::boxed::Box::new(receiver));
99
        self
100
    }
101
}
102
103
#[cfg(any(test, feature = "test-helpers"))]
104
impl<S, Tx, Ecal> Default for Interpreter<MemoryInstance, S, Tx, Ecal>
105
where
106
    S: Default,
107
    Tx: ExecutableTransaction,
108
    Ecal: EcalHandler + Default,
109
{
110
0
    fn default() -> Self {
111
0
        Interpreter::<_, S, Tx, Ecal>::with_storage(
112
0
            MemoryInstance::new(),
113
0
            Default::default(),
114
0
            InterpreterParams::default(),
115
0
        )
116
0
    }
117
}
118
119
#[cfg(any(test, feature = "test-helpers"))]
120
impl<Tx, Ecal> Interpreter<MemoryInstance, (), Tx, Ecal>
121
where
122
    Tx: ExecutableTransaction,
123
    Ecal: EcalHandler + Default,
124
{
125
    /// Create a new interpreter without a storage backend.
126
    ///
127
    /// It will have restricted capabilities.
128
0
    pub fn without_storage() -> Self {
129
0
        Self::default()
130
0
    }
131
}
132
133
#[cfg(feature = "test-helpers")]
134
impl<Tx, Ecal> Interpreter<MemoryInstance, MemoryStorage, Tx, Ecal>
135
where
136
    Tx: ExecutableTransaction,
137
    Ecal: EcalHandler + Default,
138
{
139
    /// Create a new storage with a provided in-memory storage.
140
    ///
141
    /// It will have full capabilities.
142
0
    pub fn with_memory_storage() -> Self {
143
0
        Self::default()
144
0
    }
145
}
146
147
#[cfg(feature = "test-helpers")]
148
impl<Tx, Ecal> Interpreter<MemoryInstance, MemoryStorage, Tx, Ecal>
149
where
150
    Tx: ExecutableTransaction,
151
    Ecal: EcalHandler,
152
{
153
    /// Create a new storage with a provided in-memory storage.
154
    ///
155
    /// It will have full capabilities.
156
0
    pub fn with_memory_storage_and_ecal(ecal: Ecal) -> Self {
157
0
        Interpreter::<_, MemoryStorage, Tx, Ecal>::with_storage_and_ecal(
158
0
            MemoryInstance::new(),
159
0
            Default::default(),
160
0
            InterpreterParams::default(),
161
0
            ecal,
162
0
        )
163
0
    }
164
}
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter/memory.rs
Line
Count
Source
1
#![cfg(feature = "alloc")]
2
3
use super::{
4
    internal::inc_pc,
5
    Interpreter,
6
};
7
use crate::{
8
    constraints::reg_key::*,
9
    consts::*,
10
    error::SimpleResult,
11
};
12
13
use fuel_asm::{
14
    Imm12,
15
    Imm24,
16
    PanicReason,
17
    RegId,
18
};
19
use fuel_types::{
20
    fmt_truncated_hex,
21
    RegisterId,
22
    Word,
23
};
24
25
use core::{
26
    fmt,
27
    ops::Range,
28
};
29
30
#[cfg(any(test, feature = "test-helpers"))]
31
use core::ops::{
32
    Index,
33
    IndexMut,
34
    RangeFrom,
35
    RangeTo,
36
};
37
38
use alloc::{
39
    vec,
40
    vec::Vec,
41
};
42
43
#[cfg(test)]
44
mod tests;
45
46
#[cfg(test)]
47
mod impl_tests;
48
49
#[cfg(test)]
50
mod allocation_tests;
51
52
#[cfg(test)]
53
mod stack_tests;
54
55
/// The trait for the memory.
56
pub trait Memory: AsRef<MemoryInstance> + AsMut<MemoryInstance> {}
57
58
impl<M> Memory for M where M: AsRef<MemoryInstance> + AsMut<MemoryInstance> {}
59
60
/// The memory of the VM, represented as stack and heap.
61
#[derive(Clone, Eq)]
62
pub struct MemoryInstance {
63
    /// Stack. Grows upwards.
64
    stack: Vec<u8>,
65
    /// Heap. Grows downwards from MEM_SIZE.
66
    heap: Vec<u8>,
67
    /// Lowest allowed heap address, i.e. hp register value.
68
    /// This is needed since we can allocate extra heap for performance reasons.
69
    hp: usize,
70
}
71
72
impl Default for MemoryInstance {
73
0
    fn default() -> Self {
74
0
        Self::new()
75
0
    }
76
}
77
78
impl fmt::Debug for MemoryInstance {
79
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
80
0
        write!(f, "Memory {{ stack: ")?;
81
0
        fmt_truncated_hex::<16>(&self.stack, f)?;
82
0
        write!(f, ", heap: ")?;
83
0
        let off = self.hp.saturating_sub(self.heap_offset());
84
0
        fmt_truncated_hex::<16>(&self.heap[off..], f)?;
85
0
        write!(f, ", hp: {} }}", self.hp)
86
0
    }
87
}
88
89
impl PartialEq for MemoryInstance {
90
    /// Equality comparison of the accessible memory.
91
    #[allow(clippy::arithmetic_side_effects)] // Safety: hp is kept valid everywhere
92
0
    fn eq(&self, other: &Self) -> bool {
93
0
        self.stack == other.stack && self.hp == other.hp && {
94
0
            let self_hs = self.hp - self.heap_offset();
95
0
            let other_hs = other.hp - other.heap_offset();
96
0
            self.heap[self_hs..] == other.heap[other_hs..]
97
        }
98
0
    }
99
}
100
101
impl AsRef<MemoryInstance> for MemoryInstance {
102
483M
    fn as_ref(&self) -> &MemoryInstance {
103
483M
        self
104
483M
    }
105
}
106
impl AsMut<MemoryInstance> for MemoryInstance {
107
58.3M
    fn as_mut(&mut self) -> &mut MemoryInstance {
108
58.3M
        self
109
58.3M
    }
110
}
111
112
impl MemoryInstance {
113
    /// Create a new VM memory.
114
8.77k
    pub fn new() -> Self {
115
8.77k
        Self {
116
8.77k
            stack: Vec::new(),
117
8.77k
            heap: Vec::new(),
118
8.77k
            hp: MEM_SIZE,
119
8.77k
        }
120
8.77k
    }
121
122
    /// Resets memory to initial state, keeping the original allocations.
123
4.38k
    pub fn reset(&mut self) {
124
4.38k
        self.stack.truncate(0);
125
4.38k
        self.hp = MEM_SIZE;
126
4.38k
    }
127
128
    /// Offset of the heap section
129
4.98M
    fn heap_offset(&self) -> usize {
130
4.98M
        MEM_SIZE.saturating_sub(self.heap.len())
131
4.98M
    }
132
133
    /// Returns a linear memory representation where stack is at the beginning and heap is
134
    /// at the end.
135
0
    pub fn into_linear_memory(self) -> Vec<u8> {
136
0
        let uninit_memory_size = MEM_SIZE
137
0
            .saturating_sub(self.stack.len())
138
0
            .saturating_sub(self.heap.len());
139
0
        let uninit_memory = vec![0u8; uninit_memory_size];
140
0
        let mut memory = self.stack;
141
0
        memory.extend(uninit_memory);
142
0
        memory.extend(self.heap);
143
0
        memory
144
0
    }
145
146
    /// Grows the stack to be at least `new_sp` bytes.
147
22.7M
    pub fn grow_stack(&mut self, new_sp: Word) -> Result<(), PanicReason> {
148
22.7M
        if new_sp > VM_MAX_RAM {
149
3
            return Err(PanicReason::MemoryOverflow);
150
22.7M
        }
151
22.7M
        #[allow(clippy::cast_possible_truncation)] // Safety: VM_MAX_RAM is usize
152
22.7M
        let new_sp = new_sp as usize;
153
22.7M
154
22.7M
        if new_sp > self.stack.len() {
155
18.7M
            if new_sp > self.hp {
156
0
                return Err(PanicReason::MemoryGrowthOverlap)
157
18.7M
            }
158
18.7M
159
18.7M
            self.stack.resize(new_sp, 0);
160
4.01M
        }
161
22.7M
        Ok(())
162
22.7M
    }
163
164
    /// Grows the heap by `amount` bytes. Updates hp register.
165
898k
    pub fn grow_heap_by(
166
898k
        &mut self,
167
898k
        sp_reg: Reg<SP>,
168
898k
        mut hp_reg: RegMut<HP>,
169
898k
        amount: Word,
170
898k
    ) -> Result<(), PanicReason> {
171
898k
        debug_assert_eq!(
172
898k
            self.hp as Word, *hp_reg,
173
0
            "HP register changed without memory update"
174
        );
175
176
898k
        let amount = usize::try_from(amount).map_err(|_| PanicReason::MemoryOverflow)?;
177
898k
        let new_hp = self
178
898k
            .hp
179
898k
            .checked_sub(amount)
180
898k
            .ok_or(PanicReason::MemoryOverflow)?;
181
182
898k
        if (new_hp as Word) < *sp_reg {
183
5
            return Err(PanicReason::MemoryGrowthOverlap)
184
898k
        }
185
898k
186
898k
        #[allow(clippy::arithmetic_side_effects)] // Safety: self.hp is in heap
187
898k
        let new_len = MEM_SIZE - new_hp;
188
898k
189
898k
        #[allow(clippy::arithmetic_side_effects)] // Safety: self.hp is in heap
190
898k
        if self.heap.len() >= new_len {
191
898k
            // No need to reallocate, but we need to zero the new space
192
898k
            // in case it was used before a memory reset.
193
898k
            let start = new_hp - self.heap_offset();
194
898k
            let end = self.hp - self.heap_offset();
195
898k
            self.heap[start..end].fill(0);
196
898k
        } else {
197
334
            // Reallocation is needed.
198
334
            // To reduce frequent reallocations, allocate at least 256 bytes at once.
199
334
            // After that, double the allocation every time.
200
334
            let cap = new_len.next_power_of_two().clamp(256, MEM_SIZE);
201
334
            let old_len = self.heap.len();
202
334
            let prefix_zeroes = cap - old_len;
203
334
            self.heap.resize(cap, 0);
204
334
            self.heap.copy_within(..old_len, prefix_zeroes);
205
334
            self.heap[..prefix_zeroes].fill(0);
206
334
        }
207
208
898k
        self.hp = new_hp;
209
898k
        *hp_reg = new_hp as Word;
210
898k
211
898k
        // If heap enters region where stack has been, truncate the stack
212
898k
        self.stack.truncate(new_hp);
213
898k
214
898k
        Ok(())
215
898k
    }
216
217
    /// Verify that the memory range is accessble and return it as a range.
218
557M
    pub fn verify<A: ToAddr, B: ToAddr>(
219
557M
        &self,
220
557M
        addr: A,
221
557M
        count: B,
222
557M
    ) -> Result<MemoryRange, PanicReason> {
223
557M
        let start = addr.to_addr()?;
224
557M
        let len = count.to_addr()?;
225
557M
        let end = start.saturating_add(len);
226
557M
        if end > MEM_SIZE {
227
45
            return Err(PanicReason::MemoryOverflow)
228
557M
        }
229
557M
230
557M
        if end <= self.stack.len() || start >= self.hp {
231
557M
            Ok(MemoryRange(start..end))
232
        } else {
233
148
            Err(PanicReason::UninitalizedMemoryAccess)
234
        }
235
557M
    }
_RINvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_14MemoryInstance6verifyjjEBa_
Line
Count
Source
218
35.3M
    pub fn verify<A: ToAddr, B: ToAddr>(
219
35.3M
        &self,
220
35.3M
        addr: A,
221
35.3M
        count: B,
222
35.3M
    ) -> Result<MemoryRange, PanicReason> {
223
35.3M
        let start = addr.to_addr()?;
224
35.3M
        let len = count.to_addr()?;
225
35.3M
        let end = start.saturating_add(len);
226
35.3M
        if end > MEM_SIZE {
227
0
            return Err(PanicReason::MemoryOverflow)
228
35.3M
        }
229
35.3M
230
35.3M
        if end <= self.stack.len() || start >= self.hp {
231
35.3M
            Ok(MemoryRange(start..end))
232
        } else {
233
0
            Err(PanicReason::UninitalizedMemoryAccess)
234
        }
235
35.3M
    }
_RINvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_14MemoryInstance6verifyyjEBa_
Line
Count
Source
218
498M
    pub fn verify<A: ToAddr, B: ToAddr>(
219
498M
        &self,
220
498M
        addr: A,
221
498M
        count: B,
222
498M
    ) -> Result<MemoryRange, PanicReason> {
223
498M
        let start = addr.to_addr()?;
224
498M
        let len = count.to_addr()?;
225
498M
        let end = start.saturating_add(len);
226
498M
        if end > MEM_SIZE {
227
39
            return Err(PanicReason::MemoryOverflow)
228
498M
        }
229
498M
230
498M
        if end <= self.stack.len() || start >= self.hp {
231
498M
            Ok(MemoryRange(start..end))
232
        } else {
233
104
            Err(PanicReason::UninitalizedMemoryAccess)
234
        }
235
498M
    }
_RINvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_14MemoryInstance6verifyyyEBa_
Line
Count
Source
218
24.1M
    pub fn verify<A: ToAddr, B: ToAddr>(
219
24.1M
        &self,
220
24.1M
        addr: A,
221
24.1M
        count: B,
222
24.1M
    ) -> Result<MemoryRange, PanicReason> {
223
24.1M
        let start = addr.to_addr()?;
224
24.1M
        let len = count.to_addr()?;
225
24.1M
        let end = start.saturating_add(len);
226
24.1M
        if end > MEM_SIZE {
227
6
            return Err(PanicReason::MemoryOverflow)
228
24.1M
        }
229
24.1M
230
24.1M
        if end <= self.stack.len() || start >= self.hp {
231
24.1M
            Ok(MemoryRange(start..end))
232
        } else {
233
44
            Err(PanicReason::UninitalizedMemoryAccess)
234
        }
235
24.1M
    }
236
237
    /// Verify a constant-sized memory range.
238
0
    pub fn verify_const<A: ToAddr, const C: usize>(
239
0
        &self,
240
0
        addr: A,
241
0
    ) -> Result<MemoryRange, PanicReason> {
242
0
        self.verify(addr, C)
243
0
    }
244
245
    /// Returns a reference to memory for reading, if possible.
246
    #[allow(clippy::arithmetic_side_effects)] // Safety: subtractions are checked
247
488M
    pub fn read<A: ToAddr, C: ToAddr>(
248
488M
        &self,
249
488M
        addr: A,
250
488M
        count: C,
251
488M
    ) -> Result<&[u8], PanicReason> {
252
488M
        let range = self.verify(addr, count)?;
253
254
488M
        if range.end() <= self.stack.len() {
255
488M
            Ok(&self.stack[range.usizes()])
256
181k
        } else if range.start() >= self.heap_offset() {
257
181k
            let start = range.start() - self.heap_offset();
258
181k
            let end = range.end() - self.heap_offset();
259
181k
            Ok(&self.heap[start..end])
260
        } else {
261
0
            unreachable!("Range was verified to be valid")
262
        }
263
488M
    }
_RINvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_14MemoryInstance4readjjEBa_
Line
Count
Source
247
10.4M
    pub fn read<A: ToAddr, C: ToAddr>(
248
10.4M
        &self,
249
10.4M
        addr: A,
250
10.4M
        count: C,
251
10.4M
    ) -> Result<&[u8], PanicReason> {
252
10.4M
        let range = self.verify(addr, count)?;
253
254
10.4M
        if range.end() <= self.stack.len() {
255
10.4M
            Ok(&self.stack[range.usizes()])
256
0
        } else if range.start() >= self.heap_offset() {
257
0
            let start = range.start() - self.heap_offset();
258
0
            let end = range.end() - self.heap_offset();
259
0
            Ok(&self.heap[start..end])
260
        } else {
261
0
            unreachable!("Range was verified to be valid")
262
        }
263
10.4M
    }
_RINvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_14MemoryInstance4readyjEBa_
Line
Count
Source
247
473M
    pub fn read<A: ToAddr, C: ToAddr>(
248
473M
        &self,
249
473M
        addr: A,
250
473M
        count: C,
251
473M
    ) -> Result<&[u8], PanicReason> {
252
473M
        let range = self.verify(addr, count)?;
253
254
473M
        if range.end() <= self.stack.len() {
255
473M
            Ok(&self.stack[range.usizes()])
256
181k
        } else if range.start() >= self.heap_offset() {
257
181k
            let start = range.start() - self.heap_offset();
258
181k
            let end = range.end() - self.heap_offset();
259
181k
            Ok(&self.heap[start..end])
260
        } else {
261
0
            unreachable!("Range was verified to be valid")
262
        }
263
473M
    }
_RINvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_14MemoryInstance4readyyEBa_
Line
Count
Source
247
4.19M
    pub fn read<A: ToAddr, C: ToAddr>(
248
4.19M
        &self,
249
4.19M
        addr: A,
250
4.19M
        count: C,
251
4.19M
    ) -> Result<&[u8], PanicReason> {
252
4.19M
        let range = self.verify(addr, count)?;
253
254
4.19M
        if range.end() <= self.stack.len() {
255
4.19M
            Ok(&self.stack[range.usizes()])
256
0
        } else if range.start() >= self.heap_offset() {
257
0
            let start = range.start() - self.heap_offset();
258
0
            let end = range.end() - self.heap_offset();
259
0
            Ok(&self.heap[start..end])
260
        } else {
261
0
            unreachable!("Range was verified to be valid")
262
        }
263
4.19M
    }
264
265
    /// Reads a constant-sized byte array from memory, if possible.
266
484M
    pub fn read_bytes<A: ToAddr, const C: usize>(
267
484M
        &self,
268
484M
        at: A,
269
484M
    ) -> Result<[u8; C], PanicReason> {
270
484M
        let mut result = [0; C];
271
484M
        result.copy_from_slice(self.read(at, C)?);
272
484M
        Ok(result)
273
484M
    }
_RINvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_14MemoryInstance10read_bytesjKj8_EBa_
Line
Count
Source
266
10.4M
    pub fn read_bytes<A: ToAddr, const C: usize>(
267
10.4M
        &self,
268
10.4M
        at: A,
269
10.4M
    ) -> Result<[u8; C], PanicReason> {
270
10.4M
        let mut result = [0; C];
271
10.4M
        result.copy_from_slice(self.read(at, C)?);
272
10.4M
        Ok(result)
273
10.4M
    }
_RINvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_14MemoryInstance10read_bytesyKj10_EBa_
Line
Count
Source
266
13.6M
    pub fn read_bytes<A: ToAddr, const C: usize>(
267
13.6M
        &self,
268
13.6M
        at: A,
269
13.6M
    ) -> Result<[u8; C], PanicReason> {
270
13.6M
        let mut result = [0; C];
271
13.6M
        result.copy_from_slice(self.read(at, C)?);
272
13.6M
        Ok(result)
273
13.6M
    }
_RINvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_14MemoryInstance10read_bytesyKj1_EBa_
Line
Count
Source
266
735k
    pub fn read_bytes<A: ToAddr, const C: usize>(
267
735k
        &self,
268
735k
        at: A,
269
735k
    ) -> Result<[u8; C], PanicReason> {
270
735k
        let mut result = [0; C];
271
735k
        result.copy_from_slice(self.read(at, C)?);
272
735k
        Ok(result)
273
735k
    }
_RINvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_14MemoryInstance10read_bytesyKj20_EBa_
Line
Count
Source
266
20.1M
    pub fn read_bytes<A: ToAddr, const C: usize>(
267
20.1M
        &self,
268
20.1M
        at: A,
269
20.1M
    ) -> Result<[u8; C], PanicReason> {
270
20.1M
        let mut result = [0; C];
271
20.1M
        result.copy_from_slice(self.read(at, C)?);
272
20.1M
        Ok(result)
273
20.1M
    }
_RINvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_14MemoryInstance10read_bytesyKj40_EBa_
Line
Count
Source
266
27.6k
    pub fn read_bytes<A: ToAddr, const C: usize>(
267
27.6k
        &self,
268
27.6k
        at: A,
269
27.6k
    ) -> Result<[u8; C], PanicReason> {
270
27.6k
        let mut result = [0; C];
271
27.6k
        result.copy_from_slice(self.read(at, C)?);
272
27.6k
        Ok(result)
273
27.6k
    }
_RINvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_14MemoryInstance10read_bytesyKj4_EBa_
Line
Count
Source
266
387M
    pub fn read_bytes<A: ToAddr, const C: usize>(
267
387M
        &self,
268
387M
        at: A,
269
387M
    ) -> Result<[u8; C], PanicReason> {
270
387M
        let mut result = [0; C];
271
387M
        result.copy_from_slice(self.read(at, C)?);
272
387M
        Ok(result)
273
387M
    }
_RINvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_14MemoryInstance10read_bytesyKj8_EBa_
Line
Count
Source
266
51.5M
    pub fn read_bytes<A: ToAddr, const C: usize>(
267
51.5M
        &self,
268
51.5M
        at: A,
269
51.5M
    ) -> Result<[u8; C], PanicReason> {
270
51.5M
        let mut result = [0; C];
271
51.5M
        result.copy_from_slice(self.read(at, C)?);
272
51.5M
        Ok(result)
273
51.5M
    }
274
275
    /// Gets write access to memory, if possible.
276
    /// Doesn't perform any ownership checks.
277
    #[allow(clippy::arithmetic_side_effects)] // Safety: subtractions are checked
278
29.4M
    pub fn write_noownerchecks<A: ToAddr, B: ToAddr>(
279
29.4M
        &mut self,
280
29.4M
        addr: A,
281
29.4M
        len: B,
282
29.4M
    ) -> Result<&mut [u8], PanicReason> {
283
29.4M
        let range = self.verify(addr, len)?;
284
29.4M
        if range.end() <= self.stack.len() {
285
28.6M
            Ok(&mut self.stack[range.usizes()])
286
736k
        } else if range.start() >= self.heap_offset() {
287
736k
            let start = range.start() - self.heap_offset();
288
736k
            let end = range.end() - self.heap_offset();
289
736k
            Ok(&mut self.heap[start..end])
290
        } else {
291
0
            unreachable!("Range was verified to be valid")
292
        }
293
29.4M
    }
_RINvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_14MemoryInstance19write_noownerchecksjjEBa_
Line
Count
Source
278
24.9M
    pub fn write_noownerchecks<A: ToAddr, B: ToAddr>(
279
24.9M
        &mut self,
280
24.9M
        addr: A,
281
24.9M
        len: B,
282
24.9M
    ) -> Result<&mut [u8], PanicReason> {
283
24.9M
        let range = self.verify(addr, len)?;
284
24.9M
        if range.end() <= self.stack.len() {
285
24.1M
            Ok(&mut self.stack[range.usizes()])
286
736k
        } else if range.start() >= self.heap_offset() {
287
736k
            let start = range.start() - self.heap_offset();
288
736k
            let end = range.end() - self.heap_offset();
289
736k
            Ok(&mut self.heap[start..end])
290
        } else {
291
0
            unreachable!("Range was verified to be valid")
292
        }
293
24.9M
    }
_RINvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_14MemoryInstance19write_noownerchecksyjEBa_
Line
Count
Source
278
31.5k
    pub fn write_noownerchecks<A: ToAddr, B: ToAddr>(
279
31.5k
        &mut self,
280
31.5k
        addr: A,
281
31.5k
        len: B,
282
31.5k
    ) -> Result<&mut [u8], PanicReason> {
283
31.5k
        let range = self.verify(addr, len)?;
284
31.5k
        if range.end() <= self.stack.len() {
285
31.5k
            Ok(&mut self.stack[range.usizes()])
286
0
        } else if range.start() >= self.heap_offset() {
287
0
            let start = range.start() - self.heap_offset();
288
0
            let end = range.end() - self.heap_offset();
289
0
            Ok(&mut self.heap[start..end])
290
        } else {
291
0
            unreachable!("Range was verified to be valid")
292
        }
293
31.5k
    }
_RINvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_14MemoryInstance19write_noownerchecksyyEBa_
Line
Count
Source
278
4.46M
    pub fn write_noownerchecks<A: ToAddr, B: ToAddr>(
279
4.46M
        &mut self,
280
4.46M
        addr: A,
281
4.46M
        len: B,
282
4.46M
    ) -> Result<&mut [u8], PanicReason> {
283
4.46M
        let range = self.verify(addr, len)?;
284
4.46M
        if range.end() <= self.stack.len() {
285
4.46M
            Ok(&mut self.stack[range.usizes()])
286
0
        } else if range.start() >= self.heap_offset() {
287
0
            let start = range.start() - self.heap_offset();
288
0
            let end = range.end() - self.heap_offset();
289
0
            Ok(&mut self.heap[start..end])
290
        } else {
291
0
            unreachable!("Range was verified to be valid")
292
        }
293
4.46M
    }
294
295
    /// Writes a constant-sized byte array to memory, if possible.
296
    /// Doesn't perform any ownership checks.
297
103k
    pub fn write_bytes_noownerchecks<A: ToAddr, const C: usize>(
298
103k
        &mut self,
299
103k
        addr: A,
300
103k
        data: [u8; C],
301
103k
    ) -> Result<(), PanicReason> {
302
103k
        self.write_noownerchecks(addr, C)?.copy_from_slice(&data);
303
103k
        Ok(())
304
103k
    }
_RINvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_14MemoryInstance25write_bytes_noownerchecksjKj20_EBa_
Line
Count
Source
297
6.57k
    pub fn write_bytes_noownerchecks<A: ToAddr, const C: usize>(
298
6.57k
        &mut self,
299
6.57k
        addr: A,
300
6.57k
        data: [u8; C],
301
6.57k
    ) -> Result<(), PanicReason> {
302
6.57k
        self.write_noownerchecks(addr, C)?.copy_from_slice(&data);
303
6.57k
        Ok(())
304
6.57k
    }
_RINvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_14MemoryInstance25write_bytes_noownerchecksjKj8_EBa_
Line
Count
Source
297
95.3k
    pub fn write_bytes_noownerchecks<A: ToAddr, const C: usize>(
298
95.3k
        &mut self,
299
95.3k
        addr: A,
300
95.3k
        data: [u8; C],
301
95.3k
    ) -> Result<(), PanicReason> {
302
95.3k
        self.write_noownerchecks(addr, C)?.copy_from_slice(&data);
303
95.3k
        Ok(())
304
95.3k
    }
_RINvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_14MemoryInstance25write_bytes_noownerchecksyKj8_EBa_
Line
Count
Source
297
1.67k
    pub fn write_bytes_noownerchecks<A: ToAddr, const C: usize>(
298
1.67k
        &mut self,
299
1.67k
        addr: A,
300
1.67k
        data: [u8; C],
301
1.67k
    ) -> Result<(), PanicReason> {
302
1.67k
        self.write_noownerchecks(addr, C)?.copy_from_slice(&data);
303
1.67k
        Ok(())
304
1.67k
    }
305
306
    /// Checks that memory is writable and returns a mutable slice to it.
307
24.8M
    pub fn write<A: ToAddr, C: ToAddr>(
308
24.8M
        &mut self,
309
24.8M
        owner: OwnershipRegisters,
310
24.8M
        addr: A,
311
24.8M
        len: C,
312
24.8M
    ) -> Result<&mut [u8], PanicReason> {
313
24.8M
        let range = self.verify(addr, len)?;
314
24.8M
        owner.verify_ownership(&range)?;
315
24.8M
        self.write_noownerchecks(range.start(), range.len())
316
24.8M
    }
_RINvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_14MemoryInstance5writeyjEBa_
Line
Count
Source
307
24.1M
    pub fn write<A: ToAddr, C: ToAddr>(
308
24.1M
        &mut self,
309
24.1M
        owner: OwnershipRegisters,
310
24.1M
        addr: A,
311
24.1M
        len: C,
312
24.1M
    ) -> Result<&mut [u8], PanicReason> {
313
24.1M
        let range = self.verify(addr, len)?;
314
24.1M
        owner.verify_ownership(&range)?;
315
24.1M
        self.write_noownerchecks(range.start(), range.len())
316
24.1M
    }
_RINvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_14MemoryInstance5writeyyEBa_
Line
Count
Source
307
631k
    pub fn write<A: ToAddr, C: ToAddr>(
308
631k
        &mut self,
309
631k
        owner: OwnershipRegisters,
310
631k
        addr: A,
311
631k
        len: C,
312
631k
    ) -> Result<&mut [u8], PanicReason> {
313
631k
        let range = self.verify(addr, len)?;
314
631k
        owner.verify_ownership(&range)?;
315
631k
        self.write_noownerchecks(range.start(), range.len())
316
631k
    }
317
318
    /// Writes a constant-sized byte array to memory, checking for ownership.
319
24.1M
    pub fn write_bytes<A: ToAddr, const C: usize>(
320
24.1M
        &mut self,
321
24.1M
        owner: OwnershipRegisters,
322
24.1M
        addr: A,
323
24.1M
        data: [u8; C],
324
24.1M
    ) -> Result<(), PanicReason> {
325
24.1M
        self.write(owner, addr, data.len())?.copy_from_slice(&data);
326
24.1M
        Ok(())
327
24.1M
    }
_RINvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_14MemoryInstance11write_bytesyKj10_EBa_
Line
Count
Source
319
4.19M
    pub fn write_bytes<A: ToAddr, const C: usize>(
320
4.19M
        &mut self,
321
4.19M
        owner: OwnershipRegisters,
322
4.19M
        addr: A,
323
4.19M
        data: [u8; C],
324
4.19M
    ) -> Result<(), PanicReason> {
325
4.19M
        self.write(owner, addr, data.len())?.copy_from_slice(&data);
326
4.19M
        Ok(())
327
4.19M
    }
_RINvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_14MemoryInstance11write_bytesyKj1_EBa_
Line
Count
Source
319
164k
    pub fn write_bytes<A: ToAddr, const C: usize>(
320
164k
        &mut self,
321
164k
        owner: OwnershipRegisters,
322
164k
        addr: A,
323
164k
        data: [u8; C],
324
164k
    ) -> Result<(), PanicReason> {
325
164k
        self.write(owner, addr, data.len())?.copy_from_slice(&data);
326
164k
        Ok(())
327
164k
    }
_RINvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_14MemoryInstance11write_bytesyKj20_EBa_
Line
Count
Source
319
6.88M
    pub fn write_bytes<A: ToAddr, const C: usize>(
320
6.88M
        &mut self,
321
6.88M
        owner: OwnershipRegisters,
322
6.88M
        addr: A,
323
6.88M
        data: [u8; C],
324
6.88M
    ) -> Result<(), PanicReason> {
325
6.88M
        self.write(owner, addr, data.len())?.copy_from_slice(&data);
326
6.88M
        Ok(())
327
6.88M
    }
_RINvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_14MemoryInstance11write_bytesyKj40_EBa_
Line
Count
Source
319
15.6k
    pub fn write_bytes<A: ToAddr, const C: usize>(
320
15.6k
        &mut self,
321
15.6k
        owner: OwnershipRegisters,
322
15.6k
        addr: A,
323
15.6k
        data: [u8; C],
324
15.6k
    ) -> Result<(), PanicReason> {
325
15.6k
        self.write(owner, addr, data.len())?.copy_from_slice(&data);
326
15.6k
        Ok(())
327
15.6k
    }
_RINvMs4_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_14MemoryInstance11write_bytesyKj8_EBa_
Line
Count
Source
319
12.9M
    pub fn write_bytes<A: ToAddr, const C: usize>(
320
12.9M
        &mut self,
321
12.9M
        owner: OwnershipRegisters,
322
12.9M
        addr: A,
323
12.9M
        data: [u8; C],
324
12.9M
    ) -> Result<(), PanicReason> {
325
12.9M
        self.write(owner, addr, data.len())?.copy_from_slice(&data);
326
12.9M
        Ok(())
327
12.9M
    }
328
329
    /// Copies the memory from `src` to `dst` verifying ownership.
330
    #[inline]
331
    #[track_caller]
332
7.45M
    pub fn memcopy(
333
7.45M
        &mut self,
334
7.45M
        dst: Word,
335
7.45M
        src: Word,
336
7.45M
        length: Word,
337
7.45M
        owner: OwnershipRegisters,
338
7.45M
    ) -> Result<(), PanicReason> {
339
7.45M
        let dst_range = self.verify(dst, length)?;
340
7.45M
        let src_range = self.verify(src, length)?;
341
342
7.45M
        if dst_range.start() <= src_range.start() && src_range.start() < dst_range.end()
343
7.45M
            || src_range.start() <= dst_range.start()
344
5.59M
                && dst_range.start() < src_range.end()
345
7.45M
            || dst_range.start() < src_range.end() && src_range.end() <= dst_range.end()
346
7.45M
            || src_range.start() < dst_range.end() && dst_range.end() <= src_range.end()
347
        {
348
7
            return Err(PanicReason::MemoryWriteOverlap)
349
7.45M
        }
350
7.45M
351
7.45M
        owner.verify_ownership(&dst_range)?;
352
353
7.45M
        if src_range.end() <= self.stack.len() {
354
7.36M
            if dst_range.end() <= self.stack.len() {
355
7.36M
                self.stack
356
7.36M
                    .copy_within(src_range.usizes(), dst_range.start());
357
7.36M
            } else if dst_range.start() >= self.heap_offset() {
358
7.06k
                #[allow(clippy::arithmetic_side_effects)]
359
7.06k
                // Safety: subtractions are checked above
360
7.06k
                let dst_start = dst_range.start() - self.heap_offset();
361
7.06k
                #[allow(clippy::arithmetic_side_effects)]
362
7.06k
                // Safety: subtractions are checked above
363
7.06k
                let dst_end = dst_range.end() - self.heap_offset();
364
7.06k
365
7.06k
                let src_array = &self.stack[src_range.usizes()];
366
7.06k
                let dst_array = &mut self.heap[dst_start..dst_end];
367
7.06k
                dst_array.copy_from_slice(src_array);
368
7.06k
            } else {
369
0
                unreachable!("Range was verified to be valid")
370
            }
371
83.8k
        } else if src_range.start() >= self.heap_offset() {
372
            #[allow(clippy::arithmetic_side_effects)]
373
            // Safety: subtractions are checked above
374
83.8k
            let src_start = src_range.start() - self.heap_offset();
375
83.8k
            #[allow(clippy::arithmetic_side_effects)]
376
83.8k
            // Safety: subtractions are checked above
377
83.8k
            let src_end = src_range.end() - self.heap_offset();
378
83.8k
379
83.8k
            if dst_range.end() <= self.stack.len() {
380
2.00k
                let src_array = &self.heap[src_start..src_end];
381
2.00k
382
2.00k
                let dst_array = &mut self.stack[dst_range.usizes()];
383
2.00k
                dst_array.copy_from_slice(src_array);
384
81.8k
            } else if dst_range.start() >= self.heap_offset() {
385
81.8k
                #[allow(clippy::arithmetic_side_effects)]
386
81.8k
                // Safety: subtractions are checked above
387
81.8k
                let dst_start = dst_range.start() - self.heap_offset();
388
81.8k
389
81.8k
                self.heap.copy_within(src_start..src_end, dst_start);
390
81.8k
            } else {
391
0
                unreachable!("Range was verified to be valid")
392
            }
393
        } else {
394
0
            unreachable!("Range was verified to be valid")
395
        }
396
397
7.45M
        Ok(())
398
7.45M
    }
399
400
    /// Memory access to the raw stack buffer.
401
    /// Note that for efficiency reasons this might not match sp value.
402
    #[cfg(any(test, feature = "test-helpers"))]
403
0
    pub fn stack_raw(&self) -> &[u8] {
404
0
        &self.stack
405
0
    }
406
407
    /// Memory access to the raw heap buffer.
408
    /// Note that for efficiency reasons this might not match hp value.
409
    #[cfg(any(test, feature = "test-helpers"))]
410
0
    pub fn heap_raw(&self) -> &[u8] {
411
0
        &self.heap
412
0
    }
413
}
414
415
#[cfg(feature = "test-helpers")]
416
impl From<Vec<u8>> for MemoryInstance {
417
0
    fn from(stack: Vec<u8>) -> Self {
418
0
        Self {
419
0
            stack,
420
0
            ..Self::new()
421
0
        }
422
0
    }
423
}
424
425
#[cfg(any(test, feature = "test-helpers"))]
426
impl Index<Range<usize>> for MemoryInstance {
427
    type Output = [u8];
428
429
0
    fn index(&self, index: Range<usize>) -> &Self::Output {
430
0
        self.read(index.start, index.len())
431
0
            .expect("Memory range out of bounds")
432
0
    }
433
}
434
435
#[cfg(any(test, feature = "test-helpers"))]
436
impl Index<RangeFrom<usize>> for MemoryInstance {
437
    type Output = [u8];
438
439
0
    fn index(&self, index: RangeFrom<usize>) -> &Self::Output {
440
0
        &self[index.start..MEM_SIZE]
441
0
    }
442
}
443
444
#[cfg(any(test, feature = "test-helpers"))]
445
impl Index<RangeTo<usize>> for MemoryInstance {
446
    type Output = [u8];
447
448
0
    fn index(&self, index: RangeTo<usize>) -> &Self::Output {
449
0
        &self[0..index.end]
450
0
    }
451
}
452
453
#[cfg(any(test, feature = "test-helpers"))]
454
impl IndexMut<Range<usize>> for MemoryInstance {
455
0
    fn index_mut(&mut self, index: Range<usize>) -> &mut Self::Output {
456
0
        self.write_noownerchecks(index.start, index.len())
457
0
            .expect("Memory range out of bounds")
458
0
    }
459
}
460
461
/// Used to handle `Word` to `usize` conversions for memory addresses,
462
/// as well as checking that the resulting value is withing the VM ram boundaries.
463
pub trait ToAddr {
464
    /// Converts a value to `usize` used for memory addresses.
465
    /// Returns `Err` with `MemoryOverflow` if the resulting value does't fit in the VM
466
    /// memory. This can be used for both addresses and offsets.
467
    fn to_addr(self) -> Result<usize, PanicReason>;
468
}
469
470
impl ToAddr for usize {
471
1.11G
    fn to_addr(self) -> Result<usize, PanicReason> {
472
1.11G
        if self > MEM_SIZE {
473
84
            return Err(PanicReason::MemoryOverflow)
474
1.11G
        }
475
1.11G
        Ok(self)
476
1.11G
    }
477
}
478
479
impl ToAddr for Word {
480
546M
    fn to_addr(self) -> Result<usize, PanicReason> {
481
546M
        let value = usize::try_from(self).map_err(|_| PanicReason::MemoryOverflow)?;
482
546M
        value.to_addr()
483
546M
    }
484
}
485
486
#[cfg(feature = "test-helpers")]
487
/// Implemented for `i32` to allow integer literals. Panics on negative values.
488
impl ToAddr for i32 {
489
0
    fn to_addr(self) -> Result<usize, PanicReason> {
490
0
        if self < 0 {
491
0
            panic!("Negative memory address");
492
0
        }
493
0
        let value = usize::try_from(self).map_err(|_| PanicReason::MemoryOverflow)?;
494
0
        value.to_addr()
495
0
    }
496
}
497
498
/// A range of memory. No guarantees are made about validity of access.
499
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
500
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
501
pub struct MemoryRange(Range<usize>);
502
503
impl MemoryRange {
504
    /// Create a new memory range. Cannot panic, but the range may be invalid.
505
0
    pub const fn new(start: usize, len: usize) -> Self {
506
0
        Self(start..start.saturating_add(len))
507
0
    }
508
509
    /// Start of the range.
510
86.5M
    pub fn start(&self) -> usize {
511
86.5M
        self.0.start
512
86.5M
    }
513
514
    /// End of the range. One past the last byte.
515
571M
    pub fn end(&self) -> usize {
516
571M
        self.0.end
517
571M
    }
518
519
    /// Is the range empty?
520
0
    pub fn is_empty(&self) -> bool {
521
0
        self.len() == 0
522
0
    }
523
524
    /// Length of the range.
525
24.8M
    pub fn len(&self) -> usize {
526
24.8M
        self.0.len()
527
24.8M
    }
528
529
    /// Returns the range as a `usize` range.
530
524M
    pub fn usizes(&self) -> Range<usize> {
531
524M
        self.0.clone()
532
524M
    }
533
534
    /// Returns the range as a `Word` range.
535
32.2M
    pub fn words(&self) -> Range<Word> {
536
32.2M
        self.0.start as Word..self.0.end as Word
537
32.2M
    }
538
539
    /// Splits range at given relative offset. Panics if offset > range length.
540
0
    pub fn split_at_offset(self, at: usize) -> (Self, Self) {
541
0
        let mid = self.0.start.saturating_add(at);
542
0
        assert!(mid <= self.0.end);
543
0
        (Self(self.0.start..mid), Self(mid..self.0.end))
544
0
    }
545
}
546
547
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
548
where
549
    M: Memory,
550
{
551
    /// Return the registers used to determine ownership.
552
31.8M
    pub(crate) fn ownership_registers(&self) -> OwnershipRegisters {
553
31.8M
        OwnershipRegisters::new(self)
554
31.8M
    }
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEE19ownership_registersB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEE19ownership_registersB9_
_RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEE19ownership_registersB9_
Line
Count
Source
552
31.8M
    pub(crate) fn ownership_registers(&self) -> OwnershipRegisters {
553
31.8M
        OwnershipRegisters::new(self)
554
31.8M
    }
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_4blob8BlobBodyNtB4b_12BlobMetadataEE19ownership_registersB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6create10CreateBodyNtB4b_14CreateMetadataEE19ownership_registersB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6script10ScriptBodyNtB4b_14ScriptMetadataEE19ownership_registersB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6upload10UploadBodyNtB4b_14UploadMetadataEE19ownership_registersB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_7upgrade11UpgradeBodyNtB4b_15UpgradeMetadataEE19ownership_registersB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtNtB1z_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6script10ScriptBodyNtB4l_14ScriptMetadataEE19ownership_registersB9_
555
556
17.4M
    pub(crate) fn stack_pointer_overflow<F>(&mut self, f: F, v: Word) -> SimpleResult<()>
557
17.4M
    where
558
17.4M
        F: FnOnce(Word, Word) -> (Word, bool),
559
17.4M
    {
560
17.4M
        let (
561
17.4M
            SystemRegisters {
562
17.4M
                sp, ssp, hp, pc, ..
563
17.4M
            },
564
17.4M
            _,
565
17.4M
        ) = split_registers(&mut self.registers);
566
17.4M
        stack_pointer_overflow(
567
17.4M
            sp,
568
17.4M
            ssp.as_ref(),
569
17.4M
            hp.as_ref(),
570
17.4M
            pc,
571
17.4M
            f,
572
17.4M
            v,
573
17.4M
            self.memory.as_mut(),
574
17.4M
        )
575
17.4M
    }
Unexecuted instantiation: _RINvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB8_11InterpreterNtB6_14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2c_4blob8BlobBodyNtB3I_12BlobMetadataEE22stack_pointer_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_addEBa_
Unexecuted instantiation: _RINvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB8_11InterpreterNtB6_14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2c_4blob8BlobBodyNtB3I_12BlobMetadataEE22stack_pointer_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_subEBa_
Unexecuted instantiation: _RINvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB8_11InterpreterNtB6_14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2c_6create10CreateBodyNtB3I_14CreateMetadataEE22stack_pointer_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_addEBa_
Unexecuted instantiation: _RINvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB8_11InterpreterNtB6_14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2c_6create10CreateBodyNtB3I_14CreateMetadataEE22stack_pointer_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_subEBa_
_RINvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB8_11InterpreterNtB6_14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2c_6script10ScriptBodyNtB3I_14ScriptMetadataEE22stack_pointer_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_addEBa_
Line
Count
Source
556
15.2M
    pub(crate) fn stack_pointer_overflow<F>(&mut self, f: F, v: Word) -> SimpleResult<()>
557
15.2M
    where
558
15.2M
        F: FnOnce(Word, Word) -> (Word, bool),
559
15.2M
    {
560
15.2M
        let (
561
15.2M
            SystemRegisters {
562
15.2M
                sp, ssp, hp, pc, ..
563
15.2M
            },
564
15.2M
            _,
565
15.2M
        ) = split_registers(&mut self.registers);
566
15.2M
        stack_pointer_overflow(
567
15.2M
            sp,
568
15.2M
            ssp.as_ref(),
569
15.2M
            hp.as_ref(),
570
15.2M
            pc,
571
15.2M
            f,
572
15.2M
            v,
573
15.2M
            self.memory.as_mut(),
574
15.2M
        )
575
15.2M
    }
_RINvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB8_11InterpreterNtB6_14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2c_6script10ScriptBodyNtB3I_14ScriptMetadataEE22stack_pointer_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_subEBa_
Line
Count
Source
556
2.16M
    pub(crate) fn stack_pointer_overflow<F>(&mut self, f: F, v: Word) -> SimpleResult<()>
557
2.16M
    where
558
2.16M
        F: FnOnce(Word, Word) -> (Word, bool),
559
2.16M
    {
560
2.16M
        let (
561
2.16M
            SystemRegisters {
562
2.16M
                sp, ssp, hp, pc, ..
563
2.16M
            },
564
2.16M
            _,
565
2.16M
        ) = split_registers(&mut self.registers);
566
2.16M
        stack_pointer_overflow(
567
2.16M
            sp,
568
2.16M
            ssp.as_ref(),
569
2.16M
            hp.as_ref(),
570
2.16M
            pc,
571
2.16M
            f,
572
2.16M
            v,
573
2.16M
            self.memory.as_mut(),
574
2.16M
        )
575
2.16M
    }
Unexecuted instantiation: _RINvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB8_11InterpreterQNtB6_14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1y_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2G_4blob8BlobBodyNtB4c_12BlobMetadataEE22stack_pointer_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_addEBa_
Unexecuted instantiation: _RINvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB8_11InterpreterQNtB6_14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1y_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2G_4blob8BlobBodyNtB4c_12BlobMetadataEE22stack_pointer_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_subEBa_
Unexecuted instantiation: _RINvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB8_11InterpreterQNtB6_14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1y_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2G_6create10CreateBodyNtB4c_14CreateMetadataEE22stack_pointer_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_addEBa_
Unexecuted instantiation: _RINvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB8_11InterpreterQNtB6_14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1y_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2G_6create10CreateBodyNtB4c_14CreateMetadataEE22stack_pointer_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_subEBa_
Unexecuted instantiation: _RINvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB8_11InterpreterQNtB6_14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1y_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2G_6script10ScriptBodyNtB4c_14ScriptMetadataEE22stack_pointer_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_addEBa_
Unexecuted instantiation: _RINvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB8_11InterpreterQNtB6_14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1y_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2G_6script10ScriptBodyNtB4c_14ScriptMetadataEE22stack_pointer_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_subEBa_
Unexecuted instantiation: _RINvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB8_11InterpreterQNtB6_14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1y_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2G_6upload10UploadBodyNtB4c_14UploadMetadataEE22stack_pointer_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_addEBa_
Unexecuted instantiation: _RINvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB8_11InterpreterQNtB6_14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1y_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2G_6upload10UploadBodyNtB4c_14UploadMetadataEE22stack_pointer_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_subEBa_
Unexecuted instantiation: _RINvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB8_11InterpreterQNtB6_14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1y_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2G_7upgrade11UpgradeBodyNtB4c_15UpgradeMetadataEE22stack_pointer_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_addEBa_
Unexecuted instantiation: _RINvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB8_11InterpreterQNtB6_14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1y_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2G_7upgrade11UpgradeBodyNtB4c_15UpgradeMetadataEE22stack_pointer_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_subEBa_
Unexecuted instantiation: _RINvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB8_11InterpreterQNtB6_14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtNtB1A_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6script10ScriptBodyNtB4m_14ScriptMetadataEE22stack_pointer_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_addEBa_
Unexecuted instantiation: _RINvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB8_11InterpreterQNtB6_14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtNtB1A_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6script10ScriptBodyNtB4m_14ScriptMetadataEE22stack_pointer_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_subEBa_
576
577
4.46M
    pub(crate) fn push_selected_registers(
578
4.46M
        &mut self,
579
4.46M
        segment: ProgramRegistersSegment,
580
4.46M
        bitmask: Imm24,
581
4.46M
    ) -> SimpleResult<()> {
582
4.46M
        let (
583
4.46M
            SystemRegisters {
584
4.46M
                sp, ssp, hp, pc, ..
585
4.46M
            },
586
4.46M
            program_regs,
587
4.46M
        ) = split_registers(&mut self.registers);
588
4.46M
        push_selected_registers(
589
4.46M
            self.memory.as_mut(),
590
4.46M
            sp,
591
4.46M
            ssp.as_ref(),
592
4.46M
            hp.as_ref(),
593
4.46M
            pc,
594
4.46M
            &program_regs,
595
4.46M
            segment,
596
4.46M
            bitmask,
597
4.46M
        )
598
4.46M
    }
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEE23push_selected_registersB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEE23push_selected_registersB9_
_RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEE23push_selected_registersB9_
Line
Count
Source
577
4.46M
    pub(crate) fn push_selected_registers(
578
4.46M
        &mut self,
579
4.46M
        segment: ProgramRegistersSegment,
580
4.46M
        bitmask: Imm24,
581
4.46M
    ) -> SimpleResult<()> {
582
4.46M
        let (
583
4.46M
            SystemRegisters {
584
4.46M
                sp, ssp, hp, pc, ..
585
4.46M
            },
586
4.46M
            program_regs,
587
4.46M
        ) = split_registers(&mut self.registers);
588
4.46M
        push_selected_registers(
589
4.46M
            self.memory.as_mut(),
590
4.46M
            sp,
591
4.46M
            ssp.as_ref(),
592
4.46M
            hp.as_ref(),
593
4.46M
            pc,
594
4.46M
            &program_regs,
595
4.46M
            segment,
596
4.46M
            bitmask,
597
4.46M
        )
598
4.46M
    }
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_4blob8BlobBodyNtB4b_12BlobMetadataEE23push_selected_registersB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6create10CreateBodyNtB4b_14CreateMetadataEE23push_selected_registersB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6script10ScriptBodyNtB4b_14ScriptMetadataEE23push_selected_registersB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6upload10UploadBodyNtB4b_14UploadMetadataEE23push_selected_registersB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_7upgrade11UpgradeBodyNtB4b_15UpgradeMetadataEE23push_selected_registersB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtNtB1z_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6script10ScriptBodyNtB4l_14ScriptMetadataEE23push_selected_registersB9_
599
600
436k
    pub(crate) fn pop_selected_registers(
601
436k
        &mut self,
602
436k
        segment: ProgramRegistersSegment,
603
436k
        bitmask: Imm24,
604
436k
    ) -> SimpleResult<()> {
605
436k
        let (
606
436k
            SystemRegisters {
607
436k
                sp, ssp, hp, pc, ..
608
436k
            },
609
436k
            mut program_regs,
610
436k
        ) = split_registers(&mut self.registers);
611
436k
        pop_selected_registers(
612
436k
            self.memory.as_mut(),
613
436k
            sp,
614
436k
            ssp.as_ref(),
615
436k
            hp.as_ref(),
616
436k
            pc,
617
436k
            &mut program_regs,
618
436k
            segment,
619
436k
            bitmask,
620
436k
        )
621
436k
    }
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEE22pop_selected_registersB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEE22pop_selected_registersB9_
_RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEE22pop_selected_registersB9_
Line
Count
Source
600
436k
    pub(crate) fn pop_selected_registers(
601
436k
        &mut self,
602
436k
        segment: ProgramRegistersSegment,
603
436k
        bitmask: Imm24,
604
436k
    ) -> SimpleResult<()> {
605
436k
        let (
606
436k
            SystemRegisters {
607
436k
                sp, ssp, hp, pc, ..
608
436k
            },
609
436k
            mut program_regs,
610
436k
        ) = split_registers(&mut self.registers);
611
436k
        pop_selected_registers(
612
436k
            self.memory.as_mut(),
613
436k
            sp,
614
436k
            ssp.as_ref(),
615
436k
            hp.as_ref(),
616
436k
            pc,
617
436k
            &mut program_regs,
618
436k
            segment,
619
436k
            bitmask,
620
436k
        )
621
436k
    }
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_4blob8BlobBodyNtB4b_12BlobMetadataEE22pop_selected_registersB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6create10CreateBodyNtB4b_14CreateMetadataEE22pop_selected_registersB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6script10ScriptBodyNtB4b_14ScriptMetadataEE22pop_selected_registersB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6upload10UploadBodyNtB4b_14UploadMetadataEE22pop_selected_registersB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_7upgrade11UpgradeBodyNtB4b_15UpgradeMetadataEE22pop_selected_registersB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtNtB1z_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6script10ScriptBodyNtB4l_14ScriptMetadataEE22pop_selected_registersB9_
622
623
735k
    pub(crate) fn load_byte(
624
735k
        &mut self,
625
735k
        ra: RegisterId,
626
735k
        b: Word,
627
735k
        c: Word,
628
735k
    ) -> SimpleResult<()> {
629
735k
        let (SystemRegisters { pc, .. }, mut w) = split_registers(&mut self.registers);
630
735k
        let result = &mut w[WriteRegKey::try_from(ra)?];
631
735k
        load_byte(self.memory.as_ref(), pc, result, b, c)
632
735k
    }
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEE9load_byteB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEE9load_byteB9_
_RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEE9load_byteB9_
Line
Count
Source
623
735k
    pub(crate) fn load_byte(
624
735k
        &mut self,
625
735k
        ra: RegisterId,
626
735k
        b: Word,
627
735k
        c: Word,
628
735k
    ) -> SimpleResult<()> {
629
735k
        let (SystemRegisters { pc, .. }, mut w) = split_registers(&mut self.registers);
630
735k
        let result = &mut w[WriteRegKey::try_from(ra)?];
631
735k
        load_byte(self.memory.as_ref(), pc, result, b, c)
632
735k
    }
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_4blob8BlobBodyNtB4b_12BlobMetadataEE9load_byteB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6create10CreateBodyNtB4b_14CreateMetadataEE9load_byteB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6script10ScriptBodyNtB4b_14ScriptMetadataEE9load_byteB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6upload10UploadBodyNtB4b_14UploadMetadataEE9load_byteB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_7upgrade11UpgradeBodyNtB4b_15UpgradeMetadataEE9load_byteB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtNtB1z_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6script10ScriptBodyNtB4l_14ScriptMetadataEE9load_byteB9_
633
634
51.5M
    pub(crate) fn load_word(
635
51.5M
        &mut self,
636
51.5M
        ra: RegisterId,
637
51.5M
        b: Word,
638
51.5M
        c: Imm12,
639
51.5M
    ) -> SimpleResult<()> {
640
51.5M
        let (SystemRegisters { pc, .. }, mut w) = split_registers(&mut self.registers);
641
51.5M
        let result = &mut w[WriteRegKey::try_from(ra)?];
642
51.5M
        load_word(self.memory.as_ref(), pc, result, b, c)
643
51.5M
    }
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEE9load_wordB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEE9load_wordB9_
_RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEE9load_wordB9_
Line
Count
Source
634
51.5M
    pub(crate) fn load_word(
635
51.5M
        &mut self,
636
51.5M
        ra: RegisterId,
637
51.5M
        b: Word,
638
51.5M
        c: Imm12,
639
51.5M
    ) -> SimpleResult<()> {
640
51.5M
        let (SystemRegisters { pc, .. }, mut w) = split_registers(&mut self.registers);
641
51.5M
        let result = &mut w[WriteRegKey::try_from(ra)?];
642
51.5M
        load_word(self.memory.as_ref(), pc, result, b, c)
643
51.5M
    }
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_4blob8BlobBodyNtB4b_12BlobMetadataEE9load_wordB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6create10CreateBodyNtB4b_14CreateMetadataEE9load_wordB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6script10ScriptBodyNtB4b_14ScriptMetadataEE9load_wordB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6upload10UploadBodyNtB4b_14UploadMetadataEE9load_wordB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_7upgrade11UpgradeBodyNtB4b_15UpgradeMetadataEE9load_wordB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtNtB1z_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6script10ScriptBodyNtB4l_14ScriptMetadataEE9load_wordB9_
644
645
164k
    pub(crate) fn store_byte(&mut self, a: Word, b: Word, c: Word) -> SimpleResult<()> {
646
164k
        let owner = self.ownership_registers();
647
164k
        store_byte(
648
164k
            self.memory.as_mut(),
649
164k
            owner,
650
164k
            self.registers.pc_mut(),
651
164k
            a,
652
164k
            b,
653
164k
            c,
654
164k
        )
655
164k
    }
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEE10store_byteB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEE10store_byteB9_
_RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEE10store_byteB9_
Line
Count
Source
645
164k
    pub(crate) fn store_byte(&mut self, a: Word, b: Word, c: Word) -> SimpleResult<()> {
646
164k
        let owner = self.ownership_registers();
647
164k
        store_byte(
648
164k
            self.memory.as_mut(),
649
164k
            owner,
650
164k
            self.registers.pc_mut(),
651
164k
            a,
652
164k
            b,
653
164k
            c,
654
164k
        )
655
164k
    }
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_4blob8BlobBodyNtB4b_12BlobMetadataEE10store_byteB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6create10CreateBodyNtB4b_14CreateMetadataEE10store_byteB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6script10ScriptBodyNtB4b_14ScriptMetadataEE10store_byteB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6upload10UploadBodyNtB4b_14UploadMetadataEE10store_byteB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_7upgrade11UpgradeBodyNtB4b_15UpgradeMetadataEE10store_byteB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtNtB1z_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6script10ScriptBodyNtB4l_14ScriptMetadataEE10store_byteB9_
656
657
12.9M
    pub(crate) fn store_word(&mut self, a: Word, b: Word, c: Imm12) -> SimpleResult<()> {
658
12.9M
        let owner = self.ownership_registers();
659
12.9M
        store_word(
660
12.9M
            self.memory.as_mut(),
661
12.9M
            owner,
662
12.9M
            self.registers.pc_mut(),
663
12.9M
            a,
664
12.9M
            b,
665
12.9M
            c,
666
12.9M
        )
667
12.9M
    }
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEE10store_wordB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEE10store_wordB9_
_RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEE10store_wordB9_
Line
Count
Source
657
12.9M
    pub(crate) fn store_word(&mut self, a: Word, b: Word, c: Imm12) -> SimpleResult<()> {
658
12.9M
        let owner = self.ownership_registers();
659
12.9M
        store_word(
660
12.9M
            self.memory.as_mut(),
661
12.9M
            owner,
662
12.9M
            self.registers.pc_mut(),
663
12.9M
            a,
664
12.9M
            b,
665
12.9M
            c,
666
12.9M
        )
667
12.9M
    }
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_4blob8BlobBodyNtB4b_12BlobMetadataEE10store_wordB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6create10CreateBodyNtB4b_14CreateMetadataEE10store_wordB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6script10ScriptBodyNtB4b_14ScriptMetadataEE10store_wordB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6upload10UploadBodyNtB4b_14UploadMetadataEE10store_wordB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_7upgrade11UpgradeBodyNtB4b_15UpgradeMetadataEE10store_wordB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtNtB1z_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6script10ScriptBodyNtB4l_14ScriptMetadataEE10store_wordB9_
668
669
    /// Expand heap by `amount` bytes.
670
0
    pub fn allocate(&mut self, amount: Word) -> SimpleResult<()> {
671
0
        let (SystemRegisters { hp, sp, .. }, _) = split_registers(&mut self.registers);
672
0
        self.memory.as_mut().grow_heap_by(sp.as_ref(), hp, amount)?;
673
0
        Ok(())
674
0
    }
675
676
898k
    pub(crate) fn malloc(&mut self, a: Word) -> SimpleResult<()> {
677
898k
        let (SystemRegisters { hp, sp, pc, .. }, _) =
678
898k
            split_registers(&mut self.registers);
679
898k
        malloc(hp, sp.as_ref(), pc, a, self.memory.as_mut())
680
898k
    }
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEE6mallocB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEE6mallocB9_
_RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEE6mallocB9_
Line
Count
Source
676
898k
    pub(crate) fn malloc(&mut self, a: Word) -> SimpleResult<()> {
677
898k
        let (SystemRegisters { hp, sp, pc, .. }, _) =
678
898k
            split_registers(&mut self.registers);
679
898k
        malloc(hp, sp.as_ref(), pc, a, self.memory.as_mut())
680
898k
    }
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_4blob8BlobBodyNtB4b_12BlobMetadataEE6mallocB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6create10CreateBodyNtB4b_14CreateMetadataEE6mallocB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6script10ScriptBodyNtB4b_14ScriptMetadataEE6mallocB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6upload10UploadBodyNtB4b_14UploadMetadataEE6mallocB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_7upgrade11UpgradeBodyNtB4b_15UpgradeMetadataEE6mallocB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtNtB1z_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6script10ScriptBodyNtB4l_14ScriptMetadataEE6mallocB9_
681
682
262k
    pub(crate) fn memclear(&mut self, a: Word, b: Word) -> SimpleResult<()> {
683
262k
        let owner = self.ownership_registers();
684
262k
        memclear(self.memory.as_mut(), owner, self.registers.pc_mut(), a, b)
685
262k
    }
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEE8memclearB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEE8memclearB9_
_RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEE8memclearB9_
Line
Count
Source
682
262k
    pub(crate) fn memclear(&mut self, a: Word, b: Word) -> SimpleResult<()> {
683
262k
        let owner = self.ownership_registers();
684
262k
        memclear(self.memory.as_mut(), owner, self.registers.pc_mut(), a, b)
685
262k
    }
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_4blob8BlobBodyNtB4b_12BlobMetadataEE8memclearB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6create10CreateBodyNtB4b_14CreateMetadataEE8memclearB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6script10ScriptBodyNtB4b_14ScriptMetadataEE8memclearB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6upload10UploadBodyNtB4b_14UploadMetadataEE8memclearB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_7upgrade11UpgradeBodyNtB4b_15UpgradeMetadataEE8memclearB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtNtB1z_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6script10ScriptBodyNtB4l_14ScriptMetadataEE8memclearB9_
686
687
7.39M
    pub(crate) fn memcopy(&mut self, a: Word, b: Word, c: Word) -> SimpleResult<()> {
688
7.39M
        let owner = self.ownership_registers();
689
7.39M
        memcopy(
690
7.39M
            self.memory.as_mut(),
691
7.39M
            owner,
692
7.39M
            self.registers.pc_mut(),
693
7.39M
            a,
694
7.39M
            b,
695
7.39M
            c,
696
7.39M
        )
697
7.39M
    }
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEE7memcopyB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEE7memcopyB9_
_RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEE7memcopyB9_
Line
Count
Source
687
7.39M
    pub(crate) fn memcopy(&mut self, a: Word, b: Word, c: Word) -> SimpleResult<()> {
688
7.39M
        let owner = self.ownership_registers();
689
7.39M
        memcopy(
690
7.39M
            self.memory.as_mut(),
691
7.39M
            owner,
692
7.39M
            self.registers.pc_mut(),
693
7.39M
            a,
694
7.39M
            b,
695
7.39M
            c,
696
7.39M
        )
697
7.39M
    }
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_4blob8BlobBodyNtB4b_12BlobMetadataEE7memcopyB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6create10CreateBodyNtB4b_14CreateMetadataEE7memcopyB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6script10ScriptBodyNtB4b_14ScriptMetadataEE7memcopyB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6upload10UploadBodyNtB4b_14UploadMetadataEE7memcopyB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_7upgrade11UpgradeBodyNtB4b_15UpgradeMetadataEE7memcopyB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtNtB1z_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6script10ScriptBodyNtB4l_14ScriptMetadataEE7memcopyB9_
698
699
1.63M
    pub(crate) fn memeq(
700
1.63M
        &mut self,
701
1.63M
        ra: RegisterId,
702
1.63M
        b: Word,
703
1.63M
        c: Word,
704
1.63M
        d: Word,
705
1.63M
    ) -> SimpleResult<()> {
706
1.63M
        let (SystemRegisters { pc, .. }, mut w) = split_registers(&mut self.registers);
707
1.63M
        let result = &mut w[WriteRegKey::try_from(ra)?];
708
1.63M
        memeq(self.memory.as_mut(), result, pc, b, c, d)
709
1.63M
    }
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEE5memeqB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEE5memeqB9_
_RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterNtB5_14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEE5memeqB9_
Line
Count
Source
699
1.63M
    pub(crate) fn memeq(
700
1.63M
        &mut self,
701
1.63M
        ra: RegisterId,
702
1.63M
        b: Word,
703
1.63M
        c: Word,
704
1.63M
        d: Word,
705
1.63M
    ) -> SimpleResult<()> {
706
1.63M
        let (SystemRegisters { pc, .. }, mut w) = split_registers(&mut self.registers);
707
1.63M
        let result = &mut w[WriteRegKey::try_from(ra)?];
708
1.63M
        memeq(self.memory.as_mut(), result, pc, b, c, d)
709
1.63M
    }
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_4blob8BlobBodyNtB4b_12BlobMetadataEE5memeqB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6create10CreateBodyNtB4b_14CreateMetadataEE5memeqB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6script10ScriptBodyNtB4b_14ScriptMetadataEE5memeqB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6upload10UploadBodyNtB4b_14UploadMetadataEE5memeqB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_7upgrade11UpgradeBodyNtB4b_15UpgradeMetadataEE5memeqB9_
Unexecuted instantiation: _RNvMse_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryINtB7_11InterpreterQNtB5_14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtNtB1z_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6script10ScriptBodyNtB4l_14ScriptMetadataEE5memeqB9_
710
}
711
712
/// Update stack pointer, checking for validity first.
713
22.3M
pub(crate) fn try_update_stack_pointer(
714
22.3M
    mut sp: RegMut<SP>,
715
22.3M
    ssp: Reg<SSP>,
716
22.3M
    hp: Reg<HP>,
717
22.3M
    new_sp: Word,
718
22.3M
    memory: &mut MemoryInstance,
719
22.3M
) -> SimpleResult<()> {
720
22.3M
    if new_sp < *ssp {
721
9
        Err(PanicReason::MemoryOverflow.into())
722
22.3M
    } else if new_sp > *hp {
723
25
        Err(PanicReason::MemoryGrowthOverlap.into())
724
    } else {
725
22.3M
        *sp = new_sp;
726
22.3M
        memory.grow_stack(new_sp)?;
727
22.3M
        Ok(())
728
    }
729
22.3M
}
730
731
17.4M
pub(crate) fn stack_pointer_overflow<F>(
732
17.4M
    sp: RegMut<SP>,
733
17.4M
    ssp: Reg<SSP>,
734
17.4M
    hp: Reg<HP>,
735
17.4M
    pc: RegMut<PC>,
736
17.4M
    f: F,
737
17.4M
    v: Word,
738
17.4M
    memory: &mut MemoryInstance,
739
17.4M
) -> SimpleResult<()>
740
17.4M
where
741
17.4M
    F: FnOnce(Word, Word) -> (Word, bool),
742
17.4M
{
743
17.4M
    let (new_sp, overflow) = f(*sp, v);
744
17.4M
745
17.4M
    if overflow {
746
18
        return Err(PanicReason::MemoryOverflow.into())
747
17.4M
    }
748
17.4M
749
17.4M
    try_update_stack_pointer(sp, ssp, hp, new_sp, memory)?;
750
17.4M
    Ok(inc_pc(pc)?)
751
17.4M
}
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memory22stack_pointer_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_addEB6_
Line
Count
Source
731
15.2M
pub(crate) fn stack_pointer_overflow<F>(
732
15.2M
    sp: RegMut<SP>,
733
15.2M
    ssp: Reg<SSP>,
734
15.2M
    hp: Reg<HP>,
735
15.2M
    pc: RegMut<PC>,
736
15.2M
    f: F,
737
15.2M
    v: Word,
738
15.2M
    memory: &mut MemoryInstance,
739
15.2M
) -> SimpleResult<()>
740
15.2M
where
741
15.2M
    F: FnOnce(Word, Word) -> (Word, bool),
742
15.2M
{
743
15.2M
    let (new_sp, overflow) = f(*sp, v);
744
15.2M
745
15.2M
    if overflow {
746
0
        return Err(PanicReason::MemoryOverflow.into())
747
15.2M
    }
748
15.2M
749
15.2M
    try_update_stack_pointer(sp, ssp, hp, new_sp, memory)?;
750
15.2M
    Ok(inc_pc(pc)?)
751
15.2M
}
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memory22stack_pointer_overflowNvMs7_NtCsd3UI3IJrzMw_4core3numy15overflowing_subEB6_
Line
Count
Source
731
2.16M
pub(crate) fn stack_pointer_overflow<F>(
732
2.16M
    sp: RegMut<SP>,
733
2.16M
    ssp: Reg<SSP>,
734
2.16M
    hp: Reg<HP>,
735
2.16M
    pc: RegMut<PC>,
736
2.16M
    f: F,
737
2.16M
    v: Word,
738
2.16M
    memory: &mut MemoryInstance,
739
2.16M
) -> SimpleResult<()>
740
2.16M
where
741
2.16M
    F: FnOnce(Word, Word) -> (Word, bool),
742
2.16M
{
743
2.16M
    let (new_sp, overflow) = f(*sp, v);
744
2.16M
745
2.16M
    if overflow {
746
18
        return Err(PanicReason::MemoryOverflow.into())
747
2.16M
    }
748
2.16M
749
2.16M
    try_update_stack_pointer(sp, ssp, hp, new_sp, memory)?;
750
2.16M
    Ok(inc_pc(pc)?)
751
2.16M
}
752
753
#[allow(clippy::too_many_arguments)]
754
4.46M
pub(crate) fn push_selected_registers(
755
4.46M
    memory: &mut MemoryInstance,
756
4.46M
    sp: RegMut<SP>,
757
4.46M
    ssp: Reg<SSP>,
758
4.46M
    hp: Reg<HP>,
759
4.46M
    pc: RegMut<PC>,
760
4.46M
    program_regs: &ProgramRegisters,
761
4.46M
    segment: ProgramRegistersSegment,
762
4.46M
    bitmask: Imm24,
763
4.46M
) -> SimpleResult<()> {
764
4.46M
    let bitmask = bitmask.to_u32();
765
4.46M
766
4.46M
    // First update the new stack pointer, as that's the only error condition
767
4.46M
    let count: u64 = bitmask.count_ones().into();
768
4.46M
    let write_size = count
769
4.46M
        .checked_mul(WORD_SIZE as u64)
770
4.46M
        .expect("Bitmask size times 8 can never oveflow");
771
4.46M
    let write_at = *sp;
772
4.46M
    // If this would overflow, the stack pointer update below will fail
773
4.46M
    let new_sp = write_at.saturating_add(write_size);
774
4.46M
    try_update_stack_pointer(sp, ssp, hp, new_sp, memory)?;
775
776
    // Write the registers to the stack
777
4.46M
    let mut it = memory
778
4.46M
        .write_noownerchecks(write_at, write_size)?
779
4.46M
        .chunks_exact_mut(WORD_SIZE);
780
107M
    for (i, reg) in program_regs.segment(segment).iter().enumerate() {
781
107M
        if (bitmask & (1 << i)) != 0 {
782
49.1M
            let item = it
783
49.1M
                .next()
784
49.1M
                .expect("Memory range mismatched with register count");
785
49.1M
            item.copy_from_slice(&reg.to_be_bytes());
786
58.0M
        }
787
    }
788
789
4.46M
    Ok(inc_pc(pc)?)
790
4.46M
}
791
792
#[allow(clippy::too_many_arguments)]
793
436k
pub(crate) fn pop_selected_registers(
794
436k
    memory: &mut MemoryInstance,
795
436k
    sp: RegMut<SP>,
796
436k
    ssp: Reg<SSP>,
797
436k
    hp: Reg<HP>,
798
436k
    pc: RegMut<PC>,
799
436k
    program_regs: &mut ProgramRegisters,
800
436k
    segment: ProgramRegistersSegment,
801
436k
    bitmask: Imm24,
802
436k
) -> SimpleResult<()> {
803
436k
    let bitmask = bitmask.to_u32();
804
436k
805
436k
    // First update the stack pointer, as that's the only error condition
806
436k
    let count: u64 = bitmask.count_ones().into();
807
436k
    let size_in_stack = count
808
436k
        .checked_mul(WORD_SIZE as u64)
809
436k
        .expect("Bitmask size times 8 can never oveflow");
810
436k
    let new_sp = sp
811
436k
        .checked_sub(size_in_stack)
812
436k
        .ok_or(PanicReason::MemoryOverflow)?;
813
436k
    try_update_stack_pointer(sp, ssp, hp, new_sp, memory)?;
814
815
    // Restore registers from the stack
816
436k
    let mut it = memory.read(new_sp, size_in_stack)?.chunks_exact(WORD_SIZE);
817
10.4M
    for (i, reg) in program_regs.segment_mut(segment).iter_mut().enumerate() {
818
10.4M
        if (bitmask & (1 << i)) != 0 {
819
5.10M
            let mut buf = [0u8; WORD_SIZE];
820
5.10M
            buf.copy_from_slice(it.next().expect("Count mismatch"));
821
5.10M
            *reg = Word::from_be_bytes(buf);
822
5.37M
        }
823
    }
824
825
436k
    Ok(inc_pc(pc)?)
826
436k
}
827
828
735k
pub(crate) fn load_byte(
829
735k
    memory: &MemoryInstance,
830
735k
    pc: RegMut<PC>,
831
735k
    result: &mut Word,
832
735k
    b: Word,
833
735k
    c: Word,
834
735k
) -> SimpleResult<()> {
835
735k
    let [b] = memory.read_bytes(b.saturating_add(c))?;
836
735k
    *result = b as Word;
837
735k
    Ok(inc_pc(pc)?)
838
735k
}
839
840
51.5M
pub(crate) fn load_word(
841
51.5M
    memory: &MemoryInstance,
842
51.5M
    pc: RegMut<PC>,
843
51.5M
    result: &mut Word,
844
51.5M
    b: Word,
845
51.5M
    c: Imm12,
846
51.5M
) -> SimpleResult<()> {
847
51.5M
    let offset = u64::from(c)
848
51.5M
        .checked_mul(WORD_SIZE as u64)
849
51.5M
        .expect("u12 * 8 cannot overflow a Word");
850
51.5M
    let addr = b.checked_add(offset).ok_or(PanicReason::MemoryOverflow)?;
851
51.5M
    *result = Word::from_be_bytes(memory.read_bytes(addr)?);
852
51.5M
    Ok(inc_pc(pc)?)
853
51.5M
}
854
855
#[allow(clippy::cast_possible_truncation)]
856
164k
pub(crate) fn store_byte(
857
164k
    memory: &mut MemoryInstance,
858
164k
    owner: OwnershipRegisters,
859
164k
    pc: RegMut<PC>,
860
164k
    a: Word,
861
164k
    b: Word,
862
164k
    c: Word,
863
164k
) -> SimpleResult<()> {
864
164k
    memory.write_bytes(owner, a.saturating_add(c), [b as u8])?;
865
164k
    Ok(inc_pc(pc)?)
866
164k
}
867
868
12.9M
pub(crate) fn store_word(
869
12.9M
    memory: &mut MemoryInstance,
870
12.9M
    owner: OwnershipRegisters,
871
12.9M
    pc: RegMut<PC>,
872
12.9M
    a: Word,
873
12.9M
    b: Word,
874
12.9M
    c: Imm12,
875
12.9M
) -> SimpleResult<()> {
876
12.9M
    #[allow(clippy::arithmetic_side_effects)]
877
12.9M
    let offset = u64::from(c)
878
12.9M
        .checked_mul(WORD_SIZE as u64)
879
12.9M
        .expect("12-bits number multiplied by 8 cannot overflow a Word");
880
12.9M
    let addr = a.saturating_add(offset);
881
12.9M
    memory.write_bytes(owner, addr, b.to_be_bytes())?;
882
12.9M
    Ok(inc_pc(pc)?)
883
12.9M
}
884
885
898k
pub(crate) fn malloc(
886
898k
    hp: RegMut<HP>,
887
898k
    sp: Reg<SP>,
888
898k
    pc: RegMut<PC>,
889
898k
    amount: Word,
890
898k
    memory: &mut MemoryInstance,
891
898k
) -> SimpleResult<()> {
892
898k
    memory.grow_heap_by(sp, hp, amount)?;
893
898k
    Ok(inc_pc(pc)?)
894
898k
}
895
896
262k
pub(crate) fn memclear(
897
262k
    memory: &mut MemoryInstance,
898
262k
    owner: OwnershipRegisters,
899
262k
    pc: RegMut<PC>,
900
262k
    a: Word,
901
262k
    b: Word,
902
262k
) -> SimpleResult<()> {
903
262k
    memory.write(owner, a, b)?.fill(0);
904
262k
    Ok(inc_pc(pc)?)
905
262k
}
906
907
7.39M
pub(crate) fn memcopy(
908
7.39M
    memory: &mut MemoryInstance,
909
7.39M
    owner: OwnershipRegisters,
910
7.39M
    pc: RegMut<PC>,
911
7.39M
    dst: Word,
912
7.39M
    src: Word,
913
7.39M
    length: Word,
914
7.39M
) -> SimpleResult<()> {
915
7.39M
    memory.memcopy(dst, src, length, owner)?;
916
917
7.39M
    Ok(inc_pc(pc)?)
918
7.39M
}
919
920
1.63M
pub(crate) fn memeq(
921
1.63M
    memory: &mut MemoryInstance,
922
1.63M
    result: &mut Word,
923
1.63M
    pc: RegMut<PC>,
924
1.63M
    b: Word,
925
1.63M
    c: Word,
926
1.63M
    d: Word,
927
1.63M
) -> SimpleResult<()> {
928
1.63M
    *result = (memory.read(b, d)? == memory.read(c, d)?) as Word;
929
1.63M
    Ok(inc_pc(pc)?)
930
1.63M
}
931
932
#[derive(Debug, Clone, Copy)]
933
pub struct OwnershipRegisters {
934
    pub(crate) sp: u64,
935
    pub(crate) ssp: u64,
936
    pub(crate) hp: u64,
937
    /// Previous heap pointer, used for external contexts.
938
    /// Otherwise, it's just memory size.
939
    pub(crate) prev_hp: u64,
940
}
941
942
impl OwnershipRegisters {
943
31.8M
    pub(crate) fn new<M, S, Tx, Ecal>(vm: &Interpreter<M, S, Tx, Ecal>) -> Self {
944
31.8M
        let prev_hp = vm
945
31.8M
            .frames
946
31.8M
            .last()
947
31.8M
            .map(|frame| frame.registers()[RegId::HP])
Unexecuted instantiation: _RNCINvMsf_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB8_18OwnershipRegisters3newNtB8_14MemoryInstanceNtNtNtBc_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_4blob8BlobBodyNtB3U_12BlobMetadataENtBa_16NotSupportedEcalE0Bc_
Unexecuted instantiation: _RNCINvMsf_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB8_18OwnershipRegisters3newNtB8_14MemoryInstanceNtNtNtBc_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6create10CreateBodyNtB3U_14CreateMetadataENtBa_16NotSupportedEcalE0Bc_
_RNCINvMsf_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB8_18OwnershipRegisters3newNtB8_14MemoryInstanceNtNtNtBc_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6script10ScriptBodyNtB3U_14ScriptMetadataENtBa_16NotSupportedEcalE0Bc_
Line
Count
Source
947
4.60k
            .map(|frame| frame.registers()[RegId::HP])
Unexecuted instantiation: _RNCINvMsf_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB8_18OwnershipRegisters3newQNtB8_14MemoryInstanceINtNtNtBc_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_4blob8BlobBodyNtB4o_12BlobMetadataENtBa_16NotSupportedEcalE0Bc_
Unexecuted instantiation: _RNCINvMsf_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB8_18OwnershipRegisters3newQNtB8_14MemoryInstanceINtNtNtBc_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6create10CreateBodyNtB4o_14CreateMetadataENtBa_16NotSupportedEcalE0Bc_
Unexecuted instantiation: _RNCINvMsf_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB8_18OwnershipRegisters3newQNtB8_14MemoryInstanceINtNtNtBc_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6script10ScriptBodyNtB4o_14ScriptMetadataENtBa_16NotSupportedEcalE0Bc_
Unexecuted instantiation: _RNCINvMsf_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB8_18OwnershipRegisters3newQNtB8_14MemoryInstanceINtNtNtBc_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6upload10UploadBodyNtB4o_14UploadMetadataENtBa_16NotSupportedEcalE0Bc_
Unexecuted instantiation: _RNCINvMsf_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB8_18OwnershipRegisters3newQNtB8_14MemoryInstanceINtNtNtBc_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_7upgrade11UpgradeBodyNtB4o_15UpgradeMetadataENtBa_16NotSupportedEcalE0Bc_
Unexecuted instantiation: _RNCINvMsf_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB8_18OwnershipRegisters3newQNtB8_14MemoryInstanceINtNtNtBc_7storage9predicate16PredicateStorageRNtNtB1M_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB32_6script10ScriptBodyNtB4y_14ScriptMetadataENtBa_16NotSupportedEcalE0Bc_
948
31.8M
            .unwrap_or(VM_MAX_RAM);
949
31.8M
950
31.8M
        OwnershipRegisters {
951
31.8M
            sp: vm.registers[RegId::SP],
952
31.8M
            ssp: vm.registers[RegId::SSP],
953
31.8M
            hp: vm.registers[RegId::HP],
954
31.8M
            prev_hp,
955
31.8M
        }
956
31.8M
    }
Unexecuted instantiation: _RINvMsf_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_18OwnershipRegisters3newNtB6_14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_4blob8BlobBodyNtB3S_12BlobMetadataENtB8_16NotSupportedEcalEBa_
Unexecuted instantiation: _RINvMsf_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_18OwnershipRegisters3newNtB6_14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6create10CreateBodyNtB3S_14CreateMetadataENtB8_16NotSupportedEcalEBa_
_RINvMsf_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_18OwnershipRegisters3newNtB6_14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2m_6script10ScriptBodyNtB3S_14ScriptMetadataENtB8_16NotSupportedEcalEBa_
Line
Count
Source
943
31.8M
    pub(crate) fn new<M, S, Tx, Ecal>(vm: &Interpreter<M, S, Tx, Ecal>) -> Self {
944
31.8M
        let prev_hp = vm
945
31.8M
            .frames
946
31.8M
            .last()
947
31.8M
            .map(|frame| frame.registers()[RegId::HP])
948
31.8M
            .unwrap_or(VM_MAX_RAM);
949
31.8M
950
31.8M
        OwnershipRegisters {
951
31.8M
            sp: vm.registers[RegId::SP],
952
31.8M
            ssp: vm.registers[RegId::SSP],
953
31.8M
            hp: vm.registers[RegId::HP],
954
31.8M
            prev_hp,
955
31.8M
        }
956
31.8M
    }
Unexecuted instantiation: _RINvMsf_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_18OwnershipRegisters3newQNtB6_14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_4blob8BlobBodyNtB4m_12BlobMetadataENtB8_16NotSupportedEcalEBa_
Unexecuted instantiation: _RINvMsf_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_18OwnershipRegisters3newQNtB6_14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6create10CreateBodyNtB4m_14CreateMetadataENtB8_16NotSupportedEcalEBa_
Unexecuted instantiation: _RINvMsf_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_18OwnershipRegisters3newQNtB6_14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6script10ScriptBodyNtB4m_14ScriptMetadataENtB8_16NotSupportedEcalEBa_
Unexecuted instantiation: _RINvMsf_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_18OwnershipRegisters3newQNtB6_14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_6upload10UploadBodyNtB4m_14UploadMetadataENtB8_16NotSupportedEcalEBa_
Unexecuted instantiation: _RINvMsf_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_18OwnershipRegisters3newQNtB6_14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1I_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2Q_7upgrade11UpgradeBodyNtB4m_15UpgradeMetadataENtB8_16NotSupportedEcalEBa_
Unexecuted instantiation: _RINvMsf_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter6memoryNtB6_18OwnershipRegisters3newQNtB6_14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtNtB1K_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_6script10ScriptBodyNtB4w_14ScriptMetadataENtB8_16NotSupportedEcalEBa_
957
958
    /// Create an instance that only allows stack writes.
959
430k
    pub(crate) fn only_allow_stack_write(sp: u64, ssp: u64, hp: u64) -> Self {
960
430k
        debug_assert!(sp <= VM_MAX_RAM);
961
430k
        debug_assert!(ssp <= VM_MAX_RAM);
962
430k
        debug_assert!(hp <= VM_MAX_RAM);
963
430k
        debug_assert!(ssp <= sp);
964
430k
        debug_assert!(sp <= hp);
965
430k
        OwnershipRegisters {
966
430k
            sp,
967
430k
            ssp,
968
430k
            hp,
969
430k
            prev_hp: hp,
970
430k
        }
971
430k
    }
972
973
    /// Allows all writes, whole memory is stack.allocated
974
    #[cfg(test)]
975
    pub(crate) fn test_full_stack() -> Self {
976
        OwnershipRegisters {
977
            sp: VM_MAX_RAM,
978
            ssp: 0,
979
            hp: VM_MAX_RAM,
980
            prev_hp: VM_MAX_RAM,
981
        }
982
    }
983
984
32.2M
    pub(crate) fn verify_ownership(
985
32.2M
        &self,
986
32.2M
        range: &MemoryRange,
987
32.2M
    ) -> Result<(), PanicReason> {
988
32.2M
        if self.has_ownership_range(&range.words()) {
989
32.2M
            Ok(())
990
        } else {
991
139
            Err(PanicReason::MemoryOwnership)
992
        }
993
32.2M
    }
994
995
32.2M
    pub fn has_ownership_range(&self, range: &Range<Word>) -> bool {
996
32.2M
        self.has_ownership_stack(range) || self.has_ownership_heap(range)
997
32.2M
    }
998
999
    /// Empty range is owned iff the range.start is owned
1000
32.2M
    pub(crate) fn has_ownership_stack(&self, range: &Range<Word>) -> bool {
1001
32.2M
        if range.is_empty() && range.start == self.ssp {
1002
355k
            return true
1003
31.9M
        }
1004
31.9M
1005
31.9M
        if !(self.ssp..self.sp).contains(&range.start) {
1006
825k
            return false
1007
31.0M
        }
1008
31.0M
1009
31.0M
        if range.end > VM_MAX_RAM {
1010
0
            return false
1011
31.0M
        }
1012
31.0M
1013
31.0M
        (self.ssp..=self.sp).contains(&range.end)
1014
32.2M
    }
1015
1016
    /// Empty range is owned iff the range.start is owned
1017
825k
    pub(crate) fn has_ownership_heap(&self, range: &Range<Word>) -> bool {
1018
825k
        if range.is_empty() && range.start == self.hp {
1019
65.0k
            return true
1020
760k
        }
1021
760k
1022
760k
        if range.start < self.hp {
1023
139
            return false
1024
760k
        }
1025
760k
1026
760k
        self.hp != self.prev_hp && range.end <= self.prev_hp
1027
825k
    }
1028
}
1029
1030
/// Attempt copy from slice to memory, filling zero bytes when exceeding slice boundaries.
1031
/// Performs overflow and memory range checks, but no ownership checks.
1032
/// Note that if `src_offset` is larger than `src.len()`, the whole range will be
1033
/// zero-filled.
1034
368k
pub(crate) fn copy_from_slice_zero_fill<A: ToAddr, B: ToAddr>(
1035
368k
    memory: &mut MemoryInstance,
1036
368k
    owner: OwnershipRegisters,
1037
368k
    src: &[u8],
1038
368k
    dst_addr: A,
1039
368k
    src_offset: Word,
1040
368k
    len: B,
1041
368k
) -> SimpleResult<()> {
1042
368k
    let range = memory.write(owner, dst_addr, len)?;
1043
1044
    // Special-case the ranges that are completely out of bounds,
1045
    // to avoid platform-dependenct usize conversion.
1046
368k
    if src_offset >= src.len() as Word {
1047
184k
        range[..].fill(0);
1048
184k
    } else {
1049
184k
        // Safety: since we check above that this is not larger than `src.len()`,
1050
184k
        // which is `usize`, the cast never truncates.
1051
184k
        #[allow(clippy::cast_possible_truncation)]
1052
184k
        let src_offset = src_offset as usize;
1053
184k
        let src_end = src_offset.saturating_add(range.len()).min(src.len());
1054
184k
        let data = src.get(src_offset..src_end).unwrap_or(&[]);
1055
184k
1056
184k
        range[..data.len()].copy_from_slice(data);
1057
184k
        range[data.len()..].fill(0);
1058
184k
    }
1059
368k
    Ok(())
1060
368k
}
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter/blob.rs
Line
Count
Source
1
use fuel_asm::{
2
    RegisterId,
3
    Word,
4
};
5
use fuel_storage::StorageSize;
6
use fuel_tx::PanicReason;
7
use fuel_types::BlobId;
8
9
use crate::{
10
    error::IoResult,
11
    prelude::*,
12
    storage::{
13
        BlobData,
14
        InterpreterStorage,
15
    },
16
};
17
18
use super::{
19
    internal::inc_pc,
20
    memory::copy_from_slice_zero_fill,
21
    split_registers,
22
    GetRegMut,
23
    Interpreter,
24
    Memory,
25
    SystemRegisters,
26
    WriteRegKey,
27
};
28
29
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
30
where
31
    M: Memory,
32
    S: InterpreterStorage,
33
    <S as InterpreterStorage>::DataError: From<S::DataError>,
34
{
35
2
    pub(crate) fn blob_size(
36
2
        &mut self,
37
2
        dst: RegisterId,
38
2
        blob_id_ptr: Word,
39
2
    ) -> IoResult<(), S::DataError> {
40
2
        let gas_cost = self
41
2
            .interpreter_params
42
2
            .gas_costs
43
2
            .bsiz()
44
2
            .map_err(PanicReason::from)?;
45
2
        self.gas_charge(gas_cost.base())?;
46
47
2
        let blob_id = BlobId::from(self.memory.as_ref().read_bytes(blob_id_ptr)?);
48
49
1
        let size = <S as StorageSize<BlobData>>::size_of_value(&self.storage, &blob_id)
50
1
            .map_err(RuntimeError::Storage)?
51
1
            .ok_or(PanicReason::BlobNotFound)?;
52
53
0
        self.dependent_gas_charge_without_base(gas_cost, size as Word)?;
54
0
        let (SystemRegisters { pc, .. }, mut w) = split_registers(&mut self.registers);
55
0
        let result = &mut w[WriteRegKey::try_from(dst)?];
56
0
        *result = size as Word;
57
0
        Ok(inc_pc(pc)?)
58
2
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4blobINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_4blob8BlobBodyNtB3L_12BlobMetadataEE9blob_sizeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4blobINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6create10CreateBodyNtB3L_14CreateMetadataEE9blob_sizeB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4blobINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6script10ScriptBodyNtB3L_14ScriptMetadataEE9blob_sizeB6_
Line
Count
Source
35
2
    pub(crate) fn blob_size(
36
2
        &mut self,
37
2
        dst: RegisterId,
38
2
        blob_id_ptr: Word,
39
2
    ) -> IoResult<(), S::DataError> {
40
2
        let gas_cost = self
41
2
            .interpreter_params
42
2
            .gas_costs
43
2
            .bsiz()
44
2
            .map_err(PanicReason::from)?;
45
2
        self.gas_charge(gas_cost.base())?;
46
47
2
        let blob_id = BlobId::from(self.memory.as_ref().read_bytes(blob_id_ptr)?);
48
49
1
        let size = <S as StorageSize<BlobData>>::size_of_value(&self.storage, &blob_id)
50
1
            .map_err(RuntimeError::Storage)?
51
1
            .ok_or(PanicReason::BlobNotFound)?;
52
53
0
        self.dependent_gas_charge_without_base(gas_cost, size as Word)?;
54
0
        let (SystemRegisters { pc, .. }, mut w) = split_registers(&mut self.registers);
55
0
        let result = &mut w[WriteRegKey::try_from(dst)?];
56
0
        *result = size as Word;
57
0
        Ok(inc_pc(pc)?)
58
2
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4blobINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_4blob8BlobBodyNtB4f_12BlobMetadataEE9blob_sizeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4blobINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6create10CreateBodyNtB4f_14CreateMetadataEE9blob_sizeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4blobINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6script10ScriptBodyNtB4f_14ScriptMetadataEE9blob_sizeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4blobINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6upload10UploadBodyNtB4f_14UploadMetadataEE9blob_sizeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4blobINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_7upgrade11UpgradeBodyNtB4f_15UpgradeMetadataEE9blob_sizeB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4blobINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1D_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2T_6script10ScriptBodyNtB4p_14ScriptMetadataEE9blob_sizeB6_
59
60
3
    pub(crate) fn blob_load_data(
61
3
        &mut self,
62
3
        dst_ptr: Word,
63
3
        blob_id_ptr: Word,
64
3
        blob_offset: Word,
65
3
        len: Word,
66
3
    ) -> IoResult<(), S::DataError> {
67
3
        let gas_cost = self
68
3
            .interpreter_params
69
3
            .gas_costs
70
3
            .bldd()
71
3
            .map_err(PanicReason::from)?;
72
3
        self.gas_charge(gas_cost.base())?;
73
74
3
        let blob_id = BlobId::from(self.memory.as_ref().read_bytes(blob_id_ptr)?);
75
2
        let owner = self.ownership_registers();
76
77
2
        let size = <S as StorageSize<BlobData>>::size_of_value(&self.storage, &blob_id)
78
2
            .map_err(RuntimeError::Storage)?
79
2
            .ok_or(PanicReason::BlobNotFound)?;
80
0
        self.dependent_gas_charge_without_base(gas_cost, len.max(size as Word))?;
81
82
0
        let blob = <S as StorageInspect<BlobData>>::get(&self.storage, &blob_id)
83
0
            .map_err(RuntimeError::Storage)?
84
0
            .ok_or(PanicReason::BlobNotFound)?;
85
0
        let blob = blob.as_ref().as_ref();
86
0
87
0
        copy_from_slice_zero_fill(
88
0
            self.memory.as_mut(),
89
0
            owner,
90
0
            blob,
91
0
            dst_ptr,
92
0
            blob_offset,
93
0
            len,
94
0
        )?;
95
96
0
        Ok(inc_pc(self.registers.pc_mut())?)
97
3
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4blobINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_4blob8BlobBodyNtB3L_12BlobMetadataEE14blob_load_dataB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4blobINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6create10CreateBodyNtB3L_14CreateMetadataEE14blob_load_dataB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4blobINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2f_6script10ScriptBodyNtB3L_14ScriptMetadataEE14blob_load_dataB6_
Line
Count
Source
60
3
    pub(crate) fn blob_load_data(
61
3
        &mut self,
62
3
        dst_ptr: Word,
63
3
        blob_id_ptr: Word,
64
3
        blob_offset: Word,
65
3
        len: Word,
66
3
    ) -> IoResult<(), S::DataError> {
67
3
        let gas_cost = self
68
3
            .interpreter_params
69
3
            .gas_costs
70
3
            .bldd()
71
3
            .map_err(PanicReason::from)?;
72
3
        self.gas_charge(gas_cost.base())?;
73
74
3
        let blob_id = BlobId::from(self.memory.as_ref().read_bytes(blob_id_ptr)?);
75
2
        let owner = self.ownership_registers();
76
77
2
        let size = <S as StorageSize<BlobData>>::size_of_value(&self.storage, &blob_id)
78
2
            .map_err(RuntimeError::Storage)?
79
2
            .ok_or(PanicReason::BlobNotFound)?;
80
0
        self.dependent_gas_charge_without_base(gas_cost, len.max(size as Word))?;
81
82
0
        let blob = <S as StorageInspect<BlobData>>::get(&self.storage, &blob_id)
83
0
            .map_err(RuntimeError::Storage)?
84
0
            .ok_or(PanicReason::BlobNotFound)?;
85
0
        let blob = blob.as_ref().as_ref();
86
0
87
0
        copy_from_slice_zero_fill(
88
0
            self.memory.as_mut(),
89
0
            owner,
90
0
            blob,
91
0
            dst_ptr,
92
0
            blob_offset,
93
0
            len,
94
0
        )?;
95
96
0
        Ok(inc_pc(self.registers.pc_mut())?)
97
3
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4blobINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_4blob8BlobBodyNtB4f_12BlobMetadataEE14blob_load_dataB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4blobINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6create10CreateBodyNtB4f_14CreateMetadataEE14blob_load_dataB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4blobINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6script10ScriptBodyNtB4f_14ScriptMetadataEE14blob_load_dataB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4blobINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_6upload10UploadBodyNtB4f_14UploadMetadataEE14blob_load_dataB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4blobINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1B_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2J_7upgrade11UpgradeBodyNtB4f_15UpgradeMetadataEE14blob_load_dataB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4blobINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1D_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2T_6script10ScriptBodyNtB4p_14ScriptMetadataEE14blob_load_dataB6_
98
}
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter/diff.rs
Line
Count
Source
1
//! # VM State Differences
2
//! This module provides the ability to generate diffs between two VMs internal states.
3
//! The diff can then be used to invert a VM to the original state.
4
//! This module is experimental work in progress and currently only used in testing
5
//! although it could potentially stabilize to be used in production.
6
7
use alloc::{
8
    sync::Arc,
9
    vec::Vec,
10
};
11
use core::{
12
    any::Any,
13
    fmt::Debug,
14
    hash::Hash,
15
    ops::AddAssign,
16
};
17
use hashbrown::{
18
    HashMap,
19
    HashSet,
20
};
21
22
use fuel_asm::Word;
23
use fuel_storage::{
24
    Mappable,
25
    StorageInspect,
26
    StorageMutate,
27
};
28
use fuel_tx::{
29
    Contract,
30
    Receipt,
31
};
32
use fuel_types::AssetId;
33
34
use crate::{
35
    call::CallFrame,
36
    context::Context,
37
    storage::{
38
        ContractsAssets,
39
        ContractsRawCode,
40
        ContractsState,
41
    },
42
};
43
44
use super::{
45
    balances::Balance,
46
    receipts::ReceiptsCtx,
47
    ExecutableTransaction,
48
    Interpreter,
49
    Memory,
50
    PanicContext,
51
};
52
use storage::*;
53
54
mod storage;
55
56
#[cfg(test)]
57
mod tests;
58
59
#[derive(Debug, Clone)]
60
/// A diff of VM state.
61
///
62
/// By default this does not print out the
63
/// memory bytes but you can supply the `#` flag
64
/// to get them like:
65
/// ```ignore
66
/// println!("{:#}", diff);
67
/// ```
68
pub struct Diff<T: VmStateCapture + Clone> {
69
    changes: Vec<Change<T>>,
70
}
71
72
#[derive(Debug, Clone)]
73
enum Change<T: VmStateCapture + Clone> {
74
    /// Holds a snapshot of register state.
75
    Register(T::State<VecState<Word>>),
76
    /// Holds a snapshot of memory state.
77
    Memory(T::State<MemoryRegion>),
78
    /// Holds a snapshot of storage state.
79
    Storage(T::State<StorageState>),
80
    /// Holds a snapshot of the call stack.
81
    Frame(T::State<VecState<Option<CallFrame>>>),
82
    /// Holds a snapshot of receipt state.
83
    Receipt(T::State<VecState<Option<Receipt>>>),
84
    /// Holds a snapshot of balance state.
85
    Balance(T::State<MapState<AssetId, Option<Balance>>>),
86
    /// Holds a snapshot of context state.
87
    Context(T::State<Context>),
88
    /// Holds a snapshot of the panic context state.
89
    PanicContext(T::State<PanicContext>),
90
    /// Holds a snapshot of the transaction state.
91
    Txn(T::State<Arc<dyn AnyDebug>>),
92
}
93
94
/// A trait that combines the [`Debug`] and [`Any`] traits.
95
pub trait AnyDebug: Any + Debug {
96
    /// Returns a reference to the underlying type as `Any`.
97
    fn as_any_ref(&self) -> &dyn Any;
98
}
99
100
impl<T> AnyDebug for T
101
where
102
    T: Any + Debug,
103
{
104
0
    fn as_any_ref(&self) -> &dyn Any {
105
0
        self
106
0
    }
107
}
108
109
/// A mapping between the kind of state that is being capture
110
/// and the concrete data that is collected.
111
pub trait VmStateCapture {
112
    /// The actual type is defined by the implementations of
113
    /// the Capture trait.
114
    type State<S: core::fmt::Debug + Clone>: core::fmt::Debug + Clone;
115
}
116
117
#[derive(Debug, Clone)]
118
/// Family of state data that are implemented with the [`Delta`]
119
/// struct. Captures the difference between the current and previous
120
/// state of the VM.
121
pub struct Deltas;
122
123
impl VmStateCapture for Deltas {
124
    type State<S: core::fmt::Debug + Clone> = Delta<S>;
125
}
126
127
#[derive(Debug, Clone)]
128
/// The Delta struct represents the difference between two states of the VM.
129
pub struct Delta<S> {
130
    // Represents the state of the VM before a change.
131
    from: S,
132
    // Represents the state of the VM after a change.
133
    to: S,
134
}
135
136
#[derive(Debug, Clone)]
137
/// Family of state data that are implemented with the [`Previous`]
138
/// struct. Captures the initial state of the VM.
139
pub struct InitialVmState;
140
141
impl VmStateCapture for InitialVmState {
142
    type State<S: core::fmt::Debug + Clone> = Previous<S>;
143
}
144
#[derive(Debug, Clone)]
145
/// The State type when capturing the initial state of the VM.
146
pub struct Previous<S>(S);
147
148
#[derive(Debug, Clone)]
149
/// The state of a vector at an index.
150
struct VecState<T> {
151
    /// Index of the value.
152
    index: usize,
153
    /// Value at the index.
154
    value: T,
155
}
156
157
#[derive(Debug, Clone)]
158
/// The state of a map at a key.
159
struct MapState<K, V>
160
where
161
    K: Hash,
162
    V: PartialEq,
163
{
164
    /// Key of the value.
165
    key: K,
166
    /// Value at the key.
167
    value: V,
168
}
169
170
#[derive(Clone)]
171
/// The state of a memory region.
172
struct MemoryRegion {
173
    /// The start of the memory region.
174
    start: usize,
175
    /// The region of bytes.
176
    bytes: Vec<u8>,
177
}
178
179
impl Debug for MemoryRegion {
180
0
    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
181
0
        if f.alternate() {
182
0
            f.debug_struct("Memory")
183
0
                .field("start", &self.start)
184
0
                .field("bytes", &self.bytes)
185
0
                .finish()
186
        } else {
187
0
            f.debug_struct("Memory")
188
0
                .field("start", &self.start)
189
0
                .field("bytes", &self.bytes.len())
190
0
                .finish()
191
        }
192
0
    }
193
}
194
195
0
fn capture_buffer_state<'iter, I, T>(
196
0
    a: I,
197
0
    b: I,
198
0
    change: fn(Delta<VecState<T>>) -> Change<Deltas>,
199
0
) -> impl Iterator<Item = Change<Deltas>> + 'iter
200
0
where
201
0
    T: 'static + core::cmp::PartialEq + Clone,
202
0
    I: Iterator<Item = &'iter T> + 'iter,
203
0
{
204
0
    a.enumerate()
205
0
        .zip(b)
206
0
        .filter(|&(a, b)| (a.1 != b))
207
0
        .map(move |(a, b)| {
208
0
            change(Delta {
209
0
                from: VecState {
210
0
                    index: a.0,
211
0
                    value: a.1.clone(),
212
0
                },
213
0
                to: VecState {
214
0
                    index: a.0,
215
0
                    value: b.clone(),
216
0
                },
217
0
            })
218
0
        })
219
0
}
220
221
type ChangeDeltaVariant<S> = fn(Delta<S>) -> Change<Deltas>;
222
223
0
fn capture_map_state<'iter, K, V>(
224
0
    a: &'iter HashMap<K, V>,
225
0
    b: &'iter HashMap<K, V>,
226
0
    change: ChangeDeltaVariant<MapState<K, Option<V>>>,
227
0
) -> Vec<Change<Deltas>>
228
0
where
229
0
    K: 'static + PartialEq + Eq + Clone + Hash + Debug,
230
0
    V: 'static + core::cmp::PartialEq + Clone + Debug,
231
0
{
232
0
    let a_keys: HashSet<_> = a.keys().collect();
233
0
    let b_keys: HashSet<_> = b.keys().collect();
234
0
    capture_map_state_inner(a, &a_keys, b, &b_keys)
235
0
        .map(change)
236
0
        .collect()
237
0
}
238
239
0
fn capture_map_state_inner<'iter, K, V>(
240
0
    a: &'iter HashMap<K, V>,
241
0
    a_keys: &'iter HashSet<&K>,
242
0
    b: &'iter HashMap<K, V>,
243
0
    b_keys: &'iter HashSet<&K>,
244
0
) -> impl Iterator<Item = Delta<MapState<K, Option<V>>>> + 'iter
245
0
where
246
0
    K: 'static + PartialEq + Eq + Clone + Hash + Debug,
247
0
    V: 'static + core::cmp::PartialEq + Clone + Debug,
248
0
{
249
0
    let a_diff = a_keys.difference(b_keys).map(|k| Delta {
250
0
        from: MapState {
251
0
            key: (*k).clone(),
252
0
            value: Some(a[*k].clone()),
253
0
        },
254
0
        to: MapState {
255
0
            key: (*k).clone(),
256
0
            value: None,
257
0
        },
258
0
    });
259
0
    let b_diff = b_keys.difference(a_keys).map(|k| Delta {
260
0
        from: MapState {
261
0
            key: (*k).clone(),
262
0
            value: None,
263
0
        },
264
0
        to: MapState {
265
0
            key: (*k).clone(),
266
0
            value: Some(b[*k].clone()),
267
0
        },
268
0
    });
269
0
    let intersection = a_keys.intersection(b_keys).filter_map(|k| {
270
0
        let value_a = &a[*k];
271
0
        let value_b = &b[*k];
272
0
        (value_a != value_b).then(|| Delta {
273
0
            from: MapState {
274
0
                key: (*k).clone(),
275
0
                value: Some(value_a.clone()),
276
0
            },
277
0
            to: MapState {
278
0
                key: (*k).clone(),
279
0
                value: Some(value_b.clone()),
280
0
            },
281
0
        })
282
0
    });
283
0
284
0
    a_diff.chain(b_diff).chain(intersection)
285
0
}
286
287
0
fn capture_vec_state<'iter, I, T>(
288
0
    a: I,
289
0
    b: I,
290
0
    change: ChangeDeltaVariant<VecState<Option<T>>>,
291
0
) -> impl Iterator<Item = Change<Deltas>> + 'iter
292
0
where
293
0
    T: 'static + core::cmp::PartialEq + Clone,
294
0
    I: Iterator<Item = &'iter T> + 'iter,
295
0
{
296
0
    capture_vec_state_inner(a, b).map(move |(index, a, b)| {
297
0
        change(Delta {
298
0
            from: VecState { index, value: a },
299
0
            to: VecState { index, value: b },
300
0
        })
301
0
    })
302
0
}
303
0
fn capture_vec_state_inner<'iter, I, T>(
304
0
    a: I,
305
0
    b: I,
306
0
) -> impl Iterator<Item = (usize, Option<T>, Option<T>)> + 'iter
307
0
where
308
0
    T: 'static + core::cmp::PartialEq + Clone,
309
0
    I: Iterator<Item = &'iter T> + 'iter,
310
0
{
311
0
    a.map(Some)
312
0
        .chain(core::iter::repeat(None))
313
0
        .enumerate()
314
0
        .zip(b.map(Some).chain(core::iter::repeat(None)))
315
0
        .take_while(|((_, a), b)| a.is_some() || b.is_some())
316
0
        .filter(|((_, a), b)| b.map_or(true, |b| a.map_or(true, |a| a != b)))
317
0
        .map(|((index, a), b)| (index, a.cloned(), b.cloned()))
318
0
}
319
320
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
321
where
322
    M: Memory,
323
{
324
    /// The diff function generates a diff of VM state, represented by the Diff struct,
325
    /// between two VMs internal states.
326
0
    pub fn diff(&self, other: &Self) -> Diff<Deltas>
327
0
    where
328
0
        Tx: PartialEq + Clone + Debug + 'static,
329
0
    {
330
0
        let mut diff = Diff {
331
0
            changes: Vec::new(),
332
0
        };
333
0
        let registers = capture_buffer_state(
334
0
            self.registers.iter(),
335
0
            other.registers.iter(),
336
0
            Change::Register,
337
0
        );
338
0
        diff.changes.extend(registers);
339
0
        let frames =
340
0
            capture_vec_state(self.frames.iter(), other.frames.iter(), Change::Frame);
341
0
        diff.changes.extend(frames);
342
0
        let receipts = capture_vec_state(
343
0
            self.receipts.as_ref().iter(),
344
0
            other.receipts.as_ref().iter(),
345
0
            Change::Receipt,
346
0
        );
347
0
        diff.changes.extend(receipts);
348
0
        let balances = capture_map_state(
349
0
            self.balances.as_ref(),
350
0
            other.balances.as_ref(),
351
0
            Change::Balance,
352
0
        );
353
0
        diff.changes.extend(balances);
354
0
355
0
        let other_memory = other.memory().clone().into_linear_memory();
356
0
        let this_memory = self.memory().clone().into_linear_memory();
357
0
358
0
        let mut memory = this_memory.iter().enumerate().zip(other_memory.iter());
359
360
0
        while let Some(((start, s_from), s_to)) = memory
361
0
            .by_ref()
362
0
            .find(|((_, a), b)| a != b)
363
0
            .map(|((n, a), b)| ((n, *a), *b))
364
0
        {
365
0
            let (mut from, mut to): (Vec<_>, Vec<_>) = memory
366
0
                .by_ref()
367
0
                .take_while(|((_, a), b)| a != b)
368
0
                .map(|((_, a), b)| (*a, *b))
369
0
                .unzip();
370
0
            from.splice(..0, core::iter::once(s_from)).next();
371
0
            to.splice(..0, core::iter::once(s_to)).next();
372
0
            diff.changes.push(Change::Memory(Delta {
373
0
                from: MemoryRegion { start, bytes: from },
374
0
                to: MemoryRegion { start, bytes: to },
375
0
            }));
376
        }
377
378
0
        if self.context != other.context {
379
0
            diff.changes.push(Change::Context(Delta {
380
0
                from: self.context.clone(),
381
0
                to: other.context.clone(),
382
0
            }))
383
0
        }
384
385
0
        if self.panic_context != other.panic_context {
386
0
            diff.changes.push(Change::PanicContext(Delta {
387
0
                from: self.panic_context.clone(),
388
0
                to: other.panic_context.clone(),
389
0
            }))
390
0
        }
391
392
0
        if self.tx != other.tx {
393
0
            let from: Arc<dyn AnyDebug> = Arc::new(self.tx.clone());
394
0
            let to: Arc<dyn AnyDebug> = Arc::new(other.tx.clone());
395
0
            diff.changes.push(Change::Txn(Delta { from, to }))
396
0
        }
397
398
0
        diff
399
0
    }
400
}
401
402
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
403
where
404
    M: Memory,
405
{
406
0
    fn inverse_inner(&mut self, change: &Change<InitialVmState>)
407
0
    where
408
0
        Tx: Clone + 'static,
409
0
    {
410
0
        match change {
411
0
            Change::Register(Previous(VecState { index, value })) => {
412
0
                self.registers[*index] = *value
413
            }
414
0
            Change::Frame(Previous(value)) => invert_vec(&mut self.frames, value),
415
0
            Change::Receipt(Previous(value)) => {
416
0
                invert_receipts_ctx(&mut self.receipts, value)
417
            }
418
0
            Change::Balance(Previous(value)) => invert_map(self.balances.as_mut(), value),
419
0
            Change::Memory(Previous(MemoryRegion { start, bytes })) => self
420
0
                .memory_mut()
421
0
                .write_noownerchecks(*start, bytes.len())
422
0
                .expect("Memory must exist here")
423
0
                .copy_from_slice(&bytes[..]),
424
0
            Change::Context(Previous(value)) => self.context = value.clone(),
425
0
            Change::PanicContext(Previous(value)) => self.panic_context = value.clone(),
426
0
            Change::Txn(Previous(tx)) => {
427
0
                self.tx = AsRef::<dyn AnyDebug>::as_ref(tx)
428
0
                    .as_any_ref()
429
0
                    .downcast_ref::<Tx>()
430
0
                    .unwrap()
431
0
                    .clone();
432
0
            }
433
0
            Change::Storage(_) => (),
434
        }
435
0
    }
436
}
437
438
0
fn invert_vec<T: Clone>(vector: &mut Vec<T>, value: &VecState<Option<T>>) {
439
    use core::cmp::Ordering;
440
0
    match (&value, value.index.cmp(&vector.len())) {
441
        (
442
            VecState {
443
0
                index,
444
0
                value: Some(value),
445
0
            },
446
0
            Ordering::Equal | Ordering::Greater,
447
0
        ) => {
448
0
            vector.resize((*index).saturating_add(1), value.clone());
449
0
            vector[*index] = value.clone();
450
0
        }
451
        (
452
            VecState {
453
0
                index,
454
0
                value: Some(value),
455
0
            },
456
0
            Ordering::Less,
457
0
        ) => vector[*index] = value.clone(),
458
0
        (VecState { value: None, .. }, Ordering::Equal | Ordering::Greater) => (),
459
0
        (VecState { index, value: None }, Ordering::Less) => vector.truncate(*index),
460
    }
461
0
}
462
463
0
fn invert_map<K: Hash + PartialEq + Eq + Clone, V: Clone + PartialEq>(
464
0
    map: &mut HashMap<K, V>,
465
0
    value: &MapState<K, Option<V>>,
466
0
) {
467
0
    match value {
468
        MapState {
469
0
            key,
470
0
            value: Some(value),
471
0
        } => {
472
0
            map.insert(key.clone(), value.clone());
473
0
        }
474
0
        MapState { key, value: None } => {
475
0
            map.remove(key);
476
0
        }
477
    }
478
0
}
479
480
0
fn invert_receipts_ctx(ctx: &mut ReceiptsCtx, value: &VecState<Option<Receipt>>) {
481
0
    let mut ctx_mut = ctx.lock();
482
0
    invert_vec(ctx_mut.receipts_mut(), value);
483
0
}
484
485
impl<M, S, Tx, Ecal> PartialEq for Interpreter<M, S, Tx, Ecal>
486
where
487
    M: Memory,
488
    Tx: PartialEq,
489
{
490
    /// Does not compare storage, debugger or profiler
491
0
    fn eq(&self, other: &Self) -> bool {
492
0
        self.registers == other.registers
493
0
            && self.memory.as_ref() == other.memory.as_ref()
494
0
            && self.frames == other.frames
495
0
            && self.receipts == other.receipts
496
0
            && self.tx == other.tx
497
0
            && self.initial_balances == other.initial_balances
498
0
            && self.context == other.context
499
0
            && self.balances == other.balances
500
0
            && self.interpreter_params == other.interpreter_params
501
0
            && self.panic_context == other.panic_context
502
0
    }
503
}
504
505
impl From<Diff<Deltas>> for Diff<InitialVmState> {
506
0
    fn from(d: Diff<Deltas>) -> Self {
507
0
        Self {
508
0
            changes: d
509
0
                .changes
510
0
                .into_iter()
511
0
                .map(|c| match c {
512
0
                    Change::Register(v) => Change::Register(v.into()),
513
0
                    Change::Memory(v) => Change::Memory(v.into()),
514
0
                    Change::Storage(v) => Change::Storage(v.into()),
515
0
                    Change::Frame(v) => Change::Frame(v.into()),
516
0
                    Change::Receipt(v) => Change::Receipt(v.into()),
517
0
                    Change::Balance(v) => Change::Balance(v.into()),
518
0
                    Change::Context(v) => Change::Context(v.into()),
519
0
                    Change::PanicContext(v) => Change::PanicContext(v.into()),
520
0
                    Change::Txn(v) => Change::Txn(v.into()),
521
0
                })
522
0
                .collect(),
523
0
        }
524
0
    }
525
}
526
527
impl<T> From<Delta<T>> for Previous<T> {
528
0
    fn from(d: Delta<T>) -> Self {
529
0
        Self(d.from)
530
0
    }
Unexecuted instantiation: _RNvXs6_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4diffINtB5_8PreviousINtB5_8VecStateyEEINtNtCsd3UI3IJrzMw_4core7convert4FromINtB5_5DeltaB12_EE4fromB9_
Unexecuted instantiation: _RNvXs6_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4diffINtB5_8PreviousNtB5_12MemoryRegionEINtNtCsd3UI3IJrzMw_4core7convert4FromINtB5_5DeltaB12_EE4fromB9_
Unexecuted instantiation: _RNvXs6_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4diffINtB5_8PreviousNtNtB5_7storage12StorageStateEINtNtCsd3UI3IJrzMw_4core7convert4FromINtB5_5DeltaB12_EE4fromB9_
Unexecuted instantiation: _RNvXs6_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4diffINtB5_8PreviousINtB5_8VecStateINtNtCsd3UI3IJrzMw_4core6option6OptionNtNtB9_4call9CallFrameEEEINtNtB1m_7convert4FromINtB5_5DeltaB12_EE4fromB9_
Unexecuted instantiation: _RNvXs6_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4diffINtB5_8PreviousINtB5_8VecStateINtNtCsd3UI3IJrzMw_4core6option6OptionNtNtCseSMGV7FMBK4_7fuel_tx7receipt7ReceiptEEEINtNtB1m_7convert4FromINtB5_5DeltaB12_EE4fromB9_
Unexecuted instantiation: _RNvXs6_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4diffINtB5_8PreviousINtB5_8MapStateNtNtCsklA9joyWMfk_10fuel_types11array_types7AssetIdINtNtCsd3UI3IJrzMw_4core6option6OptionNtNtB7_8balances7BalanceEEEINtNtB2b_7convert4FromINtB5_5DeltaB12_EE4fromB9_
Unexecuted instantiation: _RNvXs6_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4diffINtB5_8PreviousNtNtB9_7context7ContextEINtNtCsd3UI3IJrzMw_4core7convert4FromINtB5_5DeltaB12_EE4fromB9_
Unexecuted instantiation: _RNvXs6_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4diffINtB5_8PreviousNtB7_12PanicContextEINtNtCsd3UI3IJrzMw_4core7convert4FromINtB5_5DeltaB12_EE4fromB9_
Unexecuted instantiation: _RNvXs6_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter4diffINtB5_8PreviousINtNtCs5vansr6XbJU_5alloc4sync3ArcDNtB5_8AnyDebugEL_EEINtNtCsd3UI3IJrzMw_4core7convert4FromINtB5_5DeltaB12_EE4fromB9_
531
}
532
533
impl<T: VmStateCapture + Clone> AddAssign for Diff<T> {
534
0
    fn add_assign(&mut self, rhs: Self) {
535
0
        self.changes.extend(rhs.changes);
536
0
    }
537
}
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter/diff/storage.rs
Line
Count
Source
1
use core::fmt::Debug;
2
use hashbrown::HashMap;
3
4
use fuel_storage::{
5
    StorageRead,
6
    StorageSize,
7
    StorageWrite,
8
};
9
use fuel_tx::ConsensusParameters;
10
use fuel_types::{
11
    BlobId,
12
    BlockHeight,
13
    Bytes32,
14
    ContractId,
15
};
16
17
use crate::storage::{
18
    BlobBytes,
19
    BlobData,
20
    ContractsAssetKey,
21
    ContractsAssetsStorage,
22
    ContractsStateData,
23
    ContractsStateKey,
24
    InterpreterStorage,
25
    UploadedBytecode,
26
    UploadedBytecodes,
27
};
28
29
use super::{
30
    ExecutableTransaction,
31
    Interpreter,
32
    *,
33
};
34
35
#[derive(Debug)]
36
/// The set of state changes that are recorded.
37
pub(super) enum StorageDelta {
38
    State(MappableDelta<ContractsStateKey, ContractsStateData>),
39
    Assets(MappableDelta<ContractsAssetKey, u64>),
40
    RawCode(MappableDelta<ContractId, Contract>),
41
    UploadedBytecode(MappableDelta<Bytes32, UploadedBytecode>),
42
    BlobData(MappableDelta<BlobId, BlobBytes>),
43
}
44
45
/// The set of states that are recorded.
46
#[derive(Debug, Clone)]
47
pub(super) enum StorageState {
48
    State(MappableState<ContractsStateKey, ContractsStateData>),
49
    Assets(MappableState<ContractsAssetKey, u64>),
50
    RawCode(MappableState<ContractId, Contract>),
51
    UploadedBytecode(MappableState<Bytes32, UploadedBytecode>),
52
    BlobData(MappableState<BlobId, BlobBytes>),
53
}
54
55
#[derive(Debug)]
56
/// A [`Mappable`] type that has changed.
57
pub(super) enum MappableDelta<Key, Value> {
58
    Replace(Key, Value, Option<Value>),
59
    Take(Key, Value),
60
}
61
62
/// The state of a [`Mappable`] type.
63
#[derive(Debug, Clone)]
64
pub(super) struct MappableState<Key, Value> {
65
    pub key: Key,
66
    pub value: Option<Value>,
67
}
68
69
/// Records state changes of any [`Mappable`] type.
70
pub(super) trait StorageType: Mappable {
71
    /// Records a replace state change.
72
    fn record_replace(
73
        key: &Self::Key,
74
        value: &Self::Value,
75
        existing: Option<Self::OwnedValue>,
76
    ) -> StorageDelta;
77
78
    /// Records a take state change.
79
    fn record_take(key: &Self::Key, value: Self::OwnedValue) -> StorageDelta;
80
}
81
82
#[derive(Debug)]
83
pub struct Record<S>(pub(super) S, pub(super) Vec<StorageDelta>)
84
where
85
    S: InterpreterStorage;
86
87
impl<M, S, Tx, Ecal> Interpreter<M, Record<S>, Tx, Ecal>
88
where
89
    S: InterpreterStorage,
90
    Tx: ExecutableTransaction,
91
{
92
    /// Remove the [`Recording`] wrapper from the storage.
93
    /// Recording storage changes has an overhead so it's
94
    /// useful to be able to remove it once the diff is generated.
95
0
    pub fn remove_recording(self) -> Interpreter<M, S, Tx, Ecal> {
96
0
        Interpreter {
97
0
            registers: self.registers,
98
0
            memory: self.memory,
99
0
            frames: self.frames,
100
0
            receipts: self.receipts,
101
0
            tx: self.tx,
102
0
            initial_balances: self.initial_balances,
103
0
            input_contracts: self.input_contracts,
104
0
            input_contracts_index_to_output_index: self
105
0
                .input_contracts_index_to_output_index,
106
0
            storage: self.storage.0,
107
0
            debugger: self.debugger,
108
0
            context: self.context,
109
0
            balances: self.balances,
110
0
            panic_context: self.panic_context,
111
0
            profiler: self.profiler,
112
0
            interpreter_params: self.interpreter_params,
113
0
            ecal_state: self.ecal_state,
114
0
        }
115
0
    }
116
117
    /// Get the diff of changes to this VMs storage.
118
0
    pub fn storage_diff(&self) -> Diff<Deltas> {
119
0
        let mut diff = Diff {
120
0
            changes: Vec::new(),
121
0
        };
122
0
        let mut contracts_state = Delta {
123
0
            from: HashMap::new(),
124
0
            to: HashMap::new(),
125
0
        };
126
0
        let mut contracts_assets = Delta {
127
0
            from: HashMap::new(),
128
0
            to: HashMap::new(),
129
0
        };
130
0
        let mut contracts_raw_code = Delta {
131
0
            from: HashMap::new(),
132
0
            to: HashMap::new(),
133
0
        };
134
0
        let mut uploaded_bytecode: Delta<HashMap<Bytes32, &UploadedBytecode>> = Delta {
135
0
            from: HashMap::new(),
136
0
            to: HashMap::new(),
137
0
        };
138
0
        let mut blob_data = Delta {
139
0
            from: HashMap::new(),
140
0
            to: HashMap::new(),
141
0
        };
142
143
0
        for delta in self.storage.1.iter() {
144
0
            match delta {
145
0
                StorageDelta::State(delta) => {
146
0
                    mappable_delta_to_hashmap(&mut contracts_state, delta)
147
                }
148
0
                StorageDelta::Assets(delta) => {
149
0
                    mappable_delta_to_hashmap(&mut contracts_assets, delta)
150
                }
151
0
                StorageDelta::RawCode(delta) => {
152
0
                    mappable_delta_to_hashmap(&mut contracts_raw_code, delta)
153
                }
154
0
                StorageDelta::UploadedBytecode(delta) => {
155
0
                    mappable_delta_to_hashmap(&mut uploaded_bytecode, delta)
156
                }
157
0
                StorageDelta::BlobData(delta) => {
158
0
                    mappable_delta_to_hashmap(&mut blob_data, delta)
159
                }
160
            }
161
        }
162
0
        storage_state_to_changes(&mut diff, contracts_state, StorageState::State);
163
0
        storage_state_to_changes(&mut diff, contracts_assets, StorageState::Assets);
164
0
        storage_state_to_changes(&mut diff, contracts_raw_code, StorageState::RawCode);
165
0
        storage_state_to_changes(
166
0
            &mut diff,
167
0
            uploaded_bytecode,
168
0
            StorageState::UploadedBytecode,
169
0
        );
170
0
        storage_state_to_changes(&mut diff, blob_data, StorageState::BlobData);
171
0
        diff
172
0
    }
173
}
174
175
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
176
where
177
    M: Memory,
178
    S: InterpreterStorage,
179
    Tx: ExecutableTransaction,
180
{
181
    /// Add a [`Recording`] wrapper around the storage to
182
    /// record any changes this VM makes to it's storage.
183
    /// Recording storage changes has an overhead so should
184
    /// be used in production.
185
0
    pub fn add_recording(self) -> Interpreter<M, Record<S>, Tx, Ecal> {
186
0
        Interpreter {
187
0
            registers: self.registers,
188
0
            memory: self.memory,
189
0
            frames: self.frames,
190
0
            receipts: self.receipts,
191
0
            tx: self.tx,
192
0
            initial_balances: self.initial_balances,
193
0
            input_contracts: self.input_contracts,
194
0
            input_contracts_index_to_output_index: self
195
0
                .input_contracts_index_to_output_index,
196
0
            storage: Record::new(self.storage),
197
0
            debugger: self.debugger,
198
0
            context: self.context,
199
0
            balances: self.balances,
200
0
            panic_context: self.panic_context,
201
0
            profiler: self.profiler,
202
0
            interpreter_params: self.interpreter_params,
203
0
            ecal_state: self.ecal_state,
204
0
        }
205
0
    }
206
207
    /// Change this VMs internal state to match the initial state from this diff.
208
0
    pub fn reset_vm_state(&mut self, diff: &Diff<InitialVmState>)
209
0
    where
210
0
        Tx: Clone + 'static,
211
0
    {
212
0
        for change in &diff.changes {
213
0
            self.inverse_inner(change);
214
0
            if let Change::Storage(Previous(from)) = change {
215
0
                match from {
216
0
                    StorageState::State(MappableState { key, value }) => {
217
0
                        if let Some(value) = value {
218
0
                            StorageMutate::<ContractsState>::insert(
219
0
                                &mut self.storage,
220
0
                                key,
221
0
                                value.as_ref(),
222
0
                            )
223
0
                            .unwrap();
224
0
                        }
225
                    }
226
0
                    StorageState::Assets(MappableState { key, value }) => {
227
0
                        if let Some(value) = value {
228
0
                            StorageMutate::<ContractsAssets>::insert(
229
0
                                &mut self.storage,
230
0
                                key,
231
0
                                value,
232
0
                            )
233
0
                            .unwrap();
234
0
                        }
235
                    }
236
0
                    StorageState::RawCode(MappableState { key, value }) => {
237
0
                        if let Some(value) = value {
238
0
                            StorageMutate::<ContractsRawCode>::insert(
239
0
                                &mut self.storage,
240
0
                                key,
241
0
                                value.as_ref(),
242
0
                            )
243
0
                            .unwrap();
244
0
                        }
245
                    }
246
0
                    StorageState::UploadedBytecode(MappableState { key, value }) => {
247
0
                        if let Some(value) = value {
248
0
                            StorageMutate::<UploadedBytecodes>::insert(
249
0
                                &mut self.storage,
250
0
                                key,
251
0
                                value,
252
0
                            )
253
0
                            .unwrap();
254
0
                        }
255
                    }
256
0
                    StorageState::BlobData(MappableState { key, value }) => {
257
0
                        if let Some(value) = value {
258
0
                            StorageMutate::<BlobData>::insert(
259
0
                                &mut self.storage,
260
0
                                key,
261
0
                                value.as_ref(),
262
0
                            )
263
0
                            .unwrap();
264
0
                        }
265
                    }
266
                }
267
0
            }
268
        }
269
0
    }
270
}
271
272
0
fn mappable_delta_to_hashmap<'value, K, V>(
273
0
    state: &mut Delta<HashMap<K, &'value V>>,
274
0
    delta: &'value MappableDelta<K, V>,
275
0
) where
276
0
    K: Copy + PartialEq + Eq + core::hash::Hash + 'static,
277
0
    V: Clone + 'static,
278
0
{
279
0
    match delta {
280
0
        MappableDelta::Replace(key, value, Some(existing)) => {
281
0
            state.from.entry(*key).or_insert(existing);
282
0
            state.to.insert(*key, value);
283
0
        }
284
0
        MappableDelta::Replace(key, value, None) => {
285
0
            state.to.insert(*key, value);
286
0
        }
287
0
        MappableDelta::Take(key, existing) => {
288
0
            state.from.entry(*key).or_insert(existing);
289
0
            state.to.remove(key);
290
0
        }
291
    }
292
0
}
293
294
0
fn storage_state_to_changes<K, V>(
295
0
    diff: &mut Diff<Deltas>,
296
0
    state: Delta<HashMap<K, &V>>,
297
0
    f: fn(MappableState<K, V>) -> StorageState,
298
0
) where
299
0
    K: Copy + PartialEq + Eq + Hash + 'static,
300
0
    V: Clone + 'static,
301
0
{
302
0
    let Delta { mut from, to } = state;
303
0
    let iter = to.into_iter().map(|(k, v)| {
304
0
        Change::Storage(Delta {
305
0
            from: f(MappableState {
306
0
                key: k,
307
0
                value: from.remove(&k).cloned(),
308
0
            }),
309
0
            to: f(MappableState {
310
0
                key: k,
311
0
                value: Some(v.clone()),
312
0
            }),
313
0
        })
314
0
    });
315
0
    diff.changes.extend(iter);
316
0
    let iter = from.into_iter().map(|(k, v)| {
317
0
        Change::Storage(Delta {
318
0
            from: f(MappableState {
319
0
                key: k,
320
0
                value: Some(v.clone()),
321
0
            }),
322
0
            to: f(MappableState {
323
0
                key: k,
324
0
                value: None,
325
0
            }),
326
0
        })
327
0
    });
328
0
    diff.changes.extend(iter);
329
0
}
330
331
impl<Type: Mappable, S> StorageInspect<Type> for Record<S>
332
where
333
    S: StorageInspect<Type>,
334
    S: InterpreterStorage,
335
{
336
    type Error = <S as StorageInspect<Type>>::Error;
337
338
0
    fn get(
339
0
        &self,
340
0
        key: &<Type as Mappable>::Key,
341
0
    ) -> Result<Option<alloc::borrow::Cow<<Type as Mappable>::OwnedValue>>, Self::Error>
342
0
    {
343
0
        <S as StorageInspect<Type>>::get(&self.0, key)
344
0
    }
345
346
0
    fn contains_key(&self, key: &<Type as Mappable>::Key) -> Result<bool, Self::Error> {
347
0
        <S as StorageInspect<Type>>::contains_key(&self.0, key)
348
0
    }
349
}
350
351
impl<Type: Mappable, S> StorageSize<Type> for Record<S>
352
where
353
    S: StorageSize<Type>,
354
    S: InterpreterStorage,
355
{
356
0
    fn size_of_value(
357
0
        &self,
358
0
        key: &<Type as Mappable>::Key,
359
0
    ) -> Result<Option<usize>, Self::Error> {
360
0
        <S as StorageSize<Type>>::size_of_value(&self.0, key)
361
0
    }
362
}
363
364
impl<Type: Mappable, S> StorageRead<Type> for Record<S>
365
where
366
    S: StorageRead<Type>,
367
    S: InterpreterStorage,
368
{
369
0
    fn read(
370
0
        &self,
371
0
        key: &<Type as Mappable>::Key,
372
0
        buf: &mut [u8],
373
0
    ) -> Result<Option<usize>, Self::Error> {
374
0
        <S as StorageRead<Type>>::read(&self.0, key, buf)
375
0
    }
376
377
0
    fn read_alloc(
378
0
        &self,
379
0
        key: &<Type as Mappable>::Key,
380
0
    ) -> Result<Option<Vec<u8>>, Self::Error> {
381
0
        <S as StorageRead<Type>>::read_alloc(&self.0, key)
382
0
    }
383
}
384
385
impl<Type: StorageType, S> StorageMutate<Type> for Record<S>
386
where
387
    S: StorageInspect<Type>,
388
    S: StorageMutate<Type>,
389
    S: InterpreterStorage,
390
{
391
0
    fn replace(
392
0
        &mut self,
393
0
        key: &Type::Key,
394
0
        value: &Type::Value,
395
0
    ) -> Result<Option<Type::OwnedValue>, Self::Error> {
396
0
        let existing = <S as StorageMutate<Type>>::replace(&mut self.0, key, value)?;
397
0
        self.1.push(<Type as StorageType>::record_replace(
398
0
            key,
399
0
            value,
400
0
            existing.clone(),
401
0
        ));
402
0
        Ok(existing)
403
0
    }
404
405
0
    fn take(&mut self, key: &Type::Key) -> Result<Option<Type::OwnedValue>, Self::Error> {
406
0
        let existing = <S as StorageMutate<Type>>::take(&mut self.0, key)?;
407
0
        if let Some(existing) = &existing {
408
0
            self.1
409
0
                .push(<Type as StorageType>::record_take(key, existing.clone()));
410
0
        }
411
0
        Ok(existing)
412
0
    }
413
}
414
415
impl<Type: StorageType, S> StorageWrite<Type> for Record<S>
416
where
417
    S: StorageWrite<Type>,
418
    S: InterpreterStorage,
419
{
420
0
    fn write_bytes(&mut self, key: &Type::Key, buf: &[u8]) -> Result<usize, Self::Error> {
421
0
        <S as StorageWrite<Type>>::write_bytes(&mut self.0, key, buf)
422
0
    }
423
424
0
    fn replace_bytes(
425
0
        &mut self,
426
0
        key: &Type::Key,
427
0
        buf: &[u8],
428
0
    ) -> Result<(usize, Option<Vec<u8>>), Self::Error> {
429
0
        <S as StorageWrite<Type>>::replace_bytes(&mut self.0, key, buf)
430
0
    }
431
432
0
    fn take_bytes(&mut self, key: &Type::Key) -> Result<Option<Vec<u8>>, Self::Error> {
433
0
        <S as StorageWrite<Type>>::take_bytes(&mut self.0, key)
434
0
    }
435
}
436
437
impl<S: ContractsAssetsStorage + InterpreterStorage> ContractsAssetsStorage
438
    for Record<S>
439
{
440
}
441
442
impl<S> InterpreterStorage for Record<S>
443
where
444
    S: InterpreterStorage,
445
{
446
    type DataError = <S as InterpreterStorage>::DataError;
447
448
0
    fn block_height(&self) -> Result<BlockHeight, Self::DataError> {
449
0
        self.0.block_height()
450
0
    }
451
452
0
    fn consensus_parameters_version(&self) -> Result<u32, Self::DataError> {
453
0
        self.0.consensus_parameters_version()
454
0
    }
455
456
0
    fn state_transition_version(&self) -> Result<u32, Self::DataError> {
457
0
        self.0.state_transition_version()
458
0
    }
459
460
0
    fn timestamp(&self, height: BlockHeight) -> Result<Word, Self::DataError> {
461
0
        self.0.timestamp(height)
462
0
    }
463
464
0
    fn block_hash(&self, block_height: BlockHeight) -> Result<Bytes32, Self::DataError> {
465
0
        self.0.block_hash(block_height)
466
0
    }
467
468
0
    fn coinbase(&self) -> Result<fuel_types::ContractId, Self::DataError> {
469
0
        self.0.coinbase()
470
0
    }
471
472
0
    fn set_consensus_parameters(
473
0
        &mut self,
474
0
        version: u32,
475
0
        consensus_parameters: &ConsensusParameters,
476
0
    ) -> Result<Option<ConsensusParameters>, Self::DataError> {
477
0
        self.0
478
0
            .set_consensus_parameters(version, consensus_parameters)
479
0
    }
480
481
0
    fn set_state_transition_bytecode(
482
0
        &mut self,
483
0
        version: u32,
484
0
        hash: &Bytes32,
485
0
    ) -> Result<Option<Bytes32>, Self::DataError> {
486
0
        self.0.set_state_transition_bytecode(version, hash)
487
0
    }
488
489
0
    fn contract_state_range(
490
0
        &self,
491
0
        id: &ContractId,
492
0
        start_key: &Bytes32,
493
0
        range: usize,
494
0
    ) -> Result<Vec<Option<alloc::borrow::Cow<ContractsStateData>>>, Self::DataError>
495
0
    {
496
0
        self.0.contract_state_range(id, start_key, range)
497
0
    }
498
499
0
    fn contract_state_insert_range<'a, I>(
500
0
        &mut self,
501
0
        contract: &ContractId,
502
0
        start_key: &Bytes32,
503
0
        values: I,
504
0
    ) -> Result<usize, Self::DataError>
505
0
    where
506
0
        I: Iterator<Item = &'a [u8]>,
507
0
    {
508
0
        self.0
509
0
            .contract_state_insert_range(contract, start_key, values)
510
0
    }
511
512
0
    fn contract_state_remove_range(
513
0
        &mut self,
514
0
        contract: &ContractId,
515
0
        start_key: &Bytes32,
516
0
        range: usize,
517
0
    ) -> Result<Option<()>, S::DataError> {
518
0
        self.0
519
0
            .contract_state_remove_range(contract, start_key, range)
520
0
    }
521
}
522
523
impl StorageType for ContractsState {
524
0
    fn record_replace(
525
0
        key: &Self::Key,
526
0
        value: &[u8],
527
0
        existing: Option<ContractsStateData>,
528
0
    ) -> StorageDelta {
529
0
        StorageDelta::State(MappableDelta::Replace(*key, value.into(), existing))
530
0
    }
531
532
0
    fn record_take(key: &Self::Key, value: ContractsStateData) -> StorageDelta {
533
0
        StorageDelta::State(MappableDelta::Take(*key, value))
534
0
    }
535
}
536
537
impl StorageType for ContractsAssets {
538
0
    fn record_replace(
539
0
        key: &Self::Key,
540
0
        value: &u64,
541
0
        existing: Option<u64>,
542
0
    ) -> StorageDelta {
543
0
        StorageDelta::Assets(MappableDelta::Replace(*key, *value, existing))
544
0
    }
545
546
0
    fn record_take(key: &Self::Key, value: u64) -> StorageDelta {
547
0
        StorageDelta::Assets(MappableDelta::Take(*key, value))
548
0
    }
549
}
550
551
impl StorageType for ContractsRawCode {
552
0
    fn record_replace(
553
0
        key: &ContractId,
554
0
        value: &[u8],
555
0
        existing: Option<Contract>,
556
0
    ) -> StorageDelta {
557
0
        StorageDelta::RawCode(MappableDelta::Replace(*key, value.into(), existing))
558
0
    }
559
560
0
    fn record_take(key: &ContractId, value: Contract) -> StorageDelta {
561
0
        StorageDelta::RawCode(MappableDelta::Take(*key, value))
562
0
    }
563
}
564
565
impl StorageType for UploadedBytecodes {
566
0
    fn record_replace(
567
0
        key: &Bytes32,
568
0
        value: &UploadedBytecode,
569
0
        existing: Option<UploadedBytecode>,
570
0
    ) -> StorageDelta {
571
0
        StorageDelta::UploadedBytecode(MappableDelta::Replace(
572
0
            *key,
573
0
            value.clone(),
574
0
            existing,
575
0
        ))
576
0
    }
577
578
0
    fn record_take(key: &Bytes32, value: UploadedBytecode) -> StorageDelta {
579
0
        StorageDelta::UploadedBytecode(MappableDelta::Take(*key, value))
580
0
    }
581
}
582
583
impl StorageType for BlobData {
584
0
    fn record_replace(
585
0
        key: &BlobId,
586
0
        value: &[u8],
587
0
        existing: Option<BlobBytes>,
588
0
    ) -> StorageDelta {
589
0
        StorageDelta::BlobData(MappableDelta::Replace(*key, value.into(), existing))
590
0
    }
591
592
0
    fn record_take(key: &BlobId, value: BlobBytes) -> StorageDelta {
593
0
        StorageDelta::BlobData(MappableDelta::Take(*key, value))
594
0
    }
595
}
596
impl<S> Record<S>
597
where
598
    S: InterpreterStorage,
599
{
600
0
    pub fn new(s: S) -> Self {
601
0
        Self(s, Vec::new())
602
0
    }
603
}
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter/alu/muldiv.rs
Line
Count
Source
1
use super::super::{
2
    internal::inc_pc,
3
    is_wrapping,
4
    ExecutableTransaction,
5
    Interpreter,
6
};
7
use crate::{
8
    constraints::reg_key::*,
9
    error::SimpleResult,
10
};
11
12
use fuel_asm::PanicReason;
13
use fuel_types::{
14
    RegisterId,
15
    Word,
16
};
17
18
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
19
where
20
    Tx: ExecutableTransaction,
21
{
22
    /// Stores the overflowed wrapped value into RegId::OF
23
3.50M
    pub(crate) fn alu_muldiv(
24
3.50M
        &mut self,
25
3.50M
        ra: RegisterId,
26
3.50M
        lhs: Word,
27
3.50M
        rhs: Word,
28
3.50M
        divider: Word,
29
3.50M
    ) -> SimpleResult<()> {
30
3.50M
        let (
31
3.50M
            SystemRegisters {
32
3.50M
                flag,
33
3.50M
                mut of,
34
3.50M
                mut err,
35
3.50M
                pc,
36
3.50M
                ..
37
3.50M
            },
38
3.50M
            mut w,
39
3.50M
        ) = split_registers(&mut self.registers);
40
3.50M
        let dest = &mut w[ra.try_into()?];
41
42
3.50M
        let (result, overflow) = muldiv(lhs, rhs, divider);
43
3.50M
44
3.50M
        if overflow != 0 && !is_wrapping(flag.into()) {
45
2
            return Err(PanicReason::ArithmeticOverflow.into())
46
3.50M
        }
47
3.50M
48
3.50M
        *of = overflow;
49
3.50M
        *err = 0;
50
3.50M
        *dest = result;
51
3.50M
52
3.50M
        inc_pc(pc)?;
53
3.50M
        Ok(())
54
3.50M
    }
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu6muldivINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2n_4blob8BlobBodyNtB3T_12BlobMetadataEE10alu_muldivB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu6muldivINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2n_6create10CreateBodyNtB3T_14CreateMetadataEE10alu_muldivB8_
_RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu6muldivINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2n_6script10ScriptBodyNtB3T_14ScriptMetadataEE10alu_muldivB8_
Line
Count
Source
23
3.50M
    pub(crate) fn alu_muldiv(
24
3.50M
        &mut self,
25
3.50M
        ra: RegisterId,
26
3.50M
        lhs: Word,
27
3.50M
        rhs: Word,
28
3.50M
        divider: Word,
29
3.50M
    ) -> SimpleResult<()> {
30
3.50M
        let (
31
3.50M
            SystemRegisters {
32
3.50M
                flag,
33
3.50M
                mut of,
34
3.50M
                mut err,
35
3.50M
                pc,
36
3.50M
                ..
37
3.50M
            },
38
3.50M
            mut w,
39
3.50M
        ) = split_registers(&mut self.registers);
40
3.50M
        let dest = &mut w[ra.try_into()?];
41
42
3.50M
        let (result, overflow) = muldiv(lhs, rhs, divider);
43
3.50M
44
3.50M
        if overflow != 0 && !is_wrapping(flag.into()) {
45
2
            return Err(PanicReason::ArithmeticOverflow.into())
46
3.50M
        }
47
3.50M
48
3.50M
        *of = overflow;
49
3.50M
        *err = 0;
50
3.50M
        *dest = result;
51
3.50M
52
3.50M
        inc_pc(pc)?;
53
3.50M
        Ok(())
54
3.50M
    }
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu6muldivINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1J_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2R_4blob8BlobBodyNtB4n_12BlobMetadataEE10alu_muldivB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu6muldivINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1J_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2R_6create10CreateBodyNtB4n_14CreateMetadataEE10alu_muldivB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu6muldivINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1J_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2R_6script10ScriptBodyNtB4n_14ScriptMetadataEE10alu_muldivB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu6muldivINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1J_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2R_6upload10UploadBodyNtB4n_14UploadMetadataEE10alu_muldivB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu6muldivINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1J_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2R_7upgrade11UpgradeBodyNtB4n_15UpgradeMetadataEE10alu_muldivB8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu6muldivINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1L_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB31_6script10ScriptBodyNtB4x_14ScriptMetadataEE10alu_muldivB8_
55
}
56
57
/// Fused multiply-divide with arbitrary precision intermediate result.
58
/// Returns `(result, overflow)`.
59
/// Divider 0 is treated as `1<<64`.
60
#[allow(clippy::cast_possible_truncation)]
61
3.50M
pub(crate) fn muldiv(lhs: u64, rhs: u64, divider: u64) -> (u64, u64) {
62
3.50M
    // Widen all inputs so we never overflow
63
3.50M
    let lhs = lhs as u128;
64
3.50M
    let rhs = rhs as u128;
65
3.50M
    let divider = divider as u128;
66
3.50M
67
3.50M
    // Compute intermediate result
68
3.50M
    let intermediate = lhs
69
3.50M
        .checked_mul(rhs)
70
3.50M
        .expect("Cannot overflow as we have enough bits");
71
72
    // Divide
73
3.50M
    if let Some(result) = intermediate.checked_div(divider) {
74
        // We want to truncate the `result` here and return a non-empty `overflow`.
75
2.10M
        (result as u64, (result >> 64) as u64)
76
    } else {
77
1.39M
        ((intermediate >> 64) as u64, 0)
78
    }
79
3.50M
}
80
81
#[cfg(test)]
82
mod tests {
83
    use super::*;
84
85
    #[rstest::rstest]
86
    #[case(0, 0, 0, 0, 0)]
87
    #[case(0, 0, 1, 0, 0)]
88
    #[case(0, 5, 1, 0, 0)]
89
    #[case(9, 9, 1, 81, 0)]
90
    #[case(9, 9, 2, 40, 0)]
91
    #[case(9, 9, 3, 27, 0)]
92
    #[case(9, 9, 4, 20, 0)]
93
    #[case(u64::MAX, 5, 10, u64::MAX / 2, 0)]
94
    #[case(u64::MAX, 2, 6, u64::MAX / 3, 0)]
95
    #[case(u64::MAX, u64::MAX, u64::MAX, u64::MAX, 0)]
96
    #[case(u64::MAX, 4, 2, 0xfffffffffffffffe, 1)]
97
    #[case(u64::MAX, 3, 2, 0x7ffffffffffffffe, 1)]
98
    fn fused_muldiv(
99
        #[case] lhs: u64,
100
        #[case] rhs: u64,
101
        #[case] divisor: u64,
102
        #[case] expected: u64,
103
        #[case] expected_overflow: u64,
104
    ) {
105
        let (result, overflow) = muldiv(lhs, rhs, divisor);
106
        assert_eq!(result, expected);
107
        assert_eq!(overflow, expected_overflow);
108
    }
109
}
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter/alu/wideint.rs
Line
Count
Source
1
use ethnum::U256;
2
3
use fuel_asm::{
4
    wideint::*,
5
    PanicReason,
6
};
7
use fuel_types::{
8
    RegisterId,
9
    Word,
10
};
11
12
use super::super::{
13
    internal::inc_pc,
14
    is_unsafe_math,
15
    is_wrapping,
16
    ExecutableTransaction,
17
    Interpreter,
18
};
19
use crate::{
20
    constraints::reg_key::*,
21
    error::SimpleResult,
22
    interpreter::Memory,
23
};
24
25
// This macro is used to duplicate the implementation for both 128-bit and 256-bit
26
// versions. It takes two type parameters: the current type and type that has double-width
27
// of it. The appropriate type is chosen based on benchmarks for each operation.
28
// Currently, `primitive_types` is used for anything requiring division, modulo or 512-bit
29
// precision. Otherwise, `ethnum` is used for 256-bit operations, and the builtin `u128`
30
// for 128-bit operations.
31
macro_rules! wideint_ops {
32
    ($t:ident, $wider_t:ident) => {
33
        paste::paste! {
34
            // Conversion helpers
35
36
            /// Converts to `primitive_types` version of the current type
37
10.8M
            fn [<to_prim_ $t:lower>](value: $t) -> primitive_types::[<$t:upper>] {
38
10.8M
                let mut buffer = [0u8; core::mem::size_of::<$t>()];
39
10.8M
                buffer[..].copy_from_slice(&value.to_le_bytes());
40
10.8M
                primitive_types::[<$t:upper>]::from_little_endian(&buffer)
41
10.8M
            }
_RNvNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideint12to_prim_u128
Line
Count
Source
37
5.75M
            fn [<to_prim_ $t:lower>](value: $t) -> primitive_types::[<$t:upper>] {
38
5.75M
                let mut buffer = [0u8; core::mem::size_of::<$t>()];
39
5.75M
                buffer[..].copy_from_slice(&value.to_le_bytes());
40
5.75M
                primitive_types::[<$t:upper>]::from_little_endian(&buffer)
41
5.75M
            }
_RNvNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideint12to_prim_u256
Line
Count
Source
37
5.06M
            fn [<to_prim_ $t:lower>](value: $t) -> primitive_types::[<$t:upper>] {
38
5.06M
                let mut buffer = [0u8; core::mem::size_of::<$t>()];
39
5.06M
                buffer[..].copy_from_slice(&value.to_le_bytes());
40
5.06M
                primitive_types::[<$t:upper>]::from_little_endian(&buffer)
41
5.06M
            }
42
43
            /// Converts to `primitive_types` version that has double the size of the current type
44
7.65M
            fn [<to_wider_prim_ $t:lower>](value: $t) -> primitive_types::[<$wider_t:upper>] {
45
7.65M
                let mut buffer = [0u8; 2 * core::mem::size_of::<$t>()];
46
7.65M
                buffer[..core::mem::size_of::<$t>()].copy_from_slice(&value.to_le_bytes());
47
7.65M
                primitive_types::[<$wider_t:upper>]::from_little_endian(&buffer)
48
7.65M
            }
_RNvNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideint18to_wider_prim_u128
Line
Count
Source
44
2.08M
            fn [<to_wider_prim_ $t:lower>](value: $t) -> primitive_types::[<$wider_t:upper>] {
45
2.08M
                let mut buffer = [0u8; 2 * core::mem::size_of::<$t>()];
46
2.08M
                buffer[..core::mem::size_of::<$t>()].copy_from_slice(&value.to_le_bytes());
47
2.08M
                primitive_types::[<$wider_t:upper>]::from_little_endian(&buffer)
48
2.08M
            }
_RNvNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideint18to_wider_prim_u256
Line
Count
Source
44
5.57M
            fn [<to_wider_prim_ $t:lower>](value: $t) -> primitive_types::[<$wider_t:upper>] {
45
5.57M
                let mut buffer = [0u8; 2 * core::mem::size_of::<$t>()];
46
5.57M
                buffer[..core::mem::size_of::<$t>()].copy_from_slice(&value.to_le_bytes());
47
5.57M
                primitive_types::[<$wider_t:upper>]::from_little_endian(&buffer)
48
5.57M
            }
49
50
            /// Converts to `u128` or `ethnum::U256`
51
1.79M
            fn [<from_prim_ $t:lower>](value: primitive_types::[<$t:upper>]) -> $t {
52
1.79M
                let mut buffer = [0u8; ::core::mem::size_of::<$t>()];
53
1.79M
                value.to_little_endian(&mut buffer);
54
1.79M
                $t::from_le_bytes(buffer)
55
1.79M
            }
_RNvNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideint14from_prim_u128
Line
Count
Source
51
1.17M
            fn [<from_prim_ $t:lower>](value: primitive_types::[<$t:upper>]) -> $t {
52
1.17M
                let mut buffer = [0u8; ::core::mem::size_of::<$t>()];
53
1.17M
                value.to_little_endian(&mut buffer);
54
1.17M
                $t::from_le_bytes(buffer)
55
1.17M
            }
_RNvNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideint14from_prim_u256
Line
Count
Source
51
615k
            fn [<from_prim_ $t:lower>](value: primitive_types::[<$t:upper>]) -> $t {
52
615k
                let mut buffer = [0u8; ::core::mem::size_of::<$t>()];
53
615k
                value.to_little_endian(&mut buffer);
54
615k
                $t::from_le_bytes(buffer)
55
615k
            }
56
57
            /// Drops higher half of the value and converts to `u128` or `ethnum::U256`
58
2.40M
            fn [<truncate_from_prim_ $t:lower>](value: primitive_types::[<$wider_t:upper>]) -> $t {
59
                const S: usize = ::core::mem::size_of::<$t>();
60
2.40M
                let mut buffer = [0u8; 2 * S];
61
2.40M
                value.to_little_endian(&mut buffer);
62
2.40M
                let truncated: [u8; S] = buffer[..S].try_into().unwrap_or_else(|_| unreachable!());
63
2.40M
                $t::from_le_bytes(truncated)
64
2.40M
            }
_RNvNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideint23truncate_from_prim_u128
Line
Count
Source
58
928k
            fn [<truncate_from_prim_ $t:lower>](value: primitive_types::[<$wider_t:upper>]) -> $t {
59
                const S: usize = ::core::mem::size_of::<$t>();
60
928k
                let mut buffer = [0u8; 2 * S];
61
928k
                value.to_little_endian(&mut buffer);
62
928k
                let truncated: [u8; S] = buffer[..S].try_into().unwrap_or_else(|_| unreachable!());
63
928k
                $t::from_le_bytes(truncated)
64
928k
            }
_RNvNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideint23truncate_from_prim_u256
Line
Count
Source
58
1.47M
            fn [<truncate_from_prim_ $t:lower>](value: primitive_types::[<$wider_t:upper>]) -> $t {
59
                const S: usize = ::core::mem::size_of::<$t>();
60
1.47M
                let mut buffer = [0u8; 2 * S];
61
1.47M
                value.to_little_endian(&mut buffer);
62
1.47M
                let truncated: [u8; S] = buffer[..S].try_into().unwrap_or_else(|_| unreachable!());
63
1.47M
                $t::from_le_bytes(truncated)
64
1.47M
            }
65
66
            impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
67
            where
68
                M: Memory,
69
                Tx: ExecutableTransaction,
70
            {
71
10.2M
                pub(crate) fn [<alu_wideint_cmp_ $t:lower>](
72
10.2M
                    &mut self,
73
10.2M
                    ra: RegisterId,
74
10.2M
                    b: Word,
75
10.2M
                    c: Word,
76
10.2M
                    args: CompareArgs,
77
10.2M
                ) -> SimpleResult<()> {
78
10.2M
79
10.2M
                    let (SystemRegisters { mut of, mut err, pc, .. }, mut w) = split_registers(&mut self.registers);
80
10.2M
                    let dest: &mut Word = &mut w[ra.try_into()?];
81
82
                    // LHS argument is always indirect, load it
83
10.2M
                    let lhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(b)?);
84
85
                    // RHS is only indirect if the flag is set
86
10.2M
                    let rhs: $t = if args.indirect_rhs {
87
1.42M
                        $t::from_be_bytes(self.memory.as_ref().read_bytes(c)?)
88
                    } else {
89
8.82M
                        c.into()
90
                    };
91
92
10.2M
                    *dest = [<cmp_ $t:lower>](lhs, rhs, args.mode);
93
10.2M
                    *of = 0;
94
10.2M
                    *err = 0;
95
10.2M
96
10.2M
                    inc_pc(pc)?;
97
10.2M
                    Ok(())
98
10.2M
                }
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_4blob8BlobBodyNtB3U_12BlobMetadataEE20alu_wideint_cmp_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6create10CreateBodyNtB3U_14CreateMetadataEE20alu_wideint_cmp_u128B8_
_RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6script10ScriptBodyNtB3U_14ScriptMetadataEE20alu_wideint_cmp_u128B8_
Line
Count
Source
71
4.77M
                pub(crate) fn [<alu_wideint_cmp_ $t:lower>](
72
4.77M
                    &mut self,
73
4.77M
                    ra: RegisterId,
74
4.77M
                    b: Word,
75
4.77M
                    c: Word,
76
4.77M
                    args: CompareArgs,
77
4.77M
                ) -> SimpleResult<()> {
78
4.77M
79
4.77M
                    let (SystemRegisters { mut of, mut err, pc, .. }, mut w) = split_registers(&mut self.registers);
80
4.77M
                    let dest: &mut Word = &mut w[ra.try_into()?];
81
82
                    // LHS argument is always indirect, load it
83
4.77M
                    let lhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(b)?);
84
85
                    // RHS is only indirect if the flag is set
86
4.77M
                    let rhs: $t = if args.indirect_rhs {
87
11.7k
                        $t::from_be_bytes(self.memory.as_ref().read_bytes(c)?)
88
                    } else {
89
4.76M
                        c.into()
90
                    };
91
92
4.77M
                    *dest = [<cmp_ $t:lower>](lhs, rhs, args.mode);
93
4.77M
                    *of = 0;
94
4.77M
                    *err = 0;
95
4.77M
96
4.77M
                    inc_pc(pc)?;
97
4.77M
                    Ok(())
98
4.77M
                }
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_4blob8BlobBodyNtB4o_12BlobMetadataEE20alu_wideint_cmp_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6create10CreateBodyNtB4o_14CreateMetadataEE20alu_wideint_cmp_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6script10ScriptBodyNtB4o_14ScriptMetadataEE20alu_wideint_cmp_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6upload10UploadBodyNtB4o_14UploadMetadataEE20alu_wideint_cmp_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_7upgrade11UpgradeBodyNtB4o_15UpgradeMetadataEE20alu_wideint_cmp_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1M_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB32_6script10ScriptBodyNtB4y_14ScriptMetadataEE20alu_wideint_cmp_u128B8_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_4blob8BlobBodyNtB3W_12BlobMetadataEE20alu_wideint_cmp_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_6create10CreateBodyNtB3W_14CreateMetadataEE20alu_wideint_cmp_u256Ba_
_RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_6script10ScriptBodyNtB3W_14ScriptMetadataEE20alu_wideint_cmp_u256Ba_
Line
Count
Source
71
5.48M
                pub(crate) fn [<alu_wideint_cmp_ $t:lower>](
72
5.48M
                    &mut self,
73
5.48M
                    ra: RegisterId,
74
5.48M
                    b: Word,
75
5.48M
                    c: Word,
76
5.48M
                    args: CompareArgs,
77
5.48M
                ) -> SimpleResult<()> {
78
5.48M
79
5.48M
                    let (SystemRegisters { mut of, mut err, pc, .. }, mut w) = split_registers(&mut self.registers);
80
5.48M
                    let dest: &mut Word = &mut w[ra.try_into()?];
81
82
                    // LHS argument is always indirect, load it
83
5.48M
                    let lhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(b)?);
84
85
                    // RHS is only indirect if the flag is set
86
5.48M
                    let rhs: $t = if args.indirect_rhs {
87
1.41M
                        $t::from_be_bytes(self.memory.as_ref().read_bytes(c)?)
88
                    } else {
89
4.06M
                        c.into()
90
                    };
91
92
5.48M
                    *dest = [<cmp_ $t:lower>](lhs, rhs, args.mode);
93
5.48M
                    *of = 0;
94
5.48M
                    *err = 0;
95
5.48M
96
5.48M
                    inc_pc(pc)?;
97
5.48M
                    Ok(())
98
5.48M
                }
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_4blob8BlobBodyNtB4q_12BlobMetadataEE20alu_wideint_cmp_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6create10CreateBodyNtB4q_14CreateMetadataEE20alu_wideint_cmp_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6script10ScriptBodyNtB4q_14ScriptMetadataEE20alu_wideint_cmp_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6upload10UploadBodyNtB4q_14UploadMetadataEE20alu_wideint_cmp_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_7upgrade11UpgradeBodyNtB4q_15UpgradeMetadataEE20alu_wideint_cmp_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtNtB1O_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB34_6script10ScriptBodyNtB4A_14ScriptMetadataEE20alu_wideint_cmp_u256Ba_
99
100
2.26M
                pub(crate) fn [<alu_wideint_op_ $t:lower>](
101
2.26M
                    &mut self,
102
2.26M
                    dest_addr: Word,
103
2.26M
                    b: Word,
104
2.26M
                    c: Word,
105
2.26M
                    args: MathArgs,
106
2.26M
                ) -> SimpleResult<()> {
107
2.26M
                    let owner_regs = self.ownership_registers();
108
2.26M
                    let (SystemRegisters { flag, mut of, mut err, pc, .. }, _) = split_registers(&mut self.registers);
109
110
                    // LHS argument is always indirect, load it
111
2.26M
                    let lhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(b)?);
112
113
                    // RHS is only indirect if the flag is set
114
2.26M
                    let rhs: $t = if args.indirect_rhs {
115
849k
                        $t::from_be_bytes(self.memory.as_ref().read_bytes(c)?)
116
                    } else {
117
1.41M
                        c.into()
118
                    };
119
120
2.26M
                    let (wrapped, overflow) = [<op_overflowing_ $t:lower>](lhs, rhs, args);
121
2.26M
122
2.26M
                    if overflow && !is_wrapping(flag.into()) {
123
5
                        return Err(PanicReason::ArithmeticOverflow.into());
124
2.26M
                    }
125
2.26M
126
2.26M
                    *of = overflow as Word;
127
2.26M
                    *err = 0;
128
2.26M
129
2.26M
                    self.memory.as_mut().write_bytes(owner_regs, dest_addr, wrapped.to_be_bytes())?;
130
131
2.26M
                    Ok(inc_pc(pc)?)
132
2.26M
                }
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_4blob8BlobBodyNtB3U_12BlobMetadataEE19alu_wideint_op_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6create10CreateBodyNtB3U_14CreateMetadataEE19alu_wideint_op_u128B8_
_RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6script10ScriptBodyNtB3U_14ScriptMetadataEE19alu_wideint_op_u128B8_
Line
Count
Source
100
706k
                pub(crate) fn [<alu_wideint_op_ $t:lower>](
101
706k
                    &mut self,
102
706k
                    dest_addr: Word,
103
706k
                    b: Word,
104
706k
                    c: Word,
105
706k
                    args: MathArgs,
106
706k
                ) -> SimpleResult<()> {
107
706k
                    let owner_regs = self.ownership_registers();
108
706k
                    let (SystemRegisters { flag, mut of, mut err, pc, .. }, _) = split_registers(&mut self.registers);
109
110
                    // LHS argument is always indirect, load it
111
706k
                    let lhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(b)?);
112
113
                    // RHS is only indirect if the flag is set
114
706k
                    let rhs: $t = if args.indirect_rhs {
115
467k
                        $t::from_be_bytes(self.memory.as_ref().read_bytes(c)?)
116
                    } else {
117
239k
                        c.into()
118
                    };
119
120
706k
                    let (wrapped, overflow) = [<op_overflowing_ $t:lower>](lhs, rhs, args);
121
706k
122
706k
                    if overflow && !is_wrapping(flag.into()) {
123
3
                        return Err(PanicReason::ArithmeticOverflow.into());
124
706k
                    }
125
706k
126
706k
                    *of = overflow as Word;
127
706k
                    *err = 0;
128
706k
129
706k
                    self.memory.as_mut().write_bytes(owner_regs, dest_addr, wrapped.to_be_bytes())?;
130
131
706k
                    Ok(inc_pc(pc)?)
132
706k
                }
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_4blob8BlobBodyNtB4o_12BlobMetadataEE19alu_wideint_op_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6create10CreateBodyNtB4o_14CreateMetadataEE19alu_wideint_op_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6script10ScriptBodyNtB4o_14ScriptMetadataEE19alu_wideint_op_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6upload10UploadBodyNtB4o_14UploadMetadataEE19alu_wideint_op_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_7upgrade11UpgradeBodyNtB4o_15UpgradeMetadataEE19alu_wideint_op_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1M_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB32_6script10ScriptBodyNtB4y_14ScriptMetadataEE19alu_wideint_op_u128B8_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_4blob8BlobBodyNtB3W_12BlobMetadataEE19alu_wideint_op_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_6create10CreateBodyNtB3W_14CreateMetadataEE19alu_wideint_op_u256Ba_
_RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_6script10ScriptBodyNtB3W_14ScriptMetadataEE19alu_wideint_op_u256Ba_
Line
Count
Source
100
1.55M
                pub(crate) fn [<alu_wideint_op_ $t:lower>](
101
1.55M
                    &mut self,
102
1.55M
                    dest_addr: Word,
103
1.55M
                    b: Word,
104
1.55M
                    c: Word,
105
1.55M
                    args: MathArgs,
106
1.55M
                ) -> SimpleResult<()> {
107
1.55M
                    let owner_regs = self.ownership_registers();
108
1.55M
                    let (SystemRegisters { flag, mut of, mut err, pc, .. }, _) = split_registers(&mut self.registers);
109
110
                    // LHS argument is always indirect, load it
111
1.55M
                    let lhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(b)?);
112
113
                    // RHS is only indirect if the flag is set
114
1.55M
                    let rhs: $t = if args.indirect_rhs {
115
382k
                        $t::from_be_bytes(self.memory.as_ref().read_bytes(c)?)
116
                    } else {
117
1.17M
                        c.into()
118
                    };
119
120
1.55M
                    let (wrapped, overflow) = [<op_overflowing_ $t:lower>](lhs, rhs, args);
121
1.55M
122
1.55M
                    if overflow && !is_wrapping(flag.into()) {
123
2
                        return Err(PanicReason::ArithmeticOverflow.into());
124
1.55M
                    }
125
1.55M
126
1.55M
                    *of = overflow as Word;
127
1.55M
                    *err = 0;
128
1.55M
129
1.55M
                    self.memory.as_mut().write_bytes(owner_regs, dest_addr, wrapped.to_be_bytes())?;
130
131
1.55M
                    Ok(inc_pc(pc)?)
132
1.55M
                }
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_4blob8BlobBodyNtB4q_12BlobMetadataEE19alu_wideint_op_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6create10CreateBodyNtB4q_14CreateMetadataEE19alu_wideint_op_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6script10ScriptBodyNtB4q_14ScriptMetadataEE19alu_wideint_op_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6upload10UploadBodyNtB4q_14UploadMetadataEE19alu_wideint_op_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_7upgrade11UpgradeBodyNtB4q_15UpgradeMetadataEE19alu_wideint_op_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtNtB1O_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB34_6script10ScriptBodyNtB4A_14ScriptMetadataEE19alu_wideint_op_u256Ba_
133
134
1.57M
                pub(crate) fn [<alu_wideint_mul_ $t:lower>](
135
1.57M
                    &mut self,
136
1.57M
                    dest_addr: Word,
137
1.57M
                    b: Word,
138
1.57M
                    c: Word,
139
1.57M
                    args: MulArgs,
140
1.57M
                ) -> SimpleResult<()> {
141
1.57M
                    let owner_regs = self.ownership_registers();
142
1.57M
                    let (SystemRegisters { flag, mut of, mut err, pc, .. }, _) = split_registers(&mut self.registers);
143
144
                    // LHS is only indirect if the flag is set
145
1.57M
                    let lhs: $t = if args.indirect_lhs {
146
605k
                        $t::from_be_bytes(self.memory.as_ref().read_bytes(b)?)
147
                    } else {
148
965k
                        b.into()
149
                    };
150
                    // RHS is only indirect if the flag is set
151
1.57M
                    let rhs: $t = if args.indirect_rhs {
152
525k
                        $t::from_be_bytes(self.memory.as_ref().read_bytes(c)?)
153
                    } else {
154
1.04M
                        c.into()
155
                    };
156
157
1.57M
                    let (wrapped, overflow) = $t::overflowing_mul(lhs, rhs);
158
1.57M
159
1.57M
                    if overflow && !is_wrapping(flag.into()) {
160
5
                        return Err(PanicReason::ArithmeticOverflow.into());
161
1.57M
                    }
162
1.57M
163
1.57M
                    *of = overflow as Word;
164
1.57M
                    *err = 0;
165
1.57M
166
1.57M
                    self.memory.as_mut().write_bytes(owner_regs, dest_addr, wrapped.to_be_bytes())?;
167
168
1.57M
                    Ok(inc_pc(pc)?)
169
1.57M
                }
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_4blob8BlobBodyNtB3U_12BlobMetadataEE20alu_wideint_mul_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6create10CreateBodyNtB3U_14CreateMetadataEE20alu_wideint_mul_u128B8_
_RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6script10ScriptBodyNtB3U_14ScriptMetadataEE20alu_wideint_mul_u128B8_
Line
Count
Source
134
487k
                pub(crate) fn [<alu_wideint_mul_ $t:lower>](
135
487k
                    &mut self,
136
487k
                    dest_addr: Word,
137
487k
                    b: Word,
138
487k
                    c: Word,
139
487k
                    args: MulArgs,
140
487k
                ) -> SimpleResult<()> {
141
487k
                    let owner_regs = self.ownership_registers();
142
487k
                    let (SystemRegisters { flag, mut of, mut err, pc, .. }, _) = split_registers(&mut self.registers);
143
144
                    // LHS is only indirect if the flag is set
145
487k
                    let lhs: $t = if args.indirect_lhs {
146
362k
                        $t::from_be_bytes(self.memory.as_ref().read_bytes(b)?)
147
                    } else {
148
125k
                        b.into()
149
                    };
150
                    // RHS is only indirect if the flag is set
151
487k
                    let rhs: $t = if args.indirect_rhs {
152
281k
                        $t::from_be_bytes(self.memory.as_ref().read_bytes(c)?)
153
                    } else {
154
205k
                        c.into()
155
                    };
156
157
487k
                    let (wrapped, overflow) = $t::overflowing_mul(lhs, rhs);
158
487k
159
487k
                    if overflow && !is_wrapping(flag.into()) {
160
3
                        return Err(PanicReason::ArithmeticOverflow.into());
161
487k
                    }
162
487k
163
487k
                    *of = overflow as Word;
164
487k
                    *err = 0;
165
487k
166
487k
                    self.memory.as_mut().write_bytes(owner_regs, dest_addr, wrapped.to_be_bytes())?;
167
168
487k
                    Ok(inc_pc(pc)?)
169
487k
                }
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_4blob8BlobBodyNtB4o_12BlobMetadataEE20alu_wideint_mul_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6create10CreateBodyNtB4o_14CreateMetadataEE20alu_wideint_mul_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6script10ScriptBodyNtB4o_14ScriptMetadataEE20alu_wideint_mul_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6upload10UploadBodyNtB4o_14UploadMetadataEE20alu_wideint_mul_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_7upgrade11UpgradeBodyNtB4o_15UpgradeMetadataEE20alu_wideint_mul_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1M_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB32_6script10ScriptBodyNtB4y_14ScriptMetadataEE20alu_wideint_mul_u128B8_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_4blob8BlobBodyNtB3W_12BlobMetadataEE20alu_wideint_mul_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_6create10CreateBodyNtB3W_14CreateMetadataEE20alu_wideint_mul_u256Ba_
_RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_6script10ScriptBodyNtB3W_14ScriptMetadataEE20alu_wideint_mul_u256Ba_
Line
Count
Source
134
1.08M
                pub(crate) fn [<alu_wideint_mul_ $t:lower>](
135
1.08M
                    &mut self,
136
1.08M
                    dest_addr: Word,
137
1.08M
                    b: Word,
138
1.08M
                    c: Word,
139
1.08M
                    args: MulArgs,
140
1.08M
                ) -> SimpleResult<()> {
141
1.08M
                    let owner_regs = self.ownership_registers();
142
1.08M
                    let (SystemRegisters { flag, mut of, mut err, pc, .. }, _) = split_registers(&mut self.registers);
143
144
                    // LHS is only indirect if the flag is set
145
1.08M
                    let lhs: $t = if args.indirect_lhs {
146
243k
                        $t::from_be_bytes(self.memory.as_ref().read_bytes(b)?)
147
                    } else {
148
840k
                        b.into()
149
                    };
150
                    // RHS is only indirect if the flag is set
151
1.08M
                    let rhs: $t = if args.indirect_rhs {
152
243k
                        $t::from_be_bytes(self.memory.as_ref().read_bytes(c)?)
153
                    } else {
154
840k
                        c.into()
155
                    };
156
157
1.08M
                    let (wrapped, overflow) = $t::overflowing_mul(lhs, rhs);
158
1.08M
159
1.08M
                    if overflow && !is_wrapping(flag.into()) {
160
2
                        return Err(PanicReason::ArithmeticOverflow.into());
161
1.08M
                    }
162
1.08M
163
1.08M
                    *of = overflow as Word;
164
1.08M
                    *err = 0;
165
1.08M
166
1.08M
                    self.memory.as_mut().write_bytes(owner_regs, dest_addr, wrapped.to_be_bytes())?;
167
168
1.08M
                    Ok(inc_pc(pc)?)
169
1.08M
                }
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_4blob8BlobBodyNtB4q_12BlobMetadataEE20alu_wideint_mul_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6create10CreateBodyNtB4q_14CreateMetadataEE20alu_wideint_mul_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6script10ScriptBodyNtB4q_14ScriptMetadataEE20alu_wideint_mul_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6upload10UploadBodyNtB4q_14UploadMetadataEE20alu_wideint_mul_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_7upgrade11UpgradeBodyNtB4q_15UpgradeMetadataEE20alu_wideint_mul_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtNtB1O_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB34_6script10ScriptBodyNtB4A_14ScriptMetadataEE20alu_wideint_mul_u256Ba_
170
171
1.79M
                pub(crate) fn [<alu_wideint_div_ $t:lower>](
172
1.79M
                    &mut self,
173
1.79M
                    dest_addr: Word,
174
1.79M
                    b: Word,
175
1.79M
                    c: Word,
176
1.79M
                    args: DivArgs,
177
1.79M
                ) -> SimpleResult<()> {
178
1.79M
                    let owner_regs = self.ownership_registers();
179
1.79M
                    let (SystemRegisters { flag, mut of, mut err, pc, .. }, _) = split_registers(&mut self.registers);
180
181
                    // LHS is always indirect
182
1.79M
                    let lhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(b)?);
183
184
                    // RHS is only indirect if the flag is set
185
1.79M
                    let rhs: $t = if args.indirect_rhs {
186
516k
                        $t::from_be_bytes(self.memory.as_ref().read_bytes(c)?)
187
                    } else {
188
1.27M
                        c.into()
189
                    };
190
191
1.79M
                    let lhs = [<to_prim_ $t:lower>](lhs);
192
1.79M
                    let rhs = [<to_prim_ $t:lower>](rhs);
193
194
1.79M
                    let result = match lhs.checked_div(rhs) {
195
1.79M
                        Some(d) => {
196
1.79M
                            *err = 0;
197
1.79M
                            [<from_prim_ $t:lower>](d)
198
                        },
199
                        None => {
200
5
                            if is_unsafe_math(flag.into()) {
201
0
                                *err = 1;
202
0
                                $t::default() // Zero
203
                            } else {
204
5
                                return Err(PanicReason::ArithmeticError.into());
205
                            }
206
                        }
207
                    };
208
209
1.79M
                    *of = 0;
210
1.79M
211
1.79M
                    self.memory.as_mut().write_bytes(owner_regs, dest_addr, result.to_be_bytes())?;
212
213
1.79M
                    Ok(inc_pc(pc)?)
214
1.79M
                }
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_4blob8BlobBodyNtB3U_12BlobMetadataEE20alu_wideint_div_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6create10CreateBodyNtB3U_14CreateMetadataEE20alu_wideint_div_u128B8_
_RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6script10ScriptBodyNtB3U_14ScriptMetadataEE20alu_wideint_div_u128B8_
Line
Count
Source
171
1.17M
                pub(crate) fn [<alu_wideint_div_ $t:lower>](
172
1.17M
                    &mut self,
173
1.17M
                    dest_addr: Word,
174
1.17M
                    b: Word,
175
1.17M
                    c: Word,
176
1.17M
                    args: DivArgs,
177
1.17M
                ) -> SimpleResult<()> {
178
1.17M
                    let owner_regs = self.ownership_registers();
179
1.17M
                    let (SystemRegisters { flag, mut of, mut err, pc, .. }, _) = split_registers(&mut self.registers);
180
181
                    // LHS is always indirect
182
1.17M
                    let lhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(b)?);
183
184
                    // RHS is only indirect if the flag is set
185
1.17M
                    let rhs: $t = if args.indirect_rhs {
186
425k
                        $t::from_be_bytes(self.memory.as_ref().read_bytes(c)?)
187
                    } else {
188
751k
                        c.into()
189
                    };
190
191
1.17M
                    let lhs = [<to_prim_ $t:lower>](lhs);
192
1.17M
                    let rhs = [<to_prim_ $t:lower>](rhs);
193
194
1.17M
                    let result = match lhs.checked_div(rhs) {
195
1.17M
                        Some(d) => {
196
1.17M
                            *err = 0;
197
1.17M
                            [<from_prim_ $t:lower>](d)
198
                        },
199
                        None => {
200
3
                            if is_unsafe_math(flag.into()) {
201
0
                                *err = 1;
202
0
                                $t::default() // Zero
203
                            } else {
204
3
                                return Err(PanicReason::ArithmeticError.into());
205
                            }
206
                        }
207
                    };
208
209
1.17M
                    *of = 0;
210
1.17M
211
1.17M
                    self.memory.as_mut().write_bytes(owner_regs, dest_addr, result.to_be_bytes())?;
212
213
1.17M
                    Ok(inc_pc(pc)?)
214
1.17M
                }
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_4blob8BlobBodyNtB4o_12BlobMetadataEE20alu_wideint_div_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6create10CreateBodyNtB4o_14CreateMetadataEE20alu_wideint_div_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6script10ScriptBodyNtB4o_14ScriptMetadataEE20alu_wideint_div_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6upload10UploadBodyNtB4o_14UploadMetadataEE20alu_wideint_div_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_7upgrade11UpgradeBodyNtB4o_15UpgradeMetadataEE20alu_wideint_div_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1M_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB32_6script10ScriptBodyNtB4y_14ScriptMetadataEE20alu_wideint_div_u128B8_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_4blob8BlobBodyNtB3W_12BlobMetadataEE20alu_wideint_div_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_6create10CreateBodyNtB3W_14CreateMetadataEE20alu_wideint_div_u256Ba_
_RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_6script10ScriptBodyNtB3W_14ScriptMetadataEE20alu_wideint_div_u256Ba_
Line
Count
Source
171
615k
                pub(crate) fn [<alu_wideint_div_ $t:lower>](
172
615k
                    &mut self,
173
615k
                    dest_addr: Word,
174
615k
                    b: Word,
175
615k
                    c: Word,
176
615k
                    args: DivArgs,
177
615k
                ) -> SimpleResult<()> {
178
615k
                    let owner_regs = self.ownership_registers();
179
615k
                    let (SystemRegisters { flag, mut of, mut err, pc, .. }, _) = split_registers(&mut self.registers);
180
181
                    // LHS is always indirect
182
615k
                    let lhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(b)?);
183
184
                    // RHS is only indirect if the flag is set
185
615k
                    let rhs: $t = if args.indirect_rhs {
186
91.0k
                        $t::from_be_bytes(self.memory.as_ref().read_bytes(c)?)
187
                    } else {
188
524k
                        c.into()
189
                    };
190
191
615k
                    let lhs = [<to_prim_ $t:lower>](lhs);
192
615k
                    let rhs = [<to_prim_ $t:lower>](rhs);
193
194
615k
                    let result = match lhs.checked_div(rhs) {
195
615k
                        Some(d) => {
196
615k
                            *err = 0;
197
615k
                            [<from_prim_ $t:lower>](d)
198
                        },
199
                        None => {
200
2
                            if is_unsafe_math(flag.into()) {
201
0
                                *err = 1;
202
0
                                $t::default() // Zero
203
                            } else {
204
2
                                return Err(PanicReason::ArithmeticError.into());
205
                            }
206
                        }
207
                    };
208
209
615k
                    *of = 0;
210
615k
211
615k
                    self.memory.as_mut().write_bytes(owner_regs, dest_addr, result.to_be_bytes())?;
212
213
615k
                    Ok(inc_pc(pc)?)
214
615k
                }
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_4blob8BlobBodyNtB4q_12BlobMetadataEE20alu_wideint_div_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6create10CreateBodyNtB4q_14CreateMetadataEE20alu_wideint_div_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6script10ScriptBodyNtB4q_14ScriptMetadataEE20alu_wideint_div_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6upload10UploadBodyNtB4q_14UploadMetadataEE20alu_wideint_div_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_7upgrade11UpgradeBodyNtB4q_15UpgradeMetadataEE20alu_wideint_div_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtNtB1O_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB34_6script10ScriptBodyNtB4A_14ScriptMetadataEE20alu_wideint_div_u256Ba_
215
216
1.34M
                pub(crate) fn [<alu_wideint_addmod_ $t:lower>](
217
1.34M
                    &mut self,
218
1.34M
                    dest_addr: Word,
219
1.34M
                    b: Word,
220
1.34M
                    c: Word,
221
1.34M
                    d: Word,
222
1.34M
                ) -> SimpleResult<()> {
223
1.34M
                    let owner_regs = self.ownership_registers();
224
1.34M
                    let (SystemRegisters { flag, mut of, mut err, pc, .. }, _) = split_registers(&mut self.registers);
225
226
1.34M
                    let lhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(b)?);
227
1.34M
                    let rhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(c)?);
228
1.34M
                    let modulus: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(d)?);
229
230
                    // Use wider types to avoid overflow
231
1.34M
                    let lhs = [<to_wider_prim_ $t:lower>](lhs);
232
1.34M
                    let rhs = [<to_wider_prim_ $t:lower>](rhs);
233
1.34M
                    let modulus = [<to_wider_prim_ $t:lower>](modulus);
234
1.34M
235
1.34M
                    let pre_mod = lhs.checked_add(rhs)
236
1.34M
                    .expect("Cannot overflow as we're using wider types");
237
1.34M
                    let result: $t = match pre_mod.checked_rem(modulus) {
238
1.34M
                        Some(result) => {
239
1.34M
                            *err = 0;
240
1.34M
                            // Truncate never loses data as modulus is still in domain of the original type
241
1.34M
                            [<truncate_from_prim_ $t:lower>](result)
242
                        },
243
                        None => {
244
3
                            if is_unsafe_math(flag.into()) {
245
0
                                *err = 1;
246
0
                                $t::default() // Zero
247
                            } else {
248
3
                                return Err(PanicReason::ArithmeticError.into());
249
                            }
250
                        }
251
                    };
252
253
1.34M
                    *of = 0;
254
1.34M
255
1.34M
                    self.memory.as_mut().write_bytes(owner_regs, dest_addr, result.to_be_bytes())?;
256
257
1.34M
                    Ok(inc_pc(pc)?)
258
1.34M
                }
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_4blob8BlobBodyNtB3U_12BlobMetadataEE23alu_wideint_addmod_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6create10CreateBodyNtB3U_14CreateMetadataEE23alu_wideint_addmod_u128B8_
_RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6script10ScriptBodyNtB3U_14ScriptMetadataEE23alu_wideint_addmod_u128B8_
Line
Count
Source
216
127k
                pub(crate) fn [<alu_wideint_addmod_ $t:lower>](
217
127k
                    &mut self,
218
127k
                    dest_addr: Word,
219
127k
                    b: Word,
220
127k
                    c: Word,
221
127k
                    d: Word,
222
127k
                ) -> SimpleResult<()> {
223
127k
                    let owner_regs = self.ownership_registers();
224
127k
                    let (SystemRegisters { flag, mut of, mut err, pc, .. }, _) = split_registers(&mut self.registers);
225
226
127k
                    let lhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(b)?);
227
127k
                    let rhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(c)?);
228
127k
                    let modulus: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(d)?);
229
230
                    // Use wider types to avoid overflow
231
127k
                    let lhs = [<to_wider_prim_ $t:lower>](lhs);
232
127k
                    let rhs = [<to_wider_prim_ $t:lower>](rhs);
233
127k
                    let modulus = [<to_wider_prim_ $t:lower>](modulus);
234
127k
235
127k
                    let pre_mod = lhs.checked_add(rhs)
236
127k
                    .expect("Cannot overflow as we're using wider types");
237
127k
                    let result: $t = match pre_mod.checked_rem(modulus) {
238
127k
                        Some(result) => {
239
127k
                            *err = 0;
240
127k
                            // Truncate never loses data as modulus is still in domain of the original type
241
127k
                            [<truncate_from_prim_ $t:lower>](result)
242
                        },
243
                        None => {
244
1
                            if is_unsafe_math(flag.into()) {
245
0
                                *err = 1;
246
0
                                $t::default() // Zero
247
                            } else {
248
1
                                return Err(PanicReason::ArithmeticError.into());
249
                            }
250
                        }
251
                    };
252
253
127k
                    *of = 0;
254
127k
255
127k
                    self.memory.as_mut().write_bytes(owner_regs, dest_addr, result.to_be_bytes())?;
256
257
127k
                    Ok(inc_pc(pc)?)
258
127k
                }
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_4blob8BlobBodyNtB4o_12BlobMetadataEE23alu_wideint_addmod_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6create10CreateBodyNtB4o_14CreateMetadataEE23alu_wideint_addmod_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6script10ScriptBodyNtB4o_14ScriptMetadataEE23alu_wideint_addmod_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6upload10UploadBodyNtB4o_14UploadMetadataEE23alu_wideint_addmod_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_7upgrade11UpgradeBodyNtB4o_15UpgradeMetadataEE23alu_wideint_addmod_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1M_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB32_6script10ScriptBodyNtB4y_14ScriptMetadataEE23alu_wideint_addmod_u128B8_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_4blob8BlobBodyNtB3W_12BlobMetadataEE23alu_wideint_addmod_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_6create10CreateBodyNtB3W_14CreateMetadataEE23alu_wideint_addmod_u256Ba_
_RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_6script10ScriptBodyNtB3W_14ScriptMetadataEE23alu_wideint_addmod_u256Ba_
Line
Count
Source
216
1.22M
                pub(crate) fn [<alu_wideint_addmod_ $t:lower>](
217
1.22M
                    &mut self,
218
1.22M
                    dest_addr: Word,
219
1.22M
                    b: Word,
220
1.22M
                    c: Word,
221
1.22M
                    d: Word,
222
1.22M
                ) -> SimpleResult<()> {
223
1.22M
                    let owner_regs = self.ownership_registers();
224
1.22M
                    let (SystemRegisters { flag, mut of, mut err, pc, .. }, _) = split_registers(&mut self.registers);
225
226
1.22M
                    let lhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(b)?);
227
1.22M
                    let rhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(c)?);
228
1.22M
                    let modulus: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(d)?);
229
230
                    // Use wider types to avoid overflow
231
1.22M
                    let lhs = [<to_wider_prim_ $t:lower>](lhs);
232
1.22M
                    let rhs = [<to_wider_prim_ $t:lower>](rhs);
233
1.22M
                    let modulus = [<to_wider_prim_ $t:lower>](modulus);
234
1.22M
235
1.22M
                    let pre_mod = lhs.checked_add(rhs)
236
1.22M
                    .expect("Cannot overflow as we're using wider types");
237
1.22M
                    let result: $t = match pre_mod.checked_rem(modulus) {
238
1.22M
                        Some(result) => {
239
1.22M
                            *err = 0;
240
1.22M
                            // Truncate never loses data as modulus is still in domain of the original type
241
1.22M
                            [<truncate_from_prim_ $t:lower>](result)
242
                        },
243
                        None => {
244
2
                            if is_unsafe_math(flag.into()) {
245
0
                                *err = 1;
246
0
                                $t::default() // Zero
247
                            } else {
248
2
                                return Err(PanicReason::ArithmeticError.into());
249
                            }
250
                        }
251
                    };
252
253
1.22M
                    *of = 0;
254
1.22M
255
1.22M
                    self.memory.as_mut().write_bytes(owner_regs, dest_addr, result.to_be_bytes())?;
256
257
1.22M
                    Ok(inc_pc(pc)?)
258
1.22M
                }
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_4blob8BlobBodyNtB4q_12BlobMetadataEE23alu_wideint_addmod_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6create10CreateBodyNtB4q_14CreateMetadataEE23alu_wideint_addmod_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6script10ScriptBodyNtB4q_14ScriptMetadataEE23alu_wideint_addmod_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6upload10UploadBodyNtB4q_14UploadMetadataEE23alu_wideint_addmod_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_7upgrade11UpgradeBodyNtB4q_15UpgradeMetadataEE23alu_wideint_addmod_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtNtB1O_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB34_6script10ScriptBodyNtB4A_14ScriptMetadataEE23alu_wideint_addmod_u256Ba_
259
260
1.05M
                pub(crate) fn [<alu_wideint_mulmod_ $t:lower>](
261
1.05M
                    &mut self,
262
1.05M
                    dest_addr: Word,
263
1.05M
                    b: Word,
264
1.05M
                    c: Word,
265
1.05M
                    d: Word,
266
1.05M
                ) -> SimpleResult<()> {
267
1.05M
                    let owner_regs = self.ownership_registers();
268
1.05M
                    let (SystemRegisters { flag, mut of, mut err, pc, .. }, _) = split_registers(&mut self.registers);
269
270
1.05M
                    let lhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(b)?);
271
1.05M
                    let rhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(c)?);
272
1.05M
                    let modulus: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(d)?);
273
274
1.05M
                    let lhs = [<to_prim_ $t:lower>](lhs);
275
1.05M
                    let rhs = [<to_prim_ $t:lower>](rhs);
276
1.05M
                    let modulus = [<to_wider_prim_ $t:lower>](modulus);
277
278
1.05M
                    let result = match lhs.full_mul(rhs).checked_rem(modulus) {
279
                        None => {
280
3
                            if is_unsafe_math(flag.into()) {
281
0
                                *err = 1;
282
0
                                $t::default() // Zero
283
                            } else {
284
3
                                return Err(PanicReason::ArithmeticError.into());
285
                            }
286
                        },
287
1.05M
                        Some(result) => {
288
1.05M
                            *err = 0;
289
1.05M
                            // This never loses data, since the modulus type has same width as the result
290
1.05M
                            [<truncate_from_prim_ $t:lower>](result)
291
                        }
292
293
                    };
294
295
1.05M
                    *of = 0;
296
1.05M
297
1.05M
                    self.memory.as_mut().write_bytes(owner_regs, dest_addr, result.to_be_bytes())?;
298
299
1.05M
                    Ok(inc_pc(pc)?)
300
1.05M
                }
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_4blob8BlobBodyNtB3U_12BlobMetadataEE23alu_wideint_mulmod_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6create10CreateBodyNtB3U_14CreateMetadataEE23alu_wideint_mulmod_u128B8_
_RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6script10ScriptBodyNtB3U_14ScriptMetadataEE23alu_wideint_mulmod_u128B8_
Line
Count
Source
260
800k
                pub(crate) fn [<alu_wideint_mulmod_ $t:lower>](
261
800k
                    &mut self,
262
800k
                    dest_addr: Word,
263
800k
                    b: Word,
264
800k
                    c: Word,
265
800k
                    d: Word,
266
800k
                ) -> SimpleResult<()> {
267
800k
                    let owner_regs = self.ownership_registers();
268
800k
                    let (SystemRegisters { flag, mut of, mut err, pc, .. }, _) = split_registers(&mut self.registers);
269
270
800k
                    let lhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(b)?);
271
800k
                    let rhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(c)?);
272
800k
                    let modulus: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(d)?);
273
274
800k
                    let lhs = [<to_prim_ $t:lower>](lhs);
275
800k
                    let rhs = [<to_prim_ $t:lower>](rhs);
276
800k
                    let modulus = [<to_wider_prim_ $t:lower>](modulus);
277
278
800k
                    let result = match lhs.full_mul(rhs).checked_rem(modulus) {
279
                        None => {
280
2
                            if is_unsafe_math(flag.into()) {
281
0
                                *err = 1;
282
0
                                $t::default() // Zero
283
                            } else {
284
2
                                return Err(PanicReason::ArithmeticError.into());
285
                            }
286
                        },
287
800k
                        Some(result) => {
288
800k
                            *err = 0;
289
800k
                            // This never loses data, since the modulus type has same width as the result
290
800k
                            [<truncate_from_prim_ $t:lower>](result)
291
                        }
292
293
                    };
294
295
800k
                    *of = 0;
296
800k
297
800k
                    self.memory.as_mut().write_bytes(owner_regs, dest_addr, result.to_be_bytes())?;
298
299
800k
                    Ok(inc_pc(pc)?)
300
800k
                }
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_4blob8BlobBodyNtB4o_12BlobMetadataEE23alu_wideint_mulmod_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6create10CreateBodyNtB4o_14CreateMetadataEE23alu_wideint_mulmod_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6script10ScriptBodyNtB4o_14ScriptMetadataEE23alu_wideint_mulmod_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6upload10UploadBodyNtB4o_14UploadMetadataEE23alu_wideint_mulmod_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_7upgrade11UpgradeBodyNtB4o_15UpgradeMetadataEE23alu_wideint_mulmod_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1M_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB32_6script10ScriptBodyNtB4y_14ScriptMetadataEE23alu_wideint_mulmod_u128B8_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_4blob8BlobBodyNtB3W_12BlobMetadataEE23alu_wideint_mulmod_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_6create10CreateBodyNtB3W_14CreateMetadataEE23alu_wideint_mulmod_u256Ba_
_RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_6script10ScriptBodyNtB3W_14ScriptMetadataEE23alu_wideint_mulmod_u256Ba_
Line
Count
Source
260
252k
                pub(crate) fn [<alu_wideint_mulmod_ $t:lower>](
261
252k
                    &mut self,
262
252k
                    dest_addr: Word,
263
252k
                    b: Word,
264
252k
                    c: Word,
265
252k
                    d: Word,
266
252k
                ) -> SimpleResult<()> {
267
252k
                    let owner_regs = self.ownership_registers();
268
252k
                    let (SystemRegisters { flag, mut of, mut err, pc, .. }, _) = split_registers(&mut self.registers);
269
270
252k
                    let lhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(b)?);
271
252k
                    let rhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(c)?);
272
252k
                    let modulus: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(d)?);
273
274
252k
                    let lhs = [<to_prim_ $t:lower>](lhs);
275
252k
                    let rhs = [<to_prim_ $t:lower>](rhs);
276
252k
                    let modulus = [<to_wider_prim_ $t:lower>](modulus);
277
278
252k
                    let result = match lhs.full_mul(rhs).checked_rem(modulus) {
279
                        None => {
280
1
                            if is_unsafe_math(flag.into()) {
281
0
                                *err = 1;
282
0
                                $t::default() // Zero
283
                            } else {
284
1
                                return Err(PanicReason::ArithmeticError.into());
285
                            }
286
                        },
287
252k
                        Some(result) => {
288
252k
                            *err = 0;
289
252k
                            // This never loses data, since the modulus type has same width as the result
290
252k
                            [<truncate_from_prim_ $t:lower>](result)
291
                        }
292
293
                    };
294
295
252k
                    *of = 0;
296
252k
297
252k
                    self.memory.as_mut().write_bytes(owner_regs, dest_addr, result.to_be_bytes())?;
298
299
252k
                    Ok(inc_pc(pc)?)
300
252k
                }
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_4blob8BlobBodyNtB4q_12BlobMetadataEE23alu_wideint_mulmod_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6create10CreateBodyNtB4q_14CreateMetadataEE23alu_wideint_mulmod_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6script10ScriptBodyNtB4q_14ScriptMetadataEE23alu_wideint_mulmod_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6upload10UploadBodyNtB4q_14UploadMetadataEE23alu_wideint_mulmod_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_7upgrade11UpgradeBodyNtB4q_15UpgradeMetadataEE23alu_wideint_mulmod_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtNtB1O_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB34_6script10ScriptBodyNtB4A_14ScriptMetadataEE23alu_wideint_mulmod_u256Ba_
301
302
2.56M
                pub(crate) fn [<alu_wideint_muldiv_ $t:lower>](
303
2.56M
                    &mut self,
304
2.56M
                    dest_addr: Word,
305
2.56M
                    b: Word,
306
2.56M
                    c: Word,
307
2.56M
                    d: Word,
308
2.56M
                ) -> SimpleResult<()> {
309
2.56M
                    let owner_regs = self.ownership_registers();
310
2.56M
                    let (SystemRegisters { mut of, mut err, pc, flag, .. }, _) = split_registers(&mut self.registers);
311
312
2.56M
                    let lhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(b)?);
313
2.56M
                    let rhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(c)?);
314
2.56M
                    let divider: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(d)?);
315
316
                    const S: usize = core::mem::size_of::<$t>();
317
318
2.56M
                    let lhs = [<to_prim_ $t:lower>](lhs);
319
2.56M
                    let rhs = [<to_prim_ $t:lower>](rhs);
320
2.56M
321
2.56M
                    let product = lhs.full_mul(rhs);
322
2.56M
                    #[allow(clippy::arithmetic_side_effects)] // Safety: the shift has less bits than the product
323
2.56M
                    let product_div_max = product >> (S * 8);
324
2.56M
                    let result = product.checked_div([<to_wider_prim_ $t:lower>](divider)).unwrap_or(product_div_max);
325
2.56M
326
2.56M
                    let mut buffer = [0u8; 2 * S];
327
2.56M
                    result.to_little_endian(&mut buffer);
328
2.56M
                    let lower_half: [u8; S] = buffer[..S].try_into().unwrap_or_else(|_| unreachable!());
329
2.56M
                    let higher_half: [u8; S] = buffer[S..].try_into().unwrap_or_else(|_| unreachable!());
330
2.56M
                    let result = $t::from_le_bytes(lower_half);
331
2.56M
332
2.56M
                    let overflows = higher_half != [0u8; S];
333
2.56M
                    if overflows && !is_wrapping(flag.into()) {
334
4
                        return Err(PanicReason::ArithmeticOverflow.into());
335
2.56M
                    }
336
2.56M
                    *of = overflows as Word;
337
2.56M
                    *err = 0;
338
2.56M
339
2.56M
                    self.memory.as_mut().write_bytes(owner_regs, dest_addr, result.to_be_bytes())?;
340
341
2.56M
                    Ok(inc_pc(pc)?)
342
2.56M
                }
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_4blob8BlobBodyNtB3U_12BlobMetadataEE23alu_wideint_muldiv_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6create10CreateBodyNtB3U_14CreateMetadataEE23alu_wideint_muldiv_u128B8_
_RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2o_6script10ScriptBodyNtB3U_14ScriptMetadataEE23alu_wideint_muldiv_u128B8_
Line
Count
Source
302
899k
                pub(crate) fn [<alu_wideint_muldiv_ $t:lower>](
303
899k
                    &mut self,
304
899k
                    dest_addr: Word,
305
899k
                    b: Word,
306
899k
                    c: Word,
307
899k
                    d: Word,
308
899k
                ) -> SimpleResult<()> {
309
899k
                    let owner_regs = self.ownership_registers();
310
899k
                    let (SystemRegisters { mut of, mut err, pc, flag, .. }, _) = split_registers(&mut self.registers);
311
312
899k
                    let lhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(b)?);
313
899k
                    let rhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(c)?);
314
899k
                    let divider: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(d)?);
315
316
                    const S: usize = core::mem::size_of::<$t>();
317
318
899k
                    let lhs = [<to_prim_ $t:lower>](lhs);
319
899k
                    let rhs = [<to_prim_ $t:lower>](rhs);
320
899k
321
899k
                    let product = lhs.full_mul(rhs);
322
899k
                    #[allow(clippy::arithmetic_side_effects)] // Safety: the shift has less bits than the product
323
899k
                    let product_div_max = product >> (S * 8);
324
899k
                    let result = product.checked_div([<to_wider_prim_ $t:lower>](divider)).unwrap_or(product_div_max);
325
899k
326
899k
                    let mut buffer = [0u8; 2 * S];
327
899k
                    result.to_little_endian(&mut buffer);
328
899k
                    let lower_half: [u8; S] = buffer[..S].try_into().unwrap_or_else(|_| unreachable!());
329
899k
                    let higher_half: [u8; S] = buffer[S..].try_into().unwrap_or_else(|_| unreachable!());
330
899k
                    let result = $t::from_le_bytes(lower_half);
331
899k
332
899k
                    let overflows = higher_half != [0u8; S];
333
899k
                    if overflows && !is_wrapping(flag.into()) {
334
2
                        return Err(PanicReason::ArithmeticOverflow.into());
335
899k
                    }
336
899k
                    *of = overflows as Word;
337
899k
                    *err = 0;
338
899k
339
899k
                    self.memory.as_mut().write_bytes(owner_regs, dest_addr, result.to_be_bytes())?;
340
341
899k
                    Ok(inc_pc(pc)?)
342
899k
                }
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_4blob8BlobBodyNtB4o_12BlobMetadataEE23alu_wideint_muldiv_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6create10CreateBodyNtB4o_14CreateMetadataEE23alu_wideint_muldiv_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6script10ScriptBodyNtB4o_14ScriptMetadataEE23alu_wideint_muldiv_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_6upload10UploadBodyNtB4o_14UploadMetadataEE23alu_wideint_muldiv_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1K_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2S_7upgrade11UpgradeBodyNtB4o_15UpgradeMetadataEE23alu_wideint_muldiv_u128B8_
Unexecuted instantiation: _RNvMNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1M_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB32_6script10ScriptBodyNtB4y_14ScriptMetadataEE23alu_wideint_muldiv_u128B8_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_4blob8BlobBodyNtB3W_12BlobMetadataEE23alu_wideint_muldiv_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_6create10CreateBodyNtB3W_14CreateMetadataEE23alu_wideint_muldiv_u256Ba_
_RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_6script10ScriptBodyNtB3W_14ScriptMetadataEE23alu_wideint_muldiv_u256Ba_
Line
Count
Source
302
1.66M
                pub(crate) fn [<alu_wideint_muldiv_ $t:lower>](
303
1.66M
                    &mut self,
304
1.66M
                    dest_addr: Word,
305
1.66M
                    b: Word,
306
1.66M
                    c: Word,
307
1.66M
                    d: Word,
308
1.66M
                ) -> SimpleResult<()> {
309
1.66M
                    let owner_regs = self.ownership_registers();
310
1.66M
                    let (SystemRegisters { mut of, mut err, pc, flag, .. }, _) = split_registers(&mut self.registers);
311
312
1.66M
                    let lhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(b)?);
313
1.66M
                    let rhs: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(c)?);
314
1.66M
                    let divider: $t = $t::from_be_bytes(self.memory.as_ref().read_bytes(d)?);
315
316
                    const S: usize = core::mem::size_of::<$t>();
317
318
1.66M
                    let lhs = [<to_prim_ $t:lower>](lhs);
319
1.66M
                    let rhs = [<to_prim_ $t:lower>](rhs);
320
1.66M
321
1.66M
                    let product = lhs.full_mul(rhs);
322
1.66M
                    #[allow(clippy::arithmetic_side_effects)] // Safety: the shift has less bits than the product
323
1.66M
                    let product_div_max = product >> (S * 8);
324
1.66M
                    let result = product.checked_div([<to_wider_prim_ $t:lower>](divider)).unwrap_or(product_div_max);
325
1.66M
326
1.66M
                    let mut buffer = [0u8; 2 * S];
327
1.66M
                    result.to_little_endian(&mut buffer);
328
1.66M
                    let lower_half: [u8; S] = buffer[..S].try_into().unwrap_or_else(|_| unreachable!());
329
1.66M
                    let higher_half: [u8; S] = buffer[S..].try_into().unwrap_or_else(|_| unreachable!());
330
1.66M
                    let result = $t::from_le_bytes(lower_half);
331
1.66M
332
1.66M
                    let overflows = higher_half != [0u8; S];
333
1.66M
                    if overflows && !is_wrapping(flag.into()) {
334
2
                        return Err(PanicReason::ArithmeticOverflow.into());
335
1.66M
                    }
336
1.66M
                    *of = overflows as Word;
337
1.66M
                    *err = 0;
338
1.66M
339
1.66M
                    self.memory.as_mut().write_bytes(owner_regs, dest_addr, result.to_be_bytes())?;
340
341
1.66M
                    Ok(inc_pc(pc)?)
342
1.66M
                }
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_4blob8BlobBodyNtB4q_12BlobMetadataEE23alu_wideint_muldiv_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6create10CreateBodyNtB4q_14CreateMetadataEE23alu_wideint_muldiv_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6script10ScriptBodyNtB4q_14ScriptMetadataEE23alu_wideint_muldiv_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6upload10UploadBodyNtB4q_14UploadMetadataEE23alu_wideint_muldiv_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_7upgrade11UpgradeBodyNtB4q_15UpgradeMetadataEE23alu_wideint_muldiv_u256Ba_
Unexecuted instantiation: _RNvMs_NtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideintINtB8_11InterpreterQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtNtB1O_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB34_6script10ScriptBodyNtB4A_14ScriptMetadataEE23alu_wideint_muldiv_u256Ba_
343
            }
344
345
10.2M
            pub(crate) fn [<cmp_ $t:lower>](
346
10.2M
                lhs: $t,
347
10.2M
                rhs: $t,
348
10.2M
                mode: CompareMode,
349
10.2M
            ) -> Word {
350
10.2M
                match mode {
351
713k
                    CompareMode::EQ => (lhs == rhs) as Word,
352
1.28M
                    CompareMode::NE => (lhs != rhs) as Word,
353
1.58M
                    CompareMode::GT => (lhs > rhs) as Word,
354
1.92M
                    CompareMode::LT => (lhs < rhs) as Word,
355
3.23M
                    CompareMode::GTE => (lhs >= rhs) as Word,
356
417k
                    CompareMode::LTE => (lhs <= rhs) as Word,
357
1.08M
                    CompareMode::LZC => lhs.leading_zeros() as Word,
358
                }
359
10.2M
            }
_RNvNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideint8cmp_u128
Line
Count
Source
345
4.77M
            pub(crate) fn [<cmp_ $t:lower>](
346
4.77M
                lhs: $t,
347
4.77M
                rhs: $t,
348
4.77M
                mode: CompareMode,
349
4.77M
            ) -> Word {
350
4.77M
                match mode {
351
12.0k
                    CompareMode::EQ => (lhs == rhs) as Word,
352
350k
                    CompareMode::NE => (lhs != rhs) as Word,
353
916k
                    CompareMode::GT => (lhs > rhs) as Word,
354
1.91M
                    CompareMode::LT => (lhs < rhs) as Word,
355
916k
                    CompareMode::GTE => (lhs >= rhs) as Word,
356
80.2k
                    CompareMode::LTE => (lhs <= rhs) as Word,
357
583k
                    CompareMode::LZC => lhs.leading_zeros() as Word,
358
                }
359
4.77M
            }
_RNvNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideint8cmp_u256
Line
Count
Source
345
5.48M
            pub(crate) fn [<cmp_ $t:lower>](
346
5.48M
                lhs: $t,
347
5.48M
                rhs: $t,
348
5.48M
                mode: CompareMode,
349
5.48M
            ) -> Word {
350
5.48M
                match mode {
351
701k
                    CompareMode::EQ => (lhs == rhs) as Word,
352
938k
                    CompareMode::NE => (lhs != rhs) as Word,
353
671k
                    CompareMode::GT => (lhs > rhs) as Word,
354
9.48k
                    CompareMode::LT => (lhs < rhs) as Word,
355
2.31M
                    CompareMode::GTE => (lhs >= rhs) as Word,
356
337k
                    CompareMode::LTE => (lhs <= rhs) as Word,
357
505k
                    CompareMode::LZC => lhs.leading_zeros() as Word,
358
                }
359
5.48M
            }
360
361
            /// Returns (wrapped, overflow) just like overflowing_* operations of Rust integers
362
2.26M
            pub(crate) fn [<op_overflowing_ $t:lower>] (
363
2.26M
                lhs: $t,
364
2.26M
                rhs: $t,
365
2.26M
                args: MathArgs,
366
2.26M
            ) -> ($t, bool) {
367
2.26M
                match args.op {
368
985k
                    MathOp::ADD => { $t::overflowing_add(lhs, rhs) }
369
63.4k
                    MathOp::SUB => { $t::overflowing_sub(lhs, rhs) }
370
80.8k
                    MathOp::OR => { (lhs | rhs, false) }
371
230k
                    MathOp::XOR => { (lhs ^ rhs, false) }
372
107k
                    MathOp::AND => {(lhs & rhs, false) }
373
161k
                    MathOp::NOT => { (!lhs, false) }
374
                    MathOp::SHL => {
375
263k
                        if let Ok(rhs) = rhs.try_into() {
376
183k
                            ($t::checked_shl(lhs, rhs).unwrap_or_default(), false)
377
                        } else {
378
80.8k
                            ($t::default(), false) // Zero
379
                        }
380
                    }
381
                    MathOp::SHR => {
382
373k
                        if let Ok(rhs) = rhs.try_into() {
383
123k
                            ($t::checked_shr(lhs, rhs).unwrap_or_default(), false)
384
                        } else {
385
250k
                            ($t::default(), false) // Zero
386
                        }
387
                    }
388
                }
389
2.26M
            }
_RNvNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideint19op_overflowing_u128
Line
Count
Source
362
706k
            pub(crate) fn [<op_overflowing_ $t:lower>] (
363
706k
                lhs: $t,
364
706k
                rhs: $t,
365
706k
                args: MathArgs,
366
706k
            ) -> ($t, bool) {
367
706k
                match args.op {
368
102k
                    MathOp::ADD => { $t::overflowing_add(lhs, rhs) }
369
21.8k
                    MathOp::SUB => { $t::overflowing_sub(lhs, rhs) }
370
39.2k
                    MathOp::OR => { (lhs | rhs, false) }
371
188k
                    MathOp::XOR => { (lhs ^ rhs, false) }
372
65.7k
                    MathOp::AND => {(lhs & rhs, false) }
373
71.0k
                    MathOp::NOT => { (!lhs, false) }
374
                    MathOp::SHL => {
375
134k
                        if let Ok(rhs) = rhs.try_into() {
376
95.2k
                            ($t::checked_shl(lhs, rhs).unwrap_or_default(), false)
377
                        } else {
378
39.2k
                            ($t::default(), false) // Zero
379
                        }
380
                    }
381
                    MathOp::SHR => {
382
83.3k
                        if let Ok(rhs) = rhs.try_into() {
383
0
                            ($t::checked_shr(lhs, rhs).unwrap_or_default(), false)
384
                        } else {
385
83.3k
                            ($t::default(), false) // Zero
386
                        }
387
                    }
388
                }
389
706k
            }
_RNvNtNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter3alu7wideint19op_overflowing_u256
Line
Count
Source
362
1.55M
            pub(crate) fn [<op_overflowing_ $t:lower>] (
363
1.55M
                lhs: $t,
364
1.55M
                rhs: $t,
365
1.55M
                args: MathArgs,
366
1.55M
            ) -> ($t, bool) {
367
1.55M
                match args.op {
368
883k
                    MathOp::ADD => { $t::overflowing_add(lhs, rhs) }
369
41.6k
                    MathOp::SUB => { $t::overflowing_sub(lhs, rhs) }
370
41.6k
                    MathOp::OR => { (lhs | rhs, false) }
371
41.6k
                    MathOp::XOR => { (lhs ^ rhs, false) }
372
41.6k
                    MathOp::AND => {(lhs & rhs, false) }
373
90.4k
                    MathOp::NOT => { (!lhs, false) }
374
                    MathOp::SHL => {
375
129k
                        if let Ok(rhs) = rhs.try_into() {
376
87.8k
                            ($t::checked_shl(lhs, rhs).unwrap_or_default(), false)
377
                        } else {
378
41.6k
                            ($t::default(), false) // Zero
379
                        }
380
                    }
381
                    MathOp::SHR => {
382
289k
                        if let Ok(rhs) = rhs.try_into() {
383
123k
                            ($t::checked_shr(lhs, rhs).unwrap_or_default(), false)
384
                        } else {
385
166k
                            ($t::default(), false) // Zero
386
                        }
387
                    }
388
                }
389
1.55M
            }
390
        }
391
    };
392
}
393
394
wideint_ops!(u128, U256);
395
wideint_ops!(U256, U512);
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter/initialization.rs
Line
Count
Source
1
use super::{
2
    ExecutableTransaction,
3
    InitialBalances,
4
    Interpreter,
5
    Memory,
6
    RuntimeBalances,
7
};
8
use crate::{
9
    checked_transaction::{
10
        IntoChecked,
11
        Ready,
12
    },
13
    consts::*,
14
    context::Context,
15
    error::InterpreterError,
16
    prelude::RuntimeError,
17
    storage::InterpreterStorage,
18
};
19
use fuel_asm::RegId;
20
use fuel_tx::{
21
    field::{
22
        Script,
23
        ScriptGasLimit,
24
    },
25
    Input,
26
    Output,
27
};
28
use fuel_types::Word;
29
30
use crate::interpreter::CheckedMetadata;
31
32
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
33
where
34
    M: Memory,
35
    Tx: ExecutableTransaction,
36
    S: InterpreterStorage,
37
{
38
    /// Initialize the VM with a given transaction
39
4.38k
    fn init_inner(
40
4.38k
        &mut self,
41
4.38k
        mut tx: Tx,
42
4.38k
        initial_balances: InitialBalances,
43
4.38k
        runtime_balances: RuntimeBalances,
44
4.38k
        gas_limit: Word,
45
4.38k
    ) -> Result<(), RuntimeError<S::DataError>> {
46
4.38k
        tx.prepare_sign();
47
4.38k
        self.tx = tx;
48
4.38k
        self.input_contracts = self
49
4.38k
            .tx
50
4.38k
            .inputs()
51
4.38k
            .iter()
52
6.57k
            .filter_map(|i| match i {
53
2.19k
                Input::Contract(contract) => Some(contract.contract_id),
54
4.38k
                _ => None,
55
6.57k
            })
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2s_4blob8BlobBodyNtB3Y_12BlobMetadataEE10init_inner0B8_
_RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2s_6create10CreateBodyNtB3Y_14CreateMetadataEE10init_inner0B8_
Line
Count
Source
52
2.19k
            .filter_map(|i| match i {
53
0
                Input::Contract(contract) => Some(contract.contract_id),
54
2.19k
                _ => None,
55
2.19k
            })
_RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2s_6script10ScriptBodyNtB3Y_14ScriptMetadataEE10init_inner0B8_
Line
Count
Source
52
4.38k
            .filter_map(|i| match i {
53
2.19k
                Input::Contract(contract) => Some(contract.contract_id),
54
2.19k
                _ => None,
55
4.38k
            })
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1O_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2W_4blob8BlobBodyNtB4s_12BlobMetadataEE10init_inner0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1O_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2W_6create10CreateBodyNtB4s_14CreateMetadataEE10init_inner0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1O_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2W_6script10ScriptBodyNtB4s_14ScriptMetadataEE10init_inner0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1O_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2W_6upload10UploadBodyNtB4s_14UploadMetadataEE10init_inner0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1O_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2W_7upgrade11UpgradeBodyNtB4s_15UpgradeMetadataEE10init_inner0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1Q_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB36_6script10ScriptBodyNtB4C_14ScriptMetadataEE10init_inner0B8_
56
4.38k
            .collect();
57
4.38k
58
4.38k
        self.input_contracts_index_to_output_index = self
59
4.38k
            .tx
60
4.38k
            .outputs()
61
4.38k
            .iter()
62
4.38k
            .enumerate()
63
6.57k
            .filter_map(|(output_idx, o)| match o {
64
                Output::Contract(fuel_tx::output::contract::Contract {
65
2.19k
                    input_index,
66
2.19k
                    ..
67
2.19k
                }) => Some((
68
2.19k
                    *input_index,
69
2.19k
                    u16::try_from(output_idx)
70
2.19k
                        .expect("The maximum number of outputs is `u16::MAX`"),
71
2.19k
                )),
72
4.38k
                _ => None,
73
6.57k
            })
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2s_4blob8BlobBodyNtB3Y_12BlobMetadataEE10init_inners_0B8_
_RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2s_6create10CreateBodyNtB3Y_14CreateMetadataEE10init_inners_0B8_
Line
Count
Source
63
2.19k
            .filter_map(|(output_idx, o)| match o {
64
                Output::Contract(fuel_tx::output::contract::Contract {
65
0
                    input_index,
66
0
                    ..
67
0
                }) => Some((
68
0
                    *input_index,
69
0
                    u16::try_from(output_idx)
70
0
                        .expect("The maximum number of outputs is `u16::MAX`"),
71
0
                )),
72
2.19k
                _ => None,
73
2.19k
            })
_RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2s_6script10ScriptBodyNtB3Y_14ScriptMetadataEE10init_inners_0B8_
Line
Count
Source
63
4.38k
            .filter_map(|(output_idx, o)| match o {
64
                Output::Contract(fuel_tx::output::contract::Contract {
65
2.19k
                    input_index,
66
2.19k
                    ..
67
2.19k
                }) => Some((
68
2.19k
                    *input_index,
69
2.19k
                    u16::try_from(output_idx)
70
2.19k
                        .expect("The maximum number of outputs is `u16::MAX`"),
71
2.19k
                )),
72
2.19k
                _ => None,
73
4.38k
            })
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1O_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2W_4blob8BlobBodyNtB4s_12BlobMetadataEE10init_inners_0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1O_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2W_6create10CreateBodyNtB4s_14CreateMetadataEE10init_inners_0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1O_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2W_6script10ScriptBodyNtB4s_14ScriptMetadataEE10init_inners_0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1O_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2W_6upload10UploadBodyNtB4s_14UploadMetadataEE10init_inners_0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1O_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2W_7upgrade11UpgradeBodyNtB4s_15UpgradeMetadataEE10init_inners_0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1Q_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB36_6script10ScriptBodyNtB4C_14ScriptMetadataEE10init_inners_0B8_
74
4.38k
            .collect();
75
4.38k
76
4.38k
        self.initial_balances = initial_balances.clone();
77
4.38k
78
4.38k
        self.frames.clear();
79
4.38k
        self.receipts.clear();
80
4.38k
        self.memory_mut().reset();
81
4.38k
82
4.38k
        // Optimized for memset
83
280k
        self.registers.iter_mut().for_each(|r| *r = 0);
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2s_4blob8BlobBodyNtB3Y_12BlobMetadataEE10init_inners0_0B8_
_RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2s_6create10CreateBodyNtB3Y_14CreateMetadataEE10init_inners0_0B8_
Line
Count
Source
83
140k
        self.registers.iter_mut().for_each(|r| *r = 0);
_RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterNtNtB6_6memory14MemoryInstanceNtNtNtB8_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2s_6script10ScriptBodyNtB3Y_14ScriptMetadataEE10init_inners0_0B8_
Line
Count
Source
83
140k
        self.registers.iter_mut().for_each(|r| *r = 0);
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1O_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2W_4blob8BlobBodyNtB4s_12BlobMetadataEE10init_inners0_0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1O_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2W_6create10CreateBodyNtB4s_14CreateMetadataEE10init_inners0_0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1O_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2W_6script10ScriptBodyNtB4s_14ScriptMetadataEE10init_inners0_0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1O_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2W_6upload10UploadBodyNtB4s_14UploadMetadataEE10init_inners0_0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1O_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2W_7upgrade11UpgradeBodyNtB4s_15UpgradeMetadataEE10init_inners0_0B8_
Unexecuted instantiation: _RNCNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1Q_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB36_6script10ScriptBodyNtB4C_14ScriptMetadataEE10init_inners0_0B8_
84
4.38k
85
4.38k
        self.registers[RegId::ONE] = 1;
86
4.38k
87
4.38k
        // Set heap area
88
4.38k
        self.registers[RegId::HP] = VM_MAX_RAM;
89
90
        // Initialize stack
91
        macro_rules! push_stack {
92
            ($v:expr) => {{
93
                let data = $v;
94
                let old_ssp = self.registers[RegId::SSP];
95
                let new_ssp = old_ssp
96
                    .checked_add(data.len() as Word)
97
                    .expect("VM initialization data must fit into the stack");
98
                self.memory_mut().grow_stack(new_ssp)?;
99
                self.registers[RegId::SSP] = new_ssp;
100
                self.memory_mut()
101
                    .write_noownerchecks(old_ssp, data.len())
102
                    .expect("VM initialization data must fit into the stack")
103
                    .copy_from_slice(data);
104
            }};
105
        }
106
107
4.38k
        push_stack!(&*self.transaction().id(&self.chain_id()));
108
109
4.38k
        let base_asset_id = self.interpreter_params.base_asset_id;
110
4.38k
        push_stack!(&*base_asset_id);
111
112
4.38k
        runtime_balances.to_vm(self);
113
4.38k
114
4.38k
        let tx_size = self.transaction().size() as Word;
115
4.38k
        self.set_gas(gas_limit);
116
4.38k
117
4.38k
        push_stack!(&tx_size.to_be_bytes());
118
119
4.38k
        let tx_bytes = self.tx.to_bytes();
120
4.38k
        push_stack!(tx_bytes.as_slice());
121
122
4.38k
        self.registers[RegId::SP] = self.registers[RegId::SSP];
123
4.38k
124
4.38k
        Ok(())
125
4.38k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_4blob8BlobBodyNtB3W_12BlobMetadataEE10init_innerB6_
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_6create10CreateBodyNtB3W_14CreateMetadataEE10init_innerB6_
Line
Count
Source
39
2.19k
    fn init_inner(
40
2.19k
        &mut self,
41
2.19k
        mut tx: Tx,
42
2.19k
        initial_balances: InitialBalances,
43
2.19k
        runtime_balances: RuntimeBalances,
44
2.19k
        gas_limit: Word,
45
2.19k
    ) -> Result<(), RuntimeError<S::DataError>> {
46
2.19k
        tx.prepare_sign();
47
2.19k
        self.tx = tx;
48
2.19k
        self.input_contracts = self
49
2.19k
            .tx
50
2.19k
            .inputs()
51
2.19k
            .iter()
52
2.19k
            .filter_map(|i| match i {
53
                Input::Contract(contract) => Some(contract.contract_id),
54
                _ => None,
55
2.19k
            })
56
2.19k
            .collect();
57
2.19k
58
2.19k
        self.input_contracts_index_to_output_index = self
59
2.19k
            .tx
60
2.19k
            .outputs()
61
2.19k
            .iter()
62
2.19k
            .enumerate()
63
2.19k
            .filter_map(|(output_idx, o)| match o {
64
                Output::Contract(fuel_tx::output::contract::Contract {
65
                    input_index,
66
                    ..
67
                }) => Some((
68
                    *input_index,
69
                    u16::try_from(output_idx)
70
                        .expect("The maximum number of outputs is `u16::MAX`"),
71
                )),
72
                _ => None,
73
2.19k
            })
74
2.19k
            .collect();
75
2.19k
76
2.19k
        self.initial_balances = initial_balances.clone();
77
2.19k
78
2.19k
        self.frames.clear();
79
2.19k
        self.receipts.clear();
80
2.19k
        self.memory_mut().reset();
81
2.19k
82
2.19k
        // Optimized for memset
83
2.19k
        self.registers.iter_mut().for_each(|r| *r = 0);
84
2.19k
85
2.19k
        self.registers[RegId::ONE] = 1;
86
2.19k
87
2.19k
        // Set heap area
88
2.19k
        self.registers[RegId::HP] = VM_MAX_RAM;
89
90
        // Initialize stack
91
        macro_rules! push_stack {
92
            ($v:expr) => {{
93
                let data = $v;
94
                let old_ssp = self.registers[RegId::SSP];
95
                let new_ssp = old_ssp
96
                    .checked_add(data.len() as Word)
97
                    .expect("VM initialization data must fit into the stack");
98
                self.memory_mut().grow_stack(new_ssp)?;
99
                self.registers[RegId::SSP] = new_ssp;
100
                self.memory_mut()
101
                    .write_noownerchecks(old_ssp, data.len())
102
                    .expect("VM initialization data must fit into the stack")
103
                    .copy_from_slice(data);
104
            }};
105
        }
106
107
2.19k
        push_stack!(&*self.transaction().id(&self.chain_id()));
108
109
2.19k
        let base_asset_id = self.interpreter_params.base_asset_id;
110
2.19k
        push_stack!(&*base_asset_id);
111
112
2.19k
        runtime_balances.to_vm(self);
113
2.19k
114
2.19k
        let tx_size = self.transaction().size() as Word;
115
2.19k
        self.set_gas(gas_limit);
116
2.19k
117
2.19k
        push_stack!(&tx_size.to_be_bytes());
118
119
2.19k
        let tx_bytes = self.tx.to_bytes();
120
2.19k
        push_stack!(tx_bytes.as_slice());
121
122
2.19k
        self.registers[RegId::SP] = self.registers[RegId::SSP];
123
2.19k
124
2.19k
        Ok(())
125
2.19k
    }
_RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB4_11InterpreterNtNtB4_6memory14MemoryInstanceNtNtNtB6_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2q_6script10ScriptBodyNtB3W_14ScriptMetadataEE10init_innerB6_
Line
Count
Source
39
2.19k
    fn init_inner(
40
2.19k
        &mut self,
41
2.19k
        mut tx: Tx,
42
2.19k
        initial_balances: InitialBalances,
43
2.19k
        runtime_balances: RuntimeBalances,
44
2.19k
        gas_limit: Word,
45
2.19k
    ) -> Result<(), RuntimeError<S::DataError>> {
46
2.19k
        tx.prepare_sign();
47
2.19k
        self.tx = tx;
48
2.19k
        self.input_contracts = self
49
2.19k
            .tx
50
2.19k
            .inputs()
51
2.19k
            .iter()
52
2.19k
            .filter_map(|i| match i {
53
                Input::Contract(contract) => Some(contract.contract_id),
54
                _ => None,
55
2.19k
            })
56
2.19k
            .collect();
57
2.19k
58
2.19k
        self.input_contracts_index_to_output_index = self
59
2.19k
            .tx
60
2.19k
            .outputs()
61
2.19k
            .iter()
62
2.19k
            .enumerate()
63
2.19k
            .filter_map(|(output_idx, o)| match o {
64
                Output::Contract(fuel_tx::output::contract::Contract {
65
                    input_index,
66
                    ..
67
                }) => Some((
68
                    *input_index,
69
                    u16::try_from(output_idx)
70
                        .expect("The maximum number of outputs is `u16::MAX`"),
71
                )),
72
                _ => None,
73
2.19k
            })
74
2.19k
            .collect();
75
2.19k
76
2.19k
        self.initial_balances = initial_balances.clone();
77
2.19k
78
2.19k
        self.frames.clear();
79
2.19k
        self.receipts.clear();
80
2.19k
        self.memory_mut().reset();
81
2.19k
82
2.19k
        // Optimized for memset
83
2.19k
        self.registers.iter_mut().for_each(|r| *r = 0);
84
2.19k
85
2.19k
        self.registers[RegId::ONE] = 1;
86
2.19k
87
2.19k
        // Set heap area
88
2.19k
        self.registers[RegId::HP] = VM_MAX_RAM;
89
90
        // Initialize stack
91
        macro_rules! push_stack {
92
            ($v:expr) => {{
93
                let data = $v;
94
                let old_ssp = self.registers[RegId::SSP];
95
                let new_ssp = old_ssp
96
                    .checked_add(data.len() as Word)
97
                    .expect("VM initialization data must fit into the stack");
98
                self.memory_mut().grow_stack(new_ssp)?;
99
                self.registers[RegId::SSP] = new_ssp;
100
                self.memory_mut()
101
                    .write_noownerchecks(old_ssp, data.len())
102
                    .expect("VM initialization data must fit into the stack")
103
                    .copy_from_slice(data);
104
            }};
105
        }
106
107
2.19k
        push_stack!(&*self.transaction().id(&self.chain_id()));
108
109
2.19k
        let base_asset_id = self.interpreter_params.base_asset_id;
110
2.19k
        push_stack!(&*base_asset_id);
111
112
2.19k
        runtime_balances.to_vm(self);
113
2.19k
114
2.19k
        let tx_size = self.transaction().size() as Word;
115
2.19k
        self.set_gas(gas_limit);
116
2.19k
117
2.19k
        push_stack!(&tx_size.to_be_bytes());
118
119
2.19k
        let tx_bytes = self.tx.to_bytes();
120
2.19k
        push_stack!(tx_bytes.as_slice());
121
122
2.19k
        self.registers[RegId::SP] = self.registers[RegId::SSP];
123
2.19k
124
2.19k
        Ok(())
125
2.19k
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_4blob8BlobBodyNtB4q_12BlobMetadataEE10init_innerB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6create10CreateBodyNtB4q_14CreateMetadataEE10init_innerB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6script10ScriptBodyNtB4q_14ScriptMetadataEE10init_innerB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_6upload10UploadBodyNtB4q_14UploadMetadataEE10init_innerB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtB1M_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2U_7upgrade11UpgradeBodyNtB4q_15UpgradeMetadataEE10init_innerB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB4_11InterpreterQNtNtB4_6memory14MemoryInstanceINtNtNtB6_7storage9predicate16PredicateStorageRNtNtB1O_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB34_6script10ScriptBodyNtB4A_14ScriptMetadataEE10init_innerB6_
126
}
127
128
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
129
where
130
    M: Memory,
131
    Tx: ExecutableTransaction,
132
    S: InterpreterStorage,
133
{
134
    /// Initialize the VM for a predicate context
135
0
    pub fn init_predicate(
136
0
        &mut self,
137
0
        context: Context,
138
0
        tx: Tx,
139
0
        gas_limit: Word,
140
0
    ) -> Result<(), InterpreterError<S::DataError>> {
141
0
        self.context = context;
142
0
        let initial_balances: InitialBalances = Default::default();
143
0
        let runtime_balances = initial_balances.clone().try_into()?;
144
145
0
        let range = self
146
0
            .context
147
0
            .predicate()
148
0
            .expect("The context is not predicate")
149
0
            .program()
150
0
            .words();
151
0
152
0
        self.init_inner(tx, initial_balances, runtime_balances, gas_limit)?;
153
0
        self.registers[RegId::PC] = range.start as fuel_asm::Word;
154
0
        self.registers[RegId::IS] = range.start as fuel_asm::Word;
155
0
156
0
        Ok(())
157
0
    }
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1O_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2W_4blob8BlobBodyNtB4s_12BlobMetadataEE14init_predicateB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1O_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2W_6create10CreateBodyNtB4s_14CreateMetadataEE14init_predicateB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1O_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2W_6script10ScriptBodyNtB4s_14ScriptMetadataEE14init_predicateB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1O_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2W_6upload10UploadBodyNtB4s_14UploadMetadataEE14init_predicateB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtB1O_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2W_7upgrade11UpgradeBodyNtB4s_15UpgradeMetadataEE14init_predicateB8_
Unexecuted instantiation: _RNvMs_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB6_11InterpreterQNtNtB6_6memory14MemoryInstanceINtNtNtB8_7storage9predicate16PredicateStorageRNtNtB1Q_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB36_6script10ScriptBodyNtB4C_14ScriptMetadataEE14init_predicateB8_
158
}
159
160
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal>
161
where
162
    M: Memory,
163
    S: InterpreterStorage,
164
    <S as InterpreterStorage>::DataError: From<S::DataError>,
165
    Tx: ExecutableTransaction,
166
    <Tx as IntoChecked>::Metadata: CheckedMetadata,
167
{
168
    /// Initialize the VM with a given transaction, backed by a storage provider that
169
    /// allows execution of contract opcodes.
170
    ///
171
    /// For predicate estimation and verification, check [`Self::init_predicate`]
172
4.38k
    pub fn init_script(
173
4.38k
        &mut self,
174
4.38k
        ready_tx: Ready<Tx>,
175
4.38k
    ) -> Result<(), InterpreterError<S::DataError>> {
176
4.38k
        let block_height = self.storage.block_height().map_err(RuntimeError::Storage)?;
177
178
4.38k
        self.context = Context::Script { block_height };
179
4.38k
180
4.38k
        let (_, checked) = ready_tx.decompose();
181
4.38k
        let (tx, metadata): (Tx, Tx::Metadata) = checked.into();
182
4.38k
183
4.38k
        let gas_limit = tx
184
4.38k
            .as_script()
185
4.38k
            .map(|script| *script.script_gas_limit())
Unexecuted instantiation: _RNCNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2v_4blob8BlobBodyNtB41_12BlobMetadataEE11init_script0Bb_
Unexecuted instantiation: _RNCNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2v_6create10CreateBodyNtB41_14CreateMetadataEE11init_script0Bb_
_RNCNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB9_11InterpreterNtNtB9_6memory14MemoryInstanceNtNtNtBb_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2v_6script10ScriptBodyNtB41_14ScriptMetadataEE11init_script0Bb_
Line
Count
Source
185
2.19k
            .map(|script| *script.script_gas_limit())
186
4.38k
            .unwrap_or_default();
187
4.38k
188
4.38k
        let initial_balances = metadata.balances();
189
4.38k
        let runtime_balances = initial_balances.try_into()?;
190
4.38k
        self.init_inner(tx, metadata.balances(), runtime_balances, gas_limit)?;
191
192
4.38k
        if let Some(script) = self.transaction().as_script() {
193
2.19k
            let offset = self.tx_offset().saturating_add(script.script_offset()) as Word;
194
2.19k
195
2.19k
            debug_assert!(offset < VM_MAX_RAM);
196
197
2.19k
            self.registers[RegId::PC] = offset;
198
2.19k
            self.registers[RegId::IS] = offset;
199
2.19k
        }
200
201
4.38k
        Ok(())
202
4.38k
    }
Unexecuted instantiation: _RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2t_4blob8BlobBodyNtB3Z_12BlobMetadataEE11init_scriptB9_
_RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2t_6create10CreateBodyNtB3Z_14CreateMetadataEE11init_scriptB9_
Line
Count
Source
172
2.19k
    pub fn init_script(
173
2.19k
        &mut self,
174
2.19k
        ready_tx: Ready<Tx>,
175
2.19k
    ) -> Result<(), InterpreterError<S::DataError>> {
176
2.19k
        let block_height = self.storage.block_height().map_err(RuntimeError::Storage)?;
177
178
2.19k
        self.context = Context::Script { block_height };
179
2.19k
180
2.19k
        let (_, checked) = ready_tx.decompose();
181
2.19k
        let (tx, metadata): (Tx, Tx::Metadata) = checked.into();
182
2.19k
183
2.19k
        let gas_limit = tx
184
2.19k
            .as_script()
185
2.19k
            .map(|script| *script.script_gas_limit())
186
2.19k
            .unwrap_or_default();
187
2.19k
188
2.19k
        let initial_balances = metadata.balances();
189
2.19k
        let runtime_balances = initial_balances.try_into()?;
190
2.19k
        self.init_inner(tx, metadata.balances(), runtime_balances, gas_limit)?;
191
192
2.19k
        if let Some(script) = self.transaction().as_script() {
193
0
            let offset = self.tx_offset().saturating_add(script.script_offset()) as Word;
194
0
195
0
            debug_assert!(offset < VM_MAX_RAM);
196
197
0
            self.registers[RegId::PC] = offset;
198
0
            self.registers[RegId::IS] = offset;
199
2.19k
        }
200
201
2.19k
        Ok(())
202
2.19k
    }
_RNvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14initializationINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2t_6script10ScriptBodyNtB3Z_14ScriptMetadataEE11init_scriptB9_
Line
Count
Source
172
2.19k
    pub fn init_script(
173
2.19k
        &mut self,
174
2.19k
        ready_tx: Ready<Tx>,
175
2.19k
    ) -> Result<(), InterpreterError<S::DataError>> {
176
2.19k
        let block_height = self.storage.block_height().map_err(RuntimeError::Storage)?;
177
178
2.19k
        self.context = Context::Script { block_height };
179
2.19k
180
2.19k
        let (_, checked) = ready_tx.decompose();
181
2.19k
        let (tx, metadata): (Tx, Tx::Metadata) = checked.into();
182
2.19k
183
2.19k
        let gas_limit = tx
184
2.19k
            .as_script()
185
2.19k
            .map(|script| *script.script_gas_limit())
186
2.19k
            .unwrap_or_default();
187
2.19k
188
2.19k
        let initial_balances = metadata.balances();
189
2.19k
        let runtime_balances = initial_balances.try_into()?;
190
2.19k
        self.init_inner(tx, metadata.balances(), runtime_balances, gas_limit)?;
191
192
2.19k
        if let Some(script) = self.transaction().as_script() {
193
2.19k
            let offset = self.tx_offset().saturating_add(script.script_offset()) as Word;
194
2.19k
195
2.19k
            debug_assert!(offset < VM_MAX_RAM);
196
197
2.19k
            self.registers[RegId::PC] = offset;
198
2.19k
            self.registers[RegId::IS] = offset;
199
0
        }
200
201
2.19k
        Ok(())
202
2.19k
    }
203
}
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter/post_execution.rs
Line
Count
Source
1
use crate::prelude::{
2
    Bug,
3
    BugVariant,
4
    ExecutableTransaction,
5
    Interpreter,
6
    InterpreterStorage,
7
    RuntimeError,
8
};
9
10
use crate::interpreter::{
11
    InitialBalances,
12
    RuntimeBalances,
13
};
14
use fuel_tx::{
15
    FeeParameters,
16
    GasCosts,
17
};
18
use fuel_types::{
19
    AssetId,
20
    Word,
21
};
22
23
impl<M, S, T, Ecal> Interpreter<M, S, T, Ecal>
24
where
25
    S: InterpreterStorage,
26
{
27
    /// Finalize outputs post-execution.
28
    ///
29
    /// For more information, check [`ExecutableTransaction::update_outputs`].
30
    ///
31
    /// # Panics
32
    ///
33
    /// This will panic if the transaction is malformed (e.g. it contains an output change
34
    /// with asset id that doesn't exist as balance).
35
    ///
36
    /// The transaction validation is expected to halt in such case. Since the VM only
37
    /// accepts checked transactions - hence, validated - this case should be
38
    /// unreachable.
39
    #[allow(clippy::too_many_arguments)]
40
4.38k
    pub(crate) fn finalize_outputs<Tx>(
41
4.38k
        tx: &mut Tx,
42
4.38k
        gas_costs: &GasCosts,
43
4.38k
        fee_params: &FeeParameters,
44
4.38k
        base_asset_id: &AssetId,
45
4.38k
        revert: bool,
46
4.38k
        used_gas: Word,
47
4.38k
        initial_balances: &InitialBalances,
48
4.38k
        balances: &RuntimeBalances,
49
4.38k
        gas_price: Word,
50
4.38k
    ) -> Result<(), RuntimeError<S::DataError>>
51
4.38k
    where
52
4.38k
        Tx: ExecutableTransaction,
53
4.38k
    {
54
4.38k
        tx.update_outputs(
55
4.38k
            revert,
56
4.38k
            used_gas,
57
4.38k
            initial_balances,
58
4.38k
            balances,
59
4.38k
            gas_costs,
60
4.38k
            fee_params,
61
4.38k
            base_asset_id,
62
4.38k
            gas_price,
63
4.38k
        )
64
4.38k
        .map_err(|e| Bug::new(BugVariant::UncomputableRefund).with_message(e))?;
Unexecuted instantiation: _RNCINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14post_executionINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2t_4blob8BlobBodyNtB3Z_12BlobMetadataEE16finalize_outputsB2o_E0B9_
Unexecuted instantiation: _RNCINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14post_executionINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2t_4blob8BlobBodyNtB3Z_12BlobMetadataEE16finalize_outputsIB2p_NtNtB2t_6create10CreateBodyNtB54_14CreateMetadataEE0B9_
Unexecuted instantiation: _RNCINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14post_executionINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2t_4blob8BlobBodyNtB3Z_12BlobMetadataEE16finalize_outputsIB2p_NtNtB2t_6upload10UploadBodyNtB54_14UploadMetadataEE0B9_
Unexecuted instantiation: _RNCINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14post_executionINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2t_4blob8BlobBodyNtB3Z_12BlobMetadataEE16finalize_outputsIB2p_NtNtB2t_7upgrade11UpgradeBodyNtB54_15UpgradeMetadataEE0B9_
Unexecuted instantiation: _RNCINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14post_executionINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2t_6create10CreateBodyNtB3Z_14CreateMetadataEE16finalize_outputsB2o_E0B9_
Unexecuted instantiation: _RNCINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14post_executionINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2t_6create10CreateBodyNtB3Z_14CreateMetadataEE16finalize_outputsIB2p_NtNtB2t_4blob8BlobBodyNtB5b_12BlobMetadataEE0B9_
Unexecuted instantiation: _RNCINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14post_executionINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2t_6create10CreateBodyNtB3Z_14CreateMetadataEE16finalize_outputsIB2p_NtNtB2t_6upload10UploadBodyNtB5b_14UploadMetadataEE0B9_
Unexecuted instantiation: _RNCINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14post_executionINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2t_6create10CreateBodyNtB3Z_14CreateMetadataEE16finalize_outputsIB2p_NtNtB2t_7upgrade11UpgradeBodyNtB5b_15UpgradeMetadataEE0B9_
Unexecuted instantiation: _RNCINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14post_executionINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2t_6script10ScriptBodyNtB3Z_14ScriptMetadataEE16finalize_outputsB2o_E0B9_
Unexecuted instantiation: _RNCINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14post_executionINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2t_6script10ScriptBodyNtB3Z_14ScriptMetadataEE16finalize_outputsIB2p_NtNtB2t_4blob8BlobBodyNtB5b_12BlobMetadataEE0B9_
Unexecuted instantiation: _RNCINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14post_executionINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2t_6script10ScriptBodyNtB3Z_14ScriptMetadataEE16finalize_outputsIB2p_NtNtB2t_6create10CreateBodyNtB5b_14CreateMetadataEE0B9_
Unexecuted instantiation: _RNCINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14post_executionINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2t_6script10ScriptBodyNtB3Z_14ScriptMetadataEE16finalize_outputsIB2p_NtNtB2t_6upload10UploadBodyNtB5b_14UploadMetadataEE0B9_
Unexecuted instantiation: _RNCINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14post_executionINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2t_6script10ScriptBodyNtB3Z_14ScriptMetadataEE16finalize_outputsIB2p_NtNtB2t_7upgrade11UpgradeBodyNtB5b_15UpgradeMetadataEE0B9_
65
66
4.38k
        Ok(())
67
4.38k
    }
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14post_executionINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2r_4blob8BlobBodyNtB3X_12BlobMetadataEE16finalize_outputsB2m_EB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14post_executionINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2r_4blob8BlobBodyNtB3X_12BlobMetadataEE16finalize_outputsIB2n_NtNtB2r_6create10CreateBodyNtB52_14CreateMetadataEEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14post_executionINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2r_4blob8BlobBodyNtB3X_12BlobMetadataEE16finalize_outputsIB2n_NtNtB2r_6upload10UploadBodyNtB52_14UploadMetadataEEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14post_executionINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2r_4blob8BlobBodyNtB3X_12BlobMetadataEE16finalize_outputsIB2n_NtNtB2r_7upgrade11UpgradeBodyNtB52_15UpgradeMetadataEEB7_
_RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14post_executionINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2r_6create10CreateBodyNtB3X_14CreateMetadataEE16finalize_outputsB2m_EB7_
Line
Count
Source
40
2.19k
    pub(crate) fn finalize_outputs<Tx>(
41
2.19k
        tx: &mut Tx,
42
2.19k
        gas_costs: &GasCosts,
43
2.19k
        fee_params: &FeeParameters,
44
2.19k
        base_asset_id: &AssetId,
45
2.19k
        revert: bool,
46
2.19k
        used_gas: Word,
47
2.19k
        initial_balances: &InitialBalances,
48
2.19k
        balances: &RuntimeBalances,
49
2.19k
        gas_price: Word,
50
2.19k
    ) -> Result<(), RuntimeError<S::DataError>>
51
2.19k
    where
52
2.19k
        Tx: ExecutableTransaction,
53
2.19k
    {
54
2.19k
        tx.update_outputs(
55
2.19k
            revert,
56
2.19k
            used_gas,
57
2.19k
            initial_balances,
58
2.19k
            balances,
59
2.19k
            gas_costs,
60
2.19k
            fee_params,
61
2.19k
            base_asset_id,
62
2.19k
            gas_price,
63
2.19k
        )
64
2.19k
        .map_err(|e| Bug::new(BugVariant::UncomputableRefund).with_message(e))?;
65
66
2.19k
        Ok(())
67
2.19k
    }
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14post_executionINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2r_6create10CreateBodyNtB3X_14CreateMetadataEE16finalize_outputsIB2n_NtNtB2r_4blob8BlobBodyNtB59_12BlobMetadataEEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14post_executionINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2r_6create10CreateBodyNtB3X_14CreateMetadataEE16finalize_outputsIB2n_NtNtB2r_6upload10UploadBodyNtB59_14UploadMetadataEEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14post_executionINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2r_6create10CreateBodyNtB3X_14CreateMetadataEE16finalize_outputsIB2n_NtNtB2r_7upgrade11UpgradeBodyNtB59_15UpgradeMetadataEEB7_
_RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14post_executionINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2r_6script10ScriptBodyNtB3X_14ScriptMetadataEE16finalize_outputsB2m_EB7_
Line
Count
Source
40
2.19k
    pub(crate) fn finalize_outputs<Tx>(
41
2.19k
        tx: &mut Tx,
42
2.19k
        gas_costs: &GasCosts,
43
2.19k
        fee_params: &FeeParameters,
44
2.19k
        base_asset_id: &AssetId,
45
2.19k
        revert: bool,
46
2.19k
        used_gas: Word,
47
2.19k
        initial_balances: &InitialBalances,
48
2.19k
        balances: &RuntimeBalances,
49
2.19k
        gas_price: Word,
50
2.19k
    ) -> Result<(), RuntimeError<S::DataError>>
51
2.19k
    where
52
2.19k
        Tx: ExecutableTransaction,
53
2.19k
    {
54
2.19k
        tx.update_outputs(
55
2.19k
            revert,
56
2.19k
            used_gas,
57
2.19k
            initial_balances,
58
2.19k
            balances,
59
2.19k
            gas_costs,
60
2.19k
            fee_params,
61
2.19k
            base_asset_id,
62
2.19k
            gas_price,
63
2.19k
        )
64
2.19k
        .map_err(|e| Bug::new(BugVariant::UncomputableRefund).with_message(e))?;
65
66
2.19k
        Ok(())
67
2.19k
    }
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14post_executionINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2r_6script10ScriptBodyNtB3X_14ScriptMetadataEE16finalize_outputsIB2n_NtNtB2r_4blob8BlobBodyNtB59_12BlobMetadataEEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14post_executionINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2r_6script10ScriptBodyNtB3X_14ScriptMetadataEE16finalize_outputsIB2n_NtNtB2r_6create10CreateBodyNtB59_14CreateMetadataEEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14post_executionINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2r_6script10ScriptBodyNtB3X_14ScriptMetadataEE16finalize_outputsIB2n_NtNtB2r_6upload10UploadBodyNtB59_14UploadMetadataEEB7_
Unexecuted instantiation: _RINvMNtNtCsg6P9hFxt0iW_7fuel_vm11interpreter14post_executionINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2r_6script10ScriptBodyNtB3X_14ScriptMetadataEE16finalize_outputsIB2n_NtNtB2r_7upgrade11UpgradeBodyNtB59_15UpgradeMetadataEEB7_
68
}
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter/balances.rs
Line
Count
Source
1
use crate::{
2
    consts::*,
3
    error::SimpleResult,
4
    interpreter::{
5
        ExecutableTransaction,
6
        InitialBalances,
7
        Interpreter,
8
    },
9
};
10
11
use fuel_asm::{
12
    RegId,
13
    Word,
14
};
15
use fuel_tx::{
16
    consts::BALANCE_ENTRY_SIZE,
17
    ValidityError,
18
};
19
use fuel_types::AssetId;
20
use itertools::Itertools;
21
22
use alloc::collections::BTreeMap;
23
use core::ops::Index;
24
use hashbrown::HashMap;
25
26
use super::{
27
    Memory,
28
    MemoryInstance,
29
};
30
31
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
32
pub(crate) struct Balance {
33
    value: Word,
34
    offset: usize,
35
}
36
37
impl Balance {
38
8.77k
    pub const fn new(value: Word, offset: usize) -> Self {
39
8.77k
        Self { value, offset }
40
8.77k
    }
41
42
95.3k
    pub const fn offset(&self) -> usize {
43
95.3k
        self.offset
44
95.3k
    }
45
46
95.3k
    pub const fn value(&self) -> Word {
47
95.3k
        self.value
48
95.3k
    }
49
50
8.77k
    pub fn checked_add(&mut self, value: Word) -> Option<&mut Self> {
51
8.77k
        self.value
52
8.77k
            .checked_add(value)
53
8.77k
            .map(|v| self.value = v)
54
8.77k
            .map(|_| self)
55
8.77k
    }
56
57
88.7k
    pub fn checked_sub(&mut self, value: Word) -> Option<&mut Self> {
58
88.7k
        self.value
59
88.7k
            .checked_sub(value)
60
88.7k
            .map(|v| self.value = v)
61
88.7k
            .map(|_| self)
62
88.7k
    }
63
}
64
65
/// Structure to encapsulate asset balances for VM runtime
66
#[derive(Debug, Default, Clone)]
67
pub struct RuntimeBalances {
68
    state: HashMap<AssetId, Balance>,
69
}
70
71
impl TryFrom<InitialBalances> for RuntimeBalances {
72
    type Error = ValidityError;
73
74
6.57k
    fn try_from(initial_balances: InitialBalances) -> Result<Self, ValidityError> {
75
6.57k
        let mut balances: BTreeMap<_, _> = initial_balances.non_retryable.into();
76
6.57k
        if let Some(retryable_amount) = initial_balances.retryable {
77
2.19k
            let entry = balances.entry(retryable_amount.base_asset_id).or_default();
78
2.19k
            *entry = entry
79
2.19k
                .checked_add(retryable_amount.amount)
80
2.19k
                .ok_or(ValidityError::BalanceOverflow)?;
81
4.38k
        }
82
6.57k
        Self::try_from_iter(balances)
83
6.57k
    }
84
}
85
86
impl RuntimeBalances {
87
    /// Attempt to create a set of runtime balances from an iterator of pairs.
88
    ///
89
    /// This will fail if, and only if, the provided asset/balance pair isn't consistent
90
    /// or a balance overflows.
91
6.57k
    pub fn try_from_iter<T>(iter: T) -> Result<Self, ValidityError>
92
6.57k
    where
93
6.57k
        T: IntoIterator<Item = (AssetId, Word)>,
94
6.57k
    {
95
6.57k
        iter.into_iter()
96
6.57k
            .sorted_by_key(|k| k.0)
97
6.57k
            .enumerate()
98
8.77k
            .try_fold(HashMap::new(), |mut state, (i, (asset, balance))| {
99
8.77k
                let offset = VM_MEMORY_BALANCES_OFFSET
100
8.77k
                    .saturating_add(i.saturating_mul(BALANCE_ENTRY_SIZE));
101
8.77k
102
8.77k
                state
103
8.77k
                    .entry(asset)
104
8.77k
                    .or_insert_with(|| Balance::new(0, offset))
105
8.77k
                    .checked_add(balance)
106
8.77k
                    .ok_or(ValidityError::BalanceOverflow)?;
107
108
8.77k
                Ok(state)
109
8.77k
            })
110
6.57k
            .map(|state| Self { state })
111
6.57k
    }
112
113
    /// Fetch the balance of a given Id, if set.
114
0
    pub fn balance(&self, asset: &AssetId) -> Option<Word> {
115
0
        self.state.get(asset).map(Balance::value)
116
0
    }
117
118
88.7k
    fn set_memory_balance_inner(
119
88.7k
        balance: &Balance,
120
88.7k
        memory: &mut MemoryInstance,
121
88.7k
    ) -> SimpleResult<Word> {
122
88.7k
        let value = balance.value();
123
88.7k
        let offset = balance.offset();
124
88.7k
125
88.7k
        let offset = offset.saturating_add(AssetId::LEN);
126
88.7k
        memory.write_bytes_noownerchecks(offset, value.to_be_bytes())?;
127
128
88.7k
        Ok(value)
129
88.7k
    }
130
131
    #[cfg(test)]
132
    /// Attempt to add the balance of an asset, updating the VM memory in the appropriate
133
    /// offset
134
    ///
135
    /// Note: This will not append a new asset into the set since all the assets must be
136
    /// created during VM initialization and any additional asset would imply
137
    /// reordering the memory representation of the balances since they must always be
138
    /// ordered, as in the protocol.
139
    pub fn checked_balance_add(
140
        &mut self,
141
        memory: &mut MemoryInstance,
142
        asset: &AssetId,
143
        value: Word,
144
    ) -> Option<Word> {
145
        self.state
146
            .get_mut(asset)
147
            .and_then(|b| b.checked_add(value))
148
            .map(|balance| Self::set_memory_balance_inner(balance, memory))
149
            .map_or((value == 0).then_some(0), |r| r.ok())
150
    }
151
152
    /// Attempt to subtract the balance of an asset, updating the VM memory in the
153
    /// appropriate offset
154
100k
    pub fn checked_balance_sub(
155
100k
        &mut self,
156
100k
        memory: &mut MemoryInstance,
157
100k
        asset: &AssetId,
158
100k
        value: Word,
159
100k
    ) -> Option<Word> {
160
100k
        self.state
161
100k
            .get_mut(asset)
162
100k
            .and_then(|b| b.checked_sub(value))
163
100k
            .map(|balance| Self::set_memory_balance_inner(balance, memory))
164
100k
            .map_or((value == 0).then_some(0), |r| r.ok())
165
100k
    }
166
167
    /// Write all assets into the start of VM stack, i.e. at $ssp.
168
    /// Panics if the assets cannot fit.
169
4.38k
    pub fn to_vm<M, S, Tx, Ecal>(self, vm: &mut Interpreter<M, S, Tx, Ecal>)
170
4.38k
    where
171
4.38k
        M: Memory,
172
4.38k
        Tx: ExecutableTransaction,
173
4.38k
    {
174
4.38k
        let len = (vm.max_inputs() as usize).saturating_mul(BALANCE_ENTRY_SIZE) as Word;
175
4.38k
176
4.38k
        let new_ssp = vm.registers[RegId::SSP].checked_add(len).expect(
177
4.38k
            "Consensus parameters must not allow stack overflow during VM initialization",
178
4.38k
        );
179
4.38k
        vm.memory_mut().grow_stack(new_ssp).expect(
180
4.38k
            "Consensus parameters must not allow stack overflow during VM initialization",
181
4.38k
        );
182
4.38k
        vm.registers[RegId::SSP] = new_ssp;
183
4.38k
184
6.57k
        self.state.iter().for_each(|(asset, balance)| {
185
6.57k
            let value = balance.value();
186
6.57k
            let ofs = balance.offset();
187
6.57k
188
6.57k
            vm.memory_mut()
189
6.57k
                .write_bytes_noownerchecks(ofs, **asset)
190
6.57k
                .expect("Checked above");
191
6.57k
            vm.memory_mut()
192
6.57k
                .write_bytes_noownerchecks(
193
6.57k
                    ofs.saturating_add(AssetId::LEN),
194
6.57k
                    value.to_be_bytes(),
195
6.57k
                )
196
6.57k
                .expect("Checked above");
197
6.57k
        });
Unexecuted instantiation: _RNCINvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8balancesNtB8_15RuntimeBalances5to_vmNtNtBa_6memory14MemoryInstanceNtNtNtBc_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2y_4blob8BlobBodyNtB44_12BlobMetadataENtBa_16NotSupportedEcalE0Bc_
_RNCINvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8balancesNtB8_15RuntimeBalances5to_vmNtNtBa_6memory14MemoryInstanceNtNtNtBc_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2y_6create10CreateBodyNtB44_14CreateMetadataENtBa_16NotSupportedEcalE0Bc_
Line
Count
Source
184
2.19k
        self.state.iter().for_each(|(asset, balance)| {
185
2.19k
            let value = balance.value();
186
2.19k
            let ofs = balance.offset();
187
2.19k
188
2.19k
            vm.memory_mut()
189
2.19k
                .write_bytes_noownerchecks(ofs, **asset)
190
2.19k
                .expect("Checked above");
191
2.19k
            vm.memory_mut()
192
2.19k
                .write_bytes_noownerchecks(
193
2.19k
                    ofs.saturating_add(AssetId::LEN),
194
2.19k
                    value.to_be_bytes(),
195
2.19k
                )
196
2.19k
                .expect("Checked above");
197
2.19k
        });
_RNCINvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8balancesNtB8_15RuntimeBalances5to_vmNtNtBa_6memory14MemoryInstanceNtNtNtBc_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2y_6script10ScriptBodyNtB44_14ScriptMetadataENtBa_16NotSupportedEcalE0Bc_
Line
Count
Source
184
4.38k
        self.state.iter().for_each(|(asset, balance)| {
185
4.38k
            let value = balance.value();
186
4.38k
            let ofs = balance.offset();
187
4.38k
188
4.38k
            vm.memory_mut()
189
4.38k
                .write_bytes_noownerchecks(ofs, **asset)
190
4.38k
                .expect("Checked above");
191
4.38k
            vm.memory_mut()
192
4.38k
                .write_bytes_noownerchecks(
193
4.38k
                    ofs.saturating_add(AssetId::LEN),
194
4.38k
                    value.to_be_bytes(),
195
4.38k
                )
196
4.38k
                .expect("Checked above");
197
4.38k
        });
Unexecuted instantiation: _RNCINvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8balancesNtB8_15RuntimeBalances5to_vmQNtNtBa_6memory14MemoryInstanceINtNtNtBc_7storage9predicate16PredicateStorageRNtB1U_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB32_4blob8BlobBodyNtB4y_12BlobMetadataENtBa_16NotSupportedEcalE0Bc_
Unexecuted instantiation: _RNCINvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8balancesNtB8_15RuntimeBalances5to_vmQNtNtBa_6memory14MemoryInstanceINtNtNtBc_7storage9predicate16PredicateStorageRNtB1U_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB32_6create10CreateBodyNtB4y_14CreateMetadataENtBa_16NotSupportedEcalE0Bc_
Unexecuted instantiation: _RNCINvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8balancesNtB8_15RuntimeBalances5to_vmQNtNtBa_6memory14MemoryInstanceINtNtNtBc_7storage9predicate16PredicateStorageRNtB1U_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB32_6script10ScriptBodyNtB4y_14ScriptMetadataENtBa_16NotSupportedEcalE0Bc_
Unexecuted instantiation: _RNCINvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8balancesNtB8_15RuntimeBalances5to_vmQNtNtBa_6memory14MemoryInstanceINtNtNtBc_7storage9predicate16PredicateStorageRNtB1U_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB32_6upload10UploadBodyNtB4y_14UploadMetadataENtBa_16NotSupportedEcalE0Bc_
Unexecuted instantiation: _RNCINvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8balancesNtB8_15RuntimeBalances5to_vmQNtNtBa_6memory14MemoryInstanceINtNtNtBc_7storage9predicate16PredicateStorageRNtB1U_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB32_7upgrade11UpgradeBodyNtB4y_15UpgradeMetadataENtBa_16NotSupportedEcalE0Bc_
Unexecuted instantiation: _RNCINvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8balancesNtB8_15RuntimeBalances5to_vmQNtNtBa_6memory14MemoryInstanceINtNtNtBc_7storage9predicate16PredicateStorageRNtNtB1W_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3c_6script10ScriptBodyNtB4I_14ScriptMetadataENtBa_16NotSupportedEcalE0Bc_
198
4.38k
199
4.38k
        vm.balances = self;
200
4.38k
    }
Unexecuted instantiation: _RINvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8balancesNtB6_15RuntimeBalances5to_vmNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2w_4blob8BlobBodyNtB42_12BlobMetadataENtB8_16NotSupportedEcalEBa_
_RINvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8balancesNtB6_15RuntimeBalances5to_vmNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2w_6create10CreateBodyNtB42_14CreateMetadataENtB8_16NotSupportedEcalEBa_
Line
Count
Source
169
2.19k
    pub fn to_vm<M, S, Tx, Ecal>(self, vm: &mut Interpreter<M, S, Tx, Ecal>)
170
2.19k
    where
171
2.19k
        M: Memory,
172
2.19k
        Tx: ExecutableTransaction,
173
2.19k
    {
174
2.19k
        let len = (vm.max_inputs() as usize).saturating_mul(BALANCE_ENTRY_SIZE) as Word;
175
2.19k
176
2.19k
        let new_ssp = vm.registers[RegId::SSP].checked_add(len).expect(
177
2.19k
            "Consensus parameters must not allow stack overflow during VM initialization",
178
2.19k
        );
179
2.19k
        vm.memory_mut().grow_stack(new_ssp).expect(
180
2.19k
            "Consensus parameters must not allow stack overflow during VM initialization",
181
2.19k
        );
182
2.19k
        vm.registers[RegId::SSP] = new_ssp;
183
2.19k
184
2.19k
        self.state.iter().for_each(|(asset, balance)| {
185
            let value = balance.value();
186
            let ofs = balance.offset();
187
188
            vm.memory_mut()
189
                .write_bytes_noownerchecks(ofs, **asset)
190
                .expect("Checked above");
191
            vm.memory_mut()
192
                .write_bytes_noownerchecks(
193
                    ofs.saturating_add(AssetId::LEN),
194
                    value.to_be_bytes(),
195
                )
196
                .expect("Checked above");
197
2.19k
        });
198
2.19k
199
2.19k
        vm.balances = self;
200
2.19k
    }
_RINvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8balancesNtB6_15RuntimeBalances5to_vmNtNtB8_6memory14MemoryInstanceNtNtNtBa_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2w_6script10ScriptBodyNtB42_14ScriptMetadataENtB8_16NotSupportedEcalEBa_
Line
Count
Source
169
2.19k
    pub fn to_vm<M, S, Tx, Ecal>(self, vm: &mut Interpreter<M, S, Tx, Ecal>)
170
2.19k
    where
171
2.19k
        M: Memory,
172
2.19k
        Tx: ExecutableTransaction,
173
2.19k
    {
174
2.19k
        let len = (vm.max_inputs() as usize).saturating_mul(BALANCE_ENTRY_SIZE) as Word;
175
2.19k
176
2.19k
        let new_ssp = vm.registers[RegId::SSP].checked_add(len).expect(
177
2.19k
            "Consensus parameters must not allow stack overflow during VM initialization",
178
2.19k
        );
179
2.19k
        vm.memory_mut().grow_stack(new_ssp).expect(
180
2.19k
            "Consensus parameters must not allow stack overflow during VM initialization",
181
2.19k
        );
182
2.19k
        vm.registers[RegId::SSP] = new_ssp;
183
2.19k
184
2.19k
        self.state.iter().for_each(|(asset, balance)| {
185
            let value = balance.value();
186
            let ofs = balance.offset();
187
188
            vm.memory_mut()
189
                .write_bytes_noownerchecks(ofs, **asset)
190
                .expect("Checked above");
191
            vm.memory_mut()
192
                .write_bytes_noownerchecks(
193
                    ofs.saturating_add(AssetId::LEN),
194
                    value.to_be_bytes(),
195
                )
196
                .expect("Checked above");
197
2.19k
        });
198
2.19k
199
2.19k
        vm.balances = self;
200
2.19k
    }
Unexecuted instantiation: _RINvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8balancesNtB6_15RuntimeBalances5to_vmQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1S_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_4blob8BlobBodyNtB4w_12BlobMetadataENtB8_16NotSupportedEcalEBa_
Unexecuted instantiation: _RINvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8balancesNtB6_15RuntimeBalances5to_vmQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1S_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_6create10CreateBodyNtB4w_14CreateMetadataENtB8_16NotSupportedEcalEBa_
Unexecuted instantiation: _RINvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8balancesNtB6_15RuntimeBalances5to_vmQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1S_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_6script10ScriptBodyNtB4w_14ScriptMetadataENtB8_16NotSupportedEcalEBa_
Unexecuted instantiation: _RINvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8balancesNtB6_15RuntimeBalances5to_vmQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1S_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_6upload10UploadBodyNtB4w_14UploadMetadataENtB8_16NotSupportedEcalEBa_
Unexecuted instantiation: _RINvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8balancesNtB6_15RuntimeBalances5to_vmQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtB1S_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB30_7upgrade11UpgradeBodyNtB4w_15UpgradeMetadataENtB8_16NotSupportedEcalEBa_
Unexecuted instantiation: _RINvMs0_NtNtCsg6P9hFxt0iW_7fuel_vm11interpreter8balancesNtB6_15RuntimeBalances5to_vmQNtNtB8_6memory14MemoryInstanceINtNtNtBa_7storage9predicate16PredicateStorageRNtNtB1U_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB3a_6script10ScriptBodyNtB4G_14ScriptMetadataENtB8_16NotSupportedEcalEBa_
201
}
202
203
impl Index<&AssetId> for RuntimeBalances {
204
    type Output = Word;
205
206
27
    fn index(&self, index: &AssetId) -> &Self::Output {
207
27
        &self.state[index].value
208
27
    }
209
}
210
211
impl AsMut<HashMap<AssetId, Balance>> for RuntimeBalances {
212
0
    fn as_mut(&mut self) -> &mut HashMap<AssetId, Balance> {
213
0
        &mut self.state
214
0
    }
215
}
216
217
impl AsRef<HashMap<AssetId, Balance>> for RuntimeBalances {
218
0
    fn as_ref(&self) -> &HashMap<AssetId, Balance> {
219
0
        &self.state
220
0
    }
221
}
222
223
impl PartialEq for RuntimeBalances {
224
0
    fn eq(&self, other: &Self) -> bool {
225
0
        self.state == other.state
226
0
    }
227
}
228
229
#[test]
230
fn writes_to_memory_correctly() {
231
    use crate::prelude::*;
232
    use alloc::vec;
233
    use rand::{
234
        rngs::StdRng,
235
        Rng,
236
        SeedableRng,
237
    };
238
239
    let rng = &mut StdRng::seed_from_u64(2322u64);
240
    let mut interpreter = Interpreter::<_, _, Script>::without_storage();
241
242
    let base = AssetId::zeroed();
243
    let base_balance = 950;
244
    let assets = vec![
245
        (rng.gen(), 10),
246
        (rng.gen(), 25),
247
        (rng.gen(), 50),
248
        (base, base_balance),
249
        (rng.gen(), 100),
250
    ];
251
252
    let mut assets_sorted = assets.clone();
253
    assets_sorted.as_mut_slice().sort_by(|a, b| a.0.cmp(&b.0));
254
255
    assert_ne!(assets_sorted, assets);
256
257
    let balances = assets.into_iter();
258
259
    interpreter.registers_mut()[RegId::HP] = VM_MAX_RAM;
260
    RuntimeBalances::try_from_iter(balances)
261
        .expect("failed to generate balances")
262
        .to_vm(&mut interpreter);
263
264
    let memory = interpreter.memory();
265
    assets_sorted
266
        .iter()
267
        .fold(VM_MEMORY_BALANCES_OFFSET, |ofs, (asset, value)| {
268
            assert_eq!(asset.as_ref(), &memory[ofs..ofs + AssetId::LEN]);
269
            assert_eq!(
270
                &value.to_be_bytes(),
271
                &memory[ofs + AssetId::LEN..ofs + BALANCE_ENTRY_SIZE]
272
            );
273
274
            ofs + BALANCE_ENTRY_SIZE
275
        });
276
}
277
278
#[test]
279
fn try_from_iter_wont_overflow() {
280
    use crate::prelude::*;
281
    use alloc::vec;
282
    use rand::{
283
        rngs::StdRng,
284
        Rng,
285
        SeedableRng,
286
    };
287
288
    let rng = &mut StdRng::seed_from_u64(2322u64);
289
290
    let a: AssetId = rng.gen();
291
    let b: AssetId = rng.gen();
292
    let c: AssetId = rng.gen();
293
294
    // Sanity check
295
    let balances = vec![(a, u64::MAX), (b, 15), (c, 0)];
296
    let runtime_balances = RuntimeBalances::try_from_iter(balances.clone())
297
        .expect("failed to create balance set");
298
299
    balances.iter().for_each(|(asset, val)| {
300
        let bal = runtime_balances
301
            .balance(asset)
302
            .expect("failed to fetch balance");
303
304
        assert_eq!(val, &bal);
305
    });
306
307
    // Aggregated sum check
308
    let balances = vec![(a, u64::MAX), (b, 15), (c, 0), (b, 1)];
309
    let balances_aggregated = [(a, u64::MAX), (b, 16), (c, 0)];
310
    let runtime_balances =
311
        RuntimeBalances::try_from_iter(balances).expect("failed to create balance set");
312
313
    balances_aggregated.iter().for_each(|(asset, val)| {
314
        let bal = runtime_balances
315
            .balance(asset)
316
            .expect("failed to fetch balance");
317
318
        assert_eq!(val, &bal);
319
    });
320
321
    // Overflow won't panic
322
    let balances = vec![(a, u64::MAX), (b, 15), (c, 0), (a, 1)];
323
    let err =
324
        RuntimeBalances::try_from_iter(balances).expect_err("overflow set should fail");
325
326
    assert_eq!(ValidityError::BalanceOverflow, err);
327
}
328
329
#[test]
330
fn checked_add_and_sub_works() {
331
    use crate::prelude::*;
332
    use alloc::vec;
333
    use rand::{
334
        rngs::StdRng,
335
        Rng,
336
        SeedableRng,
337
    };
338
339
    let rng = &mut StdRng::seed_from_u64(2322u64);
340
341
    let mut memory = vec![0u8; MEM_SIZE].into();
342
343
    let asset: AssetId = rng.gen();
344
345
    let balances = vec![(asset, 0)];
346
    let mut balances =
347
        RuntimeBalances::try_from_iter(balances).expect("failed to create set");
348
349
    // Sanity check
350
    let bal = balances.balance(&asset).expect("failed to fetch balance");
351
    assert_eq!(bal, 0);
352
353
    // Add zero balance not in the set should result in zero and not mutate the set
354
    let asset_b: AssetId = rng.gen();
355
    assert_ne!(asset, asset_b);
356
357
    let val = balances
358
        .checked_balance_add(&mut memory, &asset_b, 0)
359
        .expect("failed to add balance");
360
361
    assert_eq!(val, 0);
362
    assert!(balances.balance(&asset_b).is_none());
363
364
    // Normal add balance works
365
    let val = balances
366
        .checked_balance_add(&mut memory, &asset, 150)
367
        .expect("failed to add balance");
368
    let bal = balances.balance(&asset).expect("failed to fetch balance");
369
370
    assert_eq!(val, 150);
371
    assert_eq!(bal, 150);
372
373
    let val = balances
374
        .checked_balance_add(&mut memory, &asset, 75)
375
        .expect("failed to add balance");
376
    let bal = balances.balance(&asset).expect("failed to fetch balance");
377
378
    assert_eq!(val, 225);
379
    assert_eq!(bal, 225);
380
381
    // Normal sub balance works
382
    let val = balances
383
        .checked_balance_sub(&mut memory, &asset, 30)
384
        .expect("failed to sub balance");
385
    let bal = balances.balance(&asset).expect("failed to fetch balance");
386
387
    assert_eq!(val, 195);
388
    assert_eq!(bal, 195);
389
390
    let val = balances
391
        .checked_balance_sub(&mut memory, &asset, 120)
392
        .expect("failed to sub balance");
393
    let bal = balances.balance(&asset).expect("failed to fetch balance");
394
395
    assert_eq!(val, 75);
396
    assert_eq!(bal, 75);
397
398
    let val = balances
399
        .checked_balance_sub(&mut memory, &asset, 70)
400
        .expect("failed to sub balance");
401
    let bal = balances.balance(&asset).expect("failed to fetch balance");
402
403
    assert_eq!(val, 5);
404
    assert_eq!(bal, 5);
405
406
    // Balance won't panic underflow
407
    assert!(balances
408
        .checked_balance_sub(&mut memory, &asset, 10)
409
        .is_none());
410
411
    // Balance won't panic overflow
412
    let val = balances
413
        .checked_balance_add(&mut memory, &asset, u64::MAX - 5)
414
        .expect("failed to add balance");
415
    let bal = balances.balance(&asset).expect("failed to fetch balance");
416
417
    assert_eq!(val, u64::MAX);
418
    assert_eq!(bal, u64::MAX);
419
420
    assert!(balances
421
        .checked_balance_add(&mut memory, &asset, 1)
422
        .is_none());
423
}
/home/marten/fuel/fuel-vm/fuel-vm/src/call.rs
Line
Count
Source
1
//! Inter-contract call supporting structures
2
3
use fuel_asm::{
4
    PanicReason,
5
    RegId,
6
};
7
use fuel_types::{
8
    bytes::padded_len_usize,
9
    canonical::{
10
        Deserialize,
11
        Serialize,
12
    },
13
    AssetId,
14
    ContractId,
15
    Word,
16
};
17
18
use crate::consts::{
19
    WORD_SIZE,
20
    *,
21
};
22
23
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
24
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
25
24.7k
#[derive(Deserialize, Serialize)]
_RINvXNvNtCsg6P9hFxt0iW_7fuel_vm4call1__NtB5_4CallNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEB7_
Line
Count
Source
25
12.3k
#[derive(Deserialize, Serialize)]
_RINvXNvNtCsg6P9hFxt0iW_7fuel_vm4call1__NtB5_4CallNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEB7_
Line
Count
Source
25
12.3k
#[derive(Deserialize, Serialize)]
_RINvXNvNtCsg6P9hFxt0iW_7fuel_vm4calls_1__NtB5_4CallNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
25
2.19k
#[derive(Deserialize, Serialize)]
_RINvXNvNtCsg6P9hFxt0iW_7fuel_vm4calls_1__NtB5_4CallNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
25
2.19k
#[derive(Deserialize, Serialize)]
_RNvXNvNtCsg6P9hFxt0iW_7fuel_vm4calls_1__NtB4_4CallNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_static
Line
Count
Source
25
2.19k
#[derive(Deserialize, Serialize)]
_RNvXNvNtCsg6P9hFxt0iW_7fuel_vm4calls_1__NtB4_4CallNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamic
Line
Count
Source
25
2.19k
#[derive(Deserialize, Serialize)]
Unexecuted instantiation: _RINvXNvNtCsg6P9hFxt0iW_7fuel_vm4calls_1__NtB5_4CallNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvXNvNtCsg6P9hFxt0iW_7fuel_vm4calls_1__NtB5_4CallNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
26
/// Call structure representation, composed of a called contract `to` and two
27
/// word arguments.
28
///
29
/// <https://github.com/FuelLabs/fuel-specs/blob/master/src/fuel-vm/instruction-set.md#call-call-contract>
30
pub struct Call {
31
    to: ContractId,
32
    a: Word,
33
    b: Word,
34
}
35
36
impl Call {
37
    /// The size of the call structures in memory representation.
38
    pub const LEN: usize = ContractId::LEN + 8 + 8;
39
40
    /// Create a new call structure representation.
41
2.19k
    pub const fn new(to: ContractId, a: Word, b: Word) -> Self {
42
2.19k
        Self { to, a, b }
43
2.19k
    }
_RNvMNtCsg6P9hFxt0iW_7fuel_vm4callNtB2_4Call3newCs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
41
2.19k
    pub const fn new(to: ContractId, a: Word, b: Word) -> Self {
42
2.19k
        Self { to, a, b }
43
2.19k
    }
Unexecuted instantiation: _RNvMNtCsg6P9hFxt0iW_7fuel_vm4callNtB2_4Call3newB4_
44
45
    /// Called contract.
46
74.2k
    pub const fn to(&self) -> &ContractId {
47
74.2k
        &self.to
48
74.2k
    }
49
50
    /// `a` argument.
51
24.7k
    pub const fn a(&self) -> Word {
52
24.7k
        self.a
53
24.7k
    }
54
55
    /// `b` argument.
56
24.7k
    pub const fn b(&self) -> Word {
57
24.7k
        self.b
58
24.7k
    }
59
60
    /// Expose the internal attributes of the call description.
61
0
    pub const fn into_inner(self) -> (ContractId, Word, Word) {
62
0
        (self.to, self.a, self.b)
63
0
    }
64
}
65
66
24.7k
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
Unexecuted instantiation: _RINvXNvNtCsg6P9hFxt0iW_7fuel_vm4calls0_1__NtB5_9CallFrameNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize13decode_staticRShEB7_
Unexecuted instantiation: _RINvXNvNtCsg6P9hFxt0iW_7fuel_vm4calls0_1__NtB5_9CallFrameNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEB7_
_RNvXNvNtCsg6P9hFxt0iW_7fuel_vm4calls1_1__NtB4_9CallFrameNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize11size_static
Line
Count
Source
66
12.3k
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
_RNvXNvNtCsg6P9hFxt0iW_7fuel_vm4calls1_1__NtB4_9CallFrameNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize12size_dynamic
Line
Count
Source
66
12.3k
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
_RINvXNvNtCsg6P9hFxt0iW_7fuel_vm4calls1_1__NtB5_9CallFrameNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Line
Count
Source
66
12.3k
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
_RINvXNvNtCsg6P9hFxt0iW_7fuel_vm4calls1_1__NtB5_9CallFrameNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Line
Count
Source
66
12.3k
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
67
/// Call frame representation in the VM stack.
68
///
69
/// <https://github.com/FuelLabs/fuel-specs/blob/master/src/fuel-vm/index.md#call-frames>
70
pub struct CallFrame {
71
    to: ContractId,
72
    asset_id: AssetId,
73
    registers: [Word; VM_REGISTER_COUNT],
74
    code_size_padded: usize,
75
    a: Word,
76
    b: Word,
77
}
78
79
#[cfg(test)]
80
impl Default for CallFrame {
81
    fn default() -> Self {
82
        Self {
83
            to: ContractId::default(),
84
            asset_id: AssetId::default(),
85
            registers: [0; VM_REGISTER_COUNT],
86
            code_size_padded: 0,
87
            a: 0,
88
            b: 0,
89
        }
90
    }
91
}
92
93
impl CallFrame {
94
    /// Create a new call frame.
95
12.3k
    pub fn new(
96
12.3k
        to: ContractId,
97
12.3k
        asset_id: AssetId,
98
12.3k
        registers: [Word; VM_REGISTER_COUNT],
99
12.3k
        code_size: usize,
100
12.3k
        a: Word,
101
12.3k
        b: Word,
102
12.3k
    ) -> Option<Self> {
103
12.3k
        Some(Self {
104
12.3k
            to,
105
12.3k
            asset_id,
106
12.3k
            registers,
107
12.3k
            code_size_padded: padded_len_usize(code_size)?,
108
12.3k
            a,
109
12.3k
            b,
110
        })
111
12.3k
    }
112
113
    /// Start of the contract id offset from the beginning of the call frame.
114
40.9k
    pub const fn contract_id_offset() -> usize {
115
40.9k
        0
116
40.9k
    }
117
118
    /// Start of the asset id offset from the beginning of the call frame.
119
40.9k
    pub const fn asset_id_offset() -> usize {
120
40.9k
        Self::contract_id_offset().saturating_add(ContractId::LEN)
121
40.9k
    }
122
123
    /// Start of the registers offset from the beginning of the call frame.
124
40.9k
    pub const fn registers_offset() -> usize {
125
40.9k
        Self::asset_id_offset().saturating_add(AssetId::LEN)
126
40.9k
    }
127
128
    /// Start of the code size offset from the beginning of the call frame.
129
40.9k
    pub const fn code_size_offset() -> usize {
130
40.9k
        Self::registers_offset().saturating_add(WORD_SIZE * VM_REGISTER_COUNT)
131
40.9k
    }
132
133
    /// Start of the `a` argument offset from the beginning of the call frame.
134
39.3k
    pub const fn a_offset() -> usize {
135
39.3k
        Self::code_size_offset().saturating_add(WORD_SIZE)
136
39.3k
    }
137
138
    /// Start of the `b` argument offset from the beginning of the call frame.
139
39.3k
    pub const fn b_offset() -> usize {
140
39.3k
        Self::a_offset().saturating_add(WORD_SIZE)
141
39.3k
    }
142
143
    /// Size of the call frame in bytes.
144
37.1k
    pub const fn serialized_size() -> usize {
145
37.1k
        Self::b_offset().saturating_add(WORD_SIZE)
146
37.1k
    }
147
148
    /// Registers prior to the called execution.
149
15.9k
    pub const fn registers(&self) -> &[Word] {
150
15.9k
        &self.registers
151
15.9k
    }
152
153
    /// Called contract id.
154
106k
    pub const fn to(&self) -> &ContractId {
155
106k
        &self.to
156
106k
    }
157
158
    #[cfg(feature = "test-helpers")]
159
    /// Contract code length in bytes.
160
0
    pub fn code_size_padded(&self) -> usize {
161
0
        self.code_size_padded
162
0
    }
163
164
    /// `a` argument.
165
0
    pub const fn a(&self) -> Word {
166
0
        self.a
167
0
    }
168
169
    /// `b` argument.
170
0
    pub const fn b(&self) -> Word {
171
0
        self.b
172
0
    }
173
174
    /// Gas context prior to the called execution.
175
11.3k
    pub fn context_gas(&self) -> Word {
176
11.3k
        self.registers[RegId::CGAS]
177
11.3k
    }
178
179
    /// Asset ID of forwarded coins.
180
0
    pub const fn asset_id(&self) -> &AssetId {
181
0
        &self.asset_id
182
0
    }
183
184
    /// Returns the mutable value of the context gas for this call frame.
185
12.3k
    pub fn context_gas_mut(&mut self) -> &mut Word {
186
12.3k
        &mut self.registers[RegId::CGAS]
187
12.3k
    }
188
189
    /// Returns the mutable value of the global gas for this call frame.
190
12.3k
    pub fn global_gas_mut(&mut self) -> &mut Word {
191
12.3k
        &mut self.registers[RegId::GGAS]
192
12.3k
    }
193
}
194
195
impl TryFrom<&[u8]> for Call {
196
    type Error = PanicReason;
197
198
12.3k
    fn try_from(mut value: &[u8]) -> Result<Self, Self::Error> {
199
12.3k
        Self::decode(&mut value).map_err(|_| PanicReason::MalformedCallStructure)
200
12.3k
    }
201
}
202
203
#[cfg(test)]
204
impl From<Call> for alloc::vec::Vec<u8> {
205
    fn from(call: Call) -> Self {
206
        call.to_bytes()
207
    }
208
}
209
210
#[cfg(test)]
211
impl From<CallFrame> for alloc::vec::Vec<u8> {
212
    fn from(call: CallFrame) -> Self {
213
        call.to_bytes()
214
    }
215
}
/home/marten/fuel/fuel-vm/fuel-vm/src/error.rs
Line
Count
Source
1
//! Runtime interpreter error implementation
2
3
use fuel_asm::{
4
    PanicInstruction,
5
    PanicReason,
6
    RawInstruction,
7
    Word,
8
};
9
use fuel_tx::ValidityError;
10
11
use crate::checked_transaction::CheckError;
12
use alloc::{
13
    format,
14
    string::{
15
        String,
16
        ToString,
17
    },
18
};
19
use core::{
20
    convert::Infallible,
21
    fmt,
22
};
23
24
use crate::storage::predicate;
25
26
/// Interpreter runtime error variants.
27
0
#[derive(Debug, derive_more::Display)]
28
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
29
pub enum InterpreterError<StorageError> {
30
    /// The instructions execution resulted in a well-formed panic, caused by an
31
    /// explicit instruction.
32
    #[display(fmt = "Execution error: {_0:?}")]
33
    PanicInstruction(PanicInstruction),
34
    /// The VM execution resulted in a well-formed panic. This panic wasn't
35
    /// caused by an instruction contained in the transaction or a called
36
    /// contract.
37
    #[display(fmt = "Execution error: {_0:?}")]
38
    Panic(PanicReason),
39
    /// Failed while checking the transaction.
40
    #[display(fmt = "Failed to check the transaction: {_0:?}")]
41
    CheckError(CheckError),
42
    /// No transaction was initialized in the interpreter. It cannot provide
43
    /// state transitions.
44
    #[display(fmt = "Execution error")]
45
    NoTransactionInitialized,
46
    #[display(fmt = "Execution error")]
47
    /// The debug state is not initialized; debug routines can't be called.
48
    DebugStateNotInitialized,
49
    /// Storage I/O error
50
    #[display(fmt = "Storage error: {}", _0)]
51
    Storage(StorageError),
52
    /// Encountered a bug
53
    #[display(fmt = "Bug: {_0}")]
54
    Bug(Bug),
55
    /// The `Ready` transaction provided to `Interpreter` doesn't have expected gas price
56
    #[display(
57
        fmt = "The transaction's gas price is wrong: expected {expected}, got {actual}"
58
    )]
59
    ReadyTransactionWrongGasPrice {
60
        /// Expected gas price
61
        expected: Word,
62
        /// Actual gas price
63
        actual: Word,
64
    },
65
}
66
67
impl<StorageError> InterpreterError<StorageError> {
68
    /// Describe the error as recoverable or halt.
69
2.12k
    pub fn from_runtime(
70
2.12k
        error: RuntimeError<StorageError>,
71
2.12k
        instruction: RawInstruction,
72
2.12k
    ) -> Self {
73
2.12k
        match error {
74
2.12k
            RuntimeError::Recoverable(reason) => {
75
2.12k
                Self::PanicInstruction(PanicInstruction::error(reason, instruction))
76
            }
77
0
            _ => Self::from(error),
78
        }
79
2.12k
    }
_RNvMNtCsg6P9hFxt0iW_7fuel_vm5errorINtB2_16InterpreterErrorNtNtCsd3UI3IJrzMw_4core7convert10InfallibleE12from_runtimeB4_
Line
Count
Source
69
2.12k
    pub fn from_runtime(
70
2.12k
        error: RuntimeError<StorageError>,
71
2.12k
        instruction: RawInstruction,
72
2.12k
    ) -> Self {
73
2.12k
        match error {
74
2.12k
            RuntimeError::Recoverable(reason) => {
75
2.12k
                Self::PanicInstruction(PanicInstruction::error(reason, instruction))
76
            }
77
0
            _ => Self::from(error),
78
        }
79
2.12k
    }
Unexecuted instantiation: _RNvMNtCsg6P9hFxt0iW_7fuel_vm5errorINtB2_16InterpreterErrorNtNtNtB4_7storage9predicate21PredicateStorageErrorE12from_runtimeB4_
80
81
    /// Return the specified panic reason that caused this error, if applicable.
82
0
    pub const fn panic_reason(&self) -> Option<PanicReason> {
83
0
        match self {
84
0
            Self::PanicInstruction(result) => Some(*result.reason()),
85
0
            Self::Panic(reason) => Some(*reason),
86
0
            _ => None,
87
        }
88
0
    }
89
90
    /// Return the instruction that caused this error, if applicable.
91
0
    pub const fn instruction(&self) -> Option<&RawInstruction> {
92
0
        match self {
93
0
            Self::PanicInstruction(result) => Some(result.instruction()),
94
0
            _ => None,
95
        }
96
0
    }
97
98
    /// Return the underlying `InstructionResult` if this instance is
99
    /// `PanicInstruction`; returns `None` otherwise.
100
2.15k
    pub fn instruction_result(&self) -> Option<PanicInstruction> {
101
2.15k
        match self {
102
2.15k
            Self::PanicInstruction(r) => Some(*r),
103
0
            _ => None,
104
        }
105
2.15k
    }
106
}
107
108
impl<StorageError> InterpreterError<StorageError>
109
where
110
    StorageError: fmt::Debug,
111
{
112
    /// Make non-generic by converting the storage error to a string.
113
0
    pub fn erase_generics(&self) -> InterpreterError<String> {
114
0
        match self {
115
0
            Self::Storage(e) => InterpreterError::Storage(format!("{e:?}")),
116
0
            Self::PanicInstruction(e) => InterpreterError::PanicInstruction(*e),
117
0
            Self::Panic(e) => InterpreterError::Panic(*e),
118
0
            Self::NoTransactionInitialized => InterpreterError::NoTransactionInitialized,
119
0
            Self::DebugStateNotInitialized => InterpreterError::DebugStateNotInitialized,
120
0
            Self::Bug(e) => InterpreterError::Bug(e.clone()),
121
0
            Self::CheckError(e) => InterpreterError::CheckError(e.clone()),
122
0
            InterpreterError::ReadyTransactionWrongGasPrice { expected, actual } => {
123
0
                InterpreterError::ReadyTransactionWrongGasPrice {
124
0
                    expected: *expected,
125
0
                    actual: *actual,
126
0
                }
127
            }
128
        }
129
0
    }
130
}
131
132
impl<StorageError> From<RuntimeError<StorageError>> for InterpreterError<StorageError> {
133
0
    fn from(error: RuntimeError<StorageError>) -> Self {
134
0
        match error {
135
0
            RuntimeError::Recoverable(e) => Self::Panic(e),
136
0
            RuntimeError::Bug(e) => Self::Bug(e),
137
0
            RuntimeError::Storage(e) => Self::Storage(e),
138
        }
139
0
    }
Unexecuted instantiation: _RNvXs0_NtCsg6P9hFxt0iW_7fuel_vm5errorINtB5_16InterpreterErrorNtNtCsd3UI3IJrzMw_4core7convert10InfallibleEINtBZ_4FromINtB5_12RuntimeErrorBX_EE4fromB7_
Unexecuted instantiation: _RNvXs0_NtCsg6P9hFxt0iW_7fuel_vm5errorINtB5_16InterpreterErrorNtNtNtB7_7storage9predicate21PredicateStorageErrorEINtNtCsd3UI3IJrzMw_4core7convert4FromINtB5_12RuntimeErrorBX_EE4fromB7_
140
}
141
142
impl<StorageError> PartialEq for InterpreterError<StorageError>
143
where
144
    StorageError: PartialEq,
145
{
146
0
    fn eq(&self, other: &Self) -> bool {
147
0
        match (self, other) {
148
0
            (Self::PanicInstruction(s), Self::PanicInstruction(o)) => s == o,
149
0
            (Self::Panic(s), Self::Panic(o)) => s == o,
150
0
            (Self::NoTransactionInitialized, Self::NoTransactionInitialized) => true,
151
0
            (Self::Storage(a), Self::Storage(b)) => a == b,
152
0
            (Self::DebugStateNotInitialized, Self::DebugStateNotInitialized) => true,
153
154
0
            _ => false,
155
        }
156
0
    }
157
}
158
159
impl<StorageError> From<Bug> for InterpreterError<StorageError> {
160
0
    fn from(bug: Bug) -> Self {
161
0
        Self::Bug(bug)
162
0
    }
163
}
164
165
impl<StorageError> From<Infallible> for InterpreterError<StorageError> {
166
0
    fn from(_: Infallible) -> Self {
167
0
        unreachable!()
168
    }
169
}
170
171
impl<StorageError> From<ValidityError> for InterpreterError<StorageError> {
172
0
    fn from(err: ValidityError) -> Self {
173
0
        Self::CheckError(CheckError::Validity(err))
174
0
    }
Unexecuted instantiation: _RNvXs4_NtCsg6P9hFxt0iW_7fuel_vm5errorINtB5_16InterpreterErrorNtNtCsd3UI3IJrzMw_4core7convert10InfallibleEINtBZ_4FromNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5error13ValidityErrorE4fromB7_
Unexecuted instantiation: _RNvXs4_NtCsg6P9hFxt0iW_7fuel_vm5errorINtB5_16InterpreterErrorNtNtNtB7_7storage9predicate21PredicateStorageErrorEINtNtCsd3UI3IJrzMw_4core7convert4FromNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8validity5error13ValidityErrorE4fromB7_
175
}
176
177
/// Runtime error description that should either be specified in the protocol or
178
/// halt the execution.
179
#[derive(Debug)]
180
#[must_use]
181
pub enum RuntimeError<StorageError> {
182
    /// Specified error with well-formed fallback strategy, i.e. vm panics.
183
    Recoverable(PanicReason),
184
    /// Invalid interpreter state reached unexpectedly, this is a bug
185
    Bug(Bug),
186
    /// Storage io error
187
    Storage(StorageError),
188
}
189
190
impl<StorageError> RuntimeError<StorageError> {
191
    /// Flag whether the error is recoverable.
192
0
    pub const fn is_recoverable(&self) -> bool {
193
0
        matches!(self, Self::Recoverable(_))
194
0
    }
195
196
    /// Flag whether the error must halt the execution.
197
0
    pub const fn must_halt(&self) -> bool {
198
0
        !self.is_recoverable()
199
0
    }
200
}
201
202
impl<StorageError: PartialEq> PartialEq for RuntimeError<StorageError> {
203
0
    fn eq(&self, other: &Self) -> bool {
204
0
        match (self, other) {
205
0
            (RuntimeError::Recoverable(a), RuntimeError::Recoverable(b)) => a == b,
206
0
            (RuntimeError::Bug(a), RuntimeError::Bug(b)) => a == b,
207
0
            (RuntimeError::Storage(a), RuntimeError::Storage(b)) => a == b,
208
0
            _ => false,
209
        }
210
0
    }
211
}
212
213
impl<StorageError: core::fmt::Debug> fmt::Display for RuntimeError<StorageError> {
214
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
215
0
        match self {
216
0
            Self::Recoverable(reason) => write!(f, "Recoverable error: {}", reason),
217
0
            Self::Bug(err) => write!(f, "Bug: {}", err),
218
0
            Self::Storage(err) => write!(f, "Unrecoverable storage error: {:?}", err),
219
        }
220
0
    }
221
}
222
223
impl<StorageError> From<PanicReason> for RuntimeError<StorageError> {
224
770
    fn from(value: PanicReason) -> Self {
225
770
        Self::Recoverable(value)
226
770
    }
_RNvXs8_NtCsg6P9hFxt0iW_7fuel_vm5errorINtB5_12RuntimeErrorNtNtCsd3UI3IJrzMw_4core7convert10InfallibleEINtBV_4FromNtNtCs6P3fQNJKMy0_8fuel_asm12panic_reason11PanicReasonE4fromB7_
Line
Count
Source
224
770
    fn from(value: PanicReason) -> Self {
225
770
        Self::Recoverable(value)
226
770
    }
Unexecuted instantiation: _RNvXs8_NtCsg6P9hFxt0iW_7fuel_vm5errorINtB5_12RuntimeErrorNtNtNtB7_7storage9predicate21PredicateStorageErrorEINtNtCsd3UI3IJrzMw_4core7convert4FromNtNtCs6P3fQNJKMy0_8fuel_asm12panic_reason11PanicReasonE4fromB7_
227
}
228
229
impl<StorageError> From<core::array::TryFromSliceError> for RuntimeError<StorageError> {
230
0
    fn from(value: core::array::TryFromSliceError) -> Self {
231
0
        Self::Recoverable(value.into())
232
0
    }
233
}
234
235
impl<StorageError> From<Bug> for RuntimeError<StorageError> {
236
0
    fn from(bug: Bug) -> Self {
237
0
        Self::Bug(bug)
238
0
    }
Unexecuted instantiation: _RNvXsa_NtCsg6P9hFxt0iW_7fuel_vm5errorINtB5_12RuntimeErrorNtNtNtB7_7storage9predicate21PredicateStorageErrorEINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_3BugE4fromB7_
Unexecuted instantiation: _RNvXsa_NtCsg6P9hFxt0iW_7fuel_vm5errorINtB5_12RuntimeErrorNtNtCsd3UI3IJrzMw_4core7convert10InfallibleEINtBV_4FromNtB5_3BugE4fromB7_
239
}
240
241
impl<StorageError> From<Infallible> for RuntimeError<StorageError> {
242
0
    fn from(_: Infallible) -> Self {
243
0
        unreachable!()
244
    }
245
}
246
247
/// Predicates checking failed
248
0
#[derive(Debug, Clone, PartialEq, derive_more::Display)]
249
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
250
pub enum PredicateVerificationFailed {
251
    /// The predicate did not use the amount of gas provided
252
    #[display(fmt = "Predicate used less than the required amount of gas")]
253
    GasMismatch,
254
    /// The transaction doesn't contain enough gas to evaluate the predicate
255
    #[display(fmt = "Insufficient gas available for single predicate")]
256
    OutOfGas,
257
    /// The predicate owner does not correspond to the predicate code
258
    #[display(fmt = "Predicate owner invalid, doesn't match code root")]
259
    InvalidOwner,
260
    /// The predicate wasn't successfully evaluated to true
261
    #[display(fmt = "Predicate failed to evaluate")]
262
    False,
263
    /// The predicate gas used was not specified before execution
264
    #[display(fmt = "Predicate failed to evaluate")]
265
    GasNotSpecified,
266
    /// The transaction's `max_gas` is greater than the global gas limit.
267
    #[display(fmt = "Transaction exceeds total gas allowance {_0:?}")]
268
    TransactionExceedsTotalGasAllowance(Word),
269
    /// The cumulative gas overflowed the u64 accumulator
270
    #[display(fmt = "Cumulative gas computation overflowed the u64 accumulator")]
271
    GasOverflow,
272
    /// Invalid interpreter state reached unexpectedly, this is a bug
273
    #[display(fmt = "Invalid interpreter state reached unexpectedly")]
274
    Bug(Bug),
275
    /// The VM execution resulted in a well-formed panic, caused by an instruction.
276
    #[display(fmt = "Execution error: {_0:?}")]
277
    PanicInstruction(PanicInstruction),
278
    /// The VM execution resulted in a well-formed panic not caused by an instruction.
279
    #[display(fmt = "Execution error: {_0:?}")]
280
    Panic(PanicReason),
281
    /// Predicate verification failed since it attempted to access storage
282
    #[display(
283
        fmt = "Predicate verification failed since it attempted to access storage"
284
    )]
285
    Storage,
286
}
287
288
impl From<InterpreterError<predicate::PredicateStorageError>>
289
    for PredicateVerificationFailed
290
{
291
0
    fn from(error: InterpreterError<predicate::PredicateStorageError>) -> Self {
292
0
        match error {
293
0
            error if error.panic_reason() == Some(PanicReason::OutOfGas) => {
294
0
                PredicateVerificationFailed::OutOfGas
295
            }
296
0
            InterpreterError::Panic(reason) => PredicateVerificationFailed::Panic(reason),
297
0
            InterpreterError::PanicInstruction(result) => {
298
0
                PredicateVerificationFailed::PanicInstruction(result)
299
            }
300
0
            InterpreterError::Bug(bug) => PredicateVerificationFailed::Bug(bug),
301
0
            InterpreterError::Storage(_) => PredicateVerificationFailed::Storage,
302
0
            _ => PredicateVerificationFailed::False,
303
        }
304
0
    }
305
}
306
307
impl From<Bug> for PredicateVerificationFailed {
308
0
    fn from(bug: Bug) -> Self {
309
0
        Self::Bug(bug)
310
0
    }
311
}
312
313
impl From<PanicReason> for PredicateVerificationFailed {
314
0
    fn from(reason: PanicReason) -> Self {
315
0
        Self::Panic(reason)
316
0
    }
317
}
318
319
impl From<PanicOrBug> for PredicateVerificationFailed {
320
0
    fn from(err: PanicOrBug) -> Self {
321
0
        match err {
322
0
            PanicOrBug::Panic(reason) => Self::from(reason),
323
0
            PanicOrBug::Bug(bug) => Self::Bug(bug),
324
        }
325
0
    }
326
}
327
328
/// Traceable bug variants
329
0
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, strum::EnumMessage)]
Unexecuted instantiation: _RNvXsD_NtCsg6P9hFxt0iW_7fuel_vm5errorNtB5_10BugVariantNtCs7SJq3lwJE1q_5strum11EnumMessage11get_messageB7_
Unexecuted instantiation: _RNvXsD_NtCsg6P9hFxt0iW_7fuel_vm5errorNtB5_10BugVariantNtCs7SJq3lwJE1q_5strum11EnumMessage20get_detailed_messageB7_
Unexecuted instantiation: _RNvXsD_NtCsg6P9hFxt0iW_7fuel_vm5errorNtB5_10BugVariantNtCs7SJq3lwJE1q_5strum11EnumMessage17get_documentationB7_
330
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
331
pub enum BugVariant {
332
    /// Context gas increase has overflow
333
    #[strum(
334
        message = "The context gas cannot overflow since it was created by a valid transaction and the total gas does not increase - hence, it always fits a word."
335
    )]
336
    ContextGasOverflow,
337
338
    /// Context gas increase has underflow
339
    #[strum(
340
        message = "The context gas cannot underflow since any script should halt upon gas exhaustion."
341
    )]
342
    ContextGasUnderflow,
343
344
    /// Global gas subtraction has underflow
345
    #[strum(
346
        message = "The gas consumption cannot exceed the gas context since it is capped by the transaction gas limit."
347
    )]
348
    GlobalGasUnderflow,
349
350
    /// The global gas is less than the context gas.
351
    #[strum(message = "The global gas cannot ever be less than the context gas. ")]
352
    GlobalGasLessThanContext,
353
354
    /// The stack point has overflow
355
    #[strum(message = "The stack pointer cannot overflow under checked operations.")]
356
    StackPointerOverflow,
357
358
    /// Code size of a contract doesn't fit into a Word. This is prevented by tx size
359
    /// limit.
360
    #[strum(message = "Contract size doesn't fit into a word.")]
361
    CodeSizeOverflow,
362
363
    /// Refund cannot be computed in the current vm state.
364
    #[strum(message = "Refund cannot be computed in the current vm state.")]
365
    UncomputableRefund,
366
367
    /// Receipts context is full, but there's an attempt to add more receipts.
368
    #[strum(message = "Receipts context is full, cannot add new receipts.")]
369
    ReceiptsCtxFull,
370
371
    /// Witness index is out of bounds.
372
    #[strum(message = "Witness index is out of bounds.")]
373
    WitnessIndexOutOfBounds,
374
375
    /// The witness subsection index is higher than the total number of parts.
376
    #[strum(
377
        message = "The witness subsection index is higher than the total number of parts."
378
    )]
379
    NextSubsectionIndexIsHigherThanTotalNumberOfParts,
380
}
381
382
impl fmt::Display for BugVariant {
383
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
384
        use strum::EnumMessage;
385
0
        if let Some(msg) = self.get_message() {
386
0
            write!(f, "{}", msg)
387
        } else {
388
0
            write!(f, "{:?}", self)
389
        }
390
0
    }
391
}
392
393
/// VM encountered unexpected state. This is a bug.
394
/// The execution must terminate since the VM is in an invalid state.
395
///
396
/// The bug it self is identified by the caller location.
397
#[derive(Debug, Clone)]
398
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
399
#[must_use]
400
pub struct Bug {
401
    /// Source code location of the bug, in `path/to/file.rs:line:column` notation
402
    location: String,
403
404
    /// Type of bug
405
    variant: BugVariant,
406
407
    /// Additional error message for the bug, if it's caused by a runtime error
408
    inner_message: Option<String>,
409
410
    /// Optionally include a backtrace for the instruction triggering this bug.
411
    /// This is only available when the `backtrace` feature is enabled.
412
    #[cfg(feature = "backtrace")]
413
    bt: backtrace::Backtrace,
414
}
415
416
impl Bug {
417
    /// Construct a new bug with the specified variant, using caller location for
418
    /// idenitfying the bug.
419
    #[track_caller]
420
0
    pub fn new(variant: BugVariant) -> Self {
421
0
        let caller = core::panic::Location::caller();
422
0
        let location = format!("{}:{}:{}", caller.file(), caller.line(), caller.column());
423
0
        Self {
424
0
            location,
425
0
            variant,
426
0
            inner_message: None,
427
0
            #[cfg(feature = "backtrace")]
428
0
            bt: backtrace::Backtrace::new(),
429
0
        }
430
0
    }
431
432
    /// Set an additional error message.
433
0
    pub fn with_message<E: ToString>(mut self, error: E) -> Self {
434
0
        self.inner_message = Some(error.to_string());
435
0
        self
436
0
    }
437
}
438
439
impl PartialEq for Bug {
440
0
    fn eq(&self, other: &Self) -> bool {
441
0
        self.location == other.location
442
0
    }
443
}
444
445
#[cfg(feature = "backtrace")]
446
mod bt {
447
    use super::*;
448
    use backtrace::Backtrace;
449
450
    impl Bug {
451
        /// Backtrace data
452
        pub const fn bt(&self) -> &Backtrace {
453
            &self.bt
454
        }
455
    }
456
}
457
458
impl fmt::Display for Bug {
459
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
460
        use percent_encoding::{
461
            utf8_percent_encode,
462
            NON_ALPHANUMERIC,
463
        };
464
465
0
        let issue_title = format!("Bug report: {:?} in {}", self.variant, self.location);
466
0
467
0
        let issue_body = format!(
468
0
            "Error: {:?} {}\nLocation: {}\nVersion: {} {}\n",
469
0
            self.variant,
470
0
            self.inner_message
471
0
                .as_ref()
472
0
                .map(|msg| format!("({msg})"))
473
0
                .unwrap_or_default(),
474
0
            self.location,
475
0
            env!("CARGO_PKG_NAME"),
476
0
            env!("CARGO_PKG_VERSION")
477
0
        );
478
0
479
0
        write!(
480
0
            f,
481
0
            concat!(
482
0
                "Encountered a bug! Please report this using the following link: ",
483
0
                "https://github.com/FuelLabs/fuel-vm/issues/new",
484
0
                "?title={}",
485
0
                "&body={}",
486
0
                "\n\n",
487
0
                "{:?} error in {}: {} {}\n",
488
0
            ),
489
0
            utf8_percent_encode(&issue_title, NON_ALPHANUMERIC),
490
0
            utf8_percent_encode(&issue_body, NON_ALPHANUMERIC),
491
0
            self.variant,
492
0
            self.location,
493
0
            self.variant,
494
0
            self.inner_message
495
0
                .as_ref()
496
0
                .map(|msg| format!("({msg})"))
497
0
                .unwrap_or_default(),
498
0
        )?;
499
500
        #[cfg(feature = "backtrace")]
501
        {
502
            write!(f, "\nBacktrace:\n{:?}\n", self.bt)?;
503
        }
504
505
0
        Ok(())
506
0
    }
507
}
508
509
/// Runtime error description that should either be specified in the protocol or
510
/// halt the execution.
511
#[derive(Debug, Clone, PartialEq)]
512
#[must_use]
513
pub enum PanicOrBug {
514
    /// VM panic
515
    Panic(PanicReason),
516
    /// Invalid interpreter state reached unexpectedly, this is a bug
517
    Bug(Bug),
518
}
519
520
impl From<PanicReason> for PanicOrBug {
521
1.35k
    fn from(panic: PanicReason) -> Self {
522
1.35k
        Self::Panic(panic)
523
1.35k
    }
524
}
525
526
impl From<Bug> for PanicOrBug {
527
0
    fn from(bug: Bug) -> Self {
528
0
        Self::Bug(bug)
529
0
    }
530
}
531
532
impl<StorageError> From<PanicOrBug> for RuntimeError<StorageError> {
533
1.35k
    fn from(value: PanicOrBug) -> Self {
534
1.35k
        match value {
535
1.35k
            PanicOrBug::Panic(reason) => Self::Recoverable(reason),
536
0
            PanicOrBug::Bug(bug) => Self::Bug(bug),
537
        }
538
1.35k
    }
_RNvXsm_NtCsg6P9hFxt0iW_7fuel_vm5errorINtB5_12RuntimeErrorNtNtCsd3UI3IJrzMw_4core7convert10InfallibleEINtBV_4FromNtB5_10PanicOrBugE4fromB7_
Line
Count
Source
533
1.35k
    fn from(value: PanicOrBug) -> Self {
534
1.35k
        match value {
535
1.35k
            PanicOrBug::Panic(reason) => Self::Recoverable(reason),
536
0
            PanicOrBug::Bug(bug) => Self::Bug(bug),
537
        }
538
1.35k
    }
Unexecuted instantiation: _RNvXsm_NtCsg6P9hFxt0iW_7fuel_vm5errorINtB5_12RuntimeErrorNtNtNtB7_7storage9predicate21PredicateStorageErrorEINtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_10PanicOrBugE4fromB7_
539
}
540
541
impl<StorageError> From<PanicOrBug> for InterpreterError<StorageError> {
542
0
    fn from(value: PanicOrBug) -> Self {
543
0
        match value {
544
0
            PanicOrBug::Panic(reason) => Self::Panic(reason),
545
0
            PanicOrBug::Bug(bug) => Self::Bug(bug),
546
        }
547
0
    }
548
}
549
550
/// Result of a operation that doesn't access storage
551
pub type SimpleResult<T> = Result<T, PanicOrBug>;
552
553
/// Result of a operation that accesses storage
554
pub type IoResult<T, S> = Result<T, RuntimeError<S>>;
555
556
#[cfg(test)]
557
mod tests {
558
    use super::*;
559
560
    #[test]
561
    fn bug_report_message() {
562
        let bug = Bug::new(BugVariant::ContextGasOverflow).with_message("Test message");
563
        let text = format!("{}", bug);
564
        assert!(text.contains(file!()));
565
        assert!(text.contains("https://github.com/FuelLabs/fuel-vm/issues/new"));
566
        assert!(text.contains("ContextGasOverflow"));
567
        assert!(text.contains("Test message"));
568
    }
569
}
/home/marten/fuel/fuel-vm/fuel-vm/src/context.rs
Line
Count
Source
1
//! VM runtime context definitions
2
3
use crate::predicate::RuntimePredicate;
4
5
use fuel_asm::Word;
6
use fuel_types::BlockHeight;
7
8
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
9
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10
/// Runtime context description.
11
pub enum Context {
12
    /// Current context is a predicate estimation.
13
    PredicateEstimation {
14
        /// Predicate program to be executed
15
        program: RuntimePredicate,
16
    },
17
    /// Current context is a predicate verification.
18
    PredicateVerification {
19
        /// Predicate program to be executed
20
        program: RuntimePredicate,
21
    },
22
    /// Current context is a script execution.
23
    Script {
24
        /// Block height of the context
25
        block_height: BlockHeight,
26
    },
27
    /// Current context is under a `CALL` scope
28
    Call {
29
        /// Block height of the context
30
        block_height: BlockHeight,
31
    },
32
    /// No transaction initialized/invalid context.
33
    NotInitialized,
34
}
35
36
impl Default for Context {
37
4.38k
    fn default() -> Self {
38
4.38k
        Self::NotInitialized
39
4.38k
    }
40
}
41
42
impl Context {
43
    /// Check if the context is predicate
44
368k
    pub const fn is_predicate(&self) -> bool {
45
368k
        matches!(
46
368k
            self,
47
            Self::PredicateEstimation { .. } | Self::PredicateVerification { .. }
48
        )
49
368k
    }
50
51
    /// Return `true` if the context is external; `false` otherwise.
52
3.33M
    pub const fn is_external(&self) -> bool {
53
31.8k
        matches!(
54
3.33M
            self,
55
            Self::PredicateEstimation { .. }
56
                | Self::PredicateVerification { .. }
57
                | Self::Script { .. }
58
        )
59
3.33M
    }
60
61
    /// Return `true` if the context is internal; `false` otherwise.
62
3.33M
    pub const fn is_internal(&self) -> bool {
63
3.33M
        !self.is_external()
64
3.33M
    }
65
66
    /// Return the program to be executed, if its a predicate
67
1
    pub const fn predicate(&self) -> Option<&RuntimePredicate> {
68
1
        match self {
69
0
            Context::PredicateEstimation { program } => Some(program),
70
0
            Context::PredicateVerification { program } => Some(program),
71
1
            _ => None,
72
        }
73
1
    }
74
75
    /// Return the block height from the context, if either script or call
76
501k
    pub const fn block_height(&self) -> Option<BlockHeight> {
77
501k
        match self {
78
501k
            Context::Script { block_height } | Context::Call { block_height } => {
79
501k
                Some(*block_height)
80
            }
81
0
            _ => None,
82
        }
83
501k
    }
84
85
    /// Update the context according to the provided frame pointer
86
23.6k
    pub fn update_from_frame_pointer(&mut self, fp: Word) {
87
11.4k
        match self {
88
11.4k
            Context::Script { block_height } if fp != 0 => {
89
11.4k
                *self = Self::Call {
90
11.4k
                    block_height: *block_height,
91
11.4k
                }
92
            }
93
94
12.1k
            Context::Call { block_height } if fp == 0 => {
95
11.3k
                *self = Self::Script {
96
11.3k
                    block_height: *block_height,
97
11.3k
                }
98
            }
99
889
            _ => (),
100
        }
101
23.6k
    }
102
}
/home/marten/fuel/fuel-vm/fuel-vm/src/state.rs
Line
Count
Source
1
//! Runtime state representation for the VM
2
3
use alloc::vec::Vec;
4
5
use fuel_tx::Receipt;
6
use fuel_types::{
7
    Bytes32,
8
    Word,
9
};
10
11
mod debug;
12
13
mod debugger;
14
15
pub use debug::{
16
    Breakpoint,
17
    DebugEval,
18
};
19
20
pub use debugger::Debugger;
21
22
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
23
/// Resulting state of an instruction set execution.
24
pub enum ExecuteState {
25
    /// The VM should proceed normally with the execution.
26
    Proceed,
27
    /// The current context returned a [`Word`].
28
    Return(Word),
29
    /// The current context returned some data represented as its digest.
30
    ReturnData(Bytes32),
31
    /// The set execution resulted in a `RVRT` instruction.
32
    Revert(Word),
33
34
    /// A debug event was reached.
35
    DebugEvent(DebugEval),
36
}
37
38
impl ExecuteState {
39
    /// Return true if the VM execution should continue.
40
0
    pub const fn should_continue(&self) -> bool {
41
0
        matches!(self, Self::Proceed | Self::DebugEvent(DebugEval::Continue))
42
0
    }
43
}
44
45
impl Default for ExecuteState {
46
0
    fn default() -> Self {
47
0
        Self::Proceed
48
0
    }
49
}
50
51
impl From<DebugEval> for ExecuteState {
52
0
    fn from(d: DebugEval) -> Self {
53
0
        Self::DebugEvent(d)
54
0
    }
55
}
56
57
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
58
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
59
/// Resulting state of a transaction/program execution.
60
pub enum ProgramState {
61
    /// The transaction returned a [`Word`].
62
    Return(Word),
63
    /// The transaction returned some data represented as its digest.
64
    ReturnData(Bytes32),
65
    /// The transaction execution resulted in a `RVRT` instruction.
66
    Revert(Word),
67
68
    /// A debug event was reached for the transaction. The VM is suspended.
69
    RunProgram(DebugEval),
70
71
    /// A debug event was reached for a predicate verification. The VM is
72
    /// suspended.
73
    VerifyPredicate(DebugEval),
74
}
75
76
impl PartialEq<Breakpoint> for ProgramState {
77
0
    fn eq(&self, other: &Breakpoint) -> bool {
78
0
        match self.debug_ref() {
79
0
            Some(&DebugEval::Breakpoint(b)) => &b == other,
80
0
            _ => false,
81
        }
82
0
    }
83
}
84
85
impl ProgramState {
86
    /// Debug event representation.
87
    ///
88
    /// Will return `None` if no debug event was reached.
89
2.19k
    pub const fn debug_ref(&self) -> Option<&DebugEval> {
90
2.19k
        match self {
91
0
            Self::RunProgram(d) | Self::VerifyPredicate(d) => Some(d),
92
2.19k
            _ => None,
93
        }
94
2.19k
    }
95
96
    /// Return `true` if a debug event was reached.
97
2.19k
    pub const fn is_debug(&self) -> bool {
98
2.19k
        self.debug_ref().is_some()
99
2.19k
    }
100
}
101
102
#[derive(Debug, Clone, PartialEq, Eq)]
103
/// Representation of the result of a transaction execution.
104
pub struct StateTransition<Tx> {
105
    state: ProgramState,
106
    tx: Tx,
107
    receipts: Vec<Receipt>,
108
}
109
110
impl<Tx> StateTransition<Tx> {
111
    /// Create a new state transition representation.
112
4.38k
    pub const fn new(state: ProgramState, tx: Tx, receipts: Vec<Receipt>) -> Self {
113
4.38k
        Self {
114
4.38k
            state,
115
4.38k
            tx,
116
4.38k
            receipts,
117
4.38k
        }
118
4.38k
    }
Unexecuted instantiation: _RNvMs3_NtCsg6P9hFxt0iW_7fuel_vm5stateINtB5_15StateTransitionINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB11_4blob8BlobBodyNtB2x_12BlobMetadataEE3newB7_
_RNvMs3_NtCsg6P9hFxt0iW_7fuel_vm5stateINtB5_15StateTransitionINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB11_6create10CreateBodyNtB2x_14CreateMetadataEE3newB7_
Line
Count
Source
112
2.19k
    pub const fn new(state: ProgramState, tx: Tx, receipts: Vec<Receipt>) -> Self {
113
2.19k
        Self {
114
2.19k
            state,
115
2.19k
            tx,
116
2.19k
            receipts,
117
2.19k
        }
118
2.19k
    }
_RNvMs3_NtCsg6P9hFxt0iW_7fuel_vm5stateINtB5_15StateTransitionINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB11_6script10ScriptBodyNtB2x_14ScriptMetadataEE3newB7_
Line
Count
Source
112
2.19k
    pub const fn new(state: ProgramState, tx: Tx, receipts: Vec<Receipt>) -> Self {
113
2.19k
        Self {
114
2.19k
            state,
115
2.19k
            tx,
116
2.19k
            receipts,
117
2.19k
        }
118
2.19k
    }
119
120
    /// Program state representation.
121
0
    pub const fn state(&self) -> &ProgramState {
122
0
        &self.state
123
0
    }
124
125
    /// Resulting mutated transaction after VM execution.
126
2.19k
    pub const fn tx(&self) -> &Tx {
127
2.19k
        &self.tx
128
2.19k
    }
_RNvMs3_NtCsg6P9hFxt0iW_7fuel_vm5stateINtB5_15StateTransitionINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB11_6create10CreateBodyNtB2x_14CreateMetadataEE2txB7_
Line
Count
Source
126
2.19k
    pub const fn tx(&self) -> &Tx {
127
2.19k
        &self.tx
128
2.19k
    }
Unexecuted instantiation: _RNvMs3_NtCsg6P9hFxt0iW_7fuel_vm5stateINtB5_15StateTransitionINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB11_6script10ScriptBodyNtB2x_14ScriptMetadataEE2txB7_
129
130
    /// Flag whether the client should revert after execution.
131
2.19k
    pub fn should_revert(&self) -> bool {
132
2.19k
        self.receipts
133
2.19k
            .iter()
134
922k
            .any(|r| matches!(r, Receipt::Revert { .. } | Receipt::Panic { .. }))
_RNCNvMs3_NtCsg6P9hFxt0iW_7fuel_vm5stateINtB7_15StateTransitionINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB13_6script10ScriptBodyNtB2z_14ScriptMetadataEE13should_revert0Cs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
134
922k
            .any(|r| matches!(r, Receipt::Revert { .. } | Receipt::Panic { .. }))
Unexecuted instantiation: _RNCNvMs3_NtCsg6P9hFxt0iW_7fuel_vm5stateINtB7_15StateTransitionpE13should_revert0B9_
135
2.19k
    }
_RNvMs3_NtCsg6P9hFxt0iW_7fuel_vm5stateINtB5_15StateTransitionINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB11_6script10ScriptBodyNtB2x_14ScriptMetadataEE13should_revertCs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
131
2.19k
    pub fn should_revert(&self) -> bool {
132
2.19k
        self.receipts
133
2.19k
            .iter()
134
2.19k
            .any(|r| matches!(r, Receipt::Revert { .. } | Receipt::Panic { .. }))
135
2.19k
    }
Unexecuted instantiation: _RNvMs3_NtCsg6P9hFxt0iW_7fuel_vm5stateINtB5_15StateTransitionpE13should_revertB7_
136
137
    /// Transaction receipts representing the state transition.
138
2.19k
    pub fn receipts(&self) -> &[Receipt] {
139
2.19k
        self.receipts.as_slice()
140
2.19k
    }
_RNvMs3_NtCsg6P9hFxt0iW_7fuel_vm5stateINtB5_15StateTransitionINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB11_6script10ScriptBodyNtB2x_14ScriptMetadataEE8receiptsCs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
138
2.19k
    pub fn receipts(&self) -> &[Receipt] {
139
2.19k
        self.receipts.as_slice()
140
2.19k
    }
Unexecuted instantiation: _RNvMs3_NtCsg6P9hFxt0iW_7fuel_vm5stateINtB5_15StateTransitionINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB11_6script10ScriptBodyNtB2x_14ScriptMetadataEE8receiptsB7_
141
142
    /// Convert this instance into its internal attributes.
143
0
    pub fn into_inner(self) -> (ProgramState, Tx, Vec<Receipt>) {
144
0
        (self.state, self.tx, self.receipts)
145
0
    }
146
}
147
148
impl<Tx> From<StateTransition<Tx>> for ProgramState {
149
0
    fn from(t: StateTransition<Tx>) -> ProgramState {
150
0
        t.state
151
0
    }
152
}
153
154
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
155
/// Zero-copy Representation of the result of a transaction execution bound to
156
/// the lifetime of the VM.
157
pub struct StateTransitionRef<'a, Tx> {
158
    state: ProgramState,
159
    tx: &'a Tx,
160
    receipts: &'a [Receipt],
161
}
162
163
impl<'a, Tx> StateTransitionRef<'a, Tx> {
164
    /// Create a new by reference state transition representation.
165
4.38k
    pub const fn new(state: ProgramState, tx: &'a Tx, receipts: &'a [Receipt]) -> Self {
166
4.38k
        Self {
167
4.38k
            state,
168
4.38k
            tx,
169
4.38k
            receipts,
170
4.38k
        }
171
4.38k
    }
Unexecuted instantiation: _RNvMs5_NtCsg6P9hFxt0iW_7fuel_vm5stateINtB5_18StateTransitionRefINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB14_4blob8BlobBodyNtB2A_12BlobMetadataEE3newB7_
_RNvMs5_NtCsg6P9hFxt0iW_7fuel_vm5stateINtB5_18StateTransitionRefINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB14_6create10CreateBodyNtB2A_14CreateMetadataEE3newB7_
Line
Count
Source
165
2.19k
    pub const fn new(state: ProgramState, tx: &'a Tx, receipts: &'a [Receipt]) -> Self {
166
2.19k
        Self {
167
2.19k
            state,
168
2.19k
            tx,
169
2.19k
            receipts,
170
2.19k
        }
171
2.19k
    }
_RNvMs5_NtCsg6P9hFxt0iW_7fuel_vm5stateINtB5_18StateTransitionRefINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB14_6script10ScriptBodyNtB2A_14ScriptMetadataEE3newB7_
Line
Count
Source
165
2.19k
    pub const fn new(state: ProgramState, tx: &'a Tx, receipts: &'a [Receipt]) -> Self {
166
2.19k
        Self {
167
2.19k
            state,
168
2.19k
            tx,
169
2.19k
            receipts,
170
2.19k
        }
171
2.19k
    }
172
173
    /// Program state representation.
174
0
    pub const fn state(&self) -> &ProgramState {
175
0
        &self.state
176
0
    }
177
178
    /// Resulting mutated transaction after VM execution.
179
0
    pub const fn tx(&self) -> &Tx {
180
0
        self.tx
181
0
    }
182
183
    /// Transaction receipts representing the state transition.
184
0
    pub const fn receipts(&self) -> &[Receipt] {
185
0
        self.receipts
186
0
    }
187
188
    /// Flag whether the client should revert after execution.
189
0
    pub fn should_revert(&self) -> bool {
190
0
        self.receipts
191
0
            .iter()
192
0
            .any(|r| matches!(r, Receipt::Revert { .. } | Receipt::Panic { .. }))
193
0
    }
194
}
195
196
impl<'a, Tx> From<&'a StateTransition<Tx>> for StateTransitionRef<'a, Tx> {
197
0
    fn from(t: &'a StateTransition<Tx>) -> StateTransitionRef<'a, Tx> {
198
0
        Self {
199
0
            state: *t.state(),
200
0
            tx: t.tx(),
201
0
            receipts: t.receipts(),
202
0
        }
203
0
    }
204
}
205
206
impl<'a, Tx: Clone> From<StateTransitionRef<'a, Tx>> for StateTransition<Tx> {
207
0
    fn from(t: StateTransitionRef<Tx>) -> StateTransition<Tx> {
208
0
        StateTransition {
209
0
            state: *t.state(),
210
0
            tx: t.tx().clone(),
211
0
            receipts: t.receipts().to_vec(),
212
0
        }
213
0
    }
214
}
215
216
impl<'a, Tx: Clone> From<StateTransitionRef<'a, Tx>> for ProgramState {
217
4.38k
    fn from(t: StateTransitionRef<'a, Tx>) -> ProgramState {
218
4.38k
        t.state
219
4.38k
    }
Unexecuted instantiation: _RNvXs8_NtCsg6P9hFxt0iW_7fuel_vm5stateNtB5_12ProgramStateINtNtCsd3UI3IJrzMw_4core7convert4FromINtB5_18StateTransitionRefINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1Y_4blob8BlobBodyNtB3u_12BlobMetadataEEE4fromB7_
_RNvXs8_NtCsg6P9hFxt0iW_7fuel_vm5stateNtB5_12ProgramStateINtNtCsd3UI3IJrzMw_4core7convert4FromINtB5_18StateTransitionRefINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1Y_6create10CreateBodyNtB3u_14CreateMetadataEEE4fromB7_
Line
Count
Source
217
2.19k
    fn from(t: StateTransitionRef<'a, Tx>) -> ProgramState {
218
2.19k
        t.state
219
2.19k
    }
_RNvXs8_NtCsg6P9hFxt0iW_7fuel_vm5stateNtB5_12ProgramStateINtNtCsd3UI3IJrzMw_4core7convert4FromINtB5_18StateTransitionRefINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1Y_6script10ScriptBodyNtB3u_14ScriptMetadataEEE4fromB7_
Line
Count
Source
217
2.19k
    fn from(t: StateTransitionRef<'a, Tx>) -> ProgramState {
218
2.19k
        t.state
219
2.19k
    }
220
}
/home/marten/fuel/fuel-vm/fuel-vm/src/state/debug.rs
Line
Count
Source
1
use fuel_asm::Instruction;
2
use fuel_types::{
3
    ContractId,
4
    Word,
5
};
6
7
use crate::consts::VM_MAX_RAM;
8
9
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash)]
10
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11
/// Breakpoint description that binds a tuple `(contract, $pc)` to a debugger
12
/// implementation.
13
///
14
/// Breakpoints should be context-sensitive; hence, should target contract Ids.
15
///
16
/// For script/predicate verification, the contract id should be zero.
17
pub struct Breakpoint {
18
    contract: ContractId,
19
    pc: Word,
20
}
21
22
impl Breakpoint {
23
0
    pub(crate) const fn raw(contract: ContractId, pc: Word) -> Self {
24
0
        Self { contract, pc }
25
0
    }
26
27
    /// Create a new contract breakpoint
28
    ///
29
    /// The `$pc` is provided in op count and internally is multiplied by the op
30
    /// size. Also, the op count is always relative to `$is` so it should
31
    /// consider only the bytecode of the contract.
32
    ///
33
    /// Panics if the `pc` cannot ever fit into the VM memory.
34
0
    pub const fn new(contract: ContractId, pc: Word) -> Self {
35
0
        let pc = pc.saturating_mul(Instruction::SIZE as Word);
36
0
        assert!(pc <= VM_MAX_RAM, "Breakpoint cannot fit into vm memory");
37
0
        Self::raw(contract, pc)
38
0
    }
39
40
    /// Create a new script breakpoint
41
    ///
42
    /// The `$pc` is provided in op count and internally is multiplied by the op
43
    /// size
44
0
    pub fn script(pc: Word) -> Self {
45
0
        let contract = Default::default();
46
0
47
0
        Self::new(contract, pc)
48
0
    }
49
50
    /// Contract that will trigger the breakpoint.
51
0
    pub const fn contract(&self) -> &ContractId {
52
0
        &self.contract
53
0
    }
54
55
    /// Program counter that will trigger the breakpoint.
56
0
    pub const fn pc(&self) -> Word {
57
0
        self.pc
58
0
    }
59
}
60
61
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
62
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
63
/// State evaluation of the interpreter that will describe if a program should
64
/// break or continue.
65
pub enum DebugEval {
66
    /// This evaluation should break the program in the location described in
67
    /// `Breakpoint`.
68
    Breakpoint(Breakpoint),
69
    /// This evaluation should not break the program.
70
    Continue,
71
}
72
73
impl Default for DebugEval {
74
0
    fn default() -> Self {
75
0
        Self::Continue
76
0
    }
77
}
78
79
impl From<Breakpoint> for DebugEval {
80
0
    fn from(b: Breakpoint) -> Self {
81
0
        Self::Breakpoint(b)
82
0
    }
83
}
84
85
impl DebugEval {
86
    /// Flag whether the program execution should break.
87
0
    pub const fn should_continue(&self) -> bool {
88
0
        matches!(self, Self::Continue)
89
0
    }
90
91
    /// Return a breakpoint description if the current evaluation should break;
92
    /// return `None` otherwise.
93
0
    pub const fn breakpoint(&self) -> Option<&Breakpoint> {
94
0
        match self {
95
0
            Self::Breakpoint(b) => Some(b),
96
0
            _ => None,
97
        }
98
0
    }
99
}
/home/marten/fuel/fuel-vm/fuel-vm/src/state/debugger.rs
Line
Count
Source
1
use crate::state::{
2
    Breakpoint,
3
    DebugEval,
4
    ProgramState,
5
};
6
7
use fuel_types::{
8
    ContractId,
9
    Word,
10
};
11
12
use hashbrown::{
13
    HashMap,
14
    HashSet,
15
};
16
17
/// Debugger implementation for the VM.
18
#[derive(Debug, Default, Clone)]
19
pub struct Debugger {
20
    /// Debugger is active and used.
21
    is_active: bool,
22
    /// Single-stepping mode triggers a breakpoint after each instruction
23
    single_stepping: bool,
24
    breakpoints: HashMap<ContractId, HashSet<Word>>,
25
    last_state: Option<ProgramState>,
26
}
27
28
impl Debugger {
29
    /// Returns `true` if the `Debugger` is active and used.
30
387M
    pub const fn is_active(&self) -> bool {
31
387M
        self.is_active
32
387M
    }
33
34
    /// Get single-stepping mode
35
0
    pub const fn single_stepping(&self) -> bool {
36
0
        self.single_stepping
37
0
    }
38
39
    /// Set single-stepping mode
40
0
    pub fn set_single_stepping(&mut self, single_stepping: bool) {
41
0
        self.is_active = true;
42
0
        self.single_stepping = single_stepping;
43
0
    }
44
45
    /// Set a new breakpoint in the provided location.
46
0
    pub fn clear_breakpoints(&mut self) {
47
0
        self.breakpoints.clear();
48
0
    }
49
50
    /// Set a new breakpoint in the provided location.
51
0
    pub fn set_breakpoint(&mut self, breakpoint: Breakpoint) {
52
0
        self.is_active = true;
53
0
        let contract = *breakpoint.contract();
54
0
        let pc = breakpoint.pc();
55
0
56
0
        self.breakpoints
57
0
            .get_mut(&contract)
58
0
            .map(|set| set.insert(pc))
59
0
            .map(|_| ())
60
0
            .unwrap_or_else(|| {
61
0
                let mut set = HashSet::new();
62
0
63
0
                set.insert(pc);
64
0
65
0
                self.breakpoints.insert(contract, set);
66
0
            });
67
0
    }
68
69
    /// Remove a breakpoint, if existent.
70
0
    pub fn remove_breakpoint(&mut self, breakpoint: &Breakpoint) {
71
0
        self.is_active = true;
72
0
        self.breakpoints
73
0
            .get_mut(breakpoint.contract())
74
0
            .map(|set| set.remove(&breakpoint.pc()));
75
0
    }
76
77
    /// Evaluate the current state of the interpreter whether or not a
78
    /// breakpoint was reached.
79
0
    pub fn eval_state(&mut self, contract: Option<&ContractId>, pc: Word) -> DebugEval {
80
0
        // Default contract address maps to unset contract target
81
0
        let contract = contract.copied().unwrap_or_default();
82
0
        let last_state = self.last_state.take();
83
0
84
0
        let current = Breakpoint::raw(contract, pc);
85
0
86
0
        if self.single_stepping {
87
0
            return match last_state {
88
0
                Some(s) if s == current => DebugEval::Continue,
89
0
                _ => current.into(),
90
            }
91
0
        }
92
0
93
0
        self.breakpoints
94
0
            .get(&contract)
95
0
            .and_then(|set| set.get(&pc))
96
0
            .map(|_| match last_state {
97
0
                Some(s) if s == current => DebugEval::Continue,
98
0
                _ => current.into(),
99
0
            })
100
0
            .unwrap_or_default()
101
0
    }
102
103
    /// Overwrite the last known state of the VM.
104
0
    pub fn set_last_state(&mut self, state: ProgramState) {
105
0
        self.is_active = true;
106
0
        self.last_state.replace(state);
107
0
    }
108
109
    /// Retried the last state of execution; return `None` if the VM was never
110
    /// executed.
111
0
    pub const fn last_state(&self) -> &Option<ProgramState> {
112
0
        &self.last_state
113
0
    }
114
}
/home/marten/fuel/fuel-vm/fuel-vm/src/memory_client.rs
Line
Count
Source
1
//! In-memory client implementation
2
3
use crate::{
4
    backtrace::Backtrace,
5
    checked_transaction::Checked,
6
    error::InterpreterError,
7
    interpreter::{
8
        EcalHandler,
9
        InterpreterParams,
10
        Memory,
11
        NotSupportedEcal,
12
    },
13
    state::StateTransitionRef,
14
    storage::MemoryStorage,
15
    transactor::Transactor,
16
};
17
use core::convert::Infallible;
18
use fuel_tx::{
19
    Blob,
20
    Create,
21
    FeeParameters,
22
    GasCosts,
23
    Receipt,
24
    Script,
25
    Upgrade,
26
    Upload,
27
};
28
29
#[cfg(any(test, feature = "test-helpers"))]
30
use crate::interpreter::MemoryInstance;
31
32
#[derive(Debug)]
33
/// Client implementation with in-memory storage backend.
34
pub struct MemoryClient<M, Ecal = NotSupportedEcal> {
35
    transactor: Transactor<M, MemoryStorage, Script, Ecal>,
36
}
37
38
#[cfg(any(test, feature = "test-helpers"))]
39
impl Default for MemoryClient<MemoryInstance> {
40
0
    fn default() -> Self {
41
0
        Self::from_txtor(Transactor::new(
42
0
            MemoryInstance::new(),
43
0
            MemoryStorage::default(),
44
0
            InterpreterParams::default(),
45
0
        ))
46
0
    }
47
}
48
49
impl<M, Ecal: EcalHandler> AsRef<MemoryStorage> for MemoryClient<M, Ecal> {
50
0
    fn as_ref(&self) -> &MemoryStorage {
51
0
        self.transactor.as_ref()
52
0
    }
53
}
54
55
impl<M, Ecal: EcalHandler> AsMut<MemoryStorage> for MemoryClient<M, Ecal> {
56
0
    fn as_mut(&mut self) -> &mut MemoryStorage {
57
0
        self.transactor.as_mut()
58
0
    }
59
}
60
61
impl<M, Ecal: EcalHandler + Default> MemoryClient<M, Ecal> {
62
    /// Create a new instance of the memory client out of a provided storage.
63
0
    pub fn new(
64
0
        memory: M,
65
0
        storage: MemoryStorage,
66
0
        interpreter_params: InterpreterParams,
67
0
    ) -> Self {
68
0
        Self {
69
0
            transactor: Transactor::new(memory, storage, interpreter_params),
70
0
        }
71
0
    }
72
}
73
74
impl<M, Ecal: EcalHandler> MemoryClient<M, Ecal> {
75
    /// Create a new instance of the memory client out of a provided storage.
76
0
    pub fn from_txtor(transactor: Transactor<M, MemoryStorage, Script, Ecal>) -> Self {
77
0
        Self { transactor }
78
0
    }
79
}
80
81
impl<M, Ecal: EcalHandler> MemoryClient<M, Ecal>
82
where
83
    M: Memory,
84
{
85
    /// If a transaction was executed and produced a VM panic, returns the
86
    /// backtrace; return `None` otherwise.
87
0
    pub fn backtrace(&self) -> Option<Backtrace> {
88
0
        self.transactor.backtrace()
89
0
    }
90
91
    /// If a transaction was successfully executed, returns the produced
92
    /// receipts; return `None` otherwise.
93
0
    pub fn receipts(&self) -> Option<&[Receipt]> {
94
0
        self.transactor.receipts()
95
0
    }
96
97
    /// State transition representation after the execution of a transaction.
98
0
    pub fn state_transition(&self) -> Option<StateTransitionRef<'_, Script>> {
99
0
        self.transactor.state_transition()
100
0
    }
101
102
    /// Deploys a `Create` transaction.
103
0
    pub fn deploy(
104
0
        &mut self,
105
0
        tx: Checked<Create>,
106
0
    ) -> Result<Create, InterpreterError<Infallible>> {
107
0
        self.transactor.deploy(tx)
108
0
    }
109
110
    /// Executes `Upgrade` transaction.
111
0
    pub fn upgrade(
112
0
        &mut self,
113
0
        tx: Checked<Upgrade>,
114
0
    ) -> Result<Upgrade, InterpreterError<Infallible>> {
115
0
        self.transactor.upgrade(tx)
116
0
    }
117
118
    /// Executes `Upload` transaction.
119
0
    pub fn upload(&mut self, tx: Checked<Upload>) -> Option<Upload> {
120
0
        self.transactor.upload(tx).ok()
121
0
    }
122
123
    /// Executes `Blob` transaction.
124
0
    pub fn blob(&mut self, tx: Checked<Blob>) -> Option<Blob> {
125
0
        self.transactor.blob(tx).ok()
126
0
    }
127
128
    /// Execute a transaction.
129
    ///
130
    /// Since the memory storage is `Infallible`, associatively, the memory
131
    /// client should also be.
132
0
    pub fn transact(&mut self, tx: Checked<Script>) -> &[Receipt] {
133
0
        self.transactor.transact(tx);
134
135
        // TODO `Transactor::result` should accept error as generic so compile-time
136
        // constraints can be applied.
137
        //
138
        // In this case, we should expect `Infallible` error.
139
0
        if let Ok(state) = self.transactor.result() {
140
0
            if state.should_revert() {
141
0
                self.transactor.as_mut().revert();
142
0
            } else {
143
0
                self.transactor.as_mut().commit();
144
0
            }
145
0
        } else {
146
0
            // if vm failed to execute, revert storage just in case
147
0
            self.transactor.as_mut().revert();
148
0
        }
149
150
0
        self.transactor.receipts().unwrap_or_default()
151
0
    }
152
153
    /// Persist the changes caused by [`Self::transact`].
154
0
    pub fn persist(&mut self) {
155
0
        self.as_mut().persist();
156
0
    }
157
158
    /// Tx memory offset
159
0
    pub fn tx_offset(&self) -> usize {
160
0
        self.transactor.tx_offset()
161
0
    }
162
163
    /// Gas costs for opcodes
164
0
    pub fn gas_costs(&self) -> &GasCosts {
165
0
        self.transactor.gas_costs()
166
0
    }
167
168
    /// Fee parameters
169
0
    pub fn fee_params(&self) -> &FeeParameters {
170
0
        self.transactor.fee_params()
171
0
    }
172
173
    #[cfg(feature = "test-helpers")]
174
    /// Sets the gas price of the `Interpreter`
175
0
    pub fn set_gas_price(&mut self, gas_price: u64) {
176
0
        self.transactor.set_gas_price(gas_price);
177
0
    }
178
}
179
180
impl<M, Ecal: EcalHandler> From<MemoryClient<M, Ecal>>
181
    for Transactor<M, MemoryStorage, Script, Ecal>
182
{
183
0
    fn from(client: MemoryClient<M, Ecal>) -> Self {
184
0
        client.transactor
185
0
    }
186
}
/home/marten/fuel/fuel-vm/fuel-vm/src/interpreter.rs
Line
Count
Source
1
//! [`Interpreter`] implementation
2
3
use crate::{
4
    call::CallFrame,
5
    checked_transaction::{
6
        BlobCheckedMetadata,
7
        CheckPredicateParams,
8
    },
9
    constraints::reg_key::*,
10
    consts::*,
11
    context::Context,
12
    error::SimpleResult,
13
    state::Debugger,
14
};
15
use alloc::vec::Vec;
16
use core::{
17
    mem,
18
    ops::Index,
19
};
20
21
use fuel_asm::{
22
    Flags,
23
    PanicReason,
24
};
25
use fuel_tx::{
26
    field,
27
    Blob,
28
    Chargeable,
29
    Create,
30
    Executable,
31
    FeeParameters,
32
    GasCosts,
33
    Output,
34
    PrepareSign,
35
    Receipt,
36
    Script,
37
    Transaction,
38
    TransactionRepr,
39
    UniqueIdentifier,
40
    Upgrade,
41
    Upload,
42
    ValidityError,
43
};
44
use fuel_types::{
45
    AssetId,
46
    Bytes32,
47
    ChainId,
48
    ContractId,
49
    Word,
50
};
51
52
mod alu;
53
mod balances;
54
mod blob;
55
mod blockchain;
56
mod constructors;
57
pub mod contract;
58
mod crypto;
59
pub mod diff;
60
mod executors;
61
mod flow;
62
mod gas;
63
mod initialization;
64
mod internal;
65
mod log;
66
mod memory;
67
mod metadata;
68
mod post_execution;
69
mod receipts;
70
71
mod debug;
72
mod ecal;
73
74
use crate::profiler::Profiler;
75
76
#[cfg(feature = "profile-gas")]
77
use crate::profiler::InstructionLocation;
78
79
pub use balances::RuntimeBalances;
80
pub use ecal::{
81
    EcalHandler,
82
    PredicateErrorEcal,
83
};
84
pub use executors::predicates;
85
pub use memory::{
86
    Memory,
87
    MemoryInstance,
88
    MemoryRange,
89
};
90
91
use crate::checked_transaction::{
92
    CreateCheckedMetadata,
93
    EstimatePredicates,
94
    IntoChecked,
95
    NonRetryableFreeBalances,
96
    RetryableAmount,
97
    ScriptCheckedMetadata,
98
    UpgradeCheckedMetadata,
99
    UploadCheckedMetadata,
100
};
101
102
#[cfg(feature = "test-helpers")]
103
pub use self::receipts::ReceiptsCtx;
104
105
#[cfg(not(feature = "test-helpers"))]
106
use self::receipts::ReceiptsCtx;
107
108
/// ECAL opcode is not supported and return an error if you try to call.
109
#[derive(Debug, Copy, Clone, Default)]
110
pub struct NotSupportedEcal;
111
112
/// VM interpreter.
113
///
114
/// The internal state of the VM isn't expose because the intended usage is to
115
/// either inspect the resulting receipts after a transaction execution, or the
116
/// resulting mutated transaction.
117
///
118
/// These can be obtained with the help of a [`crate::transactor::Transactor`]
119
/// or a client implementation.
120
#[derive(Debug, Clone)]
121
pub struct Interpreter<M, S, Tx = (), Ecal = NotSupportedEcal> {
122
    registers: [Word; VM_REGISTER_COUNT],
123
    memory: M,
124
    frames: Vec<CallFrame>,
125
    receipts: ReceiptsCtx,
126
    tx: Tx,
127
    initial_balances: InitialBalances,
128
    input_contracts: alloc::collections::BTreeSet<ContractId>,
129
    input_contracts_index_to_output_index: alloc::collections::BTreeMap<u16, u16>,
130
    storage: S,
131
    debugger: Debugger,
132
    context: Context,
133
    balances: RuntimeBalances,
134
    profiler: Profiler,
135
    interpreter_params: InterpreterParams,
136
    /// `PanicContext` after the latest execution. It is consumed by
137
    /// `append_panic_receipt` and is `PanicContext::None` after consumption.
138
    panic_context: PanicContext,
139
    ecal_state: Ecal,
140
}
141
142
/// Interpreter parameters
143
#[derive(Debug, Clone, PartialEq, Eq)]
144
pub struct InterpreterParams {
145
    /// Gas Price
146
    pub gas_price: Word,
147
    /// Gas costs
148
    pub gas_costs: GasCosts,
149
    /// Maximum number of inputs
150
    pub max_inputs: u16,
151
    /// Maximum size of the contract in bytes
152
    pub contract_max_size: u64,
153
    /// Offset of the transaction data in the memory
154
    pub tx_offset: usize,
155
    /// Maximum length of the message data
156
    pub max_message_data_length: u64,
157
    /// Chain ID
158
    pub chain_id: ChainId,
159
    /// Fee parameters
160
    pub fee_params: FeeParameters,
161
    /// Base Asset ID
162
    pub base_asset_id: AssetId,
163
}
164
165
#[cfg(feature = "test-helpers")]
166
impl Default for InterpreterParams {
167
0
    fn default() -> Self {
168
0
        Self {
169
0
            gas_price: 0,
170
0
            gas_costs: Default::default(),
171
0
            max_inputs: fuel_tx::TxParameters::DEFAULT.max_inputs(),
172
0
            contract_max_size: fuel_tx::ContractParameters::DEFAULT.contract_max_size(),
173
0
            tx_offset: fuel_tx::TxParameters::DEFAULT.tx_offset(),
174
0
            max_message_data_length: fuel_tx::PredicateParameters::DEFAULT
175
0
                .max_message_data_length(),
176
0
            chain_id: ChainId::default(),
177
0
            fee_params: FeeParameters::default(),
178
0
            base_asset_id: Default::default(),
179
0
        }
180
0
    }
181
}
182
183
impl InterpreterParams {
184
    /// Constructor for `InterpreterParams`
185
4.38k
    pub fn new<T: Into<CheckPredicateParams>>(gas_price: Word, params: T) -> Self {
186
4.38k
        let params: CheckPredicateParams = params.into();
187
4.38k
        Self {
188
4.38k
            gas_price,
189
4.38k
            gas_costs: params.gas_costs,
190
4.38k
            max_inputs: params.max_inputs,
191
4.38k
            contract_max_size: params.contract_max_size,
192
4.38k
            tx_offset: params.tx_offset,
193
4.38k
            max_message_data_length: params.max_message_data_length,
194
4.38k
            chain_id: params.chain_id,
195
4.38k
            fee_params: params.fee_params,
196
4.38k
            base_asset_id: params.base_asset_id,
197
4.38k
        }
198
4.38k
    }
Unexecuted instantiation: _RINvMs_NtCsg6P9hFxt0iW_7fuel_vm11interpreterNtB5_17InterpreterParams3newNtNtB7_19checked_transaction20CheckPredicateParamsEB7_
_RINvMs_NtCsg6P9hFxt0iW_7fuel_vm11interpreterNtB5_17InterpreterParams3newRNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction20consensus_parameters19ConsensusParametersEB7_
Line
Count
Source
185
4.38k
    pub fn new<T: Into<CheckPredicateParams>>(gas_price: Word, params: T) -> Self {
186
4.38k
        let params: CheckPredicateParams = params.into();
187
4.38k
        Self {
188
4.38k
            gas_price,
189
4.38k
            gas_costs: params.gas_costs,
190
4.38k
            max_inputs: params.max_inputs,
191
4.38k
            contract_max_size: params.contract_max_size,
192
4.38k
            tx_offset: params.tx_offset,
193
4.38k
            max_message_data_length: params.max_message_data_length,
194
4.38k
            chain_id: params.chain_id,
195
4.38k
            fee_params: params.fee_params,
196
4.38k
            base_asset_id: params.base_asset_id,
197
4.38k
        }
198
4.38k
    }
199
}
200
201
/// Sometimes it is possible to add some additional context information
202
/// regarding panic reasons to simplify debugging.
203
// TODO: Move this enum into `fuel-tx` and use it inside of the `Receipt::Panic` as meta
204
//  information. Maybe better to have `Vec<PanicContext>` to provide more information.
205
#[derive(Debug, Clone, PartialEq, Eq)]
206
pub(crate) enum PanicContext {
207
    /// No additional information.
208
    None,
209
    /// `ContractId` retrieved during instruction execution.
210
    ContractId(ContractId),
211
}
212
213
impl<M: Memory, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal> {
214
    /// Returns the current state of the VM memory
215
398M
    pub fn memory(&self) -> &MemoryInstance {
216
398M
        self.memory.as_ref()
217
398M
    }
_RNvMs0_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEE6memoryB7_
Line
Count
Source
215
398M
    pub fn memory(&self) -> &MemoryInstance {
216
398M
        self.memory.as_ref()
217
398M
    }
Unexecuted instantiation: _RNvMs0_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEE6memoryB7_
_RNvMs0_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEE6memoryB7_
Line
Count
Source
215
2.19k
    pub fn memory(&self) -> &MemoryInstance {
216
2.19k
        self.memory.as_ref()
217
2.19k
    }
Unexecuted instantiation: _RNvMs0_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_4blob8BlobBodyNtB4b_12BlobMetadataEE6memoryB7_
Unexecuted instantiation: _RNvMs0_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6create10CreateBodyNtB4b_14CreateMetadataEE6memoryB7_
Unexecuted instantiation: _RNvMs0_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6script10ScriptBodyNtB4b_14ScriptMetadataEE6memoryB7_
Unexecuted instantiation: _RNvMs0_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6upload10UploadBodyNtB4b_14UploadMetadataEE6memoryB7_
Unexecuted instantiation: _RNvMs0_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_7upgrade11UpgradeBodyNtB4b_15UpgradeMetadataEE6memoryB7_
Unexecuted instantiation: _RNvMs0_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtNtB1z_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6script10ScriptBodyNtB4l_14ScriptMetadataEE6memoryB7_
218
}
219
220
impl<M: AsMut<MemoryInstance>, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal> {
221
    /// Returns mutable access to the vm memory
222
57.0k
    pub fn memory_mut(&mut self) -> &mut MemoryInstance {
223
57.0k
        self.memory.as_mut()
224
57.0k
    }
Unexecuted instantiation: _RNvMs1_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEE10memory_mutB7_
_RNvMs1_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEE10memory_mutB7_
Line
Count
Source
222
26.3k
    pub fn memory_mut(&mut self) -> &mut MemoryInstance {
223
26.3k
        self.memory.as_mut()
224
26.3k
    }
_RNvMs1_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEE10memory_mutB7_
Line
Count
Source
222
30.7k
    pub fn memory_mut(&mut self) -> &mut MemoryInstance {
223
30.7k
        self.memory.as_mut()
224
30.7k
    }
Unexecuted instantiation: _RNvMs1_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_4blob8BlobBodyNtB4b_12BlobMetadataEE10memory_mutB7_
Unexecuted instantiation: _RNvMs1_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6create10CreateBodyNtB4b_14CreateMetadataEE10memory_mutB7_
Unexecuted instantiation: _RNvMs1_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6script10ScriptBodyNtB4b_14ScriptMetadataEE10memory_mutB7_
Unexecuted instantiation: _RNvMs1_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6upload10UploadBodyNtB4b_14UploadMetadataEE10memory_mutB7_
Unexecuted instantiation: _RNvMs1_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_7upgrade11UpgradeBodyNtB4b_15UpgradeMetadataEE10memory_mutB7_
Unexecuted instantiation: _RNvMs1_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtNtB1z_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6script10ScriptBodyNtB4l_14ScriptMetadataEE10memory_mutB7_
225
}
226
227
impl<M, S, Tx, Ecal> Interpreter<M, S, Tx, Ecal> {
228
    /// Returns the current state of the registers
229
0
    pub const fn registers(&self) -> &[Word] {
230
0
        &self.registers
231
0
    }
232
233
    /// Returns mutable access to the registers
234
0
    pub fn registers_mut(&mut self) -> &mut [Word] {
235
0
        &mut self.registers
236
0
    }
237
238
0
    pub(crate) fn call_stack(&self) -> &[CallFrame] {
239
0
        self.frames.as_slice()
240
0
    }
241
242
    /// Debug handler
243
0
    pub const fn debugger(&self) -> &Debugger {
244
0
        &self.debugger
245
0
    }
246
247
    /// The current transaction.
248
35.0k
    pub fn transaction(&self) -> &Tx {
249
35.0k
        &self.tx
250
35.0k
    }
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEE11transactionB7_
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEE11transactionB7_
Line
Count
Source
248
15.3k
    pub fn transaction(&self) -> &Tx {
249
15.3k
        &self.tx
250
15.3k
    }
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEE11transactionB7_
Line
Count
Source
248
19.7k
    pub fn transaction(&self) -> &Tx {
249
19.7k
        &self.tx
250
19.7k
    }
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_4blob8BlobBodyNtB4b_12BlobMetadataEE11transactionB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6create10CreateBodyNtB4b_14CreateMetadataEE11transactionB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6script10ScriptBodyNtB4b_14ScriptMetadataEE11transactionB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6upload10UploadBodyNtB4b_14UploadMetadataEE11transactionB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_7upgrade11UpgradeBodyNtB4b_15UpgradeMetadataEE11transactionB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtNtB1z_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6script10ScriptBodyNtB4l_14ScriptMetadataEE11transactionB7_
251
252
    /// The initial balances.
253
0
    pub fn initial_balances(&self) -> &InitialBalances {
254
0
        &self.initial_balances
255
0
    }
256
257
    /// Get max_inputs value
258
4.38k
    pub fn max_inputs(&self) -> u16 {
259
4.38k
        self.interpreter_params.max_inputs
260
4.38k
    }
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEE10max_inputsB7_
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEE10max_inputsB7_
Line
Count
Source
258
2.19k
    pub fn max_inputs(&self) -> u16 {
259
2.19k
        self.interpreter_params.max_inputs
260
2.19k
    }
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEE10max_inputsB7_
Line
Count
Source
258
2.19k
    pub fn max_inputs(&self) -> u16 {
259
2.19k
        self.interpreter_params.max_inputs
260
2.19k
    }
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_4blob8BlobBodyNtB4b_12BlobMetadataEE10max_inputsB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6create10CreateBodyNtB4b_14CreateMetadataEE10max_inputsB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6script10ScriptBodyNtB4b_14ScriptMetadataEE10max_inputsB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6upload10UploadBodyNtB4b_14UploadMetadataEE10max_inputsB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_7upgrade11UpgradeBodyNtB4b_15UpgradeMetadataEE10max_inputsB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtNtB1z_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6script10ScriptBodyNtB4l_14ScriptMetadataEE10max_inputsB7_
261
262
    /// Gas price for current block
263
15.3k
    pub fn gas_price(&self) -> Word {
264
15.3k
        self.interpreter_params.gas_price
265
15.3k
    }
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEE9gas_priceB7_
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEE9gas_priceB7_
Line
Count
Source
263
6.57k
    pub fn gas_price(&self) -> Word {
264
6.57k
        self.interpreter_params.gas_price
265
6.57k
    }
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEE9gas_priceB7_
Line
Count
Source
263
8.77k
    pub fn gas_price(&self) -> Word {
264
8.77k
        self.interpreter_params.gas_price
265
8.77k
    }
266
267
    #[cfg(feature = "test-helpers")]
268
    /// Sets the gas price of the `Interpreter`
269
0
    pub fn set_gas_price(&mut self, gas_price: u64) {
270
0
        self.interpreter_params.gas_price = gas_price;
271
0
    }
272
273
    /// Gas costs for opcodes
274
387M
    pub fn gas_costs(&self) -> &GasCosts {
275
387M
        &self.interpreter_params.gas_costs
276
387M
    }
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEE9gas_costsB7_
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEE9gas_costsB7_
Line
Count
Source
274
4.38k
    pub fn gas_costs(&self) -> &GasCosts {
275
4.38k
        &self.interpreter_params.gas_costs
276
4.38k
    }
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEE9gas_costsB7_
Line
Count
Source
274
387M
    pub fn gas_costs(&self) -> &GasCosts {
275
387M
        &self.interpreter_params.gas_costs
276
387M
    }
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_4blob8BlobBodyNtB4b_12BlobMetadataEE9gas_costsB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6create10CreateBodyNtB4b_14CreateMetadataEE9gas_costsB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6script10ScriptBodyNtB4b_14ScriptMetadataEE9gas_costsB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6upload10UploadBodyNtB4b_14UploadMetadataEE9gas_costsB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_7upgrade11UpgradeBodyNtB4b_15UpgradeMetadataEE9gas_costsB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtNtB1z_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6script10ScriptBodyNtB4l_14ScriptMetadataEE9gas_costsB7_
277
278
    /// Get the Fee Parameters
279
8.77k
    pub fn fee_params(&self) -> &FeeParameters {
280
8.77k
        &self.interpreter_params.fee_params
281
8.77k
    }
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEE10fee_paramsB7_
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEE10fee_paramsB7_
Line
Count
Source
279
4.38k
    pub fn fee_params(&self) -> &FeeParameters {
280
4.38k
        &self.interpreter_params.fee_params
281
4.38k
    }
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEE10fee_paramsB7_
Line
Count
Source
279
4.38k
    pub fn fee_params(&self) -> &FeeParameters {
280
4.38k
        &self.interpreter_params.fee_params
281
4.38k
    }
282
283
    /// Get the base Asset ID
284
4.38k
    pub fn base_asset_id(&self) -> &AssetId {
285
4.38k
        &self.interpreter_params.base_asset_id
286
4.38k
    }
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEE13base_asset_idB7_
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEE13base_asset_idB7_
Line
Count
Source
284
2.19k
    pub fn base_asset_id(&self) -> &AssetId {
285
2.19k
        &self.interpreter_params.base_asset_id
286
2.19k
    }
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEE13base_asset_idB7_
Line
Count
Source
284
2.19k
    pub fn base_asset_id(&self) -> &AssetId {
285
2.19k
        &self.interpreter_params.base_asset_id
286
2.19k
    }
287
288
    /// Get contract_max_size value
289
597k
    pub fn contract_max_size(&self) -> u64 {
290
597k
        self.interpreter_params.contract_max_size
291
597k
    }
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEE17contract_max_sizeB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEE17contract_max_sizeB7_
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEE17contract_max_sizeB7_
Line
Count
Source
289
597k
    pub fn contract_max_size(&self) -> u64 {
290
597k
        self.interpreter_params.contract_max_size
291
597k
    }
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_4blob8BlobBodyNtB4b_12BlobMetadataEE17contract_max_sizeB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6create10CreateBodyNtB4b_14CreateMetadataEE17contract_max_sizeB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6script10ScriptBodyNtB4b_14ScriptMetadataEE17contract_max_sizeB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6upload10UploadBodyNtB4b_14UploadMetadataEE17contract_max_sizeB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_7upgrade11UpgradeBodyNtB4b_15UpgradeMetadataEE17contract_max_sizeB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtNtB1z_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6script10ScriptBodyNtB4l_14ScriptMetadataEE17contract_max_sizeB7_
292
293
    /// Get tx_offset value
294
12.0M
    pub fn tx_offset(&self) -> usize {
295
12.0M
        self.interpreter_params.tx_offset
296
12.0M
    }
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEE9tx_offsetB7_
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEE9tx_offsetB7_
Line
Count
Source
294
2.19k
    pub fn tx_offset(&self) -> usize {
295
2.19k
        self.interpreter_params.tx_offset
296
2.19k
    }
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEE9tx_offsetB7_
Line
Count
Source
294
12.0M
    pub fn tx_offset(&self) -> usize {
295
12.0M
        self.interpreter_params.tx_offset
296
12.0M
    }
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_4blob8BlobBodyNtB4b_12BlobMetadataEE9tx_offsetB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6create10CreateBodyNtB4b_14CreateMetadataEE9tx_offsetB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6script10ScriptBodyNtB4b_14ScriptMetadataEE9tx_offsetB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6upload10UploadBodyNtB4b_14UploadMetadataEE9tx_offsetB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_7upgrade11UpgradeBodyNtB4b_15UpgradeMetadataEE9tx_offsetB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtNtB1z_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6script10ScriptBodyNtB4l_14ScriptMetadataEE9tx_offsetB7_
297
298
    /// Get max_message_data_length value
299
88.9k
    pub fn max_message_data_length(&self) -> u64 {
300
88.9k
        self.interpreter_params.max_message_data_length
301
88.9k
    }
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEE23max_message_data_lengthB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEE23max_message_data_lengthB7_
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEE23max_message_data_lengthB7_
Line
Count
Source
299
88.9k
    pub fn max_message_data_length(&self) -> u64 {
300
88.9k
        self.interpreter_params.max_message_data_length
301
88.9k
    }
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_4blob8BlobBodyNtB4b_12BlobMetadataEE23max_message_data_lengthB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6create10CreateBodyNtB4b_14CreateMetadataEE23max_message_data_lengthB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6script10ScriptBodyNtB4b_14ScriptMetadataEE23max_message_data_lengthB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6upload10UploadBodyNtB4b_14UploadMetadataEE23max_message_data_lengthB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_7upgrade11UpgradeBodyNtB4b_15UpgradeMetadataEE23max_message_data_lengthB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtNtB1z_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6script10ScriptBodyNtB4l_14ScriptMetadataEE23max_message_data_lengthB7_
302
303
    /// Get the chain id
304
1.62M
    pub fn chain_id(&self) -> ChainId {
305
1.62M
        self.interpreter_params.chain_id
306
1.62M
    }
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEE8chain_idB7_
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEE8chain_idB7_
Line
Count
Source
304
2.19k
    pub fn chain_id(&self) -> ChainId {
305
2.19k
        self.interpreter_params.chain_id
306
2.19k
    }
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEE8chain_idB7_
Line
Count
Source
304
1.61M
    pub fn chain_id(&self) -> ChainId {
305
1.61M
        self.interpreter_params.chain_id
306
1.61M
    }
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_4blob8BlobBodyNtB4b_12BlobMetadataEE8chain_idB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6create10CreateBodyNtB4b_14CreateMetadataEE8chain_idB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6script10ScriptBodyNtB4b_14ScriptMetadataEE8chain_idB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6upload10UploadBodyNtB4b_14UploadMetadataEE8chain_idB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_7upgrade11UpgradeBodyNtB4b_15UpgradeMetadataEE8chain_idB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtNtB1z_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6script10ScriptBodyNtB4l_14ScriptMetadataEE8chain_idB7_
307
308
    /// Receipts generated by a transaction execution.
309
8.77k
    pub fn receipts(&self) -> &[Receipt] {
310
8.77k
        self.receipts.as_ref().as_slice()
311
8.77k
    }
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEE8receiptsB7_
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEE8receiptsB7_
Line
Count
Source
309
4.38k
    pub fn receipts(&self) -> &[Receipt] {
310
4.38k
        self.receipts.as_ref().as_slice()
311
4.38k
    }
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEE8receiptsB7_
Line
Count
Source
309
4.38k
    pub fn receipts(&self) -> &[Receipt] {
310
4.38k
        self.receipts.as_ref().as_slice()
311
4.38k
    }
312
313
    /// Compute current receipts root
314
2.19k
    pub fn compute_receipts_root(&self) -> Bytes32 {
315
2.19k
        self.receipts.root()
316
2.19k
    }
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEE21compute_receipts_rootB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEE21compute_receipts_rootB7_
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEE21compute_receipts_rootB7_
Line
Count
Source
314
2.19k
    pub fn compute_receipts_root(&self) -> Bytes32 {
315
2.19k
        self.receipts.root()
316
2.19k
    }
317
318
    /// Mutable access to receipts for testing purposes.
319
    #[cfg(any(test, feature = "test-helpers"))]
320
0
    pub fn receipts_mut(&mut self) -> &mut ReceiptsCtx {
321
0
        &mut self.receipts
322
0
    }
323
324
387M
    pub(crate) fn contract_id(&self) -> Option<ContractId> {
325
387M
        self.frames.last().map(|frame| *frame.to())
Unexecuted instantiation: _RNCNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2d_4blob8BlobBodyNtB3J_12BlobMetadataEE11contract_id0B9_
Unexecuted instantiation: _RNCNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2d_6create10CreateBodyNtB3J_14CreateMetadataEE11contract_id0B9_
_RNCNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB7_11InterpreterNtNtB7_6memory14MemoryInstanceNtNtNtB9_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2d_6script10ScriptBodyNtB3J_14ScriptMetadataEE11contract_id0B9_
Line
Count
Source
325
102k
        self.frames.last().map(|frame| *frame.to())
Unexecuted instantiation: _RNCNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1z_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2H_4blob8BlobBodyNtB4d_12BlobMetadataEE11contract_id0B9_
Unexecuted instantiation: _RNCNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1z_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2H_6create10CreateBodyNtB4d_14CreateMetadataEE11contract_id0B9_
Unexecuted instantiation: _RNCNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1z_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2H_6script10ScriptBodyNtB4d_14ScriptMetadataEE11contract_id0B9_
Unexecuted instantiation: _RNCNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1z_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2H_6upload10UploadBodyNtB4d_14UploadMetadataEE11contract_id0B9_
Unexecuted instantiation: _RNCNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtB1z_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2H_7upgrade11UpgradeBodyNtB4d_15UpgradeMetadataEE11contract_id0B9_
Unexecuted instantiation: _RNCNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB7_11InterpreterQNtNtB7_6memory14MemoryInstanceINtNtNtB9_7storage9predicate16PredicateStorageRNtNtB1B_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2R_6script10ScriptBodyNtB4n_14ScriptMetadataEE11contract_id0B9_
326
387M
    }
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEE11contract_idB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEE11contract_idB7_
_RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEE11contract_idB7_
Line
Count
Source
324
387M
    pub(crate) fn contract_id(&self) -> Option<ContractId> {
325
387M
        self.frames.last().map(|frame| *frame.to())
326
387M
    }
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_4blob8BlobBodyNtB4b_12BlobMetadataEE11contract_idB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6create10CreateBodyNtB4b_14CreateMetadataEE11contract_idB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6script10ScriptBodyNtB4b_14ScriptMetadataEE11contract_idB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_6upload10UploadBodyNtB4b_14UploadMetadataEE11contract_idB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtB1x_12EmptyStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2F_7upgrade11UpgradeBodyNtB4b_15UpgradeMetadataEE11contract_idB7_
Unexecuted instantiation: _RNvMs2_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterQNtNtB5_6memory14MemoryInstanceINtNtNtB7_7storage9predicate16PredicateStorageRNtNtB1z_6memory13MemoryStorageEINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2P_6script10ScriptBodyNtB4l_14ScriptMetadataEE11contract_idB7_
327
328
    /// Reference to the underlying profiler
329
    #[cfg(feature = "profile-any")]
330
    pub const fn profiler(&self) -> &Profiler {
331
        &self.profiler
332
    }
333
}
334
335
68
pub(crate) fn flags(flag: Reg<FLAG>) -> Flags {
336
68
    Flags::from_bits_truncate(*flag)
337
68
}
338
339
43
pub(crate) fn is_wrapping(flag: Reg<FLAG>) -> bool {
340
43
    flags(flag).contains(Flags::WRAPPING)
341
43
}
342
343
25
pub(crate) fn is_unsafe_math(flag: Reg<FLAG>) -> bool {
344
25
    flags(flag).contains(Flags::UNSAFEMATH)
345
25
}
346
347
#[cfg(feature = "profile-gas")]
348
fn current_location(
349
    current_contract: Option<ContractId>,
350
    pc: crate::constraints::reg_key::Reg<{ crate::constraints::reg_key::PC }>,
351
    is: crate::constraints::reg_key::Reg<{ crate::constraints::reg_key::IS }>,
352
) -> InstructionLocation {
353
    // Safety: pc should always be above is, but fallback to zero here for weird cases,
354
    //         as the profiling code should be robust against regards cases like this.
355
    let offset = (*pc).saturating_sub(*is);
356
    InstructionLocation::new(current_contract, offset)
357
}
358
359
impl<M, S, Tx, Ecal> AsRef<S> for Interpreter<M, S, Tx, Ecal> {
360
0
    fn as_ref(&self) -> &S {
361
0
        &self.storage
362
0
    }
363
}
364
365
impl<M, S, Tx, Ecal> AsMut<S> for Interpreter<M, S, Tx, Ecal> {
366
4.38k
    fn as_mut(&mut self) -> &mut S {
367
4.38k
        &mut self.storage
368
4.38k
    }
_RNvXs4_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6script10ScriptBodyNtB3H_14ScriptMetadataEEINtNtCsd3UI3IJrzMw_4core7convert5AsMutB1t_E6as_mutB7_
Line
Count
Source
366
2.19k
    fn as_mut(&mut self) -> &mut S {
367
2.19k
        &mut self.storage
368
2.19k
    }
Unexecuted instantiation: _RNvXs4_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_4blob8BlobBodyNtB3H_12BlobMetadataEEINtNtCsd3UI3IJrzMw_4core7convert5AsMutB1t_E6as_mutB7_
_RNvXs4_NtCsg6P9hFxt0iW_7fuel_vm11interpreterINtB5_11InterpreterNtNtB5_6memory14MemoryInstanceNtNtNtB7_7storage6memory13MemoryStorageINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB2b_6create10CreateBodyNtB3H_14CreateMetadataEEINtNtCsd3UI3IJrzMw_4core7convert5AsMutB1t_E6as_mutB7_
Line
Count
Source
366
2.19k
    fn as_mut(&mut self) -> &mut S {
367
2.19k
        &mut self.storage
368
2.19k
    }
369
}
370
371
/// The definition of the executable transaction supported by the `Interpreter`.
372
pub trait ExecutableTransaction:
373
    Default
374
    + Clone
375
    + Chargeable
376
    + Executable
377
    + IntoChecked
378
    + EstimatePredicates
379
    + UniqueIdentifier
380
    + field::Outputs
381
    + field::Witnesses
382
    + Into<Transaction>
383
    + PrepareSign
384
    + fuel_types::canonical::Serialize
385
{
386
    /// Casts the `Self` transaction into `&Script` if any.
387
4.38k
    fn as_script(&self) -> Option<&Script> {
388
4.38k
        None
389
4.38k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction9as_scriptB2l_
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction9as_scriptB2s_
Line
Count
Source
387
4.38k
    fn as_script(&self) -> Option<&Script> {
388
4.38k
        None
389
4.38k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1D_14UploadMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction9as_scriptB2s_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction9as_scriptB2v_
390
391
    /// Casts the `Self` transaction into `&mut Script` if any.
392
2.19k
    fn as_script_mut(&mut self) -> Option<&mut Script> {
393
2.19k
        None
394
2.19k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction13as_script_mutB2l_
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction13as_script_mutB2s_
Line
Count
Source
392
2.19k
    fn as_script_mut(&mut self) -> Option<&mut Script> {
393
2.19k
        None
394
2.19k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1D_14UploadMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction13as_script_mutB2s_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction13as_script_mutB2v_
395
396
    /// Casts the `Self` transaction into `&Create` if any.
397
1.07M
    fn as_create(&self) -> Option<&Create> {
398
1.07M
        None
399
1.07M
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction9as_createB2l_
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction9as_createB2s_
Line
Count
Source
397
1.07M
    fn as_create(&self) -> Option<&Create> {
398
1.07M
        None
399
1.07M
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1D_14UploadMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction9as_createB2s_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction9as_createB2v_
400
401
    /// Casts the `Self` transaction into `&mut Create` if any.
402
2.19k
    fn as_create_mut(&mut self) -> Option<&mut Create> {
403
2.19k
        None
404
2.19k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction13as_create_mutB2l_
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction13as_create_mutB2s_
Line
Count
Source
402
2.19k
    fn as_create_mut(&mut self) -> Option<&mut Create> {
403
2.19k
        None
404
2.19k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1D_14UploadMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction13as_create_mutB2s_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction13as_create_mutB2v_
405
406
    /// Casts the `Self` transaction into `&Upgrade` if any.
407
0
    fn as_upgrade(&self) -> Option<&Upgrade> {
408
0
        None
409
0
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction10as_upgradeB2l_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction10as_upgradeB2s_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction10as_upgradeB2s_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1D_14UploadMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction10as_upgradeB2s_
410
411
    /// Casts the `Self` transaction into `&mut Upgrade` if any.
412
2.19k
    fn as_upgrade_mut(&mut self) -> Option<&mut Upgrade> {
413
2.19k
        None
414
2.19k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction14as_upgrade_mutB2l_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction14as_upgrade_mutB2s_
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction14as_upgrade_mutB2s_
Line
Count
Source
412
2.19k
    fn as_upgrade_mut(&mut self) -> Option<&mut Upgrade> {
413
2.19k
        None
414
2.19k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1D_14UploadMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction14as_upgrade_mutB2s_
415
416
    /// Casts the `Self` transaction into `&Upload` if any.
417
0
    fn as_upload(&self) -> Option<&Upload> {
418
0
        None
419
0
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction9as_uploadB2l_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction9as_uploadB2s_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction9as_uploadB2s_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction9as_uploadB2v_
420
421
    /// Casts the `Self` transaction into `&mut Upload` if any.
422
2.19k
    fn as_upload_mut(&mut self) -> Option<&mut Upload> {
423
2.19k
        None
424
2.19k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction13as_upload_mutB2l_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction13as_upload_mutB2s_
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction13as_upload_mutB2s_
Line
Count
Source
422
2.19k
    fn as_upload_mut(&mut self) -> Option<&mut Upload> {
423
2.19k
        None
424
2.19k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction13as_upload_mutB2v_
425
426
    /// Casts the `Self` transaction into `&Blob` if any.
427
0
    fn as_blob(&self) -> Option<&Blob> {
428
0
        None
429
0
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction7as_blobB2s_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction7as_blobB2s_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1D_14UploadMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction7as_blobB2s_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction7as_blobB2v_
430
431
    /// Casts the `Self` transaction into `&mut Blob` if any.
432
2.19k
    fn as_blob_mut(&mut self) -> Option<&mut Blob> {
433
2.19k
        None
434
2.19k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction11as_blob_mutB2s_
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction11as_blob_mutB2s_
Line
Count
Source
432
2.19k
    fn as_blob_mut(&mut self) -> Option<&mut Blob> {
433
2.19k
        None
434
2.19k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1D_14UploadMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction11as_blob_mutB2s_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction11as_blob_mutB2v_
435
436
    /// Returns the type of the transaction like `Transaction::Create` or
437
    /// `Transaction::Script`.
438
    fn transaction_type() -> Word;
439
440
    /// Replaces the `Output::Variable` with the `output`(should be also
441
    /// `Output::Variable`) by the `idx` index.
442
0
    fn replace_variable_output(
443
0
        &mut self,
444
0
        idx: usize,
445
0
        output: Output,
446
0
    ) -> SimpleResult<()> {
447
0
        if !output.is_variable() {
448
0
            return Err(PanicReason::ExpectedOutputVariable.into());
449
0
        }
450
0
451
0
        // TODO increase the error granularity for this case - create a new variant of
452
0
        // panic reason
453
0
        self.outputs_mut()
454
0
            .get_mut(idx)
455
0
            .and_then(|o| match o {
456
0
                Output::Variable { amount, .. } if amount == &0 => Some(o),
457
0
                _ => None,
458
0
            })
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_4blob8BlobBodyNtB1F_12BlobMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction23replace_variable_output0B2n_
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1F_14CreateMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction23replace_variable_output0B2u_
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1F_14ScriptMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction23replace_variable_output0B2u_
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6upload10UploadBodyNtB1F_14UploadMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction23replace_variable_output0B2u_
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1F_15UpgradeMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction23replace_variable_output0B2x_
459
0
            .map(|o| mem::replace(o, output))
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_4blob8BlobBodyNtB1F_12BlobMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction23replace_variable_outputs_0B2n_
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6create10CreateBodyNtB1F_14CreateMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction23replace_variable_outputs_0B2u_
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6script10ScriptBodyNtB1F_14ScriptMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction23replace_variable_outputs_0B2u_
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_6upload10UploadBodyNtB1F_14UploadMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction23replace_variable_outputs_0B2u_
Unexecuted instantiation: _RNCNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB9_7upgrade11UpgradeBodyNtB1F_15UpgradeMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction23replace_variable_outputs_0B2x_
460
0
            .ok_or(PanicReason::OutputNotFound)?;
461
0
        Ok(())
462
0
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction23replace_variable_outputB2l_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction23replace_variable_outputB2s_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction23replace_variable_outputB2s_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1D_14UploadMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction23replace_variable_outputB2s_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction23replace_variable_outputB2v_
463
464
    /// Update change and variable outputs.
465
    ///
466
    /// `revert` will signal if the execution was reverted. It will refund the unused gas
467
    /// cost to the base asset and reset output changes to their `initial_balances`.
468
    ///
469
    /// `remaining_gas` expects the raw content of `$ggas`
470
    ///
471
    /// `initial_balances` contains the initial state of the free balances
472
    ///
473
    /// `balances` will contain the current state of the free balances
474
    #[allow(clippy::too_many_arguments)]
475
4.38k
    fn update_outputs<I>(
476
4.38k
        &mut self,
477
4.38k
        revert: bool,
478
4.38k
        used_gas: Word,
479
4.38k
        initial_balances: &InitialBalances,
480
4.38k
        balances: &I,
481
4.38k
        gas_costs: &GasCosts,
482
4.38k
        fee_params: &FeeParameters,
483
4.38k
        base_asset_id: &AssetId,
484
4.38k
        gas_price: Word,
485
4.38k
    ) -> Result<(), ValidityError>
486
4.38k
    where
487
4.38k
        I: for<'a> Index<&'a AssetId, Output = Word>,
488
4.38k
    {
489
4.38k
        let gas_refund = self
490
4.38k
            .refund_fee(gas_costs, fee_params, used_gas, gas_price)
491
4.38k
            .ok_or(ValidityError::GasCostsCoinsOverflow)?;
492
493
6.57k
        self.outputs_mut().iter_mut().try_for_each(|o| match o {
494
            // If revert, set base asset to initial balance and refund unused gas
495
            //
496
            // Note: the initial balance deducts the gas limit from base asset
497
            Output::Change {
498
2.19k
                asset_id, amount, ..
499
2.19k
            } if revert && asset_id == base_asset_id => initial_balances.non_retryable
500
0
                [base_asset_id]
501
0
                .checked_add(gas_refund)
502
0
                .map(|v| *amount = v)
Unexecuted instantiation: _RNCNCINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtBc_4blob8BlobBodyNtB1I_12BlobMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction14update_outputsNtNtB2o_8balances15RuntimeBalancesE00B2q_
Unexecuted instantiation: _RNCNCINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtBc_6create10CreateBodyNtB1I_14CreateMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction14update_outputsNtNtB2v_8balances15RuntimeBalancesE00B2x_
Unexecuted instantiation: _RNCNCINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtBc_6script10ScriptBodyNtB1I_14ScriptMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction14update_outputsNtNtB2v_8balances15RuntimeBalancesE00B2x_
Unexecuted instantiation: _RNCNCINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtBc_6upload10UploadBodyNtB1I_14UploadMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction14update_outputsNtNtB2v_8balances15RuntimeBalancesE00B2x_
Unexecuted instantiation: _RNCNCINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtBc_7upgrade11UpgradeBodyNtB1I_15UpgradeMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction14update_outputsNtNtB2y_8balances15RuntimeBalancesE00B2A_
503
0
                .ok_or(ValidityError::BalanceOverflow),
504
505
            // If revert, reset any non-base asset to its initial balance
506
            Output::Change {
507
2.19k
                asset_id, amount, ..
508
2.16k
            } if revert => {
509
2.16k
                *amount = initial_balances.non_retryable[asset_id];
510
2.16k
                Ok(())
511
            }
512
513
            // The change for the base asset will be the available balance + unused gas
514
            Output::Change {
515
27
                asset_id, amount, ..
516
27
            } if asset_id == base_asset_id => balances[asset_id]
517
0
                .checked_add(gas_refund)
518
0
                .map(|v| *amount = v)
Unexecuted instantiation: _RNCNCINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtBc_4blob8BlobBodyNtB1I_12BlobMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction14update_outputsNtNtB2o_8balances15RuntimeBalancesE0s_0B2q_
Unexecuted instantiation: _RNCNCINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtBc_6create10CreateBodyNtB1I_14CreateMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction14update_outputsNtNtB2v_8balances15RuntimeBalancesE0s_0B2x_
Unexecuted instantiation: _RNCNCINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtBc_6script10ScriptBodyNtB1I_14ScriptMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction14update_outputsNtNtB2v_8balances15RuntimeBalancesE0s_0B2x_
Unexecuted instantiation: _RNCNCINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtBc_6upload10UploadBodyNtB1I_14UploadMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction14update_outputsNtNtB2v_8balances15RuntimeBalancesE0s_0B2x_
Unexecuted instantiation: _RNCNCINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtBc_7upgrade11UpgradeBodyNtB1I_15UpgradeMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction14update_outputsNtNtB2y_8balances15RuntimeBalancesE0s_0B2A_
519
0
                .ok_or(ValidityError::BalanceOverflow),
520
521
            // Set changes to the remainder provided balances
522
            Output::Change {
523
27
                asset_id, amount, ..
524
27
            } => {
525
27
                *amount = balances[asset_id];
526
27
                Ok(())
527
            }
528
529
            // If revert, zeroes all variable output values
530
0
            Output::Variable { amount, .. } if revert => {
531
0
                *amount = 0;
532
0
                Ok(())
533
            }
534
535
            // Other outputs are unaffected
536
4.38k
            _ => Ok(()),
537
6.57k
        })
Unexecuted instantiation: _RNCINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtBa_4blob8BlobBodyNtB1G_12BlobMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction14update_outputsNtNtB2m_8balances15RuntimeBalancesE0B2o_
_RNCINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtBa_6create10CreateBodyNtB1G_14CreateMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction14update_outputsNtNtB2t_8balances15RuntimeBalancesE0B2v_
Line
Count
Source
493
2.19k
        self.outputs_mut().iter_mut().try_for_each(|o| match o {
494
            // If revert, set base asset to initial balance and refund unused gas
495
            //
496
            // Note: the initial balance deducts the gas limit from base asset
497
            Output::Change {
498
0
                asset_id, amount, ..
499
0
            } if revert && asset_id == base_asset_id => initial_balances.non_retryable
500
0
                [base_asset_id]
501
0
                .checked_add(gas_refund)
502
0
                .map(|v| *amount = v)
503
0
                .ok_or(ValidityError::BalanceOverflow),
504
505
            // If revert, reset any non-base asset to its initial balance
506
            Output::Change {
507
0
                asset_id, amount, ..
508
0
            } if revert => {
509
0
                *amount = initial_balances.non_retryable[asset_id];
510
0
                Ok(())
511
            }
512
513
            // The change for the base asset will be the available balance + unused gas
514
            Output::Change {
515
0
                asset_id, amount, ..
516
0
            } if asset_id == base_asset_id => balances[asset_id]
517
0
                .checked_add(gas_refund)
518
0
                .map(|v| *amount = v)
519
0
                .ok_or(ValidityError::BalanceOverflow),
520
521
            // Set changes to the remainder provided balances
522
            Output::Change {
523
0
                asset_id, amount, ..
524
0
            } => {
525
0
                *amount = balances[asset_id];
526
0
                Ok(())
527
            }
528
529
            // If revert, zeroes all variable output values
530
0
            Output::Variable { amount, .. } if revert => {
531
0
                *amount = 0;
532
0
                Ok(())
533
            }
534
535
            // Other outputs are unaffected
536
2.19k
            _ => Ok(()),
537
2.19k
        })
_RNCINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtBa_6script10ScriptBodyNtB1G_14ScriptMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction14update_outputsNtNtB2t_8balances15RuntimeBalancesE0B2v_
Line
Count
Source
493
4.38k
        self.outputs_mut().iter_mut().try_for_each(|o| match o {
494
            // If revert, set base asset to initial balance and refund unused gas
495
            //
496
            // Note: the initial balance deducts the gas limit from base asset
497
            Output::Change {
498
2.19k
                asset_id, amount, ..
499
2.19k
            } if revert && asset_id == base_asset_id => initial_balances.non_retryable
500
0
                [base_asset_id]
501
0
                .checked_add(gas_refund)
502
0
                .map(|v| *amount = v)
503
0
                .ok_or(ValidityError::BalanceOverflow),
504
505
            // If revert, reset any non-base asset to its initial balance
506
            Output::Change {
507
2.19k
                asset_id, amount, ..
508
2.16k
            } if revert => {
509
2.16k
                *amount = initial_balances.non_retryable[asset_id];
510
2.16k
                Ok(())
511
            }
512
513
            // The change for the base asset will be the available balance + unused gas
514
            Output::Change {
515
27
                asset_id, amount, ..
516
27
            } if asset_id == base_asset_id => balances[asset_id]
517
0
                .checked_add(gas_refund)
518
0
                .map(|v| *amount = v)
519
0
                .ok_or(ValidityError::BalanceOverflow),
520
521
            // Set changes to the remainder provided balances
522
            Output::Change {
523
27
                asset_id, amount, ..
524
27
            } => {
525
27
                *amount = balances[asset_id];
526
27
                Ok(())
527
            }
528
529
            // If revert, zeroes all variable output values
530
0
            Output::Variable { amount, .. } if revert => {
531
0
                *amount = 0;
532
0
                Ok(())
533
            }
534
535
            // Other outputs are unaffected
536
2.19k
            _ => Ok(()),
537
4.38k
        })
Unexecuted instantiation: _RNCINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtBa_6upload10UploadBodyNtB1G_14UploadMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction14update_outputsNtNtB2t_8balances15RuntimeBalancesE0B2v_
Unexecuted instantiation: _RNCINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtBa_7upgrade11UpgradeBodyNtB1G_15UpgradeMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction14update_outputsNtNtB2w_8balances15RuntimeBalancesE0B2y_
538
4.38k
    }
Unexecuted instantiation: _RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB8_4blob8BlobBodyNtB1E_12BlobMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction14update_outputsNtNtB2k_8balances15RuntimeBalancesEB2m_
_RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB8_6create10CreateBodyNtB1E_14CreateMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction14update_outputsNtNtB2r_8balances15RuntimeBalancesEB2t_
Line
Count
Source
475
2.19k
    fn update_outputs<I>(
476
2.19k
        &mut self,
477
2.19k
        revert: bool,
478
2.19k
        used_gas: Word,
479
2.19k
        initial_balances: &InitialBalances,
480
2.19k
        balances: &I,
481
2.19k
        gas_costs: &GasCosts,
482
2.19k
        fee_params: &FeeParameters,
483
2.19k
        base_asset_id: &AssetId,
484
2.19k
        gas_price: Word,
485
2.19k
    ) -> Result<(), ValidityError>
486
2.19k
    where
487
2.19k
        I: for<'a> Index<&'a AssetId, Output = Word>,
488
2.19k
    {
489
2.19k
        let gas_refund = self
490
2.19k
            .refund_fee(gas_costs, fee_params, used_gas, gas_price)
491
2.19k
            .ok_or(ValidityError::GasCostsCoinsOverflow)?;
492
493
2.19k
        self.outputs_mut().iter_mut().try_for_each(|o| match o {
494
            // If revert, set base asset to initial balance and refund unused gas
495
            //
496
            // Note: the initial balance deducts the gas limit from base asset
497
            Output::Change {
498
                asset_id, amount, ..
499
            } if revert && asset_id == base_asset_id => initial_balances.non_retryable
500
                [base_asset_id]
501
                .checked_add(gas_refund)
502
                .map(|v| *amount = v)
503
                .ok_or(ValidityError::BalanceOverflow),
504
505
            // If revert, reset any non-base asset to its initial balance
506
            Output::Change {
507
                asset_id, amount, ..
508
            } if revert => {
509
                *amount = initial_balances.non_retryable[asset_id];
510
                Ok(())
511
            }
512
513
            // The change for the base asset will be the available balance + unused gas
514
            Output::Change {
515
                asset_id, amount, ..
516
            } if asset_id == base_asset_id => balances[asset_id]
517
                .checked_add(gas_refund)
518
                .map(|v| *amount = v)
519
                .ok_or(ValidityError::BalanceOverflow),
520
521
            // Set changes to the remainder provided balances
522
            Output::Change {
523
                asset_id, amount, ..
524
            } => {
525
                *amount = balances[asset_id];
526
                Ok(())
527
            }
528
529
            // If revert, zeroes all variable output values
530
            Output::Variable { amount, .. } if revert => {
531
                *amount = 0;
532
                Ok(())
533
            }
534
535
            // Other outputs are unaffected
536
            _ => Ok(()),
537
2.19k
        })
538
2.19k
    }
_RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB8_6script10ScriptBodyNtB1E_14ScriptMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction14update_outputsNtNtB2r_8balances15RuntimeBalancesEB2t_
Line
Count
Source
475
2.19k
    fn update_outputs<I>(
476
2.19k
        &mut self,
477
2.19k
        revert: bool,
478
2.19k
        used_gas: Word,
479
2.19k
        initial_balances: &InitialBalances,
480
2.19k
        balances: &I,
481
2.19k
        gas_costs: &GasCosts,
482
2.19k
        fee_params: &FeeParameters,
483
2.19k
        base_asset_id: &AssetId,
484
2.19k
        gas_price: Word,
485
2.19k
    ) -> Result<(), ValidityError>
486
2.19k
    where
487
2.19k
        I: for<'a> Index<&'a AssetId, Output = Word>,
488
2.19k
    {
489
2.19k
        let gas_refund = self
490
2.19k
            .refund_fee(gas_costs, fee_params, used_gas, gas_price)
491
2.19k
            .ok_or(ValidityError::GasCostsCoinsOverflow)?;
492
493
2.19k
        self.outputs_mut().iter_mut().try_for_each(|o| match o {
494
            // If revert, set base asset to initial balance and refund unused gas
495
            //
496
            // Note: the initial balance deducts the gas limit from base asset
497
            Output::Change {
498
                asset_id, amount, ..
499
            } if revert && asset_id == base_asset_id => initial_balances.non_retryable
500
                [base_asset_id]
501
                .checked_add(gas_refund)
502
                .map(|v| *amount = v)
503
                .ok_or(ValidityError::BalanceOverflow),
504
505
            // If revert, reset any non-base asset to its initial balance
506
            Output::Change {
507
                asset_id, amount, ..
508
            } if revert => {
509
                *amount = initial_balances.non_retryable[asset_id];
510
                Ok(())
511
            }
512
513
            // The change for the base asset will be the available balance + unused gas
514
            Output::Change {
515
                asset_id, amount, ..
516
            } if asset_id == base_asset_id => balances[asset_id]
517
                .checked_add(gas_refund)
518
                .map(|v| *amount = v)
519
                .ok_or(ValidityError::BalanceOverflow),
520
521
            // Set changes to the remainder provided balances
522
            Output::Change {
523
                asset_id, amount, ..
524
            } => {
525
                *amount = balances[asset_id];
526
                Ok(())
527
            }
528
529
            // If revert, zeroes all variable output values
530
            Output::Variable { amount, .. } if revert => {
531
                *amount = 0;
532
                Ok(())
533
            }
534
535
            // Other outputs are unaffected
536
            _ => Ok(()),
537
2.19k
        })
538
2.19k
    }
Unexecuted instantiation: _RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB8_6upload10UploadBodyNtB1E_14UploadMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction14update_outputsNtNtB2r_8balances15RuntimeBalancesEB2t_
Unexecuted instantiation: _RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB8_7upgrade11UpgradeBodyNtB1E_15UpgradeMetadataENtNtCsg6P9hFxt0iW_7fuel_vm11interpreter21ExecutableTransaction14update_outputsNtNtB2u_8balances15RuntimeBalancesEB2w_
539
}
540
541
impl ExecutableTransaction for Create {
542
0
    fn as_create(&self) -> Option<&Create> {
543
0
        Some(self)
544
0
    }
545
546
2.19k
    fn as_create_mut(&mut self) -> Option<&mut Create> {
547
2.19k
        Some(self)
548
2.19k
    }
549
550
0
    fn transaction_type() -> Word {
551
0
        TransactionRepr::Create as Word
552
0
    }
553
}
554
555
impl ExecutableTransaction for Script {
556
1.27M
    fn as_script(&self) -> Option<&Script> {
557
1.27M
        Some(self)
558
1.27M
    }
559
560
2.19k
    fn as_script_mut(&mut self) -> Option<&mut Script> {
561
2.19k
        Some(self)
562
2.19k
    }
563
564
83.3k
    fn transaction_type() -> Word {
565
83.3k
        TransactionRepr::Script as Word
566
83.3k
    }
567
}
568
569
impl ExecutableTransaction for Upgrade {
570
0
    fn as_upgrade(&self) -> Option<&Upgrade> {
571
0
        Some(self)
572
0
    }
573
574
0
    fn as_upgrade_mut(&mut self) -> Option<&mut Upgrade> {
575
0
        Some(self)
576
0
    }
577
578
0
    fn transaction_type() -> Word {
579
0
        TransactionRepr::Upgrade as Word
580
0
    }
581
}
582
583
impl ExecutableTransaction for Upload {
584
0
    fn as_upload(&self) -> Option<&Upload> {
585
0
        Some(self)
586
0
    }
587
588
0
    fn as_upload_mut(&mut self) -> Option<&mut Upload> {
589
0
        Some(self)
590
0
    }
591
592
0
    fn transaction_type() -> Word {
593
0
        TransactionRepr::Upload as Word
594
0
    }
595
}
596
597
impl ExecutableTransaction for Blob {
598
0
    fn as_blob(&self) -> Option<&Blob> {
599
0
        Some(self)
600
0
    }
601
602
0
    fn as_blob_mut(&mut self) -> Option<&mut Blob> {
603
0
        Some(self)
604
0
    }
605
606
0
    fn transaction_type() -> Word {
607
0
        TransactionRepr::Blob as Word
608
0
    }
609
}
610
611
/// The initial balances of the transaction.
612
#[derive(Default, Debug, Clone, Eq, PartialEq, Hash)]
613
pub struct InitialBalances {
614
    /// See [`NonRetryableFreeBalances`].
615
    pub non_retryable: NonRetryableFreeBalances,
616
    /// See [`RetryableAmount`].
617
    pub retryable: Option<RetryableAmount>,
618
}
619
620
/// Methods that should be implemented by the checked metadata of supported transactions.
621
pub trait CheckedMetadata {
622
    /// Returns the initial balances from the checked metadata of the transaction.
623
    fn balances(&self) -> InitialBalances;
624
}
625
626
impl CheckedMetadata for ScriptCheckedMetadata {
627
4.38k
    fn balances(&self) -> InitialBalances {
628
4.38k
        InitialBalances {
629
4.38k
            non_retryable: self.non_retryable_balances.clone(),
630
4.38k
            retryable: Some(self.retryable_balance),
631
4.38k
        }
632
4.38k
    }
633
}
634
635
impl CheckedMetadata for CreateCheckedMetadata {
636
4.38k
    fn balances(&self) -> InitialBalances {
637
4.38k
        InitialBalances {
638
4.38k
            non_retryable: self.free_balances.clone(),
639
4.38k
            retryable: None,
640
4.38k
        }
641
4.38k
    }
642
}
643
644
impl CheckedMetadata for UpgradeCheckedMetadata {
645
0
    fn balances(&self) -> InitialBalances {
646
0
        InitialBalances {
647
0
            non_retryable: self.free_balances.clone(),
648
0
            retryable: None,
649
0
        }
650
0
    }
651
}
652
653
impl CheckedMetadata for UploadCheckedMetadata {
654
0
    fn balances(&self) -> InitialBalances {
655
0
        InitialBalances {
656
0
            non_retryable: self.free_balances.clone(),
657
0
            retryable: None,
658
0
        }
659
0
    }
660
}
661
662
impl CheckedMetadata for BlobCheckedMetadata {
663
0
    fn balances(&self) -> InitialBalances {
664
0
        InitialBalances {
665
0
            non_retryable: self.free_balances.clone(),
666
0
            retryable: None,
667
0
        }
668
0
    }
669
}
670
671
pub(crate) struct InputContracts<'vm> {
672
    input_contracts: &'vm alloc::collections::BTreeSet<ContractId>,
673
    panic_context: &'vm mut PanicContext,
674
}
675
676
impl<'vm> InputContracts<'vm> {
677
609k
    pub fn new(
678
609k
        input_contracts: &'vm alloc::collections::BTreeSet<ContractId>,
679
609k
        panic_context: &'vm mut PanicContext,
680
609k
    ) -> Self {
681
609k
        Self {
682
609k
            input_contracts,
683
609k
            panic_context,
684
609k
        }
685
609k
    }
686
687
    /// Checks that the contract is declared in the transaction inputs.
688
380k
    pub fn check(&mut self, contract: &ContractId) -> SimpleResult<()> {
689
380k
        if !self.input_contracts.contains(contract) {
690
17
            *self.panic_context = PanicContext::ContractId(*contract);
691
17
            Err(PanicReason::ContractNotInInputs.into())
692
        } else {
693
380k
            Ok(())
694
        }
695
380k
    }
696
}
/home/marten/fuel/fuel-vm/fuel-vm/src/checked_transaction/builder.rs
Line
Count
Source
1
//! Extension trait for [`fuel_tx::TransactionBuilder`]
2
3
use super::{
4
    Checked,
5
    IntoChecked,
6
};
7
use crate::{
8
    checked_transaction::CheckPredicates,
9
    prelude::*,
10
    storage::predicate::PredicateStorageRequirements,
11
};
12
use fuel_tx::{
13
    Finalizable,
14
    TransactionBuilder,
15
};
16
use fuel_types::BlockHeight;
17
18
/// Extension trait for [`fuel_tx::TransactionBuilder`] adding finalization methods
19
pub trait TransactionBuilderExt<Tx>
20
where
21
    Tx: IntoChecked,
22
{
23
    /// Finalize the builder into a [`Checked<Tx>`] of the correct type
24
    fn finalize_checked(&self, height: BlockHeight) -> Checked<Tx>;
25
26
    /// Finalize the builder into a [`Checked<Tx>`] of the correct type
27
    /// using the storage during verification.
28
    fn finalize_checked_with_storage(
29
        &self,
30
        height: BlockHeight,
31
        storage: &impl PredicateStorageRequirements,
32
    ) -> Checked<Tx>;
33
34
    /// Finalize the builder into a [`Checked<Tx>`] of the correct type, with basic checks
35
    /// only
36
    fn finalize_checked_basic(&self, height: BlockHeight) -> Checked<Tx>;
37
}
38
39
impl<Tx: ExecutableTransaction> TransactionBuilderExt<Tx> for TransactionBuilder<Tx>
40
where
41
    Self: Finalizable<Tx>,
42
    Checked<Tx>: CheckPredicates,
43
{
44
0
    fn finalize_checked(&self, height: BlockHeight) -> Checked<Tx> {
45
0
        self.finalize()
46
0
            .into_checked(height, self.get_params())
47
0
            .expect("failed to check tx")
48
0
    }
Unexecuted instantiation: _RNvXNtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction7builderINtNtCseSMGV7FMBK4_7fuel_tx7builder18TransactionBuilderINtNtNtNtB10_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1T_6create10CreateBodyNtB37_14CreateMetadataEEINtB2_21TransactionBuilderExtB1O_E16finalize_checkedB6_
Unexecuted instantiation: _RNvXNtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction7builderINtNtCseSMGV7FMBK4_7fuel_tx7builder18TransactionBuilderINtNtNtNtB10_11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1T_6script10ScriptBodyNtB37_14ScriptMetadataEEINtB2_21TransactionBuilderExtB1O_E16finalize_checkedB6_
49
50
2.19k
    fn finalize_checked_with_storage(
51
2.19k
        &self,
52
2.19k
        height: BlockHeight,
53
2.19k
        storage: &impl PredicateStorageRequirements,
54
2.19k
    ) -> Checked<Tx> {
55
2.19k
        self.finalize()
56
2.19k
            .into_checked_reusable_memory(
57
2.19k
                height,
58
2.19k
                self.get_params(),
59
2.19k
                MemoryInstance::new(),
60
2.19k
                storage,
61
2.19k
            )
62
2.19k
            .expect("failed to check tx")
63
2.19k
    }
64
65
0
    fn finalize_checked_basic(&self, height: BlockHeight) -> Checked<Tx> {
66
0
        self.finalize()
67
0
            .into_checked_basic(height, self.get_params())
68
0
            .expect("failed to check tx")
69
0
    }
70
}
/home/marten/fuel/fuel-vm/fuel-vm/src/checked_transaction/types.rs
Line
Count
Source
1
//! Implementation for different transaction types, groupd in submodules.
2
3
pub use self::{
4
    blob::CheckedMetadata as BlobCheckedMetadata,
5
    create::CheckedMetadata as CreateCheckedMetadata,
6
    script::CheckedMetadata as ScriptCheckedMetadata,
7
    upgrade::CheckedMetadata as UpgradeCheckedMetadata,
8
    upload::CheckedMetadata as UploadCheckedMetadata,
9
};
10
use alloc::collections::BTreeMap;
11
use fuel_types::{
12
    AssetId,
13
    Word,
14
};
15
16
/// The spendable unrestricted initial assets.
17
/// More information about it in the specification:
18
/// <https://github.com/FuelLabs/fuel-specs/blob/master/src/protocol/tx-validity.md#sufficient-balance>
19
#[derive(Default, Debug, Clone, Eq, PartialEq, Hash)]
20
pub struct NonRetryableFreeBalances(pub(crate) BTreeMap<AssetId, Word>);
21
22
impl From<NonRetryableFreeBalances> for BTreeMap<AssetId, Word> {
23
6.57k
    fn from(value: NonRetryableFreeBalances) -> Self {
24
6.57k
        value.0
25
6.57k
    }
26
}
27
28
impl core::ops::Deref for NonRetryableFreeBalances {
29
    type Target = BTreeMap<AssetId, Word>;
30
31
2.16k
    fn deref(&self) -> &Self::Target {
32
2.16k
        &self.0
33
2.16k
    }
34
}
35
36
/// The spendable only during execution [`AssetId::BASE`] asset.
37
/// More information about it in the specification:
38
/// <https://github.com/FuelLabs/fuel-specs/blob/master/src/protocol/tx-validity.md#sufficient-balance>
39
#[derive(Default, Debug, Copy, Clone, Eq, PartialEq, Hash)]
40
pub struct RetryableAmount {
41
    pub(crate) amount: Word,
42
    pub(crate) base_asset_id: AssetId,
43
}
44
45
impl From<RetryableAmount> for Word {
46
0
    fn from(value: RetryableAmount) -> Self {
47
0
        value.amount
48
0
    }
49
}
50
51
impl core::ops::Deref for RetryableAmount {
52
    type Target = Word;
53
54
0
    fn deref(&self) -> &Self::Target {
55
0
        &self.amount
56
0
    }
57
}
58
59
/// For [`fuel_tx::Create`]
60
pub mod create {
61
    use super::super::{
62
        balances::{
63
            initial_free_balances,
64
            AvailableBalances,
65
        },
66
        Checked,
67
        IntoChecked,
68
    };
69
    use crate::checked_transaction::{
70
        CheckError,
71
        NonRetryableFreeBalances,
72
    };
73
    use fuel_tx::{
74
        Cacheable,
75
        Chargeable,
76
        ConsensusParameters,
77
        Create,
78
        FormatValidityChecks,
79
    };
80
    use fuel_types::{
81
        AssetId,
82
        BlockHeight,
83
    };
84
85
    /// Metadata produced by checking [`fuel_tx::Create`].
86
    #[derive(Debug, Clone, Eq, PartialEq, Hash)]
87
    pub struct CheckedMetadata {
88
        /// The base asset id.
89
        pub base_asset_id: AssetId,
90
        /// See [`NonRetryableFreeBalances`].
91
        pub free_balances: NonRetryableFreeBalances,
92
        /// The block height this tx was verified with
93
        pub block_height: BlockHeight,
94
        /// The minimum gas required for this transaction.
95
        pub min_gas: u64,
96
        /// The maximum gas required for this transaction.
97
        pub max_gas: u64,
98
    }
99
100
    impl IntoChecked for Create {
101
        type Metadata = CheckedMetadata;
102
103
2.19k
        fn into_checked_basic(
104
2.19k
            mut self,
105
2.19k
            block_height: BlockHeight,
106
2.19k
            consensus_params: &ConsensusParameters,
107
2.19k
        ) -> Result<Checked<Self>, CheckError> {
108
2.19k
            let chain_id = consensus_params.chain_id();
109
2.19k
            self.precompute(&chain_id)?;
110
2.19k
            self.check_without_signatures(block_height, consensus_params)?;
111
112
            // validate fees and compute free balances
113
            let AvailableBalances {
114
2.19k
                non_retryable_balances,
115
2.19k
                retryable_balance,
116
2.19k
            } = initial_free_balances(&self, consensus_params.base_asset_id())?;
117
2.19k
            debug_assert_eq!(
118
                retryable_balance, 0,
119
0
                "The `check_without_signatures` should return `TransactionInputContainsMessageData` above"
120
            );
121
122
2.19k
            let metadata = CheckedMetadata {
123
2.19k
                base_asset_id: *consensus_params.base_asset_id(),
124
2.19k
                free_balances: NonRetryableFreeBalances(non_retryable_balances),
125
2.19k
                block_height,
126
2.19k
                min_gas: self
127
2.19k
                    .min_gas(consensus_params.gas_costs(), consensus_params.fee_params()),
128
2.19k
                max_gas: self
129
2.19k
                    .max_gas(consensus_params.gas_costs(), consensus_params.fee_params()),
130
2.19k
            };
131
2.19k
132
2.19k
            Ok(Checked::basic(self, metadata))
133
2.19k
        }
134
    }
135
}
136
137
/// For [`fuel_tx::Mint`]
138
pub mod mint {
139
    use super::super::{
140
        Checked,
141
        IntoChecked,
142
    };
143
    use crate::checked_transaction::CheckError;
144
    use fuel_tx::{
145
        Cacheable,
146
        ConsensusParameters,
147
        FormatValidityChecks,
148
        Mint,
149
    };
150
    use fuel_types::BlockHeight;
151
152
    impl IntoChecked for Mint {
153
        type Metadata = ();
154
155
0
        fn into_checked_basic(
156
0
            mut self,
157
0
            block_height: BlockHeight,
158
0
            consensus_params: &ConsensusParameters,
159
0
        ) -> Result<Checked<Self>, CheckError> {
160
0
            let chain_id = consensus_params.chain_id();
161
0
            self.precompute(&chain_id)?;
162
0
            self.check_without_signatures(block_height, consensus_params)?;
163
164
0
            Ok(Checked::basic(self, ()))
165
0
        }
166
    }
167
}
168
169
/// For [`fuel_tx::Script`]
170
pub mod script {
171
    use super::super::{
172
        balances::{
173
            initial_free_balances,
174
            AvailableBalances,
175
        },
176
        Checked,
177
        IntoChecked,
178
    };
179
    use crate::checked_transaction::{
180
        CheckError,
181
        NonRetryableFreeBalances,
182
        RetryableAmount,
183
    };
184
    use fuel_tx::{
185
        Cacheable,
186
        Chargeable,
187
        ConsensusParameters,
188
        FormatValidityChecks,
189
        Script,
190
    };
191
    use fuel_types::{
192
        AssetId,
193
        BlockHeight,
194
    };
195
196
    /// Metadata produced by checking [`fuel_tx::Script`].
197
    #[derive(Debug, Clone, Eq, PartialEq, Hash)]
198
    pub struct CheckedMetadata {
199
        /// The base asset id.
200
        pub base_asset_id: AssetId,
201
        /// See [`NonRetryableFreeBalances`].
202
        pub non_retryable_balances: NonRetryableFreeBalances,
203
        /// See [`RetryableAmount`].
204
        pub retryable_balance: RetryableAmount,
205
        /// The block height this tx was verified with
206
        pub block_height: BlockHeight,
207
        /// The minimum gas required for this transaction.
208
        pub min_gas: u64,
209
        /// The maximum gas required for this transaction.
210
        pub max_gas: u64,
211
    }
212
213
    impl IntoChecked for Script {
214
        type Metadata = CheckedMetadata;
215
216
2.19k
        fn into_checked_basic(
217
2.19k
            mut self,
218
2.19k
            block_height: BlockHeight,
219
2.19k
            consensus_params: &ConsensusParameters,
220
2.19k
        ) -> Result<Checked<Self>, CheckError> {
221
2.19k
            let chain_id = consensus_params.chain_id();
222
2.19k
            self.precompute(&chain_id)?;
223
2.19k
            self.check_without_signatures(block_height, consensus_params)?;
224
225
            // validate fees and compute free balances
226
            let AvailableBalances {
227
2.19k
                non_retryable_balances,
228
2.19k
                retryable_balance,
229
2.19k
            } = initial_free_balances(&self, consensus_params.base_asset_id())?;
230
231
2.19k
            let metadata = CheckedMetadata {
232
2.19k
                base_asset_id: *consensus_params.base_asset_id(),
233
2.19k
                non_retryable_balances: NonRetryableFreeBalances(non_retryable_balances),
234
2.19k
                retryable_balance: RetryableAmount {
235
2.19k
                    amount: retryable_balance,
236
2.19k
                    base_asset_id: *consensus_params.base_asset_id(),
237
2.19k
                },
238
2.19k
                block_height,
239
2.19k
                min_gas: self
240
2.19k
                    .min_gas(consensus_params.gas_costs(), consensus_params.fee_params()),
241
2.19k
                max_gas: self
242
2.19k
                    .max_gas(consensus_params.gas_costs(), consensus_params.fee_params()),
243
2.19k
            };
244
2.19k
245
2.19k
            Ok(Checked::basic(self, metadata))
246
2.19k
        }
247
    }
248
}
249
250
/// For [`fuel_tx::Upgrade`]
251
pub mod upgrade {
252
    use super::super::{
253
        balances::{
254
            initial_free_balances,
255
            AvailableBalances,
256
        },
257
        Checked,
258
        IntoChecked,
259
    };
260
    use crate::checked_transaction::{
261
        CheckError,
262
        NonRetryableFreeBalances,
263
    };
264
    use fuel_tx::{
265
        Cacheable,
266
        Chargeable,
267
        ConsensusParameters,
268
        FormatValidityChecks,
269
        Upgrade,
270
    };
271
    use fuel_types::{
272
        AssetId,
273
        BlockHeight,
274
    };
275
276
    /// Metadata produced by checking [`fuel_tx::Upgrade`].
277
    #[derive(Debug, Clone, Eq, PartialEq, Hash)]
278
    pub struct CheckedMetadata {
279
        /// The base asset id.
280
        pub base_asset_id: AssetId,
281
        /// See [`NonRetryableFreeBalances`].
282
        pub free_balances: NonRetryableFreeBalances,
283
        /// The block height this tx was verified with
284
        pub block_height: BlockHeight,
285
        /// The minimum gas required for this transaction.
286
        pub min_gas: u64,
287
        /// The maximum gas required for this transaction.
288
        pub max_gas: u64,
289
    }
290
291
    impl IntoChecked for Upgrade {
292
        type Metadata = CheckedMetadata;
293
294
0
        fn into_checked_basic(
295
0
            mut self,
296
0
            block_height: BlockHeight,
297
0
            consensus_params: &ConsensusParameters,
298
0
        ) -> Result<Checked<Self>, CheckError> {
299
0
            let chain_id = consensus_params.chain_id();
300
0
            self.precompute(&chain_id)?;
301
0
            self.check_without_signatures(block_height, consensus_params)?;
302
303
            // validate fees and compute free balances
304
            let AvailableBalances {
305
0
                non_retryable_balances,
306
0
                retryable_balance,
307
0
            } = initial_free_balances(&self, consensus_params.base_asset_id())?;
308
0
            debug_assert_eq!(
309
                retryable_balance, 0,
310
0
                "The `check_without_signatures` should return `TransactionInputContainsMessageData` above"
311
            );
312
313
0
            let metadata = CheckedMetadata {
314
0
                base_asset_id: *consensus_params.base_asset_id(),
315
0
                free_balances: NonRetryableFreeBalances(non_retryable_balances),
316
0
                block_height,
317
0
                min_gas: self
318
0
                    .min_gas(consensus_params.gas_costs(), consensus_params.fee_params()),
319
0
                max_gas: self
320
0
                    .max_gas(consensus_params.gas_costs(), consensus_params.fee_params()),
321
0
            };
322
0
323
0
            Ok(Checked::basic(self, metadata))
324
0
        }
325
    }
326
}
327
328
/// For [`fuel_tx::Upload`]
329
pub mod upload {
330
    use super::super::{
331
        balances::{
332
            initial_free_balances,
333
            AvailableBalances,
334
        },
335
        Checked,
336
        IntoChecked,
337
    };
338
    use crate::checked_transaction::{
339
        CheckError,
340
        NonRetryableFreeBalances,
341
    };
342
    use fuel_tx::{
343
        Cacheable,
344
        Chargeable,
345
        ConsensusParameters,
346
        FormatValidityChecks,
347
        Upload,
348
    };
349
    use fuel_types::{
350
        AssetId,
351
        BlockHeight,
352
    };
353
354
    /// Metadata produced by checking [`fuel_tx::Upload`].
355
    #[derive(Debug, Clone, Eq, PartialEq, Hash)]
356
    pub struct CheckedMetadata {
357
        /// The base asset id.
358
        pub base_asset_id: AssetId,
359
        /// See [`NonRetryableFreeBalances`].
360
        pub free_balances: NonRetryableFreeBalances,
361
        /// The block height this tx was verified with
362
        pub block_height: BlockHeight,
363
        /// The minimum gas required for this transaction.
364
        pub min_gas: u64,
365
        /// The maximum gas required for this transaction.
366
        pub max_gas: u64,
367
    }
368
369
    impl IntoChecked for Upload {
370
        type Metadata = CheckedMetadata;
371
372
0
        fn into_checked_basic(
373
0
            mut self,
374
0
            block_height: BlockHeight,
375
0
            consensus_params: &ConsensusParameters,
376
0
        ) -> Result<Checked<Self>, CheckError> {
377
0
            let chain_id = consensus_params.chain_id();
378
0
            self.precompute(&chain_id)?;
379
0
            self.check_without_signatures(block_height, consensus_params)?;
380
381
            // validate fees and compute free balances
382
            let AvailableBalances {
383
0
                non_retryable_balances,
384
0
                retryable_balance,
385
0
            } = initial_free_balances(&self, consensus_params.base_asset_id())?;
386
0
            debug_assert_eq!(
387
                retryable_balance, 0,
388
0
                "The `check_without_signatures` should return `TransactionInputContainsMessageData` above"
389
            );
390
391
0
            let metadata = CheckedMetadata {
392
0
                base_asset_id: *consensus_params.base_asset_id(),
393
0
                free_balances: NonRetryableFreeBalances(non_retryable_balances),
394
0
                block_height,
395
0
                min_gas: self
396
0
                    .min_gas(consensus_params.gas_costs(), consensus_params.fee_params()),
397
0
                max_gas: self
398
0
                    .max_gas(consensus_params.gas_costs(), consensus_params.fee_params()),
399
0
            };
400
0
401
0
            Ok(Checked::basic(self, metadata))
402
0
        }
403
    }
404
}
405
406
/// For [`fuel_tx::Blob`]
407
pub mod blob {
408
    use super::super::{
409
        balances::{
410
            initial_free_balances,
411
            AvailableBalances,
412
        },
413
        Checked,
414
        IntoChecked,
415
    };
416
    use crate::checked_transaction::{
417
        CheckError,
418
        NonRetryableFreeBalances,
419
    };
420
    use fuel_tx::{
421
        AssetId,
422
        Blob,
423
        Cacheable,
424
        Chargeable,
425
        ConsensusParameters,
426
        FormatValidityChecks,
427
    };
428
    use fuel_types::BlockHeight;
429
430
    /// Metadata produced by checking [`fuel_tx::Blob`].
431
    #[derive(Debug, Clone, Eq, PartialEq, Hash)]
432
    pub struct CheckedMetadata {
433
        /// The base asset id.
434
        pub base_asset_id: AssetId,
435
        /// See [`NonRetryableFreeBalances`].
436
        pub free_balances: NonRetryableFreeBalances,
437
        /// The block height this tx was verified with
438
        pub block_height: BlockHeight,
439
        /// The minimum gas required for this transaction.
440
        pub min_gas: u64,
441
        /// The maximum gas required for this transaction.
442
        pub max_gas: u64,
443
    }
444
445
    impl IntoChecked for Blob {
446
        type Metadata = CheckedMetadata;
447
448
0
        fn into_checked_basic(
449
0
            mut self,
450
0
            block_height: BlockHeight,
451
0
            consensus_params: &ConsensusParameters,
452
0
        ) -> Result<Checked<Self>, CheckError> {
453
0
            let chain_id = consensus_params.chain_id();
454
0
            self.precompute(&chain_id)?;
455
0
            self.check_without_signatures(block_height, consensus_params)?;
456
457
            // validate fees and compute free balances
458
            let AvailableBalances {
459
0
                non_retryable_balances,
460
0
                retryable_balance,
461
0
            } = initial_free_balances(&self, consensus_params.base_asset_id())?;
462
0
            debug_assert_eq!(
463
                retryable_balance, 0,
464
0
                "The `check_without_signatures` should return `TransactionInputContainsMessageData` above"
465
            );
466
467
0
            let metadata = CheckedMetadata {
468
0
                base_asset_id: *consensus_params.base_asset_id(),
469
0
                free_balances: NonRetryableFreeBalances(non_retryable_balances),
470
0
                block_height,
471
0
                min_gas: self
472
0
                    .min_gas(consensus_params.gas_costs(), consensus_params.fee_params()),
473
0
                max_gas: self
474
0
                    .max_gas(consensus_params.gas_costs(), consensus_params.fee_params()),
475
0
            };
476
0
477
0
            Ok(Checked::basic(self, metadata))
478
0
        }
479
    }
480
}
/home/marten/fuel/fuel-vm/fuel-vm/src/checked_transaction/balances.rs
Line
Count
Source
1
use fuel_tx::{
2
    field,
3
    input::{
4
        coin::{
5
            CoinPredicate,
6
            CoinSigned,
7
        },
8
        message::{
9
            MessageCoinPredicate,
10
            MessageCoinSigned,
11
            MessageDataPredicate,
12
            MessageDataSigned,
13
        },
14
    },
15
    Chargeable,
16
    Input,
17
    Output,
18
    ValidityError,
19
};
20
use fuel_types::{
21
    AssetId,
22
    Word,
23
};
24
25
use alloc::collections::BTreeMap;
26
use fuel_tx::policies::PolicyType;
27
28
4.38k
pub(crate) fn initial_free_balances<T>(
29
4.38k
    tx: &T,
30
4.38k
    base_asset_id: &AssetId,
31
4.38k
) -> Result<AvailableBalances, ValidityError>
32
4.38k
where
33
4.38k
    T: Chargeable + field::Inputs + field::Outputs,
34
4.38k
{
35
4.38k
    let (mut non_retryable_balances, retryable_balance) =
36
4.38k
        add_up_input_balances(tx, base_asset_id).ok_or(ValidityError::BalanceOverflow)?;
37
38
4.38k
    let max_fee = tx
39
4.38k
        .policies()
40
4.38k
        .get(PolicyType::MaxFee)
41
4.38k
        .ok_or(ValidityError::TransactionMaxFeeNotSet)?;
42
4.38k
    deduct_max_fee_from_base_asset(&mut non_retryable_balances, base_asset_id, max_fee)?;
43
44
4.38k
    reduce_free_balances_by_coin_outputs(&mut non_retryable_balances, tx)?;
45
46
4.38k
    Ok(AvailableBalances {
47
4.38k
        non_retryable_balances,
48
4.38k
        retryable_balance,
49
4.38k
    })
50
4.38k
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction8balances21initial_free_balancesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1o_4blob8BlobBodyNtB2U_12BlobMetadataEEB6_
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction8balances21initial_free_balancesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1o_6create10CreateBodyNtB2U_14CreateMetadataEEB6_
Line
Count
Source
28
2.19k
pub(crate) fn initial_free_balances<T>(
29
2.19k
    tx: &T,
30
2.19k
    base_asset_id: &AssetId,
31
2.19k
) -> Result<AvailableBalances, ValidityError>
32
2.19k
where
33
2.19k
    T: Chargeable + field::Inputs + field::Outputs,
34
2.19k
{
35
2.19k
    let (mut non_retryable_balances, retryable_balance) =
36
2.19k
        add_up_input_balances(tx, base_asset_id).ok_or(ValidityError::BalanceOverflow)?;
37
38
2.19k
    let max_fee = tx
39
2.19k
        .policies()
40
2.19k
        .get(PolicyType::MaxFee)
41
2.19k
        .ok_or(ValidityError::TransactionMaxFeeNotSet)?;
42
2.19k
    deduct_max_fee_from_base_asset(&mut non_retryable_balances, base_asset_id, max_fee)?;
43
44
2.19k
    reduce_free_balances_by_coin_outputs(&mut non_retryable_balances, tx)?;
45
46
2.19k
    Ok(AvailableBalances {
47
2.19k
        non_retryable_balances,
48
2.19k
        retryable_balance,
49
2.19k
    })
50
2.19k
}
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction8balances21initial_free_balancesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1o_6script10ScriptBodyNtB2U_14ScriptMetadataEEB6_
Line
Count
Source
28
2.19k
pub(crate) fn initial_free_balances<T>(
29
2.19k
    tx: &T,
30
2.19k
    base_asset_id: &AssetId,
31
2.19k
) -> Result<AvailableBalances, ValidityError>
32
2.19k
where
33
2.19k
    T: Chargeable + field::Inputs + field::Outputs,
34
2.19k
{
35
2.19k
    let (mut non_retryable_balances, retryable_balance) =
36
2.19k
        add_up_input_balances(tx, base_asset_id).ok_or(ValidityError::BalanceOverflow)?;
37
38
2.19k
    let max_fee = tx
39
2.19k
        .policies()
40
2.19k
        .get(PolicyType::MaxFee)
41
2.19k
        .ok_or(ValidityError::TransactionMaxFeeNotSet)?;
42
2.19k
    deduct_max_fee_from_base_asset(&mut non_retryable_balances, base_asset_id, max_fee)?;
43
44
2.19k
    reduce_free_balances_by_coin_outputs(&mut non_retryable_balances, tx)?;
45
46
2.19k
    Ok(AvailableBalances {
47
2.19k
        non_retryable_balances,
48
2.19k
        retryable_balance,
49
2.19k
    })
50
2.19k
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction8balances21initial_free_balancesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1o_6upload10UploadBodyNtB2U_14UploadMetadataEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction8balances21initial_free_balancesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1o_7upgrade11UpgradeBodyNtB2U_15UpgradeMetadataEEB6_
51
52
/// Returns None if any of the balances would overflow.
53
4.38k
fn add_up_input_balances<T: field::Inputs>(
54
4.38k
    transaction: &T,
55
4.38k
    base_asset_id: &AssetId,
56
4.38k
) -> Option<(BTreeMap<AssetId, Word>, Word)> {
57
4.38k
    let mut non_retryable_balances = BTreeMap::<AssetId, Word>::new();
58
4.38k
    // The sum of [`AssetId::Base`] from metadata messages.
59
4.38k
    let mut retryable_balance: Word = 0;
60
61
    // Add up all the inputs for each asset ID
62
6.57k
    for input in transaction.inputs().iter() {
63
6.57k
        match input {
64
            // Sum coin inputs
65
            Input::CoinPredicate(CoinPredicate {
66
0
                asset_id, amount, ..
67
            })
68
            | Input::CoinSigned(CoinSigned {
69
4.38k
                asset_id, amount, ..
70
            }) => {
71
4.38k
                let balance = non_retryable_balances.entry(*asset_id).or_default();
72
4.38k
                *balance = (*balance).checked_add(*amount)?;
73
            }
74
            // Sum message coin inputs
75
0
            Input::MessageCoinSigned(MessageCoinSigned { amount, .. })
76
0
            | Input::MessageCoinPredicate(MessageCoinPredicate { amount, .. }) => {
77
0
                let balance = non_retryable_balances.entry(*base_asset_id).or_default();
78
0
                *balance = (*balance).checked_add(*amount)?;
79
            }
80
            // Sum data messages
81
0
            Input::MessageDataSigned(MessageDataSigned { amount, .. })
82
0
            | Input::MessageDataPredicate(MessageDataPredicate { amount, .. }) => {
83
0
                retryable_balance = retryable_balance.checked_add(*amount)?;
84
            }
85
2.19k
            Input::Contract(_) => {}
86
        }
87
    }
88
89
4.38k
    Some((non_retryable_balances, retryable_balance))
90
4.38k
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction8balances21add_up_input_balancesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1o_4blob8BlobBodyNtB2U_12BlobMetadataEEB6_
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction8balances21add_up_input_balancesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1o_6create10CreateBodyNtB2U_14CreateMetadataEEB6_
Line
Count
Source
53
2.19k
fn add_up_input_balances<T: field::Inputs>(
54
2.19k
    transaction: &T,
55
2.19k
    base_asset_id: &AssetId,
56
2.19k
) -> Option<(BTreeMap<AssetId, Word>, Word)> {
57
2.19k
    let mut non_retryable_balances = BTreeMap::<AssetId, Word>::new();
58
2.19k
    // The sum of [`AssetId::Base`] from metadata messages.
59
2.19k
    let mut retryable_balance: Word = 0;
60
61
    // Add up all the inputs for each asset ID
62
2.19k
    for input in transaction.inputs().iter() {
63
2.19k
        match input {
64
            // Sum coin inputs
65
            Input::CoinPredicate(CoinPredicate {
66
0
                asset_id, amount, ..
67
            })
68
            | Input::CoinSigned(CoinSigned {
69
2.19k
                asset_id, amount, ..
70
            }) => {
71
2.19k
                let balance = non_retryable_balances.entry(*asset_id).or_default();
72
2.19k
                *balance = (*balance).checked_add(*amount)?;
73
            }
74
            // Sum message coin inputs
75
0
            Input::MessageCoinSigned(MessageCoinSigned { amount, .. })
76
0
            | Input::MessageCoinPredicate(MessageCoinPredicate { amount, .. }) => {
77
0
                let balance = non_retryable_balances.entry(*base_asset_id).or_default();
78
0
                *balance = (*balance).checked_add(*amount)?;
79
            }
80
            // Sum data messages
81
0
            Input::MessageDataSigned(MessageDataSigned { amount, .. })
82
0
            | Input::MessageDataPredicate(MessageDataPredicate { amount, .. }) => {
83
0
                retryable_balance = retryable_balance.checked_add(*amount)?;
84
            }
85
0
            Input::Contract(_) => {}
86
        }
87
    }
88
89
2.19k
    Some((non_retryable_balances, retryable_balance))
90
2.19k
}
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction8balances21add_up_input_balancesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1o_6script10ScriptBodyNtB2U_14ScriptMetadataEEB6_
Line
Count
Source
53
2.19k
fn add_up_input_balances<T: field::Inputs>(
54
2.19k
    transaction: &T,
55
2.19k
    base_asset_id: &AssetId,
56
2.19k
) -> Option<(BTreeMap<AssetId, Word>, Word)> {
57
2.19k
    let mut non_retryable_balances = BTreeMap::<AssetId, Word>::new();
58
2.19k
    // The sum of [`AssetId::Base`] from metadata messages.
59
2.19k
    let mut retryable_balance: Word = 0;
60
61
    // Add up all the inputs for each asset ID
62
4.38k
    for input in transaction.inputs().iter() {
63
4.38k
        match input {
64
            // Sum coin inputs
65
            Input::CoinPredicate(CoinPredicate {
66
0
                asset_id, amount, ..
67
            })
68
            | Input::CoinSigned(CoinSigned {
69
2.19k
                asset_id, amount, ..
70
            }) => {
71
2.19k
                let balance = non_retryable_balances.entry(*asset_id).or_default();
72
2.19k
                *balance = (*balance).checked_add(*amount)?;
73
            }
74
            // Sum message coin inputs
75
0
            Input::MessageCoinSigned(MessageCoinSigned { amount, .. })
76
0
            | Input::MessageCoinPredicate(MessageCoinPredicate { amount, .. }) => {
77
0
                let balance = non_retryable_balances.entry(*base_asset_id).or_default();
78
0
                *balance = (*balance).checked_add(*amount)?;
79
            }
80
            // Sum data messages
81
0
            Input::MessageDataSigned(MessageDataSigned { amount, .. })
82
0
            | Input::MessageDataPredicate(MessageDataPredicate { amount, .. }) => {
83
0
                retryable_balance = retryable_balance.checked_add(*amount)?;
84
            }
85
2.19k
            Input::Contract(_) => {}
86
        }
87
    }
88
89
2.19k
    Some((non_retryable_balances, retryable_balance))
90
2.19k
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction8balances21add_up_input_balancesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1o_6upload10UploadBodyNtB2U_14UploadMetadataEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction8balances21add_up_input_balancesINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1o_7upgrade11UpgradeBodyNtB2U_15UpgradeMetadataEEB6_
91
92
4.38k
fn deduct_max_fee_from_base_asset(
93
4.38k
    non_retryable_balances: &mut BTreeMap<AssetId, Word>,
94
4.38k
    base_asset_id: &AssetId,
95
4.38k
    max_fee: Word,
96
4.38k
) -> Result<(), ValidityError> {
97
4.38k
    let base_asset_balance = non_retryable_balances.entry(*base_asset_id).or_default();
98
4.38k
    *base_asset_balance = base_asset_balance.checked_sub(max_fee).ok_or(
99
4.38k
        ValidityError::InsufficientFeeAmount {
100
4.38k
            expected: max_fee,
101
4.38k
            provided: *base_asset_balance,
102
4.38k
        },
103
4.38k
    )?;
104
105
4.38k
    Ok(())
106
4.38k
}
107
108
4.38k
fn reduce_free_balances_by_coin_outputs(
109
4.38k
    non_retryable_balances: &mut BTreeMap<AssetId, Word>,
110
4.38k
    transaction: &impl field::Outputs,
111
4.38k
) -> Result<(), ValidityError> {
112
    // reduce free balances by coin outputs
113
0
    for (asset_id, amount) in
114
4.38k
        transaction
115
4.38k
            .outputs()
116
4.38k
            .iter()
117
6.57k
            .filter_map(|output| match output {
118
                Output::Coin {
119
0
                    asset_id, amount, ..
120
0
                } => Some((asset_id, amount)),
121
6.57k
                _ => None,
122
6.57k
            })
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction8balances36reduce_free_balances_by_coin_outputsINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1F_4blob8BlobBodyNtB3b_12BlobMetadataEE0B8_
_RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction8balances36reduce_free_balances_by_coin_outputsINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1F_6create10CreateBodyNtB3b_14CreateMetadataEE0B8_
Line
Count
Source
117
2.19k
            .filter_map(|output| match output {
118
                Output::Coin {
119
0
                    asset_id, amount, ..
120
0
                } => Some((asset_id, amount)),
121
2.19k
                _ => None,
122
2.19k
            })
_RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction8balances36reduce_free_balances_by_coin_outputsINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1F_6script10ScriptBodyNtB3b_14ScriptMetadataEE0B8_
Line
Count
Source
117
4.38k
            .filter_map(|output| match output {
118
                Output::Coin {
119
0
                    asset_id, amount, ..
120
0
                } => Some((asset_id, amount)),
121
4.38k
                _ => None,
122
4.38k
            })
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction8balances36reduce_free_balances_by_coin_outputsINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1F_6upload10UploadBodyNtB3b_14UploadMetadataEE0B8_
Unexecuted instantiation: _RNCINvNtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction8balances36reduce_free_balances_by_coin_outputsINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1F_7upgrade11UpgradeBodyNtB3b_15UpgradeMetadataEE0B8_
123
    {
124
0
        let balance = non_retryable_balances.get_mut(asset_id).ok_or(
125
0
            ValidityError::TransactionOutputCoinAssetIdNotFound(*asset_id),
126
0
        )?;
127
0
        *balance = balance.checked_sub(*amount).ok_or(
128
0
            ValidityError::InsufficientInputAmount {
129
0
                asset: *asset_id,
130
0
                expected: *amount,
131
0
                provided: *balance,
132
0
            },
133
0
        )?;
134
    }
135
136
4.38k
    Ok(())
137
4.38k
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction8balances36reduce_free_balances_by_coin_outputsINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1D_4blob8BlobBodyNtB39_12BlobMetadataEEB6_
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction8balances36reduce_free_balances_by_coin_outputsINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1D_6create10CreateBodyNtB39_14CreateMetadataEEB6_
Line
Count
Source
108
2.19k
fn reduce_free_balances_by_coin_outputs(
109
2.19k
    non_retryable_balances: &mut BTreeMap<AssetId, Word>,
110
2.19k
    transaction: &impl field::Outputs,
111
2.19k
) -> Result<(), ValidityError> {
112
    // reduce free balances by coin outputs
113
0
    for (asset_id, amount) in
114
2.19k
        transaction
115
2.19k
            .outputs()
116
2.19k
            .iter()
117
2.19k
            .filter_map(|output| match output {
118
                Output::Coin {
119
                    asset_id, amount, ..
120
                } => Some((asset_id, amount)),
121
                _ => None,
122
2.19k
            })
123
    {
124
0
        let balance = non_retryable_balances.get_mut(asset_id).ok_or(
125
0
            ValidityError::TransactionOutputCoinAssetIdNotFound(*asset_id),
126
0
        )?;
127
0
        *balance = balance.checked_sub(*amount).ok_or(
128
0
            ValidityError::InsufficientInputAmount {
129
0
                asset: *asset_id,
130
0
                expected: *amount,
131
0
                provided: *balance,
132
0
            },
133
0
        )?;
134
    }
135
136
2.19k
    Ok(())
137
2.19k
}
_RINvNtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction8balances36reduce_free_balances_by_coin_outputsINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1D_6script10ScriptBodyNtB39_14ScriptMetadataEEB6_
Line
Count
Source
108
2.19k
fn reduce_free_balances_by_coin_outputs(
109
2.19k
    non_retryable_balances: &mut BTreeMap<AssetId, Word>,
110
2.19k
    transaction: &impl field::Outputs,
111
2.19k
) -> Result<(), ValidityError> {
112
    // reduce free balances by coin outputs
113
0
    for (asset_id, amount) in
114
2.19k
        transaction
115
2.19k
            .outputs()
116
2.19k
            .iter()
117
2.19k
            .filter_map(|output| match output {
118
                Output::Coin {
119
                    asset_id, amount, ..
120
                } => Some((asset_id, amount)),
121
                _ => None,
122
2.19k
            })
123
    {
124
0
        let balance = non_retryable_balances.get_mut(asset_id).ok_or(
125
0
            ValidityError::TransactionOutputCoinAssetIdNotFound(*asset_id),
126
0
        )?;
127
0
        *balance = balance.checked_sub(*amount).ok_or(
128
0
            ValidityError::InsufficientInputAmount {
129
0
                asset: *asset_id,
130
0
                expected: *amount,
131
0
                provided: *balance,
132
0
            },
133
0
        )?;
134
    }
135
136
2.19k
    Ok(())
137
2.19k
}
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction8balances36reduce_free_balances_by_coin_outputsINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1D_6upload10UploadBodyNtB39_14UploadMetadataEEB6_
Unexecuted instantiation: _RINvNtNtCsg6P9hFxt0iW_7fuel_vm19checked_transaction8balances36reduce_free_balances_by_coin_outputsINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB1D_7upgrade11UpgradeBodyNtB39_15UpgradeMetadataEEB6_
138
139
pub(crate) struct AvailableBalances {
140
    pub(crate) non_retryable_balances: BTreeMap<AssetId, Word>,
141
    pub(crate) retryable_balance: Word,
142
}
/home/marten/fuel/fuel-vm/fuel-vm/src/storage/predicate.rs
Line
Count
Source
1
//! The module contains storage requirements for the predicate execution.
2
3
use crate::{
4
    prelude::{
5
        InterpreterError,
6
        RuntimeError,
7
    },
8
    storage::InterpreterStorage,
9
};
10
use alloc::{
11
    borrow::Cow,
12
    string::String,
13
    vec::Vec,
14
};
15
use core::fmt::Debug;
16
17
use fuel_asm::Word;
18
use fuel_storage::{
19
    Mappable,
20
    StorageInspect,
21
    StorageMutate,
22
    StorageRead,
23
    StorageSize,
24
    StorageWrite,
25
};
26
use fuel_tx::ConsensusParameters;
27
use fuel_types::{
28
    BlobId,
29
    BlockHeight,
30
    Bytes32,
31
    ContractId,
32
};
33
34
use super::{
35
    interpreter::ContractsAssetsStorage,
36
    BlobData,
37
    ContractsAssets,
38
    ContractsRawCode,
39
    ContractsState,
40
    ContractsStateData,
41
    UploadedBytecodes,
42
};
43
44
/// Create an empty predicate storage.
45
0
pub fn empty_predicate_storage() -> PredicateStorage<EmptyStorage> {
46
0
    PredicateStorage::new(EmptyStorage)
47
0
}
48
49
/// No-op storage used for predicate operations.
50
///
51
/// The storage implementations are expected to provide KV-like operations for contract
52
/// operations. However, predicates, as defined in the protocol, cannot execute contract
53
/// opcodes. This means its storage backend for predicate execution shouldn't provide any
54
/// functionality. Unless the storage access is limited to immutable data and read-only.
55
#[derive(Debug, Default)]
56
pub struct PredicateStorage<D> {
57
    storage: D,
58
}
59
60
impl<D> PredicateStorage<D> {
61
    /// instantiate predicate storage with access to Blobs
62
0
    pub fn new(storage: D) -> Self {
63
0
        Self { storage }
64
0
    }
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB2_16PredicateStorageRNtB2_12EmptyStorageE3newB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB2_16PredicateStorageRNtNtB4_6memory13MemoryStorageE3newB6_
Unexecuted instantiation: _RNvMNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB2_16PredicateStorageNtB2_12EmptyStorageE3newB6_
65
}
66
67
/// Errors that happen when using predicate storage
68
#[derive(Debug, Clone)]
69
pub enum PredicateStorageError {
70
    /// Storage operation is unavailable in predicate context.
71
    UnsupportedStorageOperation,
72
    /// An storage error occurred
73
    StorageError(String),
74
}
75
76
impl From<PredicateStorageError> for InterpreterError<PredicateStorageError> {
77
0
    fn from(val: PredicateStorageError) -> Self {
78
0
        let rt: RuntimeError<PredicateStorageError> = val.into();
79
0
        rt.into()
80
0
    }
81
}
82
83
impl From<PredicateStorageError> for RuntimeError<PredicateStorageError> {
84
0
    fn from(val: PredicateStorageError) -> Self {
85
0
        RuntimeError::Storage(val)
86
0
    }
87
}
88
89
/// Storage requirements for predicates.
90
pub trait PredicateStorageRequirements
91
where
92
    Self: StorageRead<BlobData>,
93
{
94
    /// Converts the storage error to a string.
95
    fn storage_error_to_string(error: Self::Error) -> String;
96
}
97
98
impl<D> PredicateStorageRequirements for &D
99
where
100
    D: PredicateStorageRequirements,
101
{
102
0
    fn storage_error_to_string(error: Self::Error) -> String {
103
0
        D::storage_error_to_string(error)
104
0
    }
Unexecuted instantiation: _RNvXs1_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateRNtB5_12EmptyStorageNtB5_28PredicateStorageRequirements23storage_error_to_stringB9_
Unexecuted instantiation: _RNvXs1_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateRNtNtB7_6memory13MemoryStorageNtB5_28PredicateStorageRequirements23storage_error_to_stringB9_
105
}
106
107
/// The type that returns the predicate storage instance.
108
pub trait PredicateStorageProvider: Sync {
109
    /// The storage type.
110
    type Storage: PredicateStorageRequirements + Send + Sync + 'static;
111
112
    /// Returns the storage instance.
113
    fn storage(&self) -> Self::Storage;
114
}
115
116
/// Empty storage.
117
#[derive(Default, Debug, Clone, Copy)]
118
pub struct EmptyStorage;
119
120
impl StorageInspect<BlobData> for EmptyStorage {
121
    type Error = PredicateStorageError;
122
123
0
    fn get(
124
0
        &self,
125
0
        _: &BlobId,
126
0
    ) -> Result<Option<Cow<<BlobData as Mappable>::OwnedValue>>, Self::Error> {
127
0
        Err(Self::Error::UnsupportedStorageOperation)
128
0
    }
129
130
0
    fn contains_key(&self, _: &BlobId) -> Result<bool, Self::Error> {
131
0
        Err(Self::Error::UnsupportedStorageOperation)
132
0
    }
133
}
134
135
impl StorageSize<BlobData> for EmptyStorage {
136
0
    fn size_of_value(&self, _: &BlobId) -> Result<Option<usize>, Self::Error> {
137
0
        Err(Self::Error::UnsupportedStorageOperation)
138
0
    }
139
}
140
141
impl StorageRead<BlobData> for EmptyStorage {
142
0
    fn read(&self, _: &BlobId, _: &mut [u8]) -> Result<Option<usize>, Self::Error> {
143
0
        Err(Self::Error::UnsupportedStorageOperation)
144
0
    }
145
146
0
    fn read_alloc(&self, _: &BlobId) -> Result<Option<Vec<u8>>, Self::Error> {
147
0
        Err(Self::Error::UnsupportedStorageOperation)
148
0
    }
149
}
150
151
impl PredicateStorageRequirements for EmptyStorage {
152
0
    fn storage_error_to_string(error: Self::Error) -> String {
153
0
        alloc::format!("{:?}", error)
154
0
    }
155
}
156
157
impl PredicateStorageProvider for EmptyStorage {
158
    type Storage = Self;
159
160
0
    fn storage(&self) -> Self::Storage {
161
0
        *self
162
0
    }
163
}
164
165
trait NoStorage {}
166
167
impl NoStorage for ContractsState {}
168
impl NoStorage for ContractsRawCode {}
169
impl NoStorage for ContractsAssets {}
170
impl NoStorage for UploadedBytecodes {}
171
172
impl<Type, D> StorageInspect<Type> for PredicateStorage<D>
173
where
174
    Type: Mappable + NoStorage,
175
{
176
    type Error = PredicateStorageError;
177
178
0
    fn get(
179
0
        &self,
180
0
        _key: &Type::Key,
181
0
    ) -> Result<Option<Cow<'_, Type::OwnedValue>>, Self::Error> {
182
0
        Err(Self::Error::UnsupportedStorageOperation)
183
0
    }
Unexecuted instantiation: _RNvXsb_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtB5_12EmptyStorageEINtCsemUD0ZWGYFx_12fuel_storage14StorageInspectNtB7_16ContractsRawCodeE3getB9_
Unexecuted instantiation: _RNvXsb_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtB5_12EmptyStorageEINtCsemUD0ZWGYFx_12fuel_storage14StorageInspectNtNtB7_15contracts_state14ContractsStateE3getB9_
Unexecuted instantiation: _RNvXsb_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtB5_12EmptyStorageEINtCsemUD0ZWGYFx_12fuel_storage14StorageInspectNtNtB7_16contracts_assets15ContractsAssetsE3getB9_
Unexecuted instantiation: _RNvXsb_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtNtB7_6memory13MemoryStorageEINtCsemUD0ZWGYFx_12fuel_storage14StorageInspectNtB7_16ContractsRawCodeE3getB9_
Unexecuted instantiation: _RNvXsb_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtNtB7_6memory13MemoryStorageEINtCsemUD0ZWGYFx_12fuel_storage14StorageInspectNtNtB7_15contracts_state14ContractsStateE3getB9_
Unexecuted instantiation: _RNvXsb_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtNtB7_6memory13MemoryStorageEINtCsemUD0ZWGYFx_12fuel_storage14StorageInspectNtNtB7_16contracts_assets15ContractsAssetsE3getB9_
184
185
0
    fn contains_key(&self, _key: &Type::Key) -> Result<bool, Self::Error> {
186
0
        Err(Self::Error::UnsupportedStorageOperation)
187
0
    }
188
}
189
190
impl<D> StorageInspect<BlobData> for PredicateStorage<D>
191
where
192
    D: PredicateStorageRequirements,
193
{
194
    type Error = PredicateStorageError;
195
196
0
    fn get(
197
0
        &self,
198
0
        key: &<BlobData as Mappable>::Key,
199
0
    ) -> Result<Option<Cow<'_, <BlobData as Mappable>::OwnedValue>>, Self::Error> {
200
0
        <D as StorageInspect<BlobData>>::get(&self.storage, key)
201
0
            .map_err(|e| Self::Error::StorageError(D::storage_error_to_string(e)))
Unexecuted instantiation: _RNCNvXsc_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB7_16PredicateStorageRNtB7_12EmptyStorageEINtCsemUD0ZWGYFx_12fuel_storage14StorageInspectNtNtB9_9blob_data8BlobDataE3get0Bb_
Unexecuted instantiation: _RNCNvXsc_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB7_16PredicateStorageRNtNtB9_6memory13MemoryStorageEINtCsemUD0ZWGYFx_12fuel_storage14StorageInspectNtNtB9_9blob_data8BlobDataE3get0Bb_
202
0
    }
Unexecuted instantiation: _RNvXsc_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtB5_12EmptyStorageEINtCsemUD0ZWGYFx_12fuel_storage14StorageInspectNtNtB7_9blob_data8BlobDataE3getB9_
Unexecuted instantiation: _RNvXsc_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtNtB7_6memory13MemoryStorageEINtCsemUD0ZWGYFx_12fuel_storage14StorageInspectNtNtB7_9blob_data8BlobDataE3getB9_
203
204
0
    fn contains_key(
205
0
        &self,
206
0
        key: &<BlobData as Mappable>::Key,
207
0
    ) -> Result<bool, Self::Error> {
208
0
        <D as StorageInspect<BlobData>>::contains_key(&self.storage, key)
209
0
            .map_err(|e| Self::Error::StorageError(D::storage_error_to_string(e)))
210
0
    }
211
}
212
213
impl<Type, D> StorageMutate<Type> for PredicateStorage<D>
214
where
215
    Type: Mappable,
216
    Self: StorageInspect<Type, Error = PredicateStorageError>,
217
{
218
0
    fn replace(
219
0
        &mut self,
220
0
        _key: &Type::Key,
221
0
        _value: &Type::Value,
222
0
    ) -> Result<Option<Type::OwnedValue>, Self::Error> {
223
0
        Err(Self::Error::UnsupportedStorageOperation)
224
0
    }
Unexecuted instantiation: _RNvXsd_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtB5_12EmptyStorageEINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtNtB7_16contracts_assets15ContractsAssetsE7replaceB9_
Unexecuted instantiation: _RNvXsd_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtNtB7_6memory13MemoryStorageEINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtNtB7_16contracts_assets15ContractsAssetsE7replaceB9_
225
226
0
    fn take(
227
0
        &mut self,
228
0
        _key: &Type::Key,
229
0
    ) -> Result<Option<Type::OwnedValue>, Self::Error> {
230
0
        Err(Self::Error::UnsupportedStorageOperation)
231
0
    }
232
}
233
234
impl<D> StorageSize<ContractsRawCode> for PredicateStorage<D> {
235
0
    fn size_of_value(&self, _key: &ContractId) -> Result<Option<usize>, Self::Error> {
236
0
        Err(Self::Error::UnsupportedStorageOperation)
237
0
    }
Unexecuted instantiation: _RNvXse_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtB5_12EmptyStorageEINtCsemUD0ZWGYFx_12fuel_storage11StorageSizeNtB7_16ContractsRawCodeE13size_of_valueB9_
Unexecuted instantiation: _RNvXse_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtNtB7_6memory13MemoryStorageEINtCsemUD0ZWGYFx_12fuel_storage11StorageSizeNtB7_16ContractsRawCodeE13size_of_valueB9_
238
}
239
240
impl<D> StorageRead<ContractsRawCode> for PredicateStorage<D> {
241
0
    fn read(
242
0
        &self,
243
0
        _key: &<ContractsRawCode as Mappable>::Key,
244
0
        _buf: &mut [u8],
245
0
    ) -> Result<Option<usize>, Self::Error> {
246
0
        Err(Self::Error::UnsupportedStorageOperation)
247
0
    }
Unexecuted instantiation: _RNvXsf_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtB5_12EmptyStorageEINtCsemUD0ZWGYFx_12fuel_storage11StorageReadNtB7_16ContractsRawCodeE4readB9_
Unexecuted instantiation: _RNvXsf_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtNtB7_6memory13MemoryStorageEINtCsemUD0ZWGYFx_12fuel_storage11StorageReadNtB7_16ContractsRawCodeE4readB9_
248
249
0
    fn read_alloc(
250
0
        &self,
251
0
        _key: &<ContractsRawCode as Mappable>::Key,
252
0
    ) -> Result<Option<Vec<u8>>, Self::Error> {
253
0
        Err(Self::Error::UnsupportedStorageOperation)
254
0
    }
255
}
256
257
impl<D> StorageWrite<ContractsRawCode> for PredicateStorage<D> {
258
0
    fn write_bytes(
259
0
        &mut self,
260
0
        _key: &<ContractsRawCode as Mappable>::Key,
261
0
        _buf: &[u8],
262
0
    ) -> Result<usize, Self::Error> {
263
0
        Err(Self::Error::UnsupportedStorageOperation)
264
0
    }
265
266
0
    fn replace_bytes(
267
0
        &mut self,
268
0
        _key: &<ContractsRawCode as Mappable>::Key,
269
0
        _buf: &[u8],
270
0
    ) -> Result<(usize, Option<Vec<u8>>), Self::Error> {
271
0
        Err(Self::Error::UnsupportedStorageOperation)
272
0
    }
273
274
0
    fn take_bytes(
275
0
        &mut self,
276
0
        _key: &<ContractsRawCode as Mappable>::Key,
277
0
    ) -> Result<Option<Vec<u8>>, Self::Error> {
278
0
        Err(Self::Error::UnsupportedStorageOperation)
279
0
    }
280
}
281
282
impl<D> StorageSize<ContractsState> for PredicateStorage<D> {
283
0
    fn size_of_value(
284
0
        &self,
285
0
        _key: &<ContractsState as Mappable>::Key,
286
0
    ) -> Result<Option<usize>, Self::Error> {
287
0
        Err(Self::Error::UnsupportedStorageOperation)
288
0
    }
289
}
290
291
impl<D> StorageRead<ContractsState> for PredicateStorage<D> {
292
0
    fn read(
293
0
        &self,
294
0
        _key: &<ContractsState as Mappable>::Key,
295
0
        _buf: &mut [u8],
296
0
    ) -> Result<Option<usize>, Self::Error> {
297
0
        Err(Self::Error::UnsupportedStorageOperation)
298
0
    }
299
300
0
    fn read_alloc(
301
0
        &self,
302
0
        _key: &<ContractsState as Mappable>::Key,
303
0
    ) -> Result<Option<Vec<u8>>, Self::Error> {
304
0
        Err(Self::Error::UnsupportedStorageOperation)
305
0
    }
306
}
307
308
impl<D> StorageWrite<ContractsState> for PredicateStorage<D> {
309
0
    fn write_bytes(
310
0
        &mut self,
311
0
        _key: &<ContractsState as Mappable>::Key,
312
0
        _buf: &[u8],
313
0
    ) -> Result<usize, Self::Error> {
314
0
        Err(Self::Error::UnsupportedStorageOperation)
315
0
    }
316
317
0
    fn replace_bytes(
318
0
        &mut self,
319
0
        _key: &<ContractsState as Mappable>::Key,
320
0
        _buf: &[u8],
321
0
    ) -> Result<(usize, Option<Vec<u8>>), Self::Error> {
322
0
        Err(Self::Error::UnsupportedStorageOperation)
323
0
    }
Unexecuted instantiation: _RNvXsj_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtB5_12EmptyStorageEINtCsemUD0ZWGYFx_12fuel_storage12StorageWriteNtNtB7_15contracts_state14ContractsStateE13replace_bytesB9_
Unexecuted instantiation: _RNvXsj_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtNtB7_6memory13MemoryStorageEINtCsemUD0ZWGYFx_12fuel_storage12StorageWriteNtNtB7_15contracts_state14ContractsStateE13replace_bytesB9_
324
325
0
    fn take_bytes(
326
0
        &mut self,
327
0
        _key: &<ContractsState as Mappable>::Key,
328
0
    ) -> Result<Option<Vec<u8>>, Self::Error> {
329
0
        Err(Self::Error::UnsupportedStorageOperation)
330
0
    }
331
}
332
333
impl<D> StorageSize<BlobData> for PredicateStorage<D>
334
where
335
    D: PredicateStorageRequirements,
336
{
337
0
    fn size_of_value(
338
0
        &self,
339
0
        key: &<BlobData as Mappable>::Key,
340
0
    ) -> Result<Option<usize>, Self::Error> {
341
0
        StorageSize::<BlobData>::size_of_value(&self.storage, key)
342
0
            .map_err(|e| Self::Error::StorageError(D::storage_error_to_string(e)))
Unexecuted instantiation: _RNCNvXsk_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB7_16PredicateStorageRNtB7_12EmptyStorageEINtCsemUD0ZWGYFx_12fuel_storage11StorageSizeNtNtB9_9blob_data8BlobDataE13size_of_value0Bb_
Unexecuted instantiation: _RNCNvXsk_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB7_16PredicateStorageRNtNtB9_6memory13MemoryStorageEINtCsemUD0ZWGYFx_12fuel_storage11StorageSizeNtNtB9_9blob_data8BlobDataE13size_of_value0Bb_
343
0
    }
Unexecuted instantiation: _RNvXsk_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtB5_12EmptyStorageEINtCsemUD0ZWGYFx_12fuel_storage11StorageSizeNtNtB7_9blob_data8BlobDataE13size_of_valueB9_
Unexecuted instantiation: _RNvXsk_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtNtB7_6memory13MemoryStorageEINtCsemUD0ZWGYFx_12fuel_storage11StorageSizeNtNtB7_9blob_data8BlobDataE13size_of_valueB9_
344
}
345
346
impl<D> StorageRead<BlobData> for PredicateStorage<D>
347
where
348
    D: PredicateStorageRequirements,
349
{
350
0
    fn read(
351
0
        &self,
352
0
        key: &<BlobData as Mappable>::Key,
353
0
        buf: &mut [u8],
354
0
    ) -> Result<Option<usize>, Self::Error> {
355
0
        StorageRead::<BlobData>::read(&self.storage, key, buf)
356
0
            .map_err(|e| Self::Error::StorageError(D::storage_error_to_string(e)))
357
0
    }
358
359
0
    fn read_alloc(
360
0
        &self,
361
0
        key: &<BlobData as Mappable>::Key,
362
0
    ) -> Result<Option<Vec<u8>>, Self::Error> {
363
0
        StorageRead::<BlobData>::read_alloc(&self.storage, key)
364
0
            .map_err(|e| Self::Error::StorageError(D::storage_error_to_string(e)))
365
0
    }
366
}
367
368
impl<D> StorageWrite<BlobData> for PredicateStorage<D>
369
where
370
    D: PredicateStorageRequirements,
371
{
372
0
    fn write_bytes(
373
0
        &mut self,
374
0
        _key: &<BlobData as Mappable>::Key,
375
0
        _buf: &[u8],
376
0
    ) -> Result<usize, Self::Error> {
377
0
        Err(Self::Error::UnsupportedStorageOperation)
378
0
    }
379
380
0
    fn replace_bytes(
381
0
        &mut self,
382
0
        _key: &<BlobData as Mappable>::Key,
383
0
        _buf: &[u8],
384
0
    ) -> Result<(usize, Option<Vec<u8>>), Self::Error> {
385
0
        Err(Self::Error::UnsupportedStorageOperation)
386
0
    }
387
388
0
    fn take_bytes(
389
0
        &mut self,
390
0
        _key: &<BlobData as Mappable>::Key,
391
0
    ) -> Result<Option<Vec<u8>>, Self::Error> {
392
0
        Err(Self::Error::UnsupportedStorageOperation)
393
0
    }
394
}
395
396
impl<D> ContractsAssetsStorage for PredicateStorage<D> {}
397
398
impl<D> InterpreterStorage for PredicateStorage<D>
399
where
400
    D: PredicateStorageRequirements,
401
{
402
    type DataError = PredicateStorageError;
403
404
0
    fn block_height(&self) -> Result<BlockHeight, Self::DataError> {
405
0
        Err(Self::DataError::UnsupportedStorageOperation)
406
0
    }
407
408
0
    fn consensus_parameters_version(&self) -> Result<u32, Self::DataError> {
409
0
        Err(Self::DataError::UnsupportedStorageOperation)
410
0
    }
411
412
0
    fn state_transition_version(&self) -> Result<u32, Self::DataError> {
413
0
        Err(Self::DataError::UnsupportedStorageOperation)
414
0
    }
415
416
0
    fn timestamp(&self, _height: BlockHeight) -> Result<Word, Self::DataError> {
417
0
        Err(Self::DataError::UnsupportedStorageOperation)
418
0
    }
Unexecuted instantiation: _RNvXso_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtB5_12EmptyStorageENtNtB7_11interpreter18InterpreterStorage9timestampB9_
Unexecuted instantiation: _RNvXso_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtNtB7_6memory13MemoryStorageENtNtB7_11interpreter18InterpreterStorage9timestampB9_
419
420
0
    fn block_hash(&self, _block_height: BlockHeight) -> Result<Bytes32, Self::DataError> {
421
0
        Err(Self::DataError::UnsupportedStorageOperation)
422
0
    }
Unexecuted instantiation: _RNvXso_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtB5_12EmptyStorageENtNtB7_11interpreter18InterpreterStorage10block_hashB9_
Unexecuted instantiation: _RNvXso_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtNtB7_6memory13MemoryStorageENtNtB7_11interpreter18InterpreterStorage10block_hashB9_
423
424
0
    fn coinbase(&self) -> Result<ContractId, Self::DataError> {
425
0
        Err(Self::DataError::UnsupportedStorageOperation)
426
0
    }
Unexecuted instantiation: _RNvXso_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtB5_12EmptyStorageENtNtB7_11interpreter18InterpreterStorage8coinbaseB9_
Unexecuted instantiation: _RNvXso_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtNtB7_6memory13MemoryStorageENtNtB7_11interpreter18InterpreterStorage8coinbaseB9_
427
428
0
    fn set_consensus_parameters(
429
0
        &mut self,
430
0
        _version: u32,
431
0
        _consensus_parameters: &ConsensusParameters,
432
0
    ) -> Result<Option<ConsensusParameters>, Self::DataError> {
433
0
        Err(Self::DataError::UnsupportedStorageOperation)
434
0
    }
435
436
0
    fn set_state_transition_bytecode(
437
0
        &mut self,
438
0
        _version: u32,
439
0
        _hash: &Bytes32,
440
0
    ) -> Result<Option<Bytes32>, Self::DataError> {
441
0
        Err(Self::DataError::UnsupportedStorageOperation)
442
0
    }
443
444
0
    fn contract_state_range(
445
0
        &self,
446
0
        _id: &ContractId,
447
0
        _start_key: &Bytes32,
448
0
        _range: usize,
449
0
    ) -> Result<Vec<Option<Cow<ContractsStateData>>>, Self::DataError> {
450
0
        Err(Self::DataError::UnsupportedStorageOperation)
451
0
    }
Unexecuted instantiation: _RNvXso_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtB5_12EmptyStorageENtNtB7_11interpreter18InterpreterStorage20contract_state_rangeB9_
Unexecuted instantiation: _RNvXso_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtNtB7_6memory13MemoryStorageENtNtB7_11interpreter18InterpreterStorage20contract_state_rangeB9_
452
453
0
    fn contract_state_insert_range<'a, I>(
454
0
        &mut self,
455
0
        _: &ContractId,
456
0
        _: &Bytes32,
457
0
        _: I,
458
0
    ) -> Result<usize, Self::DataError>
459
0
    where
460
0
        I: Iterator<Item = &'a [u8]>,
461
0
    {
462
0
        Err(Self::DataError::UnsupportedStorageOperation)
463
0
    }
Unexecuted instantiation: _RINvXso_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB6_16PredicateStorageRNtB6_12EmptyStorageENtNtB8_11interpreter18InterpreterStorage27contract_state_insert_rangeINtNtNtCsd3UI3IJrzMw_4core5slice4iter11ChunksExacthEEBa_
Unexecuted instantiation: _RINvXso_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB6_16PredicateStorageRNtNtB8_6memory13MemoryStorageENtNtB8_11interpreter18InterpreterStorage27contract_state_insert_rangeINtNtNtCsd3UI3IJrzMw_4core5slice4iter11ChunksExacthEEBa_
464
465
0
    fn contract_state_remove_range(
466
0
        &mut self,
467
0
        _contract: &ContractId,
468
0
        _start_key: &Bytes32,
469
0
        _range: usize,
470
0
    ) -> Result<Option<()>, Self::DataError> {
471
0
        Err(Self::DataError::UnsupportedStorageOperation)
472
0
    }
Unexecuted instantiation: _RNvXso_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtB5_12EmptyStorageENtNtB7_11interpreter18InterpreterStorage27contract_state_remove_rangeB9_
Unexecuted instantiation: _RNvXso_NtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicateINtB5_16PredicateStorageRNtNtB7_6memory13MemoryStorageENtNtB7_11interpreter18InterpreterStorage27contract_state_remove_rangeB9_
473
}
/home/marten/fuel/fuel-vm/fuel-vm/src/storage/memory.rs
Line
Count
Source
1
#![allow(clippy::cast_possible_truncation)]
2
3
use crate::storage::{
4
    ContractsAssetKey,
5
    ContractsAssets,
6
    ContractsRawCode,
7
    ContractsState,
8
    ContractsStateData,
9
    ContractsStateKey,
10
    InterpreterStorage,
11
    UploadedBytecode,
12
    UploadedBytecodes,
13
};
14
15
use fuel_crypto::Hasher;
16
use fuel_storage::{
17
    Mappable,
18
    StorageAsRef,
19
    StorageInspect,
20
    StorageMutate,
21
    StorageRead,
22
    StorageSize,
23
    StorageWrite,
24
};
25
use fuel_tx::{
26
    ConsensusParameters,
27
    Contract,
28
};
29
use fuel_types::{
30
    BlobId,
31
    BlockHeight,
32
    Bytes32,
33
    ContractId,
34
    Word,
35
};
36
use tai64::Tai64;
37
38
use super::{
39
    interpreter::ContractsAssetsStorage,
40
    BlobBytes,
41
    BlobData,
42
};
43
44
use crate::storage::predicate::PredicateStorageRequirements;
45
use alloc::{
46
    borrow::Cow,
47
    collections::BTreeMap,
48
    vec::Vec,
49
};
50
use core::convert::Infallible;
51
52
#[derive(Debug, Default, Clone, PartialEq, Eq)]
53
struct MemoryStorageInner {
54
    contracts: BTreeMap<ContractId, Contract>,
55
    balances: BTreeMap<ContractsAssetKey, Word>,
56
    contract_state: BTreeMap<ContractsStateKey, ContractsStateData>,
57
    blobs: BTreeMap<BlobId, BlobBytes>,
58
    /// Mapping from consensus parameters version to consensus parameters.
59
    consensus_parameters_versions: BTreeMap<u32, ConsensusParameters>,
60
    /// Mapping from state transition bytecode root to bytecode.
61
    state_transition_bytecodes: BTreeMap<Bytes32, UploadedBytecode>,
62
    /// Mapping from state transition bytecode version to hash.
63
    state_transition_bytecodes_versions: BTreeMap<u32, Bytes32>,
64
}
65
66
#[derive(Debug, Clone)]
67
/// In-memory storage implementation for the interpreter.
68
///
69
/// It tracks 3 states:
70
///
71
/// - memory: the transactions will be applied to this state.
72
/// - transacted: will receive the committed `memory` state.
73
/// - persisted: will receive the persisted `transacted` state.
74
pub struct MemoryStorage {
75
    block_height: BlockHeight,
76
    coinbase: ContractId,
77
    consensus_parameters_version: u32,
78
    state_transition_version: u32,
79
    memory: MemoryStorageInner,
80
    transacted: MemoryStorageInner,
81
    persisted: MemoryStorageInner,
82
}
83
84
impl MemoryStorage {
85
    /// Create a new memory storage.
86
2.19k
    pub fn new(block_height: BlockHeight, coinbase: ContractId) -> Self {
87
2.19k
        Self::new_with_versions(block_height, coinbase, 0, 0)
88
2.19k
    }
89
90
    /// Create a new memory storage with versions.
91
2.19k
    pub fn new_with_versions(
92
2.19k
        block_height: BlockHeight,
93
2.19k
        coinbase: ContractId,
94
2.19k
        consensus_parameters_version: u32,
95
2.19k
        state_transition_version: u32,
96
2.19k
    ) -> Self {
97
2.19k
        Self {
98
2.19k
            block_height,
99
2.19k
            coinbase,
100
2.19k
            consensus_parameters_version,
101
2.19k
            state_transition_version,
102
2.19k
            memory: Default::default(),
103
2.19k
            transacted: Default::default(),
104
2.19k
            persisted: Default::default(),
105
2.19k
        }
106
2.19k
    }
107
108
    /// Iterate over all contract state in storage
109
0
    pub fn all_contract_state(
110
0
        &self,
111
0
    ) -> impl Iterator<Item = (&ContractsStateKey, &ContractsStateData)> {
112
0
        self.memory.contract_state.iter()
113
0
    }
114
115
    /// Fetch a mapping from the contract state.
116
0
    pub fn contract_state(
117
0
        &self,
118
0
        contract: &ContractId,
119
0
        key: &Bytes32,
120
0
    ) -> Cow<'_, ContractsStateData> {
121
0
        self.storage::<ContractsState>()
122
0
            .get(&(contract, key).into())
123
0
            .expect("Infallible")
124
0
            .unwrap_or(Cow::Owned(ContractsStateData::default()))
125
0
    }
126
127
    /// Set the transacted state to the memory state.
128
0
    pub fn commit(&mut self) {
129
0
        self.transacted = self.memory.clone();
130
0
    }
131
132
    /// Revert the memory state to the transacted state.
133
0
    pub fn revert(&mut self) {
134
0
        self.memory = self.transacted.clone();
135
0
    }
136
137
    /// Revert the memory and transacted changes to the persisted state.
138
0
    pub fn rollback(&mut self) {
139
0
        self.memory = self.persisted.clone();
140
0
        self.transacted = self.persisted.clone();
141
0
    }
142
143
    /// Persist the changes from transacted to memory+persisted state.
144
0
    pub fn persist(&mut self) {
145
0
        self.memory = self.transacted.clone();
146
0
        self.persisted = self.transacted.clone();
147
0
    }
148
149
    #[cfg(feature = "test-helpers")]
150
    /// Set the block height of the chain
151
4.38k
    pub fn set_block_height(&mut self, block_height: BlockHeight) {
152
4.38k
        self.block_height = block_height;
153
4.38k
    }
154
155
    #[cfg(feature = "test-helpers")]
156
    /// Set the consensus parameters version
157
0
    pub fn set_consensus_parameters_version(
158
0
        &mut self,
159
0
        consensus_parameters_version: u32,
160
0
    ) {
161
0
        self.consensus_parameters_version = consensus_parameters_version;
162
0
    }
163
164
    #[cfg(feature = "test-helpers")]
165
    /// Set the state transition version
166
0
    pub fn set_state_transition_version(&mut self, state_transition_version: u32) {
167
0
        self.state_transition_version = state_transition_version;
168
0
    }
169
170
    #[cfg(feature = "test-helpers")]
171
    /// Returns mutable reference to the consensus parameters versions table.
172
0
    pub fn consensus_parameters_versions_mut(
173
0
        &mut self,
174
0
    ) -> &mut BTreeMap<u32, ConsensusParameters> {
175
0
        &mut self.memory.consensus_parameters_versions
176
0
    }
177
178
    #[cfg(feature = "test-helpers")]
179
    /// Returns mutable reference to the state transition bytecodes table.
180
0
    pub fn state_transition_bytecodes_mut(
181
0
        &mut self,
182
0
    ) -> &mut BTreeMap<Bytes32, UploadedBytecode> {
183
0
        &mut self.memory.state_transition_bytecodes
184
0
    }
185
186
    #[cfg(feature = "test-helpers")]
187
    /// Returns mutable reference to the state transition bytecodes versions table.
188
0
    pub fn state_transition_bytecodes_versions_mut(
189
0
        &mut self,
190
0
    ) -> &mut BTreeMap<u32, Bytes32> {
191
0
        &mut self.memory.state_transition_bytecodes_versions
192
0
    }
193
}
194
195
impl Default for MemoryStorage {
196
2.19k
    fn default() -> Self {
197
2.19k
        let block_height = 1.into();
198
2.19k
        let coinbase = ContractId::from(*Hasher::hash(b"coinbase"));
199
2.19k
200
2.19k
        Self::new(block_height, coinbase)
201
2.19k
    }
202
}
203
204
impl StorageInspect<ContractsRawCode> for MemoryStorage {
205
    type Error = Infallible;
206
207
368k
    fn get(&self, key: &ContractId) -> Result<Option<Cow<'_, Contract>>, Infallible> {
208
368k
        Ok(self.memory.contracts.get(key).map(Cow::Borrowed))
209
368k
    }
210
211
4.38k
    fn contains_key(&self, key: &ContractId) -> Result<bool, Infallible> {
212
4.38k
        Ok(self.memory.contracts.contains_key(key))
213
4.38k
    }
214
}
215
216
impl StorageMutate<ContractsRawCode> for MemoryStorage {
217
2.19k
    fn replace(
218
2.19k
        &mut self,
219
2.19k
        key: &ContractId,
220
2.19k
        value: &[u8],
221
2.19k
    ) -> Result<Option<Contract>, Infallible> {
222
2.19k
        Ok(self.memory.contracts.insert(*key, value.into()))
223
2.19k
    }
224
225
0
    fn take(&mut self, key: &ContractId) -> Result<Option<Contract>, Infallible> {
226
0
        Ok(self.memory.contracts.remove(key))
227
0
    }
228
}
229
230
impl StorageWrite<ContractsRawCode> for MemoryStorage {
231
0
    fn write_bytes(&mut self, key: &ContractId, buf: &[u8]) -> Result<usize, Infallible> {
232
0
        let size = buf.len();
233
0
        self.memory.contracts.insert(*key, Contract::from(buf));
234
0
        Ok(size)
235
0
    }
236
237
0
    fn replace_bytes(
238
0
        &mut self,
239
0
        key: &ContractId,
240
0
        buf: &[u8],
241
0
    ) -> Result<(usize, Option<Vec<u8>>), Self::Error> {
242
0
        let size = buf.len();
243
0
        let prev = self
244
0
            .memory
245
0
            .contracts
246
0
            .insert(*key, Contract::from(buf))
247
0
            .map(Into::into);
248
0
        Ok((size, prev))
249
0
    }
250
251
0
    fn take_bytes(&mut self, key: &ContractId) -> Result<Option<Vec<u8>>, Self::Error> {
252
0
        let prev = self.memory.contracts.remove(key).map(Into::into);
253
0
        Ok(prev)
254
0
    }
255
}
256
257
impl StorageSize<ContractsRawCode> for MemoryStorage {
258
380k
    fn size_of_value(&self, key: &ContractId) -> Result<Option<usize>, Infallible> {
259
380k
        Ok(self.memory.contracts.get(key).map(|c| c.as_ref().len()))
260
380k
    }
261
}
262
263
impl StorageRead<ContractsRawCode> for MemoryStorage {
264
12.3k
    fn read(
265
12.3k
        &self,
266
12.3k
        key: &ContractId,
267
12.3k
        buf: &mut [u8],
268
12.3k
    ) -> Result<Option<usize>, Self::Error> {
269
12.3k
        Ok(self.memory.contracts.get(key).map(|c| {
270
12.3k
            let len = buf.len().min(c.as_ref().len());
271
12.3k
            buf.copy_from_slice(&c.as_ref()[..len]);
272
12.3k
            len
273
12.3k
        }))
274
12.3k
    }
275
276
0
    fn read_alloc(&self, key: &ContractId) -> Result<Option<Vec<u8>>, Self::Error> {
277
0
        Ok(self.memory.contracts.get(key).map(|c| c.as_ref().to_vec()))
278
0
    }
279
}
280
281
impl StorageInspect<UploadedBytecodes> for MemoryStorage {
282
    type Error = Infallible;
283
284
0
    fn get(
285
0
        &self,
286
0
        key: &<UploadedBytecodes as Mappable>::Key,
287
0
    ) -> Result<Option<Cow<'_, UploadedBytecode>>, Infallible> {
288
0
        Ok(self
289
0
            .memory
290
0
            .state_transition_bytecodes
291
0
            .get(key)
292
0
            .map(Cow::Borrowed))
293
0
    }
294
295
0
    fn contains_key(
296
0
        &self,
297
0
        key: &<UploadedBytecodes as Mappable>::Key,
298
0
    ) -> Result<bool, Infallible> {
299
0
        Ok(self.memory.state_transition_bytecodes.contains_key(key))
300
0
    }
301
}
302
303
impl StorageMutate<UploadedBytecodes> for MemoryStorage {
304
0
    fn replace(
305
0
        &mut self,
306
0
        key: &<UploadedBytecodes as Mappable>::Key,
307
0
        value: &<UploadedBytecodes as Mappable>::Value,
308
0
    ) -> Result<Option<UploadedBytecode>, Infallible> {
309
0
        Ok(self
310
0
            .memory
311
0
            .state_transition_bytecodes
312
0
            .insert(*key, value.clone()))
313
0
    }
314
315
0
    fn take(
316
0
        &mut self,
317
0
        key: &<UploadedBytecodes as Mappable>::Key,
318
0
    ) -> Result<Option<UploadedBytecode>, Infallible> {
319
0
        Ok(self.memory.state_transition_bytecodes.remove(key))
320
0
    }
321
}
322
323
impl StorageInspect<ContractsAssets> for MemoryStorage {
324
    type Error = Infallible;
325
326
13.5k
    fn get(
327
13.5k
        &self,
328
13.5k
        key: &<ContractsAssets as Mappable>::Key,
329
13.5k
    ) -> Result<Option<Cow<'_, Word>>, Infallible> {
330
13.5k
        Ok(self.memory.balances.get(key).map(Cow::Borrowed))
331
13.5k
    }
332
333
0
    fn contains_key(
334
0
        &self,
335
0
        key: &<ContractsAssets as Mappable>::Key,
336
0
    ) -> Result<bool, Infallible> {
337
0
        Ok(self.memory.balances.contains_key(key))
338
0
    }
339
}
340
341
impl StorageMutate<ContractsAssets> for MemoryStorage {
342
13.5k
    fn replace(
343
13.5k
        &mut self,
344
13.5k
        key: &<ContractsAssets as Mappable>::Key,
345
13.5k
        value: &Word,
346
13.5k
    ) -> Result<Option<Word>, Infallible> {
347
13.5k
        Ok(self.memory.balances.insert(*key, *value))
348
13.5k
    }
349
350
0
    fn take(
351
0
        &mut self,
352
0
        key: &<ContractsAssets as Mappable>::Key,
353
0
    ) -> Result<Option<Word>, Infallible> {
354
0
        Ok(self.memory.balances.remove(key))
355
0
    }
356
}
357
358
impl StorageInspect<ContractsState> for MemoryStorage {
359
    type Error = Infallible;
360
361
2.03k
    fn get(
362
2.03k
        &self,
363
2.03k
        key: &<ContractsState as Mappable>::Key,
364
2.03k
    ) -> Result<Option<Cow<'_, <ContractsState as Mappable>::OwnedValue>>, Infallible>
365
2.03k
    {
366
2.03k
        Ok(self.memory.contract_state.get(key).map(Cow::Borrowed))
367
2.03k
    }
368
369
1.51k
    fn contains_key(
370
1.51k
        &self,
371
1.51k
        key: &<ContractsState as Mappable>::Key,
372
1.51k
    ) -> Result<bool, Infallible> {
373
1.51k
        Ok(self.memory.contract_state.contains_key(key))
374
1.51k
    }
375
}
376
377
impl StorageMutate<ContractsState> for MemoryStorage {
378
0
    fn replace(
379
0
        &mut self,
380
0
        key: &<ContractsState as Mappable>::Key,
381
0
        value: &<ContractsState as Mappable>::Value,
382
0
    ) -> Result<Option<<ContractsState as Mappable>::OwnedValue>, Infallible> {
383
0
        Ok(self.memory.contract_state.insert(*key, value.into()))
384
0
    }
385
386
0
    fn take(
387
0
        &mut self,
388
0
        key: &<ContractsState as Mappable>::Key,
389
0
    ) -> Result<Option<ContractsStateData>, Infallible> {
390
0
        Ok(self.memory.contract_state.remove(key))
391
0
    }
392
}
393
394
impl StorageWrite<ContractsState> for MemoryStorage {
395
1.51k
    fn write_bytes(
396
1.51k
        &mut self,
397
1.51k
        key: &<ContractsState as Mappable>::Key,
398
1.51k
        buf: &[u8],
399
1.51k
    ) -> Result<usize, Infallible> {
400
1.51k
        let size = buf.len();
401
1.51k
        self.memory
402
1.51k
            .contract_state
403
1.51k
            .insert(*key, ContractsStateData::from(buf));
404
1.51k
        Ok(size)
405
1.51k
    }
406
407
347
    fn replace_bytes(
408
347
        &mut self,
409
347
        key: &<ContractsState as Mappable>::Key,
410
347
        buf: &[u8],
411
347
    ) -> Result<(usize, Option<Vec<u8>>), Self::Error>
412
347
    where
413
347
        Self: StorageSize<ContractsState>,
414
347
    {
415
347
        let size = buf.len();
416
347
        let prev = self
417
347
            .memory
418
347
            .contract_state
419
347
            .insert(*key, ContractsStateData::from(buf))
420
347
            .map(Into::into);
421
347
        Ok((size, prev))
422
347
    }
423
424
0
    fn take_bytes(
425
0
        &mut self,
426
0
        key: &<ContractsState as Mappable>::Key,
427
0
    ) -> Result<Option<Vec<u8>>, Self::Error> {
428
0
        let prev = self.memory.contract_state.remove(key).map(Into::into);
429
0
        Ok(prev)
430
0
    }
431
}
432
433
impl StorageSize<ContractsState> for MemoryStorage {
434
0
    fn size_of_value(
435
0
        &self,
436
0
        key: &<ContractsState as Mappable>::Key,
437
0
    ) -> Result<Option<usize>, Infallible> {
438
0
        Ok(self
439
0
            .memory
440
0
            .contract_state
441
0
            .get(key)
442
0
            .map(|c| c.as_ref().len()))
443
0
    }
444
}
445
446
impl StorageRead<ContractsState> for MemoryStorage {
447
0
    fn read(
448
0
        &self,
449
0
        key: &<ContractsState as Mappable>::Key,
450
0
        buf: &mut [u8],
451
0
    ) -> Result<Option<usize>, Self::Error> {
452
0
        Ok(self.memory.contract_state.get(key).map(|data| {
453
0
            let len = buf.len().min(data.as_ref().len());
454
0
            buf.copy_from_slice(&data.as_ref()[..len]);
455
0
            len
456
0
        }))
457
0
    }
458
459
0
    fn read_alloc(
460
0
        &self,
461
0
        key: &<ContractsState as Mappable>::Key,
462
0
    ) -> Result<Option<Vec<u8>>, Self::Error> {
463
0
        Ok(self
464
0
            .memory
465
0
            .contract_state
466
0
            .get(key)
467
0
            .map(|c| c.as_ref().to_vec()))
468
0
    }
469
}
470
471
impl StorageSize<BlobData> for MemoryStorage {
472
6
    fn size_of_value(
473
6
        &self,
474
6
        key: &<BlobData as Mappable>::Key,
475
6
    ) -> Result<Option<usize>, Infallible> {
476
6
        Ok(self.memory.blobs.get(key).map(|c| c.as_ref().len()))
477
6
    }
478
}
479
480
impl StorageRead<BlobData> for MemoryStorage {
481
0
    fn read(
482
0
        &self,
483
0
        key: &<BlobData as Mappable>::Key,
484
0
        buf: &mut [u8],
485
0
    ) -> Result<Option<usize>, Self::Error> {
486
0
        Ok(self.memory.blobs.get(key).map(|data| {
487
0
            let len = buf.len().min(data.as_ref().len());
488
0
            buf.copy_from_slice(&data.as_ref()[..len]);
489
0
            len
490
0
        }))
491
0
    }
492
493
0
    fn read_alloc(
494
0
        &self,
495
0
        key: &<BlobData as Mappable>::Key,
496
0
    ) -> Result<Option<Vec<u8>>, Self::Error> {
497
0
        Ok(self.memory.blobs.get(key).map(|c| c.as_ref().to_vec()))
498
0
    }
499
}
500
501
impl StorageInspect<BlobData> for MemoryStorage {
502
    type Error = Infallible;
503
504
0
    fn get(
505
0
        &self,
506
0
        key: &<BlobData as Mappable>::Key,
507
0
    ) -> Result<Option<Cow<'_, <BlobData as Mappable>::OwnedValue>>, Infallible> {
508
0
        Ok(self.memory.blobs.get(key).map(Cow::Borrowed))
509
0
    }
510
511
0
    fn contains_key(
512
0
        &self,
513
0
        key: &<BlobData as Mappable>::Key,
514
0
    ) -> Result<bool, Infallible> {
515
0
        Ok(self.memory.blobs.contains_key(key))
516
0
    }
517
}
518
519
impl StorageMutate<BlobData> for MemoryStorage {
520
0
    fn replace(
521
0
        &mut self,
522
0
        key: &<BlobData as Mappable>::Key,
523
0
        value: &<BlobData as Mappable>::Value,
524
0
    ) -> Result<Option<<BlobData as Mappable>::OwnedValue>, Infallible> {
525
0
        Ok(self.memory.blobs.insert(*key, value.into()))
526
0
    }
527
528
0
    fn take(
529
0
        &mut self,
530
0
        key: &<BlobData as Mappable>::Key,
531
0
    ) -> Result<Option<BlobBytes>, Infallible> {
532
0
        Ok(self.memory.blobs.remove(key))
533
0
    }
534
}
535
536
impl StorageWrite<BlobData> for MemoryStorage {
537
0
    fn write_bytes(
538
0
        &mut self,
539
0
        key: &<BlobData as Mappable>::Key,
540
0
        buf: &[u8],
541
0
    ) -> Result<usize, Infallible> {
542
0
        let size = buf.len();
543
0
        self.memory.blobs.insert(*key, BlobBytes::from(buf));
544
0
        Ok(size)
545
0
    }
546
547
0
    fn replace_bytes(
548
0
        &mut self,
549
0
        key: &<BlobData as Mappable>::Key,
550
0
        buf: &[u8],
551
0
    ) -> Result<(usize, Option<Vec<u8>>), Self::Error>
552
0
    where
553
0
        Self: StorageSize<BlobData>,
554
0
    {
555
0
        let size = buf.len();
556
0
        let prev = self
557
0
            .memory
558
0
            .blobs
559
0
            .insert(*key, BlobBytes::from(buf))
560
0
            .map(Into::into);
561
0
        Ok((size, prev))
562
0
    }
563
564
0
    fn take_bytes(
565
0
        &mut self,
566
0
        key: &<BlobData as Mappable>::Key,
567
0
    ) -> Result<Option<Vec<u8>>, Self::Error> {
568
0
        let prev = self.memory.blobs.remove(key).map(Into::into);
569
0
        Ok(prev)
570
0
    }
571
}
572
573
impl ContractsAssetsStorage for MemoryStorage {}
574
575
impl InterpreterStorage for MemoryStorage {
576
    type DataError = Infallible;
577
578
4.38k
    fn block_height(&self) -> Result<BlockHeight, Infallible> {
579
4.38k
        Ok(self.block_height)
580
4.38k
    }
581
582
0
    fn consensus_parameters_version(&self) -> Result<u32, Self::DataError> {
583
0
        Ok(self.consensus_parameters_version)
584
0
    }
585
586
0
    fn state_transition_version(&self) -> Result<u32, Self::DataError> {
587
0
        Ok(self.state_transition_version)
588
0
    }
589
590
    #[allow(clippy::arithmetic_side_effects)] // Safety: not enough bits to overflow
591
326k
    fn timestamp(&self, height: BlockHeight) -> Result<Word, Self::DataError> {
592
        const GENESIS: Tai64 = Tai64::UNIX_EPOCH;
593
        const INTERVAL: Word = 10;
594
595
326k
        Ok((GENESIS + (*height as Word * INTERVAL)).0)
596
326k
    }
597
598
72.8k
    fn block_hash(&self, block_height: BlockHeight) -> Result<Bytes32, Infallible> {
599
72.8k
        Ok(Hasher::hash(block_height.to_be_bytes()))
600
72.8k
    }
601
602
231k
    fn coinbase(&self) -> Result<ContractId, Infallible> {
603
231k
        Ok(self.coinbase)
604
231k
    }
605
606
0
    fn set_consensus_parameters(
607
0
        &mut self,
608
0
        version: u32,
609
0
        consensus_parameters: &ConsensusParameters,
610
0
    ) -> Result<Option<ConsensusParameters>, Self::DataError> {
611
0
        Ok(self
612
0
            .memory
613
0
            .consensus_parameters_versions
614
0
            .insert(version, consensus_parameters.clone()))
615
0
    }
616
617
0
    fn set_state_transition_bytecode(
618
0
        &mut self,
619
0
        version: u32,
620
0
        bytecode: &Bytes32,
621
0
    ) -> Result<Option<Bytes32>, Self::DataError> {
622
0
        Ok(self
623
0
            .memory
624
0
            .state_transition_bytecodes_versions
625
0
            .insert(version, *bytecode))
626
0
    }
627
628
880
    fn contract_state_range(
629
880
        &self,
630
880
        id: &ContractId,
631
880
        start_key: &Bytes32,
632
880
        range: usize,
633
880
    ) -> Result<Vec<Option<Cow<ContractsStateData>>>, Self::DataError> {
634
880
        let start: ContractsStateKey = (id, start_key).into();
635
880
        let end: ContractsStateKey = (id, &Bytes32::new([u8::MAX; 32])).into();
636
880
        let mut iter = self.memory.contract_state.range(start..end);
637
880
638
880
        let mut next_item = iter.next();
639
23.6k
        Ok(core::iter::successors(Some(**start_key), |n| {
640
23.6k
            let mut n = *n;
641
23.6k
            if add_one(&mut n) {
642
0
                None
643
            } else {
644
23.6k
                Some(n)
645
            }
646
23.6k
        })
647
23.6k
        .map(|next_key: [u8; 32]| match next_item.take() {
648
0
            Some((k, v)) => match next_key.cmp(k.state_key()) {
649
                core::cmp::Ordering::Less => {
650
0
                    next_item = Some((k, v));
651
0
                    None
652
                }
653
                core::cmp::Ordering::Equal => {
654
0
                    next_item = iter.next();
655
0
                    Some(Cow::Borrowed(v))
656
                }
657
0
                core::cmp::Ordering::Greater => None,
658
            },
659
23.6k
            None => None,
660
23.6k
        })
661
880
        .take(range)
662
880
        .collect())
663
880
    }
664
665
3.76k
    fn contract_state_insert_range<'a, I>(
666
3.76k
        &mut self,
667
3.76k
        contract: &ContractId,
668
3.76k
        start_key: &Bytes32,
669
3.76k
        values: I,
670
3.76k
    ) -> Result<usize, Self::DataError>
671
3.76k
    where
672
3.76k
        I: Iterator<Item = &'a [u8]>,
673
3.76k
    {
674
3.76k
        let storage: &mut dyn StorageWrite<ContractsState, Error = Self::DataError> =
675
3.76k
            self;
676
3.76k
        let mut unset_count = 0;
677
5.27k
        core::iter::successors(Some(**start_key), |n| {
678
5.27k
            let mut n = *n;
679
5.27k
            if add_one(&mut n) {
680
0
                None
681
            } else {
682
5.27k
                Some(n)
683
            }
684
5.27k
        })
685
3.76k
        .zip(values)
686
3.76k
        .try_for_each(|(key, value)| {
687
1.51k
            let key: ContractsStateKey = (contract, &Bytes32::from(key)).into();
688
1.51k
            // Safety: we never have over usize::MAX items in one call
689
1.51k
            #[allow(clippy::arithmetic_side_effects)]
690
1.51k
            if !storage.contains_key(&key)? {
691
162
                unset_count += 1;
692
1.34k
            }
693
1.51k
            storage.write_bytes(&key, value)?;
694
1.51k
            Ok::<_, Self::DataError>(())
695
3.76k
        })?;
696
3.76k
        Ok(unset_count)
697
3.76k
    }
698
699
5.17k
    fn contract_state_remove_range(
700
5.17k
        &mut self,
701
5.17k
        contract: &ContractId,
702
5.17k
        start_key: &Bytes32,
703
5.17k
        range: usize,
704
5.17k
    ) -> Result<Option<()>, Self::DataError> {
705
5.17k
        let mut all_set_key = true;
706
5.17k
        let mut values: hashbrown::HashSet<_> =
707
10.4M
            core::iter::successors(Some(**start_key), |n| {
708
10.4M
                let mut n = *n;
709
10.4M
                if add_one(&mut n) {
710
0
                    None
711
                } else {
712
10.4M
                    Some(n)
713
                }
714
10.4M
            })
715
5.17k
            .take(range)
716
5.17k
            .collect();
717
5.17k
        self.memory.contract_state.retain(|key, _| {
718
3.14k
            let c = key.contract_id();
719
3.14k
            let k = key.state_key();
720
3.14k
            let r = values.remove(&**k);
721
3.14k
            all_set_key &= c == contract && r;
722
3.14k
            c != contract || !r
723
5.17k
        });
724
5.17k
        Ok((all_set_key && values.is_empty()).then_some(()))
725
5.17k
    }
726
}
727
728
impl PredicateStorageRequirements for MemoryStorage {
729
0
    fn storage_error_to_string(error: Self::Error) -> alloc::string::String {
730
0
        alloc::format!("{:?}", error)
731
0
    }
732
}
733
734
10.5M
fn add_one(a: &mut [u8; 32]) -> bool {
735
10.5M
    let right = u128::from_be_bytes(a[16..].try_into().unwrap());
736
10.5M
    let (right, of) = right.overflowing_add(1);
737
10.5M
    a[16..].copy_from_slice(&right.to_be_bytes()[..]);
738
10.5M
    if of {
739
0
        let left = u128::from_be_bytes(a[..16].try_into().unwrap());
740
0
        let (left, of) = left.overflowing_add(1);
741
0
        a[..16].copy_from_slice(&left.to_be_bytes()[..]);
742
0
        return of
743
10.5M
    }
744
10.5M
    false
745
10.5M
}
746
747
#[cfg(test)]
748
mod tests {
749
    use super::*;
750
    use alloc::vec;
751
    use test_case::test_case;
752
753
    const fn key(k: u8) -> [u8; 32] {
754
        [
755
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
756
            0, 0, 0, 0, 0, k,
757
        ]
758
    }
759
760
    #[test_case(&[&[0u8; 32]], &[0u8; 32], 1 => vec![Some(Default::default())])]
761
    #[test_case(&[&[0u8; 32]], &[0u8; 32], 0 => Vec::<Option<ContractsStateData>>::with_capacity(0))]
762
    #[test_case(&[], &[0u8; 32], 1 => vec![None])]
763
    #[test_case(&[], &[1u8; 32], 1 => vec![None])]
764
    #[test_case(&[&[0u8; 32]], &key(1), 2 => vec![None, None])]
765
    #[test_case(&[&key(1), &key(3)], &[0u8; 32], 4 => vec![None, Some(Default::default()), None, Some(Default::default())])]
766
    #[test_case(&[&[0u8; 32], &key(1)], &[0u8; 32], 1 => vec![Some(Default::default())])]
767
    fn test_contract_state_range(
768
        store: &[&[u8; 32]],
769
        start: &[u8; 32],
770
        range: usize,
771
    ) -> Vec<Option<ContractsStateData>> {
772
        let mut mem = MemoryStorage::default();
773
        for k in store {
774
            mem.memory.contract_state.insert(
775
                (&ContractId::default(), &(**k).into()).into(),
776
                Default::default(),
777
            );
778
        }
779
        mem.contract_state_range(&ContractId::default(), &(*start).into(), range)
780
            .unwrap()
781
            .into_iter()
782
            .map(|v| v.map(|v| v.into_owned()))
783
            .collect()
784
    }
785
}
/home/marten/fuel/fuel-vm/fuel-vm/src/storage/contracts_state.rs
Line
Count
Source
1
use crate::double_key;
2
use fuel_storage::Mappable;
3
use fuel_types::{
4
    fmt_truncated_hex,
5
    Bytes32,
6
    ContractId,
7
};
8
9
use alloc::{
10
    vec,
11
    vec::Vec,
12
};
13
use derivative::Derivative;
14
15
#[cfg(feature = "random")]
16
use rand::{
17
    distributions::{
18
        Distribution,
19
        Standard,
20
    },
21
    Rng,
22
};
23
24
/// The storage table for contract's hashed key-value state.
25
///
26
/// Lifetime is for optimization to avoid `clone`.
27
pub struct ContractsState;
28
29
impl Mappable for ContractsState {
30
    type Key = Self::OwnedKey;
31
    /// The table key is combination of the `ContractId` and `Bytes32` hash of the value's
32
    /// key.
33
    type OwnedKey = ContractsStateKey;
34
    type OwnedValue = ContractsStateData;
35
    type Value = [u8];
36
}
37
38
double_key!(
39
    ContractsStateKey,
40
    ContractId,
41
    contract_id,
42
    Bytes32,
43
    state_key
44
);
45
46
0
/// Storage type for contract state
47
0
#[derive(Derivative, Clone, PartialEq, Eq, Hash)]
48
0
#[derivative(Debug)]
49
0
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
50
0
pub struct ContractsStateData(
51
0
    #[derivative(Debug(format_with = "fmt_truncated_hex::<16>"))] pub Vec<u8>,
52
0
);
53
54
// TODO: Remove fixed size default when adding support for dynamic storage
55
impl Default for ContractsStateData {
56
0
    fn default() -> Self {
57
0
        Self(vec![0u8; 32])
58
0
    }
59
}
60
61
impl From<Vec<u8>> for ContractsStateData {
62
0
    fn from(c: Vec<u8>) -> Self {
63
0
        Self(c)
64
0
    }
65
}
66
67
impl From<&[u8]> for ContractsStateData {
68
25.5k
    fn from(c: &[u8]) -> Self {
69
25.5k
        Self(c.into())
70
25.5k
    }
71
}
72
73
impl From<&mut [u8]> for ContractsStateData {
74
0
    fn from(c: &mut [u8]) -> Self {
75
0
        Self(c.into())
76
0
    }
77
}
78
79
impl From<ContractsStateData> for Vec<u8> {
80
335
    fn from(c: ContractsStateData) -> Vec<u8> {
81
335
        c.0
82
335
    }
83
}
84
85
impl AsRef<[u8]> for ContractsStateData {
86
0
    fn as_ref(&self) -> &[u8] {
87
0
        self.0.as_ref()
88
0
    }
89
}
90
91
impl AsMut<[u8]> for ContractsStateData {
92
0
    fn as_mut(&mut self) -> &mut [u8] {
93
0
        self.0.as_mut()
94
0
    }
95
}
96
97
#[cfg(feature = "random")]
98
impl Distribution<ContractsStateData> for Standard {
99
0
    fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> ContractsStateData {
100
0
        ContractsStateData(rng.gen::<Bytes32>().to_vec())
101
0
    }
102
}
103
104
impl IntoIterator for ContractsStateData {
105
    type IntoIter = alloc::vec::IntoIter<Self::Item>;
106
    type Item = u8;
107
108
23.6k
    fn into_iter(self) -> Self::IntoIter {
109
23.6k
        self.0.into_iter()
110
23.6k
    }
111
}
/home/marten/fuel/fuel-vm/fuel-vm/src/storage/blob_data.rs
Line
Count
Source
1
use fuel_storage::Mappable;
2
use fuel_types::{
3
    fmt_truncated_hex,
4
    BlobId,
5
};
6
7
use alloc::vec::Vec;
8
use derivative::Derivative;
9
10
#[cfg(feature = "random")]
11
use rand::{
12
    distributions::{
13
        Distribution,
14
        Standard,
15
    },
16
    Rng,
17
};
18
19
/// The storage table for blob data bytes.
20
pub struct BlobData;
21
22
impl Mappable for BlobData {
23
    type Key = Self::OwnedKey;
24
    type OwnedKey = BlobId;
25
    type OwnedValue = BlobBytes;
26
    type Value = [u8];
27
}
28
29
0
/// Storage type for blob bytes
30
0
#[derive(Derivative, Clone, PartialEq, Eq, Hash)]
31
0
#[derivative(Debug)]
32
0
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
33
0
pub struct BlobBytes(
34
0
    #[derivative(Debug(format_with = "fmt_truncated_hex::<16>"))] pub Vec<u8>,
35
0
);
36
37
impl From<Vec<u8>> for BlobBytes {
38
0
    fn from(c: Vec<u8>) -> Self {
39
0
        Self(c)
40
0
    }
41
}
42
43
impl From<&[u8]> for BlobBytes {
44
0
    fn from(c: &[u8]) -> Self {
45
0
        Self(c.into())
46
0
    }
47
}
48
49
impl From<&mut [u8]> for BlobBytes {
50
0
    fn from(c: &mut [u8]) -> Self {
51
0
        Self(c.into())
52
0
    }
53
}
54
55
impl From<BlobBytes> for Vec<u8> {
56
0
    fn from(c: BlobBytes) -> Vec<u8> {
57
0
        c.0
58
0
    }
59
}
60
61
impl AsRef<[u8]> for BlobBytes {
62
0
    fn as_ref(&self) -> &[u8] {
63
0
        self.0.as_ref()
64
0
    }
65
}
66
67
impl AsMut<[u8]> for BlobBytes {
68
0
    fn as_mut(&mut self) -> &mut [u8] {
69
0
        self.0.as_mut()
70
0
    }
71
}
72
73
#[cfg(feature = "random")]
74
impl Distribution<BlobBytes> for Standard {
75
0
    fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> BlobBytes {
76
0
        let len = rng.gen_range(0..1024);
77
0
        let mut val = Vec::new();
78
0
        for _ in 0..len {
79
0
            val.push(rng.gen());
80
0
        }
81
0
        BlobBytes(val)
82
0
    }
83
}
84
85
impl IntoIterator for BlobBytes {
86
    type IntoIter = alloc::vec::IntoIter<Self::Item>;
87
    type Item = u8;
88
89
0
    fn into_iter(self) -> Self::IntoIter {
90
0
        self.0.into_iter()
91
0
    }
92
}
/home/marten/fuel/fuel-vm/fuel-vm/src/storage/interpreter.rs
Line
Count
Source
1
//! Trait definitions for storage backend
2
3
use fuel_storage::{
4
    StorageAsRef,
5
    StorageInspect,
6
    StorageMutate,
7
    StorageRead,
8
    StorageSize,
9
    StorageWrite,
10
};
11
use fuel_tx::{
12
    ConsensusParameters,
13
    Contract,
14
    StorageSlot,
15
};
16
use fuel_types::{
17
    AssetId,
18
    BlockHeight,
19
    Bytes32,
20
    ContractId,
21
    Word,
22
};
23
24
use crate::{
25
    prelude::{
26
        InterpreterError,
27
        RuntimeError,
28
    },
29
    storage::{
30
        ContractsAssets,
31
        ContractsRawCode,
32
        ContractsState,
33
        ContractsStateData,
34
        UploadedBytecode,
35
        UploadedBytecodes,
36
    },
37
};
38
use alloc::{
39
    borrow::Cow,
40
    vec::Vec,
41
};
42
use core::ops::{
43
    Deref,
44
    DerefMut,
45
};
46
47
use super::blob_data::BlobData;
48
49
/// When this trait is implemented, the underlying interpreter is guaranteed to
50
/// have full functionality
51
pub trait InterpreterStorage:
52
    StorageWrite<ContractsRawCode, Error = Self::DataError>
53
    + StorageSize<ContractsRawCode, Error = Self::DataError>
54
    + StorageRead<ContractsRawCode, Error = Self::DataError>
55
    + StorageWrite<ContractsState, Error = Self::DataError>
56
    + StorageSize<ContractsState, Error = Self::DataError>
57
    + StorageRead<ContractsState, Error = Self::DataError>
58
    + StorageMutate<UploadedBytecodes, Error = Self::DataError>
59
    + StorageWrite<BlobData, Error = Self::DataError>
60
    + StorageSize<BlobData, Error = Self::DataError>
61
    + StorageRead<BlobData, Error = Self::DataError>
62
    + ContractsAssetsStorage<Error = Self::DataError>
63
{
64
    /// Error implementation for reasons unspecified in the protocol.
65
    type DataError: Into<InterpreterError<Self::DataError>>
66
        + Into<RuntimeError<Self::DataError>>
67
        + core::fmt::Debug;
68
69
    /// Provide the current block height in which the transactions should be
70
    /// executed.
71
    fn block_height(&self) -> Result<BlockHeight, Self::DataError>;
72
73
    /// Provide the current version of consensus parameters used to execute transaction.
74
    fn consensus_parameters_version(&self) -> Result<u32, Self::DataError>;
75
76
    /// Provide the current version of state transition function used to execute
77
    /// transaction.
78
    fn state_transition_version(&self) -> Result<u32, Self::DataError>;
79
80
    /// Return the timestamp of a given block
81
    ///
82
    /// This isn't optional because the VM is expected to panic if an invalid block height
83
    /// is passed - under the assumption that the block height is consistent, the
84
    /// storage should necessarily have the timestamp for the block, unless some I/O
85
    /// error prevents it from fetching it.
86
    fn timestamp(&self, height: BlockHeight) -> Result<Word, Self::DataError>;
87
88
    /// Provide the block hash from a given height.
89
    fn block_hash(&self, block_height: BlockHeight) -> Result<Bytes32, Self::DataError>;
90
91
    /// Provide the coinbase address for the VM instructions implementation.
92
    fn coinbase(&self) -> Result<ContractId, Self::DataError>;
93
94
    /// Set the consensus parameters in the storage under the `version`.
95
    ///
96
    /// Returns the previous consensus parameters if they were set.
97
    fn set_consensus_parameters(
98
        &mut self,
99
        version: u32,
100
        consensus_parameters: &ConsensusParameters,
101
    ) -> Result<Option<ConsensusParameters>, Self::DataError>;
102
103
    /// Returns `true` if the fully uploaded state transition bytecode is present in the
104
    /// storage.
105
0
    fn contains_state_transition_bytecode_root(
106
0
        &self,
107
0
        root: &Bytes32,
108
0
    ) -> Result<bool, Self::DataError> {
109
0
        let bytecode = self.storage::<UploadedBytecodes>().get(root)?;
110
111
0
        if let Some(cow) = bytecode {
112
0
            if let UploadedBytecode::Completed(_) = cow.as_ref() {
113
0
                Ok(true)
114
            } else {
115
0
                Ok(false)
116
            }
117
        } else {
118
0
            Ok(false)
119
        }
120
0
    }
Unexecuted instantiation: _RNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtNtB6_11interpreter18InterpreterStorage39contains_state_transition_bytecode_rootB8_
Unexecuted instantiation: _RNvYQNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtNtB7_11interpreter18InterpreterStorage39contains_state_transition_bytecode_rootB9_
121
122
    /// Set the state transition bytecode in the storage under the `version`.
123
    ///
124
    /// Returns the previous bytecode if it was set.
125
    fn set_state_transition_bytecode(
126
        &mut self,
127
        version: u32,
128
        hash: &Bytes32,
129
    ) -> Result<Option<Bytes32>, Self::DataError>;
130
131
    /// Deploy a contract into the storage with contract id
132
2.19k
    fn deploy_contract_with_id(
133
2.19k
        &mut self,
134
2.19k
        slots: &[StorageSlot],
135
2.19k
        contract: &Contract,
136
2.19k
        id: &ContractId,
137
2.19k
    ) -> Result<(), Self::DataError> {
138
2.19k
        self.storage_contract_insert(id, contract)?;
139
140
        // On the `fuel-core` side it is done in more optimal way
141
2.19k
        slots.iter().try_for_each(|s| {
142
0
            self.contract_state_insert(id, s.key(), s.value().as_ref())?;
143
0
            Ok(())
144
2.19k
        })?;
145
2.19k
        Ok(())
146
2.19k
    }
147
148
    /// Fetch a previously inserted contract code from the chain state for a
149
    /// given contract.
150
368k
    fn storage_contract(
151
368k
        &self,
152
368k
        id: &ContractId,
153
368k
    ) -> Result<Option<Cow<'_, Contract>>, Self::DataError> {
154
368k
        StorageInspect::<ContractsRawCode>::get(self, id)
155
368k
    }
Unexecuted instantiation: _RNvYINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtB5_12EmptyStorageENtNtB7_11interpreter18InterpreterStorage16storage_contractB9_
Unexecuted instantiation: _RNvYINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtNtB7_6memory13MemoryStorageENtNtB7_11interpreter18InterpreterStorage16storage_contractB9_
_RNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtNtB6_11interpreter18InterpreterStorage16storage_contractB8_
Line
Count
Source
150
368k
    fn storage_contract(
151
368k
        &self,
152
368k
        id: &ContractId,
153
368k
    ) -> Result<Option<Cow<'_, Contract>>, Self::DataError> {
154
368k
        StorageInspect::<ContractsRawCode>::get(self, id)
155
368k
    }
156
157
    /// Fetch the size of a previously inserted contract code from the chain state for a
158
    /// given contract.
159
0
    fn storage_contract_size(
160
0
        &self,
161
0
        id: &ContractId,
162
0
    ) -> Result<Option<usize>, Self::DataError> {
163
0
        StorageSize::<ContractsRawCode>::size_of_value(self, id)
164
0
    }
165
166
    /// Read contract bytes from storage into the buffer.
167
0
    fn read_contract(
168
0
        &self,
169
0
        id: &ContractId,
170
0
        writer: &mut [u8],
171
0
    ) -> Result<Option<Word>, Self::DataError> {
172
0
        Ok(StorageRead::<ContractsRawCode>::read(self, id, writer)?.map(|r| r as Word))
173
0
    }
174
175
    /// Append a contract to the chain, provided its identifier.
176
    ///
177
    /// Canonically, the identifier should be [`Contract::id`].
178
2.19k
    fn storage_contract_insert(
179
2.19k
        &mut self,
180
2.19k
        id: &ContractId,
181
2.19k
        contract: &Contract,
182
2.19k
    ) -> Result<(), Self::DataError> {
183
2.19k
        StorageMutate::<ContractsRawCode>::insert(self, id, contract.as_ref())
184
2.19k
    }
185
186
    /// Check if a provided contract exists in the chain.
187
4.38k
    fn storage_contract_exists(&self, id: &ContractId) -> Result<bool, Self::DataError> {
188
4.38k
        self.storage::<ContractsRawCode>().contains_key(id)
189
4.38k
    }
_RNvYQNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtNtB7_11interpreter18InterpreterStorage23storage_contract_existsB9_
Line
Count
Source
187
2.19k
    fn storage_contract_exists(&self, id: &ContractId) -> Result<bool, Self::DataError> {
188
2.19k
        self.storage::<ContractsRawCode>().contains_key(id)
189
2.19k
    }
_RNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtNtB6_11interpreter18InterpreterStorage23storage_contract_existsB8_
Line
Count
Source
187
2.19k
    fn storage_contract_exists(&self, id: &ContractId) -> Result<bool, Self::DataError> {
188
2.19k
        self.storage::<ContractsRawCode>().contains_key(id)
189
2.19k
    }
190
191
    /// Fetch the value form a key-value mapping in a contract storage.
192
2.03k
    fn contract_state(
193
2.03k
        &self,
194
2.03k
        id: &ContractId,
195
2.03k
        key: &Bytes32,
196
2.03k
    ) -> Result<Option<Cow<'_, ContractsStateData>>, Self::DataError> {
197
2.03k
        StorageInspect::<ContractsState>::get(self, &(id, key).into())
198
2.03k
    }
Unexecuted instantiation: _RNvYQINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtB6_12EmptyStorageENtNtB8_11interpreter18InterpreterStorage14contract_stateBa_
Unexecuted instantiation: _RNvYQINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtNtB8_6memory13MemoryStorageENtNtB8_11interpreter18InterpreterStorage14contract_stateBa_
_RNvYQNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtNtB7_11interpreter18InterpreterStorage14contract_stateB9_
Line
Count
Source
192
2.03k
    fn contract_state(
193
2.03k
        &self,
194
2.03k
        id: &ContractId,
195
2.03k
        key: &Bytes32,
196
2.03k
    ) -> Result<Option<Cow<'_, ContractsStateData>>, Self::DataError> {
197
2.03k
        StorageInspect::<ContractsState>::get(self, &(id, key).into())
198
2.03k
    }
Unexecuted instantiation: _RNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtNtB6_11interpreter18InterpreterStorage14contract_stateB8_
199
200
    /// Insert a key-value mapping in a contract storage.
201
0
    fn contract_state_insert(
202
0
        &mut self,
203
0
        contract: &ContractId,
204
0
        key: &Bytes32,
205
0
        value: &[u8],
206
0
    ) -> Result<(), Self::DataError> {
207
0
        StorageWrite::<ContractsState>::write_bytes(
208
0
            self,
209
0
            &(contract, key).into(),
210
0
            value,
211
0
        )?;
212
0
        Ok(())
213
0
    }
214
215
    /// Insert a key-value mapping into a contract storage.
216
347
    fn contract_state_replace(
217
347
        &mut self,
218
347
        contract: &ContractId,
219
347
        key: &Bytes32,
220
347
        value: &[u8],
221
347
    ) -> Result<Option<Vec<u8>>, Self::DataError> {
222
347
        let (_, prev) = StorageWrite::<ContractsState>::replace_bytes(
223
347
            self,
224
347
            &(contract, key).into(),
225
347
            value,
226
347
        )?;
227
347
        Ok(prev)
228
347
    }
Unexecuted instantiation: _RNvYINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtB5_12EmptyStorageENtNtB7_11interpreter18InterpreterStorage22contract_state_replaceB9_
Unexecuted instantiation: _RNvYINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtNtB7_6memory13MemoryStorageENtNtB7_11interpreter18InterpreterStorage22contract_state_replaceB9_
_RNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtNtB6_11interpreter18InterpreterStorage22contract_state_replaceB8_
Line
Count
Source
216
347
    fn contract_state_replace(
217
347
        &mut self,
218
347
        contract: &ContractId,
219
347
        key: &Bytes32,
220
347
        value: &[u8],
221
347
    ) -> Result<Option<Vec<u8>>, Self::DataError> {
222
347
        let (_, prev) = StorageWrite::<ContractsState>::replace_bytes(
223
347
            self,
224
347
            &(contract, key).into(),
225
347
            value,
226
347
        )?;
227
347
        Ok(prev)
228
347
    }
229
230
    /// Fetch a range of values from a key-value mapping in a contract storage.
231
    /// Returns the full range requested using optional values in case
232
    /// a requested slot is unset.  
233
    fn contract_state_range(
234
        &self,
235
        id: &ContractId,
236
        start_key: &Bytes32,
237
        range: usize,
238
    ) -> Result<Vec<Option<Cow<ContractsStateData>>>, Self::DataError>;
239
240
    /// Insert a range of key-value mappings into contract storage.
241
    /// Returns the number of keys that were previously unset but are now set.
242
    fn contract_state_insert_range<'a, I>(
243
        &mut self,
244
        contract: &ContractId,
245
        start_key: &Bytes32,
246
        values: I,
247
    ) -> Result<usize, Self::DataError>
248
    where
249
        I: Iterator<Item = &'a [u8]>;
250
251
    /// Remove a range of key-values from contract storage.
252
    /// Returns None if any of the keys in the range were already unset.
253
    fn contract_state_remove_range(
254
        &mut self,
255
        contract: &ContractId,
256
        start_key: &Bytes32,
257
        range: usize,
258
    ) -> Result<Option<()>, Self::DataError>;
259
}
260
261
/// Storage operations for contract assets.
262
pub trait ContractsAssetsStorage: StorageMutate<ContractsAssets> {
263
    /// Fetch the balance of an asset ID in a contract storage.
264
13.5k
    fn contract_asset_id_balance(
265
13.5k
        &self,
266
13.5k
        id: &ContractId,
267
13.5k
        asset_id: &AssetId,
268
13.5k
    ) -> Result<Option<Word>, Self::Error> {
269
13.5k
        let balance = self
270
13.5k
            .storage::<ContractsAssets>()
271
13.5k
            .get(&(id, asset_id).into())?
272
13.5k
            .map(Cow::into_owned);
273
13.5k
274
13.5k
        Ok(balance)
275
13.5k
    }
Unexecuted instantiation: _RNvYINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtB5_12EmptyStorageENtNtB7_11interpreter22ContractsAssetsStorage25contract_asset_id_balanceB9_
Unexecuted instantiation: _RNvYINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtNtB7_6memory13MemoryStorageENtNtB7_11interpreter22ContractsAssetsStorage25contract_asset_id_balanceB9_
_RNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtNtB6_11interpreter22ContractsAssetsStorage25contract_asset_id_balanceB8_
Line
Count
Source
264
13.5k
    fn contract_asset_id_balance(
265
13.5k
        &self,
266
13.5k
        id: &ContractId,
267
13.5k
        asset_id: &AssetId,
268
13.5k
    ) -> Result<Option<Word>, Self::Error> {
269
13.5k
        let balance = self
270
13.5k
            .storage::<ContractsAssets>()
271
13.5k
            .get(&(id, asset_id).into())?
272
13.5k
            .map(Cow::into_owned);
273
13.5k
274
13.5k
        Ok(balance)
275
13.5k
    }
276
277
    /// Update the balance of an asset ID in a contract storage.
278
1.16k
    fn contract_asset_id_balance_insert(
279
1.16k
        &mut self,
280
1.16k
        contract: &ContractId,
281
1.16k
        asset_id: &AssetId,
282
1.16k
        value: Word,
283
1.16k
    ) -> Result<(), Self::Error> {
284
1.16k
        StorageMutate::<ContractsAssets>::insert(
285
1.16k
            self,
286
1.16k
            &(contract, asset_id).into(),
287
1.16k
            &value,
288
1.16k
        )
289
1.16k
    }
Unexecuted instantiation: _RNvYINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtB5_12EmptyStorageENtNtB7_11interpreter22ContractsAssetsStorage32contract_asset_id_balance_insertB9_
Unexecuted instantiation: _RNvYINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtNtB7_6memory13MemoryStorageENtNtB7_11interpreter22ContractsAssetsStorage32contract_asset_id_balance_insertB9_
_RNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtNtB6_11interpreter22ContractsAssetsStorage32contract_asset_id_balance_insertB8_
Line
Count
Source
278
1.16k
    fn contract_asset_id_balance_insert(
279
1.16k
        &mut self,
280
1.16k
        contract: &ContractId,
281
1.16k
        asset_id: &AssetId,
282
1.16k
        value: Word,
283
1.16k
    ) -> Result<(), Self::Error> {
284
1.16k
        StorageMutate::<ContractsAssets>::insert(
285
1.16k
            self,
286
1.16k
            &(contract, asset_id).into(),
287
1.16k
            &value,
288
1.16k
        )
289
1.16k
    }
290
291
    /// Update the balance of an asset ID in a contract storage.
292
    /// Returns the old balance, if any.
293
12.4k
    fn contract_asset_id_balance_replace(
294
12.4k
        &mut self,
295
12.4k
        contract: &ContractId,
296
12.4k
        asset_id: &AssetId,
297
12.4k
        value: Word,
298
12.4k
    ) -> Result<Option<Word>, Self::Error> {
299
12.4k
        StorageMutate::<ContractsAssets>::replace(
300
12.4k
            self,
301
12.4k
            &(contract, asset_id).into(),
302
12.4k
            &value,
303
12.4k
        )
304
12.4k
    }
Unexecuted instantiation: _RNvYINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtB5_12EmptyStorageENtNtB7_11interpreter22ContractsAssetsStorage33contract_asset_id_balance_replaceB9_
Unexecuted instantiation: _RNvYINtNtNtCsg6P9hFxt0iW_7fuel_vm7storage9predicate16PredicateStorageRNtNtB7_6memory13MemoryStorageENtNtB7_11interpreter22ContractsAssetsStorage33contract_asset_id_balance_replaceB9_
_RNvYNtNtNtCsg6P9hFxt0iW_7fuel_vm7storage6memory13MemoryStorageNtNtB6_11interpreter22ContractsAssetsStorage33contract_asset_id_balance_replaceB8_
Line
Count
Source
293
12.4k
    fn contract_asset_id_balance_replace(
294
12.4k
        &mut self,
295
12.4k
        contract: &ContractId,
296
12.4k
        asset_id: &AssetId,
297
12.4k
        value: Word,
298
12.4k
    ) -> Result<Option<Word>, Self::Error> {
299
12.4k
        StorageMutate::<ContractsAssets>::replace(
300
12.4k
            self,
301
12.4k
            &(contract, asset_id).into(),
302
12.4k
            &value,
303
12.4k
        )
304
12.4k
    }
305
}
306
307
impl<S> ContractsAssetsStorage for &mut S where S: ContractsAssetsStorage {}
308
309
impl<S> InterpreterStorage for &mut S
310
where
311
    S: InterpreterStorage,
312
{
313
    type DataError = <S as InterpreterStorage>::DataError;
314
315
0
    fn block_height(&self) -> Result<BlockHeight, Self::DataError> {
316
0
        <S as InterpreterStorage>::block_height(self.deref())
317
0
    }
318
319
0
    fn consensus_parameters_version(&self) -> Result<u32, Self::DataError> {
320
0
        <S as InterpreterStorage>::consensus_parameters_version(self.deref())
321
0
    }
322
323
0
    fn state_transition_version(&self) -> Result<u32, Self::DataError> {
324
0
        <S as InterpreterStorage>::state_transition_version(self.deref())
325
0
    }
326
327
0
    fn timestamp(&self, height: BlockHeight) -> Result<Word, Self::DataError> {
328
0
        <S as InterpreterStorage>::timestamp(self.deref(), height)
329
0
    }
330
331
0
    fn block_hash(&self, block_height: BlockHeight) -> Result<Bytes32, Self::DataError> {
332
0
        <S as InterpreterStorage>::block_hash(self.deref(), block_height)
333
0
    }
334
335
0
    fn coinbase(&self) -> Result<ContractId, Self::DataError> {
336
0
        <S as InterpreterStorage>::coinbase(self.deref())
337
0
    }
338
339
0
    fn set_consensus_parameters(
340
0
        &mut self,
341
0
        version: u32,
342
0
        consensus_parameters: &ConsensusParameters,
343
0
    ) -> Result<Option<ConsensusParameters>, Self::DataError> {
344
0
        <S as InterpreterStorage>::set_consensus_parameters(
345
0
            self.deref_mut(),
346
0
            version,
347
0
            consensus_parameters,
348
0
        )
349
0
    }
350
351
0
    fn set_state_transition_bytecode(
352
0
        &mut self,
353
0
        version: u32,
354
0
        hash: &Bytes32,
355
0
    ) -> Result<Option<Bytes32>, Self::DataError> {
356
0
        <S as InterpreterStorage>::set_state_transition_bytecode(
357
0
            self.deref_mut(),
358
0
            version,
359
0
            hash,
360
0
        )
361
0
    }
362
363
0
    fn storage_contract_size(
364
0
        &self,
365
0
        id: &ContractId,
366
0
    ) -> Result<Option<usize>, Self::DataError> {
367
0
        <S as InterpreterStorage>::storage_contract_size(self.deref(), id)
368
0
    }
369
370
0
    fn read_contract(
371
0
        &self,
372
0
        id: &ContractId,
373
0
        writer: &mut [u8],
374
0
    ) -> Result<Option<Word>, Self::DataError> {
375
0
        <S as InterpreterStorage>::read_contract(self.deref(), id, writer)
376
0
    }
377
378
0
    fn contract_state_range(
379
0
        &self,
380
0
        id: &ContractId,
381
0
        start_key: &Bytes32,
382
0
        range: usize,
383
0
    ) -> Result<Vec<Option<Cow<ContractsStateData>>>, Self::DataError> {
384
0
        <S as InterpreterStorage>::contract_state_range(
385
0
            self.deref(),
386
0
            id,
387
0
            start_key,
388
0
            range,
389
0
        )
390
0
    }
391
392
0
    fn contract_state_insert_range<'a, I>(
393
0
        &mut self,
394
0
        contract: &ContractId,
395
0
        start_key: &Bytes32,
396
0
        values: I,
397
0
    ) -> Result<usize, Self::DataError>
398
0
    where
399
0
        I: Iterator<Item = &'a [u8]>,
400
0
    {
401
0
        <S as InterpreterStorage>::contract_state_insert_range(
402
0
            self.deref_mut(),
403
0
            contract,
404
0
            start_key,
405
0
            values,
406
0
        )
407
0
    }
408
409
0
    fn contract_state_remove_range(
410
0
        &mut self,
411
0
        contract: &ContractId,
412
0
        start_key: &Bytes32,
413
0
        range: usize,
414
0
    ) -> Result<Option<()>, Self::DataError> {
415
0
        <S as InterpreterStorage>::contract_state_remove_range(
416
0
            self.deref_mut(),
417
0
            contract,
418
0
            start_key,
419
0
            range,
420
0
        )
421
0
    }
422
}
/home/marten/fuel/fuel-vm/fuel-merkle/src/binary/in_memory.rs
Line
Count
Source
1
use crate::{
2
    binary::{
3
        self,
4
        Primitive,
5
    },
6
    common::{
7
        Bytes32,
8
        ProofSet,
9
        StorageMap,
10
    },
11
    storage::Mappable,
12
};
13
14
/// The table of the Binary Merkle Tree's nodes. [`MerkleTree`] works with it as
15
/// a binary array, where the storage key of the node is the `u64` index and
16
/// value is the [`Node`](crate::binary::Node).
17
#[derive(Debug, Clone)]
18
pub struct NodesTable;
19
20
impl Mappable for NodesTable {
21
    type Key = Self::OwnedKey;
22
    type OwnedKey = u64;
23
    type OwnedValue = Primitive;
24
    type Value = Self::OwnedValue;
25
}
26
27
type Storage = StorageMap<NodesTable>;
28
type BinaryMerkleTree = binary::MerkleTree<NodesTable, Storage>;
29
30
#[derive(Debug, Clone)]
31
pub struct MerkleTree {
32
    tree: BinaryMerkleTree,
33
}
34
35
impl MerkleTree {
36
0
    pub fn new() -> Self {
37
0
        Self {
38
0
            tree: BinaryMerkleTree::new(Storage::new()),
39
0
        }
40
0
    }
41
42
0
    pub fn push(&mut self, data: &[u8]) {
43
0
        let _ = self.tree.push(data);
44
0
    }
45
46
0
    pub fn root(&self) -> Bytes32 {
47
0
        self.tree.root()
48
0
    }
49
50
0
    pub fn prove(&self, proof_index: u64) -> Option<(Bytes32, ProofSet)> {
51
0
        self.tree.prove(proof_index).ok()
52
0
    }
53
54
0
    pub fn reset(&mut self) {
55
0
        self.tree.reset();
56
0
    }
57
}
58
59
impl Default for MerkleTree {
60
0
    fn default() -> Self {
61
0
        Self::new()
62
0
    }
63
}
64
65
#[cfg(test)]
66
mod test {
67
    use super::*;
68
    use binary::{
69
        empty_sum,
70
        leaf_sum,
71
        node_sum,
72
    };
73
    use fuel_merkle_test_helpers::TEST_DATA;
74
75
    #[test]
76
    fn root_returns_the_empty_root_for_0_leaves() {
77
        let tree = MerkleTree::new();
78
79
        let root = tree.root();
80
        assert_eq!(root, empty_sum().clone());
81
    }
82
83
    #[test]
84
    fn root_returns_the_merkle_root_for_1_leaf() {
85
        let mut tree = MerkleTree::new();
86
87
        let data = &TEST_DATA[0..1]; // 1 leaf
88
        for datum in data.iter() {
89
            tree.push(datum);
90
        }
91
92
        let leaf_0 = leaf_sum(data[0]);
93
94
        let root = tree.root();
95
        assert_eq!(root, leaf_0);
96
    }
97
98
    #[test]
99
    fn root_returns_the_merkle_root_for_7_leaves() {
100
        let mut tree = MerkleTree::new();
101
102
        let data = &TEST_DATA[0..7]; // 7 leaves
103
        for datum in data.iter() {
104
            tree.push(datum);
105
        }
106
107
        //               07
108
        //              /  \
109
        //             /    \
110
        //            /      \
111
        //           /        \
112
        //          /          \
113
        //         /            \
114
        //       03              11
115
        //      /  \            /  \
116
        //     /    \          /    \
117
        //   01      05      09      \
118
        //  /  \    /  \    /  \      \
119
        // 00  02  04  06  08  10     12
120
        // 00  01  02  03  04  05     06
121
122
        let leaf_0 = leaf_sum(data[0]);
123
        let leaf_1 = leaf_sum(data[1]);
124
        let leaf_2 = leaf_sum(data[2]);
125
        let leaf_3 = leaf_sum(data[3]);
126
        let leaf_4 = leaf_sum(data[4]);
127
        let leaf_5 = leaf_sum(data[5]);
128
        let leaf_6 = leaf_sum(data[6]);
129
130
        let node_1 = node_sum(&leaf_0, &leaf_1);
131
        let node_5 = node_sum(&leaf_2, &leaf_3);
132
        let node_3 = node_sum(&node_1, &node_5);
133
        let node_9 = node_sum(&leaf_4, &leaf_5);
134
        let node_11 = node_sum(&node_9, &leaf_6);
135
        let node_7 = node_sum(&node_3, &node_11);
136
137
        let root = tree.root();
138
        assert_eq!(root, node_7);
139
    }
140
141
    #[test]
142
    fn prove_returns_none_for_0_leaves() {
143
        let tree = MerkleTree::new();
144
145
        let proof = tree.prove(0);
146
        assert!(proof.is_none());
147
    }
148
149
    #[test]
150
    fn prove_returns_none_when_index_is_greater_than_number_of_leaves() {
151
        let mut tree = MerkleTree::new();
152
153
        let data = &TEST_DATA[0..5]; // 5 leaves
154
        for datum in data.iter() {
155
            tree.push(datum);
156
        }
157
158
        let proof = tree.prove(10);
159
        assert!(proof.is_none());
160
    }
161
162
    #[test]
163
    fn prove_returns_the_merkle_root_and_proof_set_for_1_leaf() {
164
        let mut tree = MerkleTree::new();
165
166
        let data = &TEST_DATA[0..1]; // 1 leaf
167
        for datum in data.iter() {
168
            tree.push(datum);
169
        }
170
171
        let leaf_0 = leaf_sum(data[0]);
172
173
        {
174
            let (root, proof_set) = tree.prove(0).unwrap();
175
            assert_eq!(root, leaf_0);
176
            assert!(proof_set.is_empty());
177
        }
178
    }
179
180
    #[test]
181
    fn prove_returns_the_merkle_root_and_proof_set_for_7_leaves() {
182
        let mut tree = MerkleTree::new();
183
184
        let data = &TEST_DATA[0..7]; // 7 leaves
185
        for datum in data.iter() {
186
            tree.push(datum);
187
        }
188
189
        //               07
190
        //              /  \
191
        //             /    \
192
        //            /      \
193
        //           /        \
194
        //          /          \
195
        //         /            \
196
        //       03              11
197
        //      /  \            /  \
198
        //     /    \          /    \
199
        //   01      05      09      \
200
        //  /  \    /  \    /  \      \
201
        // 00  02  04  06  08  10     12
202
        // 00  01  02  03  04  05     06
203
204
        let leaf_0 = leaf_sum(data[0]);
205
        let leaf_1 = leaf_sum(data[1]);
206
        let leaf_2 = leaf_sum(data[2]);
207
        let leaf_3 = leaf_sum(data[3]);
208
        let leaf_4 = leaf_sum(data[4]);
209
        let leaf_5 = leaf_sum(data[5]);
210
        let leaf_6 = leaf_sum(data[6]);
211
212
        let node_1 = node_sum(&leaf_0, &leaf_1);
213
        let node_5 = node_sum(&leaf_2, &leaf_3);
214
        let node_3 = node_sum(&node_1, &node_5);
215
        let node_9 = node_sum(&leaf_4, &leaf_5);
216
        let node_11 = node_sum(&node_9, &leaf_6);
217
        let node_7 = node_sum(&node_3, &node_11);
218
219
        {
220
            let (root, proof_set) = tree.prove(0).unwrap();
221
            assert_eq!(root, node_7);
222
            assert_eq!(proof_set[0], leaf_1);
223
            assert_eq!(proof_set[1], node_5);
224
            assert_eq!(proof_set[2], node_11);
225
        }
226
        {
227
            let (root, proof_set) = tree.prove(1).unwrap();
228
            assert_eq!(root, node_7);
229
            assert_eq!(proof_set[0], leaf_0);
230
            assert_eq!(proof_set[1], node_5);
231
            assert_eq!(proof_set[2], node_11);
232
        }
233
        {
234
            let (root, proof_set) = tree.prove(2).unwrap();
235
            assert_eq!(root, node_7);
236
            assert_eq!(proof_set[0], leaf_3);
237
            assert_eq!(proof_set[1], node_1);
238
            assert_eq!(proof_set[2], node_11);
239
        }
240
        {
241
            let (root, proof_set) = tree.prove(3).unwrap();
242
            assert_eq!(root, node_7);
243
            assert_eq!(proof_set[0], leaf_2);
244
            assert_eq!(proof_set[1], node_1);
245
            assert_eq!(proof_set[2], node_11);
246
        }
247
        {
248
            let (root, proof_set) = tree.prove(4).unwrap();
249
            assert_eq!(root, node_7);
250
            assert_eq!(proof_set[0], leaf_5);
251
            assert_eq!(proof_set[1], leaf_6);
252
            assert_eq!(proof_set[2], node_3);
253
        }
254
        {
255
            let (root, proof_set) = tree.prove(5).unwrap();
256
            assert_eq!(root, node_7);
257
            assert_eq!(proof_set[0], leaf_4);
258
            assert_eq!(proof_set[1], leaf_6);
259
            assert_eq!(proof_set[2], node_3);
260
        }
261
        {
262
            let (root, proof_set) = tree.prove(6).unwrap();
263
            assert_eq!(root, node_7);
264
            assert_eq!(proof_set[0], node_9);
265
            assert_eq!(proof_set[1], node_3);
266
        }
267
    }
268
}
/home/marten/fuel/fuel-vm/fuel-merkle/src/binary/verify.rs
Line
Count
Source
1
use crate::{
2
    binary::{
3
        leaf_sum,
4
        node_sum,
5
    },
6
    common::{
7
        Bytes32,
8
        ProofSet,
9
    },
10
};
11
12
/// Returns None if:
13
/// - `num_leaves` is 0
14
/// - the result doens't fit in an usize
15
0
fn path_length_from_key(key: u64, num_leaves: u64) -> Option<usize> {
16
0
    if num_leaves == 0 {
17
0
        return None;
18
0
    }
19
20
    #[allow(clippy::arithmetic_side_effects)] // ilog2(..) < 64
21
0
    let path_length = if num_leaves.is_power_of_two() {
22
0
        num_leaves.ilog2()
23
    } else {
24
0
        num_leaves.ilog2() + 1
25
    };
26
27
    #[allow(clippy::arithmetic_side_effects)] // ilog2(..) > 0
28
0
    let num_leaves_left_subtree = 1 << (path_length - 1);
29
0
30
0
    let subtree_leaves = num_leaves.saturating_sub(num_leaves_left_subtree);
31
32
0
    let Some(subtree_key) = key.checked_sub(num_leaves_left_subtree) else {
33
        // If leaf is in left subtree, path length is full height of left subtree
34
0
        return path_length.try_into().ok();
35
    };
36
37
    // Otherwise, if left or right subtree has only one leaf, path has one additional step
38
0
    if num_leaves_left_subtree == 1 || subtree_leaves <= 1 {
39
0
        return Some(1);
40
0
    }
41
0
42
0
    // Otherwise, add 1 to height and recurse into right subtree
43
0
    path_length_from_key(subtree_key, subtree_leaves)?.checked_add(1)
44
0
}
45
46
0
pub fn verify<T: AsRef<[u8]>>(
47
0
    root: &Bytes32,
48
0
    data: &T,
49
0
    proof_set: &ProofSet,
50
0
    proof_index: u64,
51
0
    num_leaves: u64,
52
0
) -> bool {
53
0
    if num_leaves <= 1 {
54
0
        if !proof_set.is_empty() {
55
0
            return false;
56
0
        }
57
0
    } else if Some(proof_set.len()) != path_length_from_key(proof_index, num_leaves) {
58
0
        return false;
59
0
    }
60
61
0
    if proof_index >= num_leaves {
62
0
        return false;
63
0
    }
64
0
65
0
    let mut sum = leaf_sum(data.as_ref());
66
0
    if proof_set.is_empty() {
67
0
        return if num_leaves == 1 { *root == sum } else { false }
68
0
    }
69
0
    #[allow(clippy::arithmetic_side_effects)] // checked above
70
0
    let last_leaf = num_leaves - 1;
71
0
72
0
    let mut parent = 0usize;
73
0
    let mut stable_end = proof_index;
74
75
    loop {
76
        #[allow(clippy::arithmetic_side_effects)] // path_length_from_key checks
77
0
        let height = parent + 1;
78
0
79
0
        let subtree_size = 1u64 << height;
80
0
        #[allow(clippy::arithmetic_side_effects)] // floor(a / b) * b <= a
81
0
        let subtree_start_index = proof_index / subtree_size * subtree_size;
82
0
        #[allow(clippy::arithmetic_side_effects)]
83
0
        let subtree_end_index = subtree_start_index + subtree_size - 1;
84
0
85
0
        if subtree_end_index >= num_leaves {
86
0
            break
87
0
        }
88
0
89
0
        stable_end = subtree_end_index;
90
0
91
0
        if proof_set.len() < height {
92
0
            return false
93
0
        }
94
0
95
0
        let proof_data = proof_set[parent];
96
0
        #[allow(clippy::arithmetic_side_effects)] // proof_index > subtree_start_index
97
0
        if proof_index - subtree_start_index < (1 << parent) {
98
0
            sum = node_sum(&sum, &proof_data);
99
0
        } else {
100
0
            sum = node_sum(&proof_data, &sum);
101
0
        }
102
103
        #[allow(clippy::arithmetic_side_effects)] // path_length_from_key checks
104
0
        {
105
0
            parent += 1;
106
0
        }
107
    }
108
109
0
    if stable_end != last_leaf {
110
0
        if proof_set.len() <= parent {
111
0
            return false
112
0
        }
113
0
        let proof_data = proof_set[parent];
114
0
        sum = node_sum(&sum, &proof_data);
115
0
        #[allow(clippy::arithmetic_side_effects)] // path_length_from_key checks
116
0
        {
117
0
            parent += 1;
118
0
        }
119
0
    }
120
121
0
    while parent < proof_set.len() {
122
0
        let proof_data = proof_set[parent];
123
0
        sum = node_sum(&proof_data, &sum);
124
0
        #[allow(clippy::arithmetic_side_effects)] // path_length_from_key checks
125
0
        {
126
0
            parent += 1;
127
0
        }
128
    }
129
130
0
    sum == *root
131
0
}
Unexecuted instantiation: _RINvNtNtCsacfdLYFME8L_11fuel_merkle6binary6verify6verifyNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witness7WitnessEB10_
Unexecuted instantiation: _RINvNtNtCsacfdLYFME8L_11fuel_merkle6binary6verify6verifypEB6_
132
133
#[cfg(test)]
134
mod test {
135
    use super::verify;
136
    use crate::{
137
        binary::{
138
            MerkleTree,
139
            Primitive,
140
        },
141
        common::StorageMap,
142
    };
143
    use fuel_merkle_test_helpers::TEST_DATA;
144
    use fuel_storage::Mappable;
145
146
    #[derive(Debug)]
147
    struct TestTable;
148
149
    impl Mappable for TestTable {
150
        type Key = Self::OwnedKey;
151
        type OwnedKey = u64;
152
        type OwnedValue = Primitive;
153
        type Value = Self::OwnedValue;
154
    }
155
156
    #[test]
157
    fn verify_returns_true_when_the_given_proof_set_matches_the_given_merkle_root() {
158
        let mut storage_map = StorageMap::<TestTable>::new();
159
        let mut tree = MerkleTree::new(&mut storage_map);
160
161
        const PROOF_INDEX: usize = 2;
162
        const LEAVES_COUNT: usize = 5;
163
164
        let data = &TEST_DATA[0..LEAVES_COUNT]; // 5 leaves
165
        for datum in data.iter() {
166
            tree.push(datum).unwrap();
167
        }
168
169
        let (root, proof_set) = tree.prove(PROOF_INDEX as u64).unwrap();
170
        let verification = verify(
171
            &root,
172
            &TEST_DATA[PROOF_INDEX],
173
            &proof_set,
174
            PROOF_INDEX as u64,
175
            LEAVES_COUNT as u64,
176
        );
177
        assert!(verification);
178
    }
179
180
    #[test]
181
    fn verify_returns_false_when_the_given_proof_set_does_not_match_the_given_merkle_root(
182
    ) {
183
        // Check the Merkle root of one tree against the computed Merkle root of
184
        // another tree's proof set: because the two roots come from different
185
        // trees, the comparison should fail.
186
187
        // Generate the first Merkle tree and get its root
188
        let mut storage_map = StorageMap::<TestTable>::new();
189
        let mut tree = MerkleTree::new(&mut storage_map);
190
191
        const PROOF_INDEX: usize = 2;
192
        const LEAVES_COUNT: usize = 5;
193
194
        let data = &TEST_DATA[0..LEAVES_COUNT - 1];
195
        for datum in data.iter() {
196
            tree.push(datum).unwrap();
197
        }
198
        let proof = tree.prove(PROOF_INDEX as u64).unwrap();
199
        let root = proof.0;
200
201
        // Generate the second Merkle tree and get its proof set
202
        let mut storage_map = StorageMap::<TestTable>::new();
203
        let mut tree = MerkleTree::new(&mut storage_map);
204
205
        let data = &TEST_DATA[5..10];
206
        for datum in data.iter() {
207
            tree.push(datum).unwrap();
208
        }
209
        let proof = tree.prove(PROOF_INDEX as u64).unwrap();
210
        let set = proof.1;
211
212
        let verification = verify(
213
            &root,
214
            &TEST_DATA[PROOF_INDEX],
215
            &set,
216
            PROOF_INDEX as u64,
217
            LEAVES_COUNT as u64,
218
        );
219
        assert!(!verification);
220
    }
221
222
    #[test]
223
    fn verify_returns_false_when_the_proof_set_is_empty() {
224
        const PROOF_INDEX: usize = 0;
225
        const LEAVES_COUNT: usize = 0;
226
227
        let verification = verify(
228
            &Default::default(),
229
            &TEST_DATA[PROOF_INDEX],
230
            &vec![],
231
            PROOF_INDEX as u64,
232
            LEAVES_COUNT as u64,
233
        );
234
        assert!(!verification);
235
    }
236
237
    #[test]
238
    fn verify_returns_false_when_the_proof_index_is_invalid() {
239
        let mut storage_map = StorageMap::<TestTable>::new();
240
        let mut tree = MerkleTree::new(&mut storage_map);
241
242
        const PROOF_INDEX: usize = 0;
243
        const LEAVES_COUNT: usize = 5;
244
245
        let data = &TEST_DATA[0..LEAVES_COUNT - 1];
246
        for datum in data.iter() {
247
            tree.push(datum).unwrap();
248
        }
249
250
        let proof = tree.prove(PROOF_INDEX as u64).unwrap();
251
        let root = proof.0;
252
        let set = proof.1;
253
254
        let verification = verify(
255
            &root,
256
            &TEST_DATA[PROOF_INDEX],
257
            &set,
258
            PROOF_INDEX as u64 + 15,
259
            LEAVES_COUNT as u64,
260
        );
261
        assert!(!verification);
262
    }
263
}
/home/marten/fuel/fuel-vm/fuel-merkle/src/binary/node.rs
Line
Count
Source
1
use crate::{
2
    binary::{
3
        leaf_sum,
4
        node_sum,
5
    },
6
    common::{
7
        Bytes32,
8
        Position,
9
    },
10
};
11
12
use core::fmt::Debug;
13
#[derive(Clone, PartialEq, Eq, Debug)]
14
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15
pub struct Node {
16
    position: Position,
17
    hash: Bytes32,
18
}
19
20
impl Node {
21
0
    pub fn new(position: Position, hash: Bytes32) -> Self {
22
0
        Self { position, hash }
23
0
    }
24
25
    /// Returns `None` if the leaf cannot be created due to incorrect position.
26
933k
    pub fn create_leaf(index: u64, data: &[u8]) -> Option<Self> {
27
933k
        let position = Position::from_leaf_index(index)?;
28
933k
        let hash = leaf_sum(data);
29
933k
        Some(Self { position, hash })
30
933k
    }
31
32
    /// Creates a new node with the given children.
33
923k
    pub fn create_node(
34
923k
        position: Position,
35
923k
        left_child: &Self,
36
923k
        right_child: &Self,
37
923k
    ) -> Self {
38
923k
        let hash = node_sum(left_child.hash(), right_child.hash());
39
923k
        Self { position, hash }
40
923k
    }
41
42
4.60M
    pub fn position(&self) -> &Position {
43
4.60M
        &self.position
44
4.60M
    }
45
46
0
    pub fn key(&self) -> u64 {
47
0
        self.position().in_order_index()
48
0
    }
49
50
1.85M
    pub fn hash(&self) -> &Bytes32 {
51
1.85M
        &self.hash
52
1.85M
    }
53
54
3.68M
    pub fn height(&self) -> u32 {
55
3.68M
        self.position().height()
56
3.68M
    }
57
}
58
59
impl AsRef<Node> for Node {
60
0
    fn as_ref(&self) -> &Node {
61
0
        self
62
0
    }
63
}
/home/marten/fuel/fuel-vm/fuel-merkle/src/binary/primitive.rs
Line
Count
Source
1
use crate::{
2
    binary::Node,
3
    common::{
4
        Bytes32,
5
        Position,
6
    },
7
};
8
9
pub type Primitive = (u64, Bytes32);
10
11
pub trait PrimitiveView {
12
    fn position(&self) -> Position;
13
    fn hash(&self) -> &Bytes32;
14
}
15
16
impl PrimitiveView for Primitive {
17
0
    fn position(&self) -> Position {
18
0
        Position::from_in_order_index(self.0)
19
0
    }
20
21
0
    fn hash(&self) -> &Bytes32 {
22
0
        &self.1
23
0
    }
24
}
25
26
impl From<&Node> for Primitive {
27
0
    fn from(node: &Node) -> Self {
28
0
        (node.position().in_order_index(), *node.hash())
29
0
    }
30
}
31
32
impl From<Primitive> for Node {
33
0
    fn from(primitive: Primitive) -> Self {
34
0
        let position = primitive.position();
35
0
        let hash = *primitive.hash();
36
0
        Node::new(position, hash)
37
0
    }
38
}
/home/marten/fuel/fuel-vm/fuel-merkle/src/binary/merkle_tree.rs
Line
Count
Source
1
use crate::{
2
    binary::{
3
        empty_sum,
4
        in_memory::NodesTable,
5
        Node,
6
        Primitive,
7
    },
8
    common::{
9
        Bytes32,
10
        Position,
11
        ProofSet,
12
        StorageMap,
13
    },
14
    storage::{
15
        Mappable,
16
        StorageInspect,
17
        StorageInspectInfallible,
18
        StorageMutate,
19
        StorageMutateInfallible,
20
    },
21
};
22
23
use alloc::vec::Vec;
24
use core::{
25
    convert::Infallible,
26
    marker::PhantomData,
27
};
28
29
use super::root_calculator::{
30
    MerkleRootCalculator,
31
    NodeStackPushError,
32
};
33
34
0
#[derive(Debug, Clone, derive_more::Display, PartialEq, Eq)]
35
pub enum MerkleTreeError<StorageError> {
36
    #[display(fmt = "proof index {_0} is not valid")]
37
    InvalidProofIndex(u64),
38
39
    #[display(fmt = "cannot load node with key {_0}; the key is not found in storage")]
40
    LoadError(u64),
41
42
    #[display(fmt = "{}", _0)]
43
    StorageError(StorageError),
44
45
    #[display(fmt = "the tree is too large")]
46
    TooLarge,
47
}
48
49
impl<StorageError> From<StorageError> for MerkleTreeError<StorageError> {
50
0
    fn from(err: StorageError) -> MerkleTreeError<StorageError> {
51
0
        MerkleTreeError::StorageError(err)
52
0
    }
53
}
54
55
#[derive(Debug, Clone)]
56
pub struct MerkleTree<TableType, StorageType> {
57
    storage: StorageType,
58
    nodes: MerkleRootCalculator,
59
    leaves_count: u64,
60
    phantom_table: PhantomData<TableType>,
61
}
62
63
impl<TableType, StorageType> MerkleTree<TableType, StorageType> {
64
0
    pub const fn empty_root() -> &'static Bytes32 {
65
0
        empty_sum()
66
0
    }
67
68
0
    pub fn root(&self) -> Bytes32 {
69
0
        let mut scratch_storage = StorageMap::<NodesTable>::new();
70
0
        let root_node = self
71
0
            .root_node::<Infallible>(&mut scratch_storage)
72
0
            .expect("The type doesn't allow constructing invalid trees.");
73
0
        match root_node {
74
0
            None => *Self::empty_root(),
75
0
            Some(ref node) => *node.hash(),
76
        }
77
0
    }
78
79
0
    pub fn leaves_count(&self) -> u64 {
80
0
        self.leaves_count
81
0
    }
82
83
    /// The root node is generated by joining all MMR peaks, where a peak is
84
    /// defined as the head of a balanced subtree. A tree can be composed of a
85
    /// single balanced subtree, in which case the tree is itself balanced, or
86
    /// several balanced subtrees, in which case the tree is imbalanced. Only
87
    /// nodes at the head of a balanced tree are persisted in storage; any node,
88
    /// including the root node, whose child is an imbalanced child subtree will
89
    /// not be saved in persistent storage. This is because node data for such
90
    /// nodes is liable to change as more leaves are pushed to the tree.
91
    /// Instead, intermediate nodes must be held in a temporary storage space.
92
    ///
93
    /// When calling `root_node`, callees must pass a mutable reference to a
94
    /// temporary storage space that will be used to hold any intermediate nodes
95
    /// that are created during root node calculation. At the end of the method
96
    /// call, this temporary storage space will contain all intermediate nodes
97
    /// not held in persistent storage, and these nodes will be available to the
98
    /// callee.
99
    ///
100
    /// Returns `None` if the tree is empty, and the root node otherwise.
101
0
    fn root_node<E>(
102
0
        &self,
103
0
        scratch_storage: &mut StorageMap<NodesTable>,
104
0
    ) -> Result<Option<Node>, MerkleTreeError<E>> {
105
0
        let mut nodes = self.nodes.stack().iter().rev();
106
0
        let Some(mut head) = nodes.next().cloned() else {
107
0
            return Ok(None); // Empty tree
108
        };
109
110
0
        for node in nodes {
111
0
            let parent = node
112
0
                .position()
113
0
                .parent()
114
0
                .map_err(|_| MerkleTreeError::TooLarge)?;
115
0
            head = Node::create_node(parent, node, &head);
116
0
            StorageMutateInfallible::insert(
117
0
                scratch_storage,
118
0
                &head.key(),
119
0
                &(&head).into(),
120
0
            );
121
        }
122
123
0
        Ok(Some(head))
124
0
    }
125
}
126
127
impl<TableType, StorageType, StorageError> MerkleTree<TableType, StorageType>
128
where
129
    TableType: Mappable<Key = u64, Value = Primitive, OwnedValue = Primitive>,
130
    StorageType: StorageInspect<TableType, Error = StorageError>,
131
{
132
0
    pub fn new(storage: StorageType) -> Self {
133
0
        Self {
134
0
            storage,
135
0
            nodes: MerkleRootCalculator::new(),
136
0
            leaves_count: 0,
137
0
            phantom_table: Default::default(),
138
0
        }
139
0
    }
140
141
    /// A binary Merkle tree can be built from a collection of Merkle Mountain
142
    /// Range (MMR) peaks. The MMR structure can be accurately defined by the
143
    /// number of leaves in the leaf row.
144
    ///
145
    /// Consider a binary Merkle tree with seven leaves, producing the following
146
    /// MMR structure:
147
    ///
148
    /// ```text
149
    ///       03
150
    ///      /  \
151
    ///     /    \
152
    ///   01      05      09
153
    ///  /  \    /  \    /  \
154
    /// 00  02  04  06  08  10  12
155
    /// ```
156
    ///
157
    /// We observe that the tree has three peaks at positions `03`, `09`, and
158
    /// `12`. These peak positions are recorded in the order that they appear,
159
    /// reading left to right in the tree structure, and only descend in height.
160
    /// These peak positions communicate everything needed to determine the
161
    /// remaining internal nodes building upwards to the root position:
162
    ///
163
    /// ```text
164
    ///            07
165
    ///           /  \
166
    ///          /    \
167
    ///         /      \
168
    ///        /        \
169
    ///       /          \
170
    ///      /            \
171
    ///    03              11
172
    ///   /  \            /  \
173
    /// ...  ...         /    \
174
    ///                09      \
175
    ///               /  \      \
176
    ///             ...  ...    12
177
    /// ```
178
    ///
179
    /// No additional intermediate nodes or leaves are required to calculate
180
    /// the root position.
181
    ///
182
    /// The positions of the MMR peaks can be deterministically calculated as a
183
    /// function of `n + 1` where `n` is the number of leaves in the tree. By
184
    /// appending an additional leaf node to the tree, we generate a new tree
185
    /// structure with additional internal nodes (N.B.: this may also change the
186
    /// root position if the tree is already balanced).
187
    ///
188
    /// In our example, we add an additional leaf at leaf index `7` (in-order
189
    /// index `14`):
190
    ///
191
    /// ```text
192
    ///            07
193
    ///           /  \
194
    ///          /    \
195
    ///         /      \
196
    ///        /        \
197
    ///       /          \
198
    ///      /            \
199
    ///    03              11
200
    ///   /  \            /  \
201
    /// ...  ...         /    \
202
    ///                09      13
203
    ///               /  \    /  \
204
    ///             ...  ... 12  14
205
    /// ```
206
    ///
207
    /// We observe that the path from the root position to our new leaf position
208
    /// yields a set of side positions that includes our original peak
209
    /// positions (see [Path Iterator](crate::common::path_iterator::PathIter)):
210
    ///
211
    /// | Path position | Side position |
212
    /// |---------------|---------------|
213
    /// |            07 |            07 |
214
    /// |            11 |            03 |
215
    /// |            13 |            09 |
216
    /// |            14 |            12 |
217
    ///
218
    /// By excluding the root position `07`, we have established the set of
219
    /// side positions `03`, `09`, and `12`, matching our set of MMR peaks.
220
0
    pub fn load(
221
0
        storage: StorageType,
222
0
        leaves_count: u64,
223
0
    ) -> Result<Self, MerkleTreeError<StorageError>> {
224
0
        let mut nodes = Vec::new();
225
0
        let peaks = peak_positions(leaves_count).ok_or(MerkleTreeError::TooLarge)?;
226
0
        for peak in peaks.iter() {
227
0
            let key = peak.in_order_index();
228
0
            let node = storage
229
0
                .get(&key)?
230
0
                .ok_or(MerkleTreeError::LoadError(key))?
231
0
                .into_owned()
232
0
                .into();
233
0
            nodes.push(node);
234
        }
235
236
0
        Ok(Self {
237
0
            storage,
238
0
            nodes: MerkleRootCalculator::new_with_stack(nodes),
239
0
            leaves_count,
240
0
            phantom_table: Default::default(),
241
0
        })
242
0
    }
243
244
0
    pub fn prove(
245
0
        &self,
246
0
        proof_index: u64,
247
0
    ) -> Result<(Bytes32, ProofSet), MerkleTreeError<StorageError>> {
248
0
        if proof_index >= self.leaves_count {
249
0
            return Err(MerkleTreeError::InvalidProofIndex(proof_index))
250
0
        }
251
0
252
0
        let root_position = root_position(self.leaves_count)
253
0
            .expect("This tree is too large, but push should have prevented this");
254
0
        let leaf_position = Position::from_leaf_index(proof_index)
255
0
            .expect("leaves_count is valid, and this is less than leaves_count");
256
0
        let (_, mut side_positions): (Vec<_>, Vec<_>) = root_position
257
0
            .path(&leaf_position, self.leaves_count)
258
0
            .iter()
259
0
            .unzip();
260
0
        side_positions.reverse(); // Reorder side positions from leaf to root.
261
0
        side_positions.pop(); // The last side position is the root; remove it.
262
0
263
0
        // Allocate scratch storage to store temporary nodes when building the
264
0
        // root.
265
0
        let mut scratch_storage = StorageMap::<NodesTable>::new();
266
0
        let root_node = self
267
0
            .root_node(&mut scratch_storage)?
268
0
            .expect("Root node must be present, as leaves_count is nonzero");
269
0
270
0
        // Get side nodes. First, we check the scratch storage. If the side node
271
0
        // is not found in scratch storage, we then check main storage. Finally,
272
0
        // if the side node is not found in main storage, we exit with a load
273
0
        // error.
274
0
        let mut proof_set = ProofSet::new();
275
0
        for side_position in side_positions {
276
0
            let key = side_position.in_order_index();
277
0
            let primitive = StorageInspectInfallible::get(&scratch_storage, &key)
278
0
                .or(StorageInspect::get(&self.storage, &key)?)
279
0
                .ok_or(MerkleTreeError::LoadError(key))?
280
0
                .into_owned();
281
0
            let node = Node::from(primitive);
282
0
            proof_set.push(*node.hash());
283
        }
284
285
0
        let root = *root_node.hash();
286
0
        Ok((root, proof_set))
287
0
    }
288
289
0
    pub fn reset(&mut self) {
290
0
        self.nodes.clear();
291
0
    }
292
}
293
294
impl<TableType, StorageType, StorageError> MerkleTree<TableType, StorageType>
295
where
296
    TableType: Mappable<Key = u64, Value = Primitive, OwnedValue = Primitive>,
297
    StorageType: StorageMutate<TableType, Error = StorageError>,
298
{
299
    /// Adds a new leaf node to the tree.
300
    /// # WARNING
301
    /// This code might modify the storage, and then return an error.
302
    /// TODO: fix this issue
303
0
    pub fn push(&mut self, data: &[u8]) -> Result<(), MerkleTreeError<StorageError>> {
304
0
        let new_node = Node::create_leaf(self.leaves_count, data)
305
0
            .ok_or(MerkleTreeError::TooLarge)?;
306
307
        // u64 cannot overflow, as memory is finite
308
        #[allow(clippy::arithmetic_side_effects)]
309
0
        {
310
0
            self.leaves_count += 1;
311
0
        }
312
0
313
0
        self.nodes
314
0
            .push_with_callback(new_node, |node| {
315
0
                self.storage
316
0
                    .insert(&node.key(), &node.into())
317
0
                    .map_err(MerkleTreeError::StorageError)
318
0
                    .map(|_| ())
319
0
            })
320
0
            .map_err(|err| match err {
321
0
                NodeStackPushError::Callback(err) => err,
322
0
                NodeStackPushError::TooLarge => MerkleTreeError::TooLarge,
323
0
            })
324
0
    }
325
}
326
327
/// Calculcate root position from leaf count.
328
/// Returns `None` if the tree is too large.
329
0
fn root_position(leaves_count: u64) -> Option<Position> {
330
0
    // The root position of a tree will always have an in-order index equal
331
0
    // to N' - 1, where N is the leaves count and N' is N rounded (or equal)
332
0
    // to the next power of 2.
333
0
    #[allow(clippy::arithmetic_side_effects)] // next_power_of_two() > 0
334
0
    Some(Position::from_in_order_index(
335
0
        leaves_count.checked_add(1)?.next_power_of_two() - 1,
336
    ))
337
0
}
338
339
/// Calculcate peak positons for given leaf count.
340
/// Returns `None` if the tree is too large.
341
0
fn peak_positions(leaves_count: u64) -> Option<Vec<Position>> {
342
0
    let leaf_position = Position::from_leaf_index(leaves_count)?;
343
0
    let root_position = root_position(leaves_count)?;
344
345
    // Checked by root_position
346
    #[allow(clippy::arithmetic_side_effects)]
347
0
    let next_leaves_count = leaves_count + 1;
348
0
349
0
    let mut peaks_itr = root_position.path(&leaf_position, next_leaves_count).iter();
350
0
    peaks_itr.next(); // Omit the root
351
0
352
0
    let (_, peaks): (Vec<_>, Vec<_>) = peaks_itr.unzip();
353
0
354
0
    Some(peaks)
355
0
}
356
357
#[cfg(test)]
358
mod test {
359
    use super::{
360
        MerkleTree,
361
        MerkleTreeError,
362
    };
363
    use crate::{
364
        binary::{
365
            empty_sum,
366
            leaf_sum,
367
            node_sum,
368
            Node,
369
            Primitive,
370
        },
371
        common::StorageMap,
372
    };
373
    use fuel_merkle_test_helpers::TEST_DATA;
374
    use fuel_storage::{
375
        Mappable,
376
        StorageInspect,
377
        StorageMutate,
378
    };
379
380
    use alloc::vec::Vec;
381
382
    #[derive(Debug)]
383
    struct TestTable;
384
385
    impl Mappable for TestTable {
386
        type Key = Self::OwnedKey;
387
        type OwnedKey = u64;
388
        type OwnedValue = Primitive;
389
        type Value = Self::OwnedValue;
390
    }
391
392
    #[test]
393
    fn test_push_builds_internal_tree_structure() {
394
        let mut storage_map = StorageMap::<TestTable>::new();
395
        let mut tree = MerkleTree::new(&mut storage_map);
396
397
        let data = &TEST_DATA[0..7]; // 7 leaves
398
        for datum in data.iter() {
399
            let _ = tree.push(datum);
400
        }
401
402
        //               07
403
        //              /  \
404
        //             /    \
405
        //            /      \
406
        //           /        \
407
        //          /          \
408
        //         /            \
409
        //       03              11
410
        //      /  \            /  \
411
        //     /    \          /    \
412
        //   01      05      09      \
413
        //  /  \    /  \    /  \      \
414
        // 00  02  04  06  08  10     12
415
        // 00  01  02  03  04  05     06
416
417
        let leaf_0 = leaf_sum(data[0]);
418
        let leaf_1 = leaf_sum(data[1]);
419
        let leaf_2 = leaf_sum(data[2]);
420
        let leaf_3 = leaf_sum(data[3]);
421
        let leaf_4 = leaf_sum(data[4]);
422
        let leaf_5 = leaf_sum(data[5]);
423
        let leaf_6 = leaf_sum(data[6]);
424
        let node_1 = node_sum(&leaf_0, &leaf_1);
425
        let node_5 = node_sum(&leaf_2, &leaf_3);
426
        let node_3 = node_sum(&node_1, &node_5);
427
        let node_9 = node_sum(&leaf_4, &leaf_5);
428
429
        let s_leaf_0 = storage_map.get(&0).unwrap().unwrap();
430
        let s_leaf_1 = storage_map.get(&2).unwrap().unwrap();
431
        let s_leaf_2 = storage_map.get(&4).unwrap().unwrap();
432
        let s_leaf_3 = storage_map.get(&6).unwrap().unwrap();
433
        let s_leaf_4 = storage_map.get(&8).unwrap().unwrap();
434
        let s_leaf_5 = storage_map.get(&10).unwrap().unwrap();
435
        let s_leaf_6 = storage_map.get(&12).unwrap().unwrap();
436
        let s_node_1 = storage_map.get(&1).unwrap().unwrap();
437
        let s_node_5 = storage_map.get(&5).unwrap().unwrap();
438
        let s_node_9 = storage_map.get(&9).unwrap().unwrap();
439
        let s_node_3 = storage_map.get(&3).unwrap().unwrap();
440
441
        assert_eq!(*Node::from(s_leaf_0.into_owned()).hash(), leaf_0);
442
        assert_eq!(*Node::from(s_leaf_1.into_owned()).hash(), leaf_1);
443
        assert_eq!(*Node::from(s_leaf_2.into_owned()).hash(), leaf_2);
444
        assert_eq!(*Node::from(s_leaf_3.into_owned()).hash(), leaf_3);
445
        assert_eq!(*Node::from(s_leaf_4.into_owned()).hash(), leaf_4);
446
        assert_eq!(*Node::from(s_leaf_5.into_owned()).hash(), leaf_5);
447
        assert_eq!(*Node::from(s_leaf_6.into_owned()).hash(), leaf_6);
448
        assert_eq!(*Node::from(s_node_1.into_owned()).hash(), node_1);
449
        assert_eq!(*Node::from(s_node_5.into_owned()).hash(), node_5);
450
        assert_eq!(*Node::from(s_node_9.into_owned()).hash(), node_9);
451
        assert_eq!(*Node::from(s_node_3.into_owned()).hash(), node_3);
452
    }
453
454
    #[test]
455
    fn load_returns_a_valid_tree() {
456
        const LEAVES_COUNT: u64 = 2u64.pow(16) - 1;
457
458
        let mut storage_map = StorageMap::<TestTable>::new();
459
460
        let expected_root = {
461
            let mut tree = MerkleTree::new(&mut storage_map);
462
            let data = (0u64..LEAVES_COUNT)
463
                .map(|i| i.to_be_bytes())
464
                .collect::<Vec<_>>();
465
            for datum in data.iter() {
466
                let _ = tree.push(datum);
467
            }
468
            tree.root()
469
        };
470
471
        let root = {
472
            let tree = MerkleTree::load(&mut storage_map, LEAVES_COUNT).unwrap();
473
            tree.root()
474
        };
475
476
        assert_eq!(expected_root, root);
477
    }
478
479
    #[test]
480
    fn load_returns_empty_tree_for_0_leaves() {
481
        const LEAVES_COUNT: u64 = 0;
482
483
        let expected_root = *MerkleTree::<(), ()>::empty_root();
484
485
        let root = {
486
            let mut storage_map = StorageMap::<TestTable>::new();
487
            let tree = MerkleTree::load(&mut storage_map, LEAVES_COUNT).unwrap();
488
            tree.root()
489
        };
490
491
        assert_eq!(expected_root, root);
492
    }
493
494
    #[test]
495
    fn load_returns_a_load_error_if_the_storage_is_not_valid_for_the_leaves_count() {
496
        const LEAVES_COUNT: u64 = 5;
497
498
        let mut storage_map = StorageMap::<TestTable>::new();
499
500
        let mut tree = MerkleTree::new(&mut storage_map);
501
        let data = (0u64..LEAVES_COUNT)
502
            .map(|i| i.to_be_bytes())
503
            .collect::<Vec<_>>();
504
        for datum in data.iter() {
505
            let _ = tree.push(datum);
506
        }
507
508
        let err = MerkleTree::load(&mut storage_map, LEAVES_COUNT * 2)
509
            .expect_err("Expected load() to return Error; got Ok");
510
        assert!(matches!(err, MerkleTreeError::LoadError(_)));
511
    }
512
513
    #[test]
514
    fn root_returns_the_empty_root_for_0_leaves() {
515
        let mut storage_map = StorageMap::<TestTable>::new();
516
        let tree = MerkleTree::new(&mut storage_map);
517
518
        let root = tree.root();
519
        assert_eq!(root, empty_sum().clone());
520
    }
521
522
    #[test]
523
    fn root_returns_the_merkle_root_for_1_leaf() {
524
        let mut storage_map = StorageMap::<TestTable>::new();
525
        let mut tree = MerkleTree::new(&mut storage_map);
526
527
        let data = &TEST_DATA[0..1]; // 1 leaf
528
        for datum in data.iter() {
529
            let _ = tree.push(datum);
530
        }
531
532
        let leaf_0 = leaf_sum(data[0]);
533
534
        let root = tree.root();
535
        assert_eq!(root, leaf_0);
536
    }
537
538
    #[test]
539
    fn root_returns_the_merkle_root_for_7_leaves() {
540
        let mut storage_map = StorageMap::<TestTable>::new();
541
        let mut tree = MerkleTree::new(&mut storage_map);
542
543
        let data = &TEST_DATA[0..7]; // 7 leaves
544
        for datum in data.iter() {
545
            let _ = tree.push(datum);
546
        }
547
548
        //               07
549
        //              /  \
550
        //             /    \
551
        //            /      \
552
        //           /        \
553
        //          /          \
554
        //         /            \
555
        //       03              11
556
        //      /  \            /  \
557
        //     /    \          /    \
558
        //   01      05      09      \
559
        //  /  \    /  \    /  \      \
560
        // 00  02  04  06  08  10     12
561
        // 00  01  02  03  04  05     06
562
563
        let leaf_0 = leaf_sum(data[0]);
564
        let leaf_1 = leaf_sum(data[1]);
565
        let leaf_2 = leaf_sum(data[2]);
566
        let leaf_3 = leaf_sum(data[3]);
567
        let leaf_4 = leaf_sum(data[4]);
568
        let leaf_5 = leaf_sum(data[5]);
569
        let leaf_6 = leaf_sum(data[6]);
570
571
        let node_1 = node_sum(&leaf_0, &leaf_1);
572
        let node_5 = node_sum(&leaf_2, &leaf_3);
573
        let node_3 = node_sum(&node_1, &node_5);
574
        let node_9 = node_sum(&leaf_4, &leaf_5);
575
        let node_11 = node_sum(&node_9, &leaf_6);
576
        let node_7 = node_sum(&node_3, &node_11);
577
578
        let root = tree.root();
579
        assert_eq!(root, node_7);
580
    }
581
582
    #[test]
583
    fn prove_returns_invalid_proof_index_error_for_0_leaves() {
584
        let mut storage_map = StorageMap::<TestTable>::new();
585
        let tree = MerkleTree::new(&mut storage_map);
586
587
        let err = tree
588
            .prove(0)
589
            .expect_err("Expected prove() to return Error; got Ok");
590
        assert!(matches!(err, MerkleTreeError::InvalidProofIndex(0)));
591
    }
592
593
    #[test]
594
    fn prove_returns_invalid_proof_index_error_when_index_is_greater_than_number_of_leaves(
595
    ) {
596
        let mut storage_map = StorageMap::<TestTable>::new();
597
        let mut tree = MerkleTree::new(&mut storage_map);
598
599
        let data = &TEST_DATA[0..5]; // 5 leaves
600
        for datum in data.iter() {
601
            let _ = tree.push(datum);
602
        }
603
604
        let err = tree
605
            .prove(10)
606
            .expect_err("Expected prove() to return Error; got Ok");
607
        assert!(matches!(err, MerkleTreeError::InvalidProofIndex(10)))
608
    }
609
610
    #[test]
611
    fn prove_returns_the_merkle_root_and_proof_set_for_1_leaf() {
612
        let mut storage_map = StorageMap::<TestTable>::new();
613
        let mut tree = MerkleTree::new(&mut storage_map);
614
615
        let data = &TEST_DATA[0..1]; // 1 leaf
616
        for datum in data.iter() {
617
            let _ = tree.push(datum);
618
        }
619
620
        let leaf_0 = leaf_sum(data[0]);
621
622
        {
623
            let (root, proof_set) = tree.prove(0).unwrap();
624
            assert_eq!(root, leaf_0);
625
            assert!(proof_set.is_empty());
626
        }
627
    }
628
629
    #[test]
630
    fn prove_returns_the_merkle_root_and_proof_set_for_4_leaves() {
631
        let mut storage_map = StorageMap::<TestTable>::new();
632
        let mut tree = MerkleTree::new(&mut storage_map);
633
634
        let data = &TEST_DATA[0..4]; // 4 leaves
635
        for datum in data.iter() {
636
            let _ = tree.push(datum);
637
        }
638
639
        //       03
640
        //      /  \
641
        //     /    \
642
        //   01      05
643
        //  /  \    /  \
644
        // 00  02  04  06
645
        // 00  01  02  03
646
647
        let leaf_0 = leaf_sum(data[0]);
648
        let leaf_1 = leaf_sum(data[1]);
649
        let leaf_2 = leaf_sum(data[2]);
650
        let leaf_3 = leaf_sum(data[3]);
651
652
        let node_1 = node_sum(&leaf_0, &leaf_1);
653
        let node_5 = node_sum(&leaf_2, &leaf_3);
654
        let node_3 = node_sum(&node_1, &node_5);
655
656
        {
657
            let (root, proof_set) = tree.prove(0).unwrap();
658
            assert_eq!(root, node_3);
659
            assert_eq!(proof_set[0], leaf_1);
660
            assert_eq!(proof_set[1], node_5);
661
        }
662
        {
663
            let (root, proof_set) = tree.prove(1).unwrap();
664
            assert_eq!(root, node_3);
665
            assert_eq!(proof_set[0], leaf_0);
666
            assert_eq!(proof_set[1], node_5);
667
        }
668
        {
669
            let (root, proof_set) = tree.prove(2).unwrap();
670
            assert_eq!(root, node_3);
671
            assert_eq!(proof_set[0], leaf_3);
672
            assert_eq!(proof_set[1], node_1);
673
        }
674
        {
675
            let (root, proof_set) = tree.prove(3).unwrap();
676
            assert_eq!(root, node_3);
677
            assert_eq!(proof_set[0], leaf_2);
678
            assert_eq!(proof_set[1], node_1);
679
        }
680
    }
681
682
    #[test]
683
    fn prove_returns_the_merkle_root_and_proof_set_for_5_leaves() {
684
        let mut storage_map = StorageMap::<TestTable>::new();
685
        let mut tree = MerkleTree::new(&mut storage_map);
686
687
        let data = &TEST_DATA[0..5]; // 5 leaves
688
        for datum in data.iter() {
689
            let _ = tree.push(datum);
690
        }
691
692
        //          07
693
        //          /\
694
        //         /  \
695
        //       03    \
696
        //      /  \    \
697
        //     /    \    \
698
        //   01      05   \
699
        //  /  \    /  \   \
700
        // 00  02  04  06  08
701
        // 00  01  02  03  04
702
703
        let leaf_0 = leaf_sum(data[0]);
704
        let leaf_1 = leaf_sum(data[1]);
705
        let leaf_2 = leaf_sum(data[2]);
706
        let leaf_3 = leaf_sum(data[3]);
707
        let leaf_4 = leaf_sum(data[4]);
708
709
        let node_1 = node_sum(&leaf_0, &leaf_1);
710
        let node_5 = node_sum(&leaf_2, &leaf_3);
711
        let node_3 = node_sum(&node_1, &node_5);
712
        let node_7 = node_sum(&node_3, &leaf_4);
713
714
        {
715
            let (root, proof_set) = tree.prove(0).unwrap();
716
            assert_eq!(root, node_7);
717
            assert_eq!(proof_set[0], leaf_1);
718
            assert_eq!(proof_set[1], node_5);
719
            assert_eq!(proof_set[2], leaf_4);
720
        }
721
        {
722
            let (root, proof_set) = tree.prove(1).unwrap();
723
            assert_eq!(root, node_7);
724
            assert_eq!(proof_set[0], leaf_0);
725
            assert_eq!(proof_set[1], node_5);
726
            assert_eq!(proof_set[2], leaf_4);
727
        }
728
        {
729
            let (root, proof_set) = tree.prove(2).unwrap();
730
            assert_eq!(root, node_7);
731
            assert_eq!(proof_set[0], leaf_3);
732
            assert_eq!(proof_set[1], node_1);
733
            assert_eq!(proof_set[2], leaf_4);
734
        }
735
        {
736
            let (root, proof_set) = tree.prove(3).unwrap();
737
            assert_eq!(root, node_7);
738
            assert_eq!(proof_set[0], leaf_2);
739
            assert_eq!(proof_set[1], node_1);
740
            assert_eq!(proof_set[2], leaf_4);
741
        }
742
        {
743
            let (root, proof_set) = tree.prove(4).unwrap();
744
            assert_eq!(root, node_7);
745
            assert_eq!(proof_set[0], node_3);
746
        }
747
    }
748
749
    #[test]
750
    fn prove_returns_the_merkle_root_and_proof_set_for_7_leaves() {
751
        let mut storage_map = StorageMap::<TestTable>::new();
752
        let mut tree = MerkleTree::new(&mut storage_map);
753
754
        let data = &TEST_DATA[0..7]; // 7 leaves
755
        for datum in data.iter() {
756
            let _ = tree.push(datum);
757
        }
758
759
        //               07
760
        //              /  \
761
        //             /    \
762
        //            /      \
763
        //           /        \
764
        //          /          \
765
        //         /            \
766
        //       03              11
767
        //      /  \            /  \
768
        //     /    \          /    \
769
        //   01      05      09      \
770
        //  /  \    /  \    /  \      \
771
        // 00  02  04  06  08  10     12
772
        // 00  01  02  03  04  05     06
773
774
        let leaf_0 = leaf_sum(data[0]);
775
        let leaf_1 = leaf_sum(data[1]);
776
        let leaf_2 = leaf_sum(data[2]);
777
        let leaf_3 = leaf_sum(data[3]);
778
        let leaf_4 = leaf_sum(data[4]);
779
        let leaf_5 = leaf_sum(data[5]);
780
        let leaf_6 = leaf_sum(data[6]);
781
782
        let node_1 = node_sum(&leaf_0, &leaf_1);
783
        let node_5 = node_sum(&leaf_2, &leaf_3);
784
        let node_3 = node_sum(&node_1, &node_5);
785
        let node_9 = node_sum(&leaf_4, &leaf_5);
786
        let node_11 = node_sum(&node_9, &leaf_6);
787
        let node_7 = node_sum(&node_3, &node_11);
788
789
        {
790
            let (root, proof_set) = tree.prove(0).unwrap();
791
            assert_eq!(root, node_7);
792
            assert_eq!(proof_set[0], leaf_1);
793
            assert_eq!(proof_set[1], node_5);
794
            assert_eq!(proof_set[2], node_11);
795
        }
796
        {
797
            let (root, proof_set) = tree.prove(1).unwrap();
798
            assert_eq!(root, node_7);
799
            assert_eq!(proof_set[0], leaf_0);
800
            assert_eq!(proof_set[1], node_5);
801
            assert_eq!(proof_set[2], node_11);
802
        }
803
        {
804
            let (root, proof_set) = tree.prove(2).unwrap();
805
            assert_eq!(root, node_7);
806
            assert_eq!(proof_set[0], leaf_3);
807
            assert_eq!(proof_set[1], node_1);
808
            assert_eq!(proof_set[2], node_11);
809
        }
810
        {
811
            let (root, proof_set) = tree.prove(3).unwrap();
812
            assert_eq!(root, node_7);
813
            assert_eq!(proof_set[0], leaf_2);
814
            assert_eq!(proof_set[1], node_1);
815
            assert_eq!(proof_set[2], node_11);
816
        }
817
        {
818
            let (root, proof_set) = tree.prove(4).unwrap();
819
            assert_eq!(root, node_7);
820
            assert_eq!(proof_set[0], leaf_5);
821
            assert_eq!(proof_set[1], leaf_6);
822
            assert_eq!(proof_set[2], node_3);
823
        }
824
        {
825
            let (root, proof_set) = tree.prove(5).unwrap();
826
            assert_eq!(root, node_7);
827
            assert_eq!(proof_set[0], leaf_4);
828
            assert_eq!(proof_set[1], leaf_6);
829
            assert_eq!(proof_set[2], node_3);
830
        }
831
        {
832
            let (root, proof_set) = tree.prove(6).unwrap();
833
            assert_eq!(root, node_7);
834
            assert_eq!(proof_set[0], node_9);
835
            assert_eq!(proof_set[1], node_3);
836
        }
837
    }
838
839
    #[test]
840
    fn reset_reverts_tree_to_empty_state() {
841
        let mut storage_map = StorageMap::<TestTable>::new();
842
        let mut tree = MerkleTree::new(&mut storage_map);
843
844
        let data = &TEST_DATA[0..4]; // 4 leaves
845
        for datum in data.iter() {
846
            let _ = tree.push(datum);
847
        }
848
849
        tree.reset();
850
851
        let root = tree.root();
852
        let expected_root = *MerkleTree::<(), ()>::empty_root();
853
        assert_eq!(root, expected_root);
854
855
        let data = &TEST_DATA[0..4]; // 4 leaves
856
        for datum in data.iter() {
857
            let _ = tree.push(datum);
858
        }
859
860
        let leaf_0 = leaf_sum(data[0]);
861
        let leaf_1 = leaf_sum(data[1]);
862
        let leaf_2 = leaf_sum(data[2]);
863
        let leaf_3 = leaf_sum(data[3]);
864
865
        let node_1 = node_sum(&leaf_0, &leaf_1);
866
        let node_5 = node_sum(&leaf_2, &leaf_3);
867
        let node_3 = node_sum(&node_1, &node_5);
868
869
        let root = tree.root();
870
        let expected_root = node_3;
871
        assert_eq!(root, expected_root);
872
    }
873
874
    #[test]
875
    fn load_overflows() {
876
        // Given
877
        let storage_map = StorageMap::<TestTable>::new();
878
        const LEAVES_COUNT: u64 = u64::MAX;
879
880
        // When
881
        let result = MerkleTree::load(storage_map, LEAVES_COUNT).map(|_| ());
882
883
        // Then
884
        assert_eq!(result, Err(MerkleTreeError::TooLarge));
885
    }
886
887
    #[test]
888
    fn push_overflows() {
889
        // Given
890
        let mut storage_map = StorageMap::<TestTable>::new();
891
        const LEAVES_COUNT: u64 = u64::MAX / 2;
892
        loop {
893
            let result = MerkleTree::load(&mut storage_map, LEAVES_COUNT).map(|_| ());
894
895
            if let Err(MerkleTreeError::LoadError(index)) = result {
896
                storage_map.insert(&index, &Primitive::default()).unwrap();
897
            } else {
898
                break;
899
            }
900
        }
901
902
        // When
903
        let mut tree = MerkleTree::load(storage_map, LEAVES_COUNT)
904
            .expect("Expected `load()` to succeed");
905
        let _ = tree.push(&[]);
906
        let result = tree.push(&[]);
907
908
        // Then
909
        assert_eq!(result, Err(MerkleTreeError::TooLarge));
910
    }
911
}
/home/marten/fuel/fuel-vm/fuel-merkle/src/binary/root_calculator.rs
Line
Count
Source
1
use core::convert::Infallible;
2
3
use crate::{
4
    binary::{
5
        empty_sum,
6
        Node,
7
    },
8
    common::Bytes32,
9
};
10
11
use crate::alloc::borrow::ToOwned;
12
use alloc::vec::Vec;
13
14
#[derive(Debug)]
15
pub(crate) enum NodeStackPushError<E> {
16
    Callback(E),
17
    TooLarge,
18
}
19
20
#[derive(Default, Debug, Clone, PartialEq)]
21
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
22
pub struct MerkleRootCalculator {
23
    stack: Vec<Node>,
24
}
25
26
impl MerkleRootCalculator {
27
13.1k
    pub fn new() -> Self {
28
13.1k
        Self { stack: Vec::new() }
29
13.1k
    }
_RNvMNtNtCsacfdLYFME8L_11fuel_merkle6binary15root_calculatorNtB2_20MerkleRootCalculator3newCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
27
4.38k
    pub fn new() -> Self {
28
4.38k
        Self { stack: Vec::new() }
29
4.38k
    }
_RNvMNtNtCsacfdLYFME8L_11fuel_merkle6binary15root_calculatorNtB2_20MerkleRootCalculator3newCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
27
8.77k
    pub fn new() -> Self {
28
8.77k
        Self { stack: Vec::new() }
29
8.77k
    }
Unexecuted instantiation: _RNvMNtNtCsacfdLYFME8L_11fuel_merkle6binary15root_calculatorNtB2_20MerkleRootCalculator3newB6_
30
31
0
    pub fn new_with_stack(stack: Vec<Node>) -> Self {
32
0
        Self { stack }
33
0
    }
34
35
0
    pub fn clear(&mut self) {
36
0
        self.stack.clear();
37
0
    }
38
39
    /// Push a leaf to stack of nodes, propagating changes through the tree.
40
    /// Calls `node_created` for each new node created, stopping on first error.
41
933k
    pub(crate) fn push_with_callback<F, E>(
42
933k
        &mut self,
43
933k
        node: Node,
44
933k
        mut node_created: F,
45
933k
    ) -> Result<(), NodeStackPushError<E>>
46
933k
    where
47
933k
        F: FnMut(&Node) -> Result<(), E>,
48
933k
    {
49
933k
        node_created(&node).map_err(NodeStackPushError::Callback)?;
50
933k
        self.stack.push(node);
51
52
        // Propagate changes through the tree.
53
        #[allow(clippy::arithmetic_side_effects)] // ensured by loop condition
54
1.85M
        while self.stack.len() > 1 {
55
1.84M
            let rhs = &self.stack[self.stack.len() - 1];
56
1.84M
            let lhs = &self.stack[self.stack.len() - 2];
57
1.84M
            if rhs.height() != lhs.height() {
58
919k
                break;
59
921k
            }
60
61
921k
            let parent_pos = lhs
62
921k
                .position()
63
921k
                .parent()
64
921k
                .map_err(|_| NodeStackPushError::TooLarge)?;
Unexecuted instantiation: _RNCINvMNtNtCsacfdLYFME8L_11fuel_merkle6binary15root_calculatorNtB5_20MerkleRootCalculator18push_with_callbackNCNvB4_4push0NtNtCsd3UI3IJrzMw_4core7convert10InfallibleE0B9_
Unexecuted instantiation: _RNCINvMNtNtCsacfdLYFME8L_11fuel_merkle6binary15root_calculatorNtB5_20MerkleRootCalculator18push_with_callbackNCNvMs1_NtB7_11merkle_treeINtB1R_10MerkleTreeNtNtB7_9in_memory10NodesTableINtNtNtB9_6common11storage_map10StorageMapB2s_EE4push0INtB1R_15MerkleTreeErrorNtNtCsd3UI3IJrzMw_4core7convert10InfallibleEE0B9_
65
921k
            let new = Node::create_node(parent_pos, lhs, rhs);
66
921k
            node_created(&new).map_err(NodeStackPushError::Callback)?;
67
921k
            let _ = self.stack.pop();
68
921k
            let _ = self.stack.pop();
69
921k
            self.stack.push(new);
70
        }
71
72
933k
        Ok(())
73
933k
    }
_RINvMNtNtCsacfdLYFME8L_11fuel_merkle6binary15root_calculatorNtB3_20MerkleRootCalculator18push_with_callbackNCNvB2_4push0NtNtCsd3UI3IJrzMw_4core7convert10InfallibleEB7_
Line
Count
Source
41
933k
    pub(crate) fn push_with_callback<F, E>(
42
933k
        &mut self,
43
933k
        node: Node,
44
933k
        mut node_created: F,
45
933k
    ) -> Result<(), NodeStackPushError<E>>
46
933k
    where
47
933k
        F: FnMut(&Node) -> Result<(), E>,
48
933k
    {
49
933k
        node_created(&node).map_err(NodeStackPushError::Callback)?;
50
933k
        self.stack.push(node);
51
52
        // Propagate changes through the tree.
53
        #[allow(clippy::arithmetic_side_effects)] // ensured by loop condition
54
1.85M
        while self.stack.len() > 1 {
55
1.84M
            let rhs = &self.stack[self.stack.len() - 1];
56
1.84M
            let lhs = &self.stack[self.stack.len() - 2];
57
1.84M
            if rhs.height() != lhs.height() {
58
919k
                break;
59
921k
            }
60
61
921k
            let parent_pos = lhs
62
921k
                .position()
63
921k
                .parent()
64
921k
                .map_err(|_| NodeStackPushError::TooLarge)?;
65
921k
            let new = Node::create_node(parent_pos, lhs, rhs);
66
921k
            node_created(&new).map_err(NodeStackPushError::Callback)?;
67
921k
            let _ = self.stack.pop();
68
921k
            let _ = self.stack.pop();
69
921k
            self.stack.push(new);
70
        }
71
72
933k
        Ok(())
73
933k
    }
Unexecuted instantiation: _RINvMNtNtCsacfdLYFME8L_11fuel_merkle6binary15root_calculatorNtB3_20MerkleRootCalculator18push_with_callbackNCNvMs1_NtB5_11merkle_treeINtB1P_10MerkleTreeNtNtB5_9in_memory10NodesTableINtNtNtB7_6common11storage_map10StorageMapB2q_EE4push0INtB1P_15MerkleTreeErrorNtNtCsd3UI3IJrzMw_4core7convert10InfallibleEEB7_
74
75
    /// Push a new leaf node.
76
    /// Panics if the tree would be too large to compute the root for.
77
    /// In practice this never occurs, as you'd run out of memory first.
78
933k
    pub fn push(&mut self, data: &[u8]) {
79
933k
        let node = Node::create_leaf(0, data).expect("Zero is a valid index for a leaf");
80
1.85M
        self.push_with_callback::<_, Infallible>(node, |_| Ok(()))
81
933k
            .expect("Tree too large");
82
933k
    }
83
84
13.1k
    pub fn root(mut self) -> Bytes32 {
85
13.1k
        if self.stack.is_empty() {
86
0
            return empty_sum().to_owned()
87
13.1k
        }
88
14.6k
        while self.stack.len() > 1 {
89
1.49k
            let right_child = self.stack.pop().expect("Checked in loop bound");
90
1.49k
            let left_child = self.stack.pop().expect("Checked in loop bound");
91
1.49k
            let merged_pos = left_child
92
1.49k
                .position()
93
1.49k
                .parent()
94
1.49k
                .expect("Left child has no parent");
95
1.49k
            let merged_node = Node::create_node(merged_pos, &left_child, &right_child);
96
1.49k
            self.stack.push(merged_node);
97
1.49k
        }
98
13.1k
        self.stack.pop().unwrap().hash().to_owned()
99
13.1k
    }
100
101
0
    pub fn root_from_iterator<I: Iterator<Item = T>, T: AsRef<[u8]>>(
102
0
        self,
103
0
        iterator: I,
104
0
    ) -> Bytes32 {
105
0
        let mut calculator = MerkleRootCalculator::new();
106
107
0
        for data in iterator {
108
0
            calculator.push(data.as_ref());
109
0
        }
110
111
0
        calculator.root()
112
0
    }
113
114
0
    pub fn stack(&self) -> &Vec<Node> {
115
0
        &self.stack
116
0
    }
117
}
118
119
#[cfg(test)]
120
mod test {
121
    use super::*;
122
    use crate::binary::in_memory::MerkleTree;
123
    use fuel_merkle_test_helpers::TEST_DATA;
124
    #[cfg(test)]
125
    use serde_json as _;
126
127
    #[test]
128
    fn root_returns_the_empty_root_for_0_leaves() {
129
        let tree = MerkleTree::new();
130
        let calculate_root = MerkleRootCalculator::new();
131
132
        assert_eq!(tree.root(), calculate_root.root());
133
    }
134
135
    #[test]
136
    fn root_returns_the_merkle_root_for_1_leaf() {
137
        let mut tree = MerkleTree::new();
138
        let mut calculate_root = MerkleRootCalculator::new();
139
140
        let data = &TEST_DATA[0..1]; // 1 leaf
141
        for datum in data.iter() {
142
            tree.push(datum);
143
            calculate_root.push(datum)
144
        }
145
146
        assert_eq!(tree.root(), calculate_root.root());
147
    }
148
149
    #[test]
150
    fn root_returns_the_merkle_root_for_7_leaves() {
151
        let mut tree = MerkleTree::new();
152
        let mut calculate_root = MerkleRootCalculator::new();
153
154
        let data = &TEST_DATA[0..7];
155
        for datum in data.iter() {
156
            tree.push(datum);
157
            calculate_root.push(datum)
158
        }
159
        assert_eq!(tree.root(), calculate_root.root());
160
    }
161
162
    #[test]
163
    fn root_returns_the_merkle_root_for_100000_leaves() {
164
        let mut tree = MerkleTree::new();
165
        let mut calculate_root = MerkleRootCalculator::new();
166
167
        for value in 0..10000u64 {
168
            let data = value.to_le_bytes();
169
            tree.push(&data);
170
            calculate_root.push(&data);
171
        }
172
173
        assert_eq!(tree.root(), calculate_root.root());
174
    }
175
176
    #[test]
177
    fn root_returns_the_merkle_root_from_iterator() {
178
        let mut tree = MerkleTree::new();
179
        let calculate_root = MerkleRootCalculator::new();
180
181
        let data = &TEST_DATA[0..7];
182
        for datum in data.iter() {
183
            tree.push(datum);
184
        }
185
186
        let root = calculate_root.root_from_iterator(data.iter());
187
188
        assert_eq!(tree.root(), root);
189
    }
190
191
    #[test]
192
    #[cfg(feature = "serde")]
193
    fn test_serialize_deserialize() {
194
        let mut calculator = MerkleRootCalculator::new();
195
196
        let data = &TEST_DATA[0..7];
197
        for datum in data.iter() {
198
            calculator.push(datum);
199
        }
200
        let json = serde_json::to_string(&calculator).unwrap();
201
202
        let deserialized_calculator: MerkleRootCalculator =
203
            serde_json::from_str(&json).expect("Unable to read from str");
204
205
        assert_eq!(calculator.root(), deserialized_calculator.root());
206
    }
207
}
/home/marten/fuel/fuel-vm/fuel-merkle/src/binary/hash.rs
Line
Count
Source
1
use crate::common::{
2
    empty_sum_sha256,
3
    Bytes32,
4
    Prefix,
5
};
6
7
use digest::Digest;
8
use sha2::Sha256;
9
10
type Hash = Sha256;
11
12
// Merkle Tree hash of an empty list
13
// MTH({}) = Hash()
14
0
pub const fn empty_sum() -> &'static Bytes32 {
15
0
    empty_sum_sha256()
16
0
}
17
18
// Merkle tree hash of an n-element list D[n]
19
// MTH(D[n]) = Hash(0x01 || MTH(D[0:k]) || MTH(D[k:n])
20
923k
pub fn node_sum(lhs_data: &Bytes32, rhs_data: &Bytes32) -> Bytes32 {
21
923k
    let mut hash = Hash::new();
22
923k
23
923k
    hash.update(Prefix::Node);
24
923k
    hash.update(lhs_data);
25
923k
    hash.update(rhs_data);
26
923k
27
923k
    hash.finalize().into()
28
923k
}
29
30
// Merkle tree hash of a list with one entry
31
// MTH({d(0)}) = Hash(0x00 || d(0))
32
933k
pub fn leaf_sum(data: &[u8]) -> Bytes32 {
33
933k
    let mut hash = Hash::new();
34
933k
35
933k
    hash.update(Prefix::Leaf);
36
933k
    hash.update(data);
37
933k
38
933k
    hash.finalize().into()
39
933k
}
/home/marten/fuel/fuel-vm/fuel-merkle/src/storage.rs
Line
Count
Source
1
use alloc::borrow::Cow;
2
use core::convert::Infallible;
3
4
// Re-export fuel-storage traits
5
pub use fuel_storage::{
6
    Mappable,
7
    StorageInspect,
8
    StorageMutate,
9
};
10
11
pub trait StorageInspectInfallible<Type: Mappable> {
12
    fn get(&self, key: &Type::Key) -> Option<Cow<Type::OwnedValue>>;
13
    fn contains_key(&self, key: &Type::Key) -> bool;
14
}
15
16
pub trait StorageMutateInfallible<Type: Mappable> {
17
    fn insert(&mut self, key: &Type::Key, value: &Type::Value);
18
    fn remove(&mut self, key: &Type::Key);
19
}
20
21
impl<S, Type> StorageInspectInfallible<Type> for S
22
where
23
    S: StorageInspect<Type, Error = Infallible>,
24
    Type: Mappable,
25
{
26
0
    fn get(&self, key: &Type::Key) -> Option<Cow<Type::OwnedValue>> {
27
0
        <Self as StorageInspect<Type>>::get(self, key)
28
0
            .expect("Expected get() to be infallible")
29
0
    }
30
31
0
    fn contains_key(&self, key: &Type::Key) -> bool {
32
0
        <Self as StorageInspect<Type>>::contains_key(self, key)
33
0
            .expect("Expected contains_key() to be infallible")
34
0
    }
35
}
36
37
impl<S, Type> StorageMutateInfallible<Type> for S
38
where
39
    S: StorageMutate<Type, Error = Infallible>,
40
    Type: Mappable,
41
{
42
0
    fn insert(&mut self, key: &Type::Key, value: &Type::Value) {
43
0
        <Self as StorageMutate<Type>>::insert(self, key, value)
44
0
            .expect("Expected insert() to be infallible")
45
0
    }
46
47
0
    fn remove(&mut self, key: &Type::Key) {
48
0
        <Self as StorageMutate<Type>>::remove(self, key)
49
0
            .expect("Expected remove() to be infallible")
50
0
    }
51
}
/home/marten/fuel/fuel-vm/fuel-merkle/src/common/msb.rs
Line
Count
Source
1
type Bit = bool;
2
3
pub trait Msb {
4
    fn get_bit_at_index_from_msb(&self, index: u32) -> Option<Bit>;
5
    fn common_prefix_count(&self, other: &[u8]) -> u64;
6
}
7
8
impl<const N: usize> Msb for [u8; N] {
9
0
    fn get_bit_at_index_from_msb(&self, index: u32) -> Option<Bit> {
10
0
        // The byte that contains the bit
11
0
        let byte_index = index / 8;
12
0
        // The bit within the containing byte
13
0
        let byte_bit_index = index % 8;
14
0
        self.get(byte_index as usize).map(|byte| {
15
0
            #[allow(clippy::arithmetic_side_effects)] // checked above
16
0
            let mask = 1 << (7 - byte_bit_index);
17
0
            byte & mask != 0
18
0
        })
Unexecuted instantiation: _RNCNvXNtNtCsacfdLYFME8L_11fuel_merkle6common3msbAhj20_NtB4_3Msb25get_bit_at_index_from_msb0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXNtNtCsacfdLYFME8L_11fuel_merkle6common3msbAhj20_NtB4_3Msb25get_bit_at_index_from_msb0CseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNCNvXNtNtCsacfdLYFME8L_11fuel_merkle6common3msbAhj20_NtB4_3Msb25get_bit_at_index_from_msb0B8_
Unexecuted instantiation: _RNCNvXNtNtCsacfdLYFME8L_11fuel_merkle6common3msbAhj8_NtB4_3Msb25get_bit_at_index_from_msb0B8_
19
0
    }
Unexecuted instantiation: _RNvXNtNtCsacfdLYFME8L_11fuel_merkle6common3msbAhj20_NtB2_3Msb25get_bit_at_index_from_msbCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNtNtCsacfdLYFME8L_11fuel_merkle6common3msbAhj20_NtB2_3Msb25get_bit_at_index_from_msbCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvXNtNtCsacfdLYFME8L_11fuel_merkle6common3msbAhj20_NtB2_3Msb25get_bit_at_index_from_msbB6_
Unexecuted instantiation: _RNvXNtNtCsacfdLYFME8L_11fuel_merkle6common3msbAhj8_NtB2_3Msb25get_bit_at_index_from_msbB6_
20
21
0
    fn common_prefix_count(&self, other: &[u8]) -> u64 {
22
0
        let mut count = 0;
23
0
        for (byte1, byte2) in self.iter().zip(other.iter()) {
24
            // For each pair of bytes, compute the similarity of each byte using
25
            // exclusive or (XOR). The leading zeros measures the number of
26
            // similar bits from left to right. For equal bytes, this will be 8.
27
0
            let common_bits = (byte1 ^ byte2).leading_zeros();
28
0
            #[allow(clippy::arithmetic_side_effects)] // u64 is always large enough
29
0
            {
30
0
                count += common_bits as u64;
31
0
            }
32
0
            if byte1 != byte2 {
33
0
                break
34
0
            }
35
        }
36
0
        count
37
0
    }
Unexecuted instantiation: _RNvXNtNtCsacfdLYFME8L_11fuel_merkle6common3msbAhj20_NtB2_3Msb19common_prefix_countCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNtNtCsacfdLYFME8L_11fuel_merkle6common3msbAhj20_NtB2_3Msb19common_prefix_countCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvXNtNtCsacfdLYFME8L_11fuel_merkle6common3msbAhj20_NtB2_3Msb19common_prefix_countB6_
38
}
39
40
#[allow(clippy::cast_possible_truncation)]
41
#[cfg(test)]
42
mod test {
43
    use crate::common::{
44
        Bytes1,
45
        Bytes2,
46
        Bytes4,
47
        Bytes8,
48
        Msb,
49
    };
50
    use core::mem::size_of;
51
52
    #[test]
53
    fn test_msb_for_bytes_1() {
54
        const NUM_BITS: u32 = size_of::<Bytes1>() as u32 * 8;
55
56
        let bytes: Bytes1 = [0b10101010];
57
        let expected_n = u8::from_be_bytes(bytes);
58
59
        let mut n = 0;
60
        for i in 0..NUM_BITS {
61
            let bit = bytes.get_bit_at_index_from_msb(i).unwrap() as u8;
62
            let shift = bit << (NUM_BITS - 1 - i);
63
            n |= shift;
64
        }
65
66
        assert_eq!(n, expected_n);
67
    }
68
69
    #[test]
70
    fn test_msb_for_bytes_2() {
71
        const NUM_BITS: u32 = size_of::<Bytes2>() as u32 * 8;
72
73
        let bytes: Bytes2 = [0b10101010, 0b10101010];
74
        let expected_n = u16::from_be_bytes(bytes);
75
76
        let mut n = 0;
77
        for i in 0..NUM_BITS {
78
            let bit = bytes.get_bit_at_index_from_msb(i).unwrap() as u16;
79
            let shift = bit << (NUM_BITS - 1 - i);
80
            n |= shift;
81
        }
82
83
        assert_eq!(n, expected_n);
84
    }
85
86
    #[test]
87
    fn test_msb_for_bytes_4() {
88
        const NUM_BITS: u32 = size_of::<Bytes4>() as u32 * 8;
89
90
        let bytes: Bytes4 = [0b10101010, 0b10101010, 0b10101010, 0b10101010];
91
        let expected_n = u32::from_be_bytes(bytes);
92
93
        let mut n = 0;
94
        for i in 0..NUM_BITS {
95
            let bit = bytes.get_bit_at_index_from_msb(i).unwrap() as u32;
96
            let shift = bit << (NUM_BITS - 1 - i);
97
            n |= shift;
98
        }
99
100
        assert_eq!(n, expected_n);
101
    }
102
103
    #[test]
104
    fn test_msb_for_bytes_8() {
105
        const NUM_BITS: u32 = size_of::<Bytes8>() as u32 * 8;
106
107
        let bytes: Bytes8 = [
108
            0b10101010, 0b10101010, 0b10101010, 0b10101010, 0b10101010, 0b10101010,
109
            0b10101010, 0b10101010,
110
        ];
111
        let expected_n = u64::from_be_bytes(bytes);
112
113
        let mut n = 0;
114
        for i in 0..NUM_BITS {
115
            let bit = bytes.get_bit_at_index_from_msb(i).unwrap() as u64;
116
            let shift = bit << (NUM_BITS - 1 - i);
117
            n |= shift;
118
        }
119
120
        assert_eq!(n, expected_n);
121
    }
122
123
    #[test]
124
    fn test_get_bit_at_index_from_msb_returns_none_for_index_out_of_bounds() {
125
        let bytes: Bytes4 = [0b10101010, 0b10101010, 0b10101010, 0b10101010];
126
127
        // Returns None; acceptable inputs for Bytes4 are in [0, 31]
128
        let bit = bytes.get_bit_at_index_from_msb(32);
129
        assert_eq!(bit, None);
130
    }
131
132
    #[test]
133
    fn test_common_prefix_count_returns_count_of_common_bits_when_all_bits_match() {
134
        let lhs_bytes: Bytes4 = [0b10101010, 0b10101010, 0b10101010, 0b10101010];
135
        let rhs_bytes: Bytes4 = [0b10101010, 0b10101010, 0b10101010, 0b10101010];
136
        let common_prefix_count = lhs_bytes.common_prefix_count(&rhs_bytes);
137
138
        assert_eq!(common_prefix_count, 4 * 8);
139
    }
140
141
    #[test]
142
    fn test_common_prefix_count_returns_count_of_common_bits_when_some_bits_match() {
143
        let lhs_bytes: Bytes4 = [0b11111111, 0b11111111, 0b11111111, 0b11111111];
144
        let rhs_bytes: Bytes4 = [0b11111111, 0b11111111, 0b11100000, 0b00000000];
145
        let common_prefix_count = lhs_bytes.common_prefix_count(&rhs_bytes);
146
147
        assert_eq!(common_prefix_count, 19);
148
    }
149
150
    #[test]
151
    fn test_common_prefix_count_returns_0_when_the_first_bits_are_different() {
152
        let lhs_bytes: Bytes4 = [0b11111111, 0b11111111, 0b11111111, 0b11111111];
153
        let rhs_bytes: Bytes4 = [0b01111111, 0b11111111, 0b11111111, 0b11111111];
154
        let common_prefix_count = lhs_bytes.common_prefix_count(&rhs_bytes);
155
156
        assert_eq!(common_prefix_count, 0);
157
    }
158
159
    #[test]
160
    fn test_common_prefix_count_returns_0_when_all_bits_are_different() {
161
        let lhs_bytes: Bytes4 = [0b11111111, 0b11111111, 0b11111111, 0b11111111];
162
        let rhs_bytes: Bytes4 = [0b00000000, 0b00000000, 0b00000000, 0b00000000];
163
        let common_prefix_count = lhs_bytes.common_prefix_count(&rhs_bytes);
164
165
        assert_eq!(common_prefix_count, 0);
166
    }
167
}
/home/marten/fuel/fuel-vm/fuel-merkle/src/common/path_iterator.rs
Line
Count
Source
1
use crate::common::{
2
    node::{
3
        ChildKeyResult,
4
        ChildResult,
5
        ParentNode,
6
    },
7
    path::{
8
        Path,
9
        Side,
10
    },
11
};
12
13
/// # Path Iterator
14
///
15
/// A naturally arising property of binary trees is that a leaf index encodes
16
/// the unique path needed to traverse from the root of the tree to that leaf.
17
/// The index's binary representation can be read left to right as a sequence of
18
/// traversal instructions: a `0` bit means "descend left" and a `1` bit means
19
/// "descend right". By following the `x` bits composing the index, starting at
20
/// the root, descending to the left child at each `0`, descending to the right
21
/// child at each `1`, we arrive at the leaf position, having touched every node
22
/// position along the path formed by this index. Note that this algorithm does
23
/// not prescribe how to descend from one node to the next; it describes merely
24
/// the direction in which to descend at each step.
25
///
26
/// Alternatively, this can be interpreted as reading the index's most
27
/// significant bit (MSB) at an offset `n`: read the `n`th bit to the right of
28
/// the MSB. Here, `n` is a given step in the tree traversal, starting at 0, and
29
/// incrementing by 1 at each depth until the leaf is reached. The
30
/// traversal path is then the list of nodes calculated by traversing the tree
31
/// using the instruction (`0` or `1`) indicated at `x`<sub>`n`</sub>, where `x`
32
/// is the index in binary representation, and `n` is the offset for each digit
33
/// in `x` from the MSB.
34
///
35
/// Reversing this path gives us the path from the leaf to the root.
36
///
37
/// Imagine a 3-bit integer type `u3` underpinning a tree's leaf indices. 3 bits
38
/// give our tree a maximum height of 3, and a maximum number of leaf nodes
39
/// 2<sup>3</sup> = 8. For demonstration, internal nodes are numbered using
40
/// in-order indices (note that this would require an integer type with 4 bits
41
/// or more in practice). In-order indexing provides a deterministic way to
42
/// descend from one node to the next (see [Position](crate::common::Position)).
43
///
44
/// ```text
45
///                             07
46
///                            /  \
47
///                           /    \
48
///                          /      \
49
///                         /        \
50
///                        /          \
51
///                       /            \
52
///                     03              11
53
///                    /  \            /  \
54
///                   /    \          /    \
55
///                 01      05      09      13
56
///                /  \    /  \    /  \    /  \
57
/// In-order idx: 00  02  04  06  08  10  12  14
58
///     Leaf idx:  0   1   2   3   4   5   6   7
59
/// ```
60
///
61
/// Let us now find the path to leaf with index `6`. In the above diagram, this
62
/// is the seventh leaf in the leaf layer. A priori, we can see that the path
63
/// from the root to this leaf is represented by the following list of in-order
64
/// indices: `07, 11, 13, 12` (note that the leaf index that corresponds to the
65
/// in-order index `12` is `6`).
66
///
67
/// ```text
68
/// 0d6: u3 = 0b110
69
///         = Right, Right, Left
70
/// ```
71
///
72
/// Starting at the tree's root at index `07`, we can follow the instructions
73
/// encoded by the binary representation of leaf `6` (`0b110`). In combination
74
/// with our in-order index rules for descending nodes, we evaluate the
75
/// following:
76
///
77
/// 1. The first bit is `1`; move right from `07` to `11`.
78
/// 2. The next bit is `1`; move right from `11` to `13`.
79
/// 3. The next and final bit is `0`; move left from `13` to `12`.
80
///
81
/// We have arrived at the desired leaf position with in-order index `12` and
82
/// leaf index `6`. Indeed, following the instructions at each bit has produced
83
/// the same list of positional indices that we observed earlier: `07, 11, 13,
84
/// 12`.
85
pub struct PathIter<T: ParentNode> {
86
    leaf_key: T::Key,
87
    current: Option<(ChildResult<T>, ChildKeyResult<T>)>,
88
    current_offset: u32,
89
}
90
91
impl<T> PathIter<T>
92
where
93
    T: ParentNode + Clone,
94
    T::Key: Clone,
95
{
96
0
    pub fn new(root: &T, leaf_key: &T::Key) -> Self {
97
0
        let initial = (Ok(root.clone()), Ok(root.key()));
98
0
99
0
        #[rustfmt::skip]
100
0
        // The initial offset from the most significant bit (MSB).
101
0
        //
102
0
        // The offset from the MSB indicates which bit to read when deducing the
103
0
        // path from the root to the leaf. As we descend down the tree,
104
0
        // increasing the traversal depth, we increment this offset and read the
105
0
        // corresponding bit to get the next traversal instruction.
106
0
        //
107
0
        // In the general case, we start by reading the first bit of the path at
108
0
        // offset 0. This happens when the path fills its allocated memory;
109
0
        // e.g., a path of 256 instructions is encoded within a 256 bit
110
0
        // allocation for the leaf key. This also means that the key size in
111
0
        // bits is equal to the maximum height of the tree.
112
0
        //
113
0
        // In the case that the length of the path is less than the number of
114
0
        // bits in the key, the initial offset from the MSB must be augmented to
115
0
        // accommodate the shortened path. This occurs when the key is allocated
116
0
        // with a larger address space to reduce collisions of node addresses.
117
0
        //
118
0
        // E.g,
119
0
        // With an 8-bit key and heights 1 through 7:
120
0
        //
121
0
        // Height Depth
122
0
        // 7      0                        127                    Offset = Bits - Height = 8 - 7 = 1
123
0
        //                                 / \
124
0
        //                                /   \
125
0
        // ...                          ...   ...
126
0
        //                              /       \
127
0
        //                             /         \
128
0
        // 3      4                   07         247              Offset = Bits - Height = 8 - 3 = 5
129
0
        //                           /  \        / \
130
0
        //                          /    \     ...  \
131
0
        //                         /      \          \
132
0
        //                        /        \          \
133
0
        //                       /          \          \
134
0
        //                      /            \          \
135
0
        // 2      5           03              11        251       Offset = Bits - Height = 8 - 2 = 6
136
0
        //                   /  \            /  \       / \
137
0
        //                  /    \          /    \    ...  \
138
0
        // 1      6       01      05      09      13       253    Offset = Bits - Height = 8 - 1 = 7
139
0
        //               /  \    /  \    /  \    /  \      / \
140
0
        // 0      7     00  02  04  06  08  10  12  14   252 254
141
0
        //              00  01  02  03  04  05  06  07   126 127
142
0
        //
143
0
        let initial_offset = T::key_size_bits().checked_sub(root.height())
144
0
        .expect("Root height more than key size allows, ParentNode impl is incorrect");
145
0
        Self {
146
0
            leaf_key: leaf_key.clone(),
147
0
            current: Some(initial),
148
0
            current_offset: initial_offset,
149
0
        }
150
0
    }
Unexecuted instantiation: _RNvMNtNtCsacfdLYFME8L_11fuel_merkle6common13path_iteratorINtB2_8PathIterINtNtNtNtB6_6sparse11merkle_tree4node11StorageNodeNtNtB1f_9in_memory10NodesTableINtNtB4_11storage_map10StorageMapB1W_EEE3newB6_
Unexecuted instantiation: _RNvMNtNtCsacfdLYFME8L_11fuel_merkle6common13path_iteratorINtB2_8PathIterNtNtB4_8position8PositionE3newB6_
151
}
152
153
impl<T> Iterator for PathIter<T>
154
where
155
    T: ParentNode,
156
    T::Key: Path,
157
{
158
    type Item = (ChildResult<T>, ChildKeyResult<T>);
159
160
0
    fn next(&mut self) -> Option<Self::Item> {
161
0
        let value = self.current.take();
162
163
0
        if let Some((ref path_node, _)) = value {
164
0
            match path_node {
165
0
                Ok(path_node) if path_node.is_node() => {
166
0
                    let path = &self.leaf_key;
167
0
                    let instruction = path.get_instruction(self.current_offset);
168
0
                    self.current = instruction.map(|instruction| {
169
0
                        // get_instruction ensures current_offset is ok
170
0
                        #[allow(clippy::arithmetic_side_effects)]
171
0
                        {
172
0
                            self.current_offset += 1;
173
0
                        }
174
0
                        match instruction {
175
                            Side::Left => {
176
0
                                (path_node.left_child(), path_node.right_child_key())
177
                            }
178
                            Side::Right => {
179
0
                                (path_node.right_child(), path_node.left_child_key())
180
                            }
181
                        }
182
0
                    });
Unexecuted instantiation: _RNCNvXs_NtNtCsacfdLYFME8L_11fuel_merkle6common13path_iteratorINtB6_8PathIterINtNtNtNtBa_6sparse11merkle_tree4node11StorageNodeNtNtB1j_9in_memory10NodesTableINtNtB8_11storage_map10StorageMapB20_EEENtNtNtNtCsd3UI3IJrzMw_4core4iter6traits8iterator8Iterator4next0Ba_
Unexecuted instantiation: _RNCNvXs_NtNtCsacfdLYFME8L_11fuel_merkle6common13path_iteratorINtB6_8PathIterNtNtB8_8position8PositionENtNtNtNtCsd3UI3IJrzMw_4core4iter6traits8iterator8Iterator4next0Ba_
183
0
                }
184
                // Terminate the iterator if any of the following are true:
185
                //    - The path node is a leaf (traversal is complete)
186
                //    - The left or right child was not found and returned a ChildNotFound
187
                //      error
188
                //    - The left or right child returned any other error
189
0
                _ => self.current = None,
190
            }
191
0
        }
192
193
0
        value
194
0
    }
Unexecuted instantiation: _RNvXs_NtNtCsacfdLYFME8L_11fuel_merkle6common13path_iteratorINtB4_8PathIterINtNtNtNtB8_6sparse11merkle_tree4node11StorageNodeNtNtB1h_9in_memory10NodesTableINtNtB6_11storage_map10StorageMapB1Y_EEENtNtNtNtCsd3UI3IJrzMw_4core4iter6traits8iterator8Iterator4nextB8_
Unexecuted instantiation: _RNvXs_NtNtCsacfdLYFME8L_11fuel_merkle6common13path_iteratorINtB4_8PathIterNtNtB6_8position8PositionENtNtNtNtCsd3UI3IJrzMw_4core4iter6traits8iterator8Iterator4nextB8_
195
}
196
197
pub trait AsPathIterator<T: ParentNode> {
198
    fn as_path_iter(&self, leaf_key: &T::Key) -> PathIter<T>;
199
}
200
201
impl<T> AsPathIterator<T> for T
202
where
203
    T: ParentNode + Clone,
204
    T::Key: Clone,
205
{
206
0
    fn as_path_iter(&self, leaf_key: &T::Key) -> PathIter<T> {
207
0
        PathIter::new(self, leaf_key)
208
0
    }
Unexecuted instantiation: _RNvXs0_NtNtCsacfdLYFME8L_11fuel_merkle6common13path_iteratorNtNtB7_8position8PositionINtB5_14AsPathIteratorBW_E12as_path_iterB9_
Unexecuted instantiation: _RNvXs0_NtNtCsacfdLYFME8L_11fuel_merkle6common13path_iteratorINtNtNtNtB9_6sparse11merkle_tree4node11StorageNodeNtNtB13_9in_memory10NodesTableINtNtB7_11storage_map10StorageMapB1K_EEINtB5_14AsPathIteratorBW_E12as_path_iterB9_
209
}
210
211
#[cfg(test)]
212
#[allow(
213
    clippy::restriction,
214
    clippy::cast_possible_wrap,
215
    clippy::cast_sign_loss
216
)]
217
mod test {
218
    use crate::common::{
219
        node::{
220
            ChildKeyResult,
221
            ChildResult,
222
            Node,
223
            ParentNode,
224
        },
225
        AsPathIterator,
226
        Bytes8,
227
    };
228
    use alloc::vec::Vec;
229
    use core::convert::Infallible;
230
231
    #[derive(Debug, Clone, PartialEq)]
232
    struct TestNode {
233
        value: u64,
234
    }
235
236
    impl TestNode {
237
        pub fn in_order_index(&self) -> u64 {
238
            self.value
239
        }
240
241
        pub fn leaf_index(&self) -> u64 {
242
            assert!(self.is_leaf());
243
            self.value / 2
244
        }
245
246
        pub fn from_in_order_index(index: u64) -> Self {
247
            Self { value: index }
248
        }
249
250
        pub fn from_leaf_index(index: u64) -> Self {
251
            Self { value: index * 2 }
252
        }
253
254
        pub fn height(&self) -> u32 {
255
            (!self.in_order_index()).trailing_zeros()
256
        }
257
258
        pub fn is_leaf(&self) -> bool {
259
            self.in_order_index() % 2 == 0
260
        }
261
262
        fn child(&self, direction: i64) -> Self {
263
            assert!(!self.is_leaf());
264
            let shift = 1 << (self.height() - 1);
265
            let index = self.in_order_index() as i64 + shift * direction;
266
            Self::from_in_order_index(index as u64)
267
        }
268
    }
269
270
    impl Node for TestNode {
271
        type Key = Bytes8;
272
273
        fn height(&self) -> u32 {
274
            TestNode::height(self)
275
        }
276
277
        #[allow(clippy::arithmetic_side_effects, clippy::cast_possible_truncation)] // const
278
        fn key_size_bits() -> u32 {
279
            core::mem::size_of::<Self::Key>() as u32 * 8
280
        }
281
282
        fn leaf_key(&self) -> Self::Key {
283
            TestNode::leaf_index(self).to_be_bytes()
284
        }
285
286
        fn is_leaf(&self) -> bool {
287
            TestNode::is_leaf(self)
288
        }
289
290
        fn is_node(&self) -> bool {
291
            !TestNode::is_leaf(self)
292
        }
293
    }
294
295
    impl ParentNode for TestNode {
296
        type ChildKey = u64;
297
        type Error = Infallible;
298
299
        fn key(&self) -> Self::ChildKey {
300
            self.in_order_index()
301
        }
302
303
        fn left_child(&self) -> ChildResult<Self> {
304
            Ok(TestNode::child(self, -1))
305
        }
306
307
        fn left_child_key(&self) -> ChildKeyResult<Self> {
308
            self.left_child().map(|node| node.in_order_index())
309
        }
310
311
        fn right_child(&self) -> ChildResult<Self> {
312
            Ok(TestNode::child(self, 1))
313
        }
314
315
        fn right_child_key(&self) -> ChildKeyResult<Self> {
316
            self.right_child().map(|node| node.in_order_index())
317
        }
318
    }
319
320
    #[test]
321
    fn test_path_iter_returns_path() {
322
        //               07
323
        //              /  \
324
        //             /    \
325
        //            /      \
326
        //           /        \
327
        //          /          \
328
        //         /            \
329
        //       03              11
330
        //      /  \            /  \
331
        //     /    \          /    \
332
        //   01      05      09      13
333
        //  /  \    /  \    /  \    /  \
334
        // 00  02  04  06  08  10  12  14
335
        // 00  01  02  03  04  05  06  07
336
        //
337
        type Node = TestNode;
338
        let root = Node::from_in_order_index(7);
339
340
        {
341
            let leaf = Node::from_leaf_index(0);
342
            let path: Vec<TestNode> = root
343
                .as_path_iter(&leaf.leaf_key())
344
                .map(|(path, _)| path.unwrap())
345
                .collect();
346
            let expected_path = vec![
347
                Node::from_in_order_index(7),
348
                Node::from_in_order_index(3),
349
                Node::from_in_order_index(1),
350
                Node::from_leaf_index(0),
351
            ];
352
            assert_eq!(path, expected_path);
353
        }
354
355
        {
356
            let leaf = Node::from_leaf_index(1);
357
            let path: Vec<TestNode> = root
358
                .as_path_iter(&leaf.leaf_key())
359
                .map(|(path, _)| path.unwrap())
360
                .collect();
361
            let expected_path = vec![
362
                Node::from_in_order_index(7),
363
                Node::from_in_order_index(3),
364
                Node::from_in_order_index(1),
365
                Node::from_leaf_index(1),
366
            ];
367
            assert_eq!(path, expected_path);
368
        }
369
370
        {
371
            let leaf = Node::from_leaf_index(2);
372
            let path: Vec<TestNode> = root
373
                .as_path_iter(&leaf.leaf_key())
374
                .map(|(path, _)| path.unwrap())
375
                .collect();
376
            let expected_path = vec![
377
                Node::from_in_order_index(7),
378
                Node::from_in_order_index(3),
379
                Node::from_in_order_index(5),
380
                Node::from_leaf_index(2),
381
            ];
382
            assert_eq!(path, expected_path);
383
        }
384
385
        {
386
            let leaf = Node::from_leaf_index(3);
387
            let path: Vec<TestNode> = root
388
                .as_path_iter(&leaf.leaf_key())
389
                .map(|(path, _)| path.unwrap())
390
                .collect();
391
            let expected_path = vec![
392
                Node::from_in_order_index(7),
393
                Node::from_in_order_index(3),
394
                Node::from_in_order_index(5),
395
                Node::from_leaf_index(3),
396
            ];
397
            assert_eq!(path, expected_path);
398
        }
399
400
        {
401
            let leaf = Node::from_leaf_index(4);
402
            let path: Vec<TestNode> = root
403
                .as_path_iter(&leaf.leaf_key())
404
                .map(|(path, _)| path.unwrap())
405
                .collect();
406
            let expected_path = vec![
407
                Node::from_in_order_index(7),
408
                Node::from_in_order_index(11),
409
                Node::from_in_order_index(9),
410
                Node::from_leaf_index(4),
411
            ];
412
            assert_eq!(path, expected_path);
413
        }
414
415
        {
416
            let leaf = Node::from_leaf_index(5);
417
            let path: Vec<TestNode> = root
418
                .as_path_iter(&leaf.leaf_key())
419
                .map(|(path, _)| path.unwrap())
420
                .collect();
421
            let expected_path = vec![
422
                Node::from_in_order_index(7),
423
                Node::from_in_order_index(11),
424
                Node::from_in_order_index(9),
425
                Node::from_leaf_index(5),
426
            ];
427
            assert_eq!(path, expected_path);
428
        }
429
430
        {
431
            let leaf = Node::from_leaf_index(6);
432
            let path: Vec<TestNode> = root
433
                .as_path_iter(&leaf.leaf_key())
434
                .map(|(path, _)| path.unwrap())
435
                .collect();
436
            let expected_path = vec![
437
                Node::from_in_order_index(7),
438
                Node::from_in_order_index(11),
439
                Node::from_in_order_index(13),
440
                Node::from_leaf_index(6),
441
            ];
442
            assert_eq!(path, expected_path);
443
        }
444
445
        {
446
            let leaf = Node::from_leaf_index(7);
447
            let path: Vec<TestNode> = root
448
                .as_path_iter(&leaf.leaf_key())
449
                .map(|(path, _)| path.unwrap())
450
                .collect();
451
            let expected_path = vec![
452
                Node::from_in_order_index(7),
453
                Node::from_in_order_index(11),
454
                Node::from_in_order_index(13),
455
                Node::from_leaf_index(7),
456
            ];
457
            assert_eq!(path, expected_path);
458
        }
459
    }
460
461
    #[test]
462
    fn test_path_iter_returns_side_nodes() {
463
        //               07
464
        //              /  \
465
        //             /    \
466
        //            /      \
467
        //           /        \
468
        //          /          \
469
        //         /            \
470
        //       03              11
471
        //      /  \            /  \
472
        //     /    \          /    \
473
        //   01      05      09      13
474
        //  /  \    /  \    /  \    /  \
475
        // 00  02  04  06  08  10  12  14
476
        // 00  01  02  03  04  05  06  07
477
        //
478
        type Node = TestNode;
479
        let root = Node::from_in_order_index(7); // 2^3 - 1
480
481
        {
482
            let leaf = Node::from_leaf_index(0);
483
            let side: Vec<_> = root
484
                .as_path_iter(&leaf.leaf_key())
485
                .map(|(_, side)| side.unwrap())
486
                .collect();
487
            let expected_side = vec![
488
                Node::from_in_order_index(7).value,  // Root's dummy side
489
                Node::from_in_order_index(11).value, // Sibling of node 3
490
                Node::from_in_order_index(5).value,  // Sibling of node 1
491
                Node::from_leaf_index(1).value,      // Sibling of leaf 0
492
            ];
493
            assert_eq!(side, expected_side);
494
        }
495
496
        {
497
            let leaf = Node::from_leaf_index(1);
498
            let side: Vec<_> = root
499
                .as_path_iter(&leaf.leaf_key())
500
                .map(|(_, side)| side.unwrap())
501
                .collect();
502
            let expected_side = vec![
503
                Node::from_in_order_index(7).value,  // Root's dummy side
504
                Node::from_in_order_index(11).value, // Sibling of node 3
505
                Node::from_in_order_index(5).value,  // Sibling of node 1
506
                Node::from_leaf_index(0).value,      // Sibling of leaf 1
507
            ];
508
            assert_eq!(side, expected_side);
509
        }
510
511
        {
512
            let leaf = Node::from_leaf_index(2);
513
            let side: Vec<_> = root
514
                .as_path_iter(&leaf.leaf_key())
515
                .map(|(_, side)| side.unwrap())
516
                .collect();
517
            let expected_side = vec![
518
                Node::from_in_order_index(7).value,  // Root's dummy side
519
                Node::from_in_order_index(11).value, // Sibling of node 3
520
                Node::from_in_order_index(1).value,  // Sibling of node 5
521
                Node::from_leaf_index(3).value,      // Sibling of leaf 2
522
            ];
523
            assert_eq!(side, expected_side);
524
        }
525
526
        {
527
            let leaf = Node::from_leaf_index(3);
528
            let side: Vec<_> = root
529
                .as_path_iter(&leaf.leaf_key())
530
                .map(|(_, side)| side.unwrap())
531
                .collect();
532
            let expected_side = vec![
533
                Node::from_in_order_index(7).value,  // Root's dummy side
534
                Node::from_in_order_index(11).value, // Sibling of node 3
535
                Node::from_in_order_index(1).value,  // Sibling of node 5
536
                Node::from_leaf_index(2).value,      // Sibling of leaf 3
537
            ];
538
            assert_eq!(side, expected_side);
539
        }
540
541
        {
542
            let leaf = Node::from_leaf_index(4);
543
            let side: Vec<_> = root
544
                .as_path_iter(&leaf.leaf_key())
545
                .map(|(_, side)| side.unwrap())
546
                .collect();
547
            let expected_side = vec![
548
                Node::from_in_order_index(7).value,  // Root's dummy side
549
                Node::from_in_order_index(3).value,  // Sibling of node 11
550
                Node::from_in_order_index(13).value, // Sibling of node 9
551
                Node::from_leaf_index(5).value,      // Sibling of leaf 4
552
            ];
553
            assert_eq!(side, expected_side);
554
        }
555
556
        {
557
            let leaf = Node::from_leaf_index(5);
558
            let side: Vec<_> = root
559
                .as_path_iter(&leaf.leaf_key())
560
                .map(|(_, side)| side.unwrap())
561
                .collect();
562
            let expected_side = vec![
563
                Node::from_in_order_index(7).value,  // Root's dummy side
564
                Node::from_in_order_index(3).value,  // Sibling of node 11
565
                Node::from_in_order_index(13).value, // Sibling of node 9
566
                Node::from_leaf_index(4).value,      // Sibling of leaf 5
567
            ];
568
            assert_eq!(side, expected_side);
569
        }
570
571
        {
572
            let leaf = Node::from_leaf_index(6);
573
            let side: Vec<_> = root
574
                .as_path_iter(&leaf.leaf_key())
575
                .map(|(_, side)| side.unwrap())
576
                .collect();
577
            let expected_side = vec![
578
                Node::from_in_order_index(7).value, // Root's dummy side
579
                Node::from_in_order_index(3).value, // Sibling of node 11
580
                Node::from_in_order_index(9).value, // Sibling of node 13
581
                Node::from_leaf_index(7).value,     // Sibling of leaf 6
582
            ];
583
            assert_eq!(side, expected_side);
584
        }
585
586
        {
587
            let leaf = Node::from_leaf_index(7);
588
            let side: Vec<_> = root
589
                .as_path_iter(&leaf.leaf_key())
590
                .map(|(_, side)| side.unwrap())
591
                .collect();
592
            let expected_side = vec![
593
                Node::from_in_order_index(7).value, // Root's dummy side
594
                Node::from_in_order_index(3).value, // Sibling of node 11
595
                Node::from_in_order_index(9).value, // Sibling of node 13
596
                Node::from_leaf_index(6).value,     // Sibling of leaf 7
597
            ];
598
            assert_eq!(side, expected_side);
599
        }
600
    }
601
602
    #[test]
603
    fn test_path_iter_height_4() {
604
        type Node = TestNode;
605
        let root = Node::from_in_order_index(15); // 2^4 - 1
606
        let leaf = Node::from_leaf_index(4); // 0b0100
607
608
        let path: Vec<TestNode> = root
609
            .as_path_iter(&leaf.leaf_key())
610
            .map(|(path, _)| path.unwrap())
611
            .collect();
612
613
        let expected_path = vec![
614
            Node::from_in_order_index(15),
615
            Node::from_in_order_index(7),
616
            Node::from_in_order_index(11),
617
            Node::from_in_order_index(9),
618
            Node::from_in_order_index(8),
619
        ];
620
        assert_eq!(path, expected_path);
621
    }
622
623
    #[test]
624
    fn test_path_iter_height_8() {
625
        type Node = TestNode;
626
        let root = Node::from_in_order_index(255); // 2^8 - 1
627
        let leaf = Node::from_leaf_index(61); // 0b00111101
628
629
        let path: Vec<TestNode> = root
630
            .as_path_iter(&leaf.leaf_key())
631
            .map(|(path, _)| path.unwrap())
632
            .collect();
633
634
        let expected_path = vec![
635
            Node::from_in_order_index(255),
636
            Node::from_in_order_index(127),
637
            Node::from_in_order_index(63),
638
            Node::from_in_order_index(95),
639
            Node::from_in_order_index(111),
640
            Node::from_in_order_index(119),
641
            Node::from_in_order_index(123),
642
            Node::from_in_order_index(121),
643
            Node::from_leaf_index(61),
644
        ];
645
        assert_eq!(path, expected_path);
646
    }
647
648
    #[test]
649
    fn test_path_iter_returns_root_root_when_root_is_leaf() {
650
        type Node = TestNode;
651
        let root = Node::from_in_order_index(0);
652
        let leaf = Node::from_leaf_index(0);
653
654
        let (path, side): (Vec<TestNode>, Vec<_>) = root
655
            .as_path_iter(&leaf.leaf_key())
656
            .map(|(path, side)| (path.unwrap(), side.unwrap()))
657
            .unzip();
658
659
        let expected_path = vec![Node::from_in_order_index(0)];
660
        let expected_side = vec![0];
661
        assert_eq!(path, expected_path);
662
        assert_eq!(side, expected_side);
663
    }
664
}
/home/marten/fuel/fuel-vm/fuel-merkle/src/common/position.rs
Line
Count
Source
1
use crate::common::{
2
    node::{
3
        ChildKeyResult,
4
        Node,
5
        ParentNode,
6
    },
7
    Bytes8,
8
    PositionPath,
9
};
10
use core::convert::Infallible;
11
12
use super::{
13
    node::{
14
        ChildError,
15
        ChildResult,
16
    },
17
    path::Side,
18
};
19
20
/// # Position
21
///
22
/// A `Position` represents a node's position in a binary tree by encapsulating
23
/// the node's index data. Indices are calculated through in-order traversal of
24
/// the nodes, starting with the first leaf node. Indexing starts at 0.
25
///
26
/// Merkle Trees
27
///
28
/// In the context of Merkle trees, trees are constructed "upwards" from leaf
29
/// nodes. Therefore, indexing is done from the bottom up, starting with the
30
/// leaves, rather than top down, starting with the root, and we can guarantee a
31
/// deterministic construction of index data.
32
///
33
/// ```text
34
///               07
35
///              /  \
36
///             /    \
37
///            /      \
38
///           /        \
39
///          /          \
40
///         /            \
41
///       03              11
42
///      /  \            /  \
43
///     /    \          /    \
44
///   01      05      09      13
45
///  /  \    /  \    /  \    /  \
46
/// 00  02  04  06  08  10  12  14
47
/// ```
48
///
49
/// In-order indices can be considered internal to the `Position` struct and are
50
/// used to facilitate the calculation of positional attributes and the
51
/// construction of other nodes. Leaf nodes have both an in-order index as part
52
/// of the tree, and a leaf index determined by its position in the bottom row.
53
/// Because of the in-order traversal used to calculate the in-order indices,
54
/// leaf nodes have the property that their in-order index is always equal to
55
/// their leaf index multiplied by 2.
56
///
57
/// ```text
58
///                    /  \    /  \    /  \    /  \
59
///     Leaf indices: 00  01  02  03  04  05  06  07
60
/// In-order indices: 00  02  04  06  08  10  12  14
61
/// ```
62
///
63
/// This allows us to construct a `Position` (and its in-order index) by
64
/// providing either an in-order index directly or, in the case of a leaf, a
65
/// leaf index. This functionality is captured by `from_in_order_index()` and
66
/// `from_leaf_index()` respectively.
67
///
68
/// Traversal of a Merkle Tree can be performed by the methods on a given
69
/// `Position` to retrieve its sibling, parent, or uncle `Position`.
70
///
71
/// Merkle Mountain Ranges
72
///
73
/// Because the `Position` indices are calculated from in-order traversal
74
/// starting with the leaves, the deterministic quality of the indices holds
75
/// true for imbalanced binary trees, including Merkle Mountain Ranges. Consider
76
/// the following binary tree construction composed of seven leaves (with leaf
77
/// indices 0 through 6):
78
///
79
/// ```text
80
///       03
81
///      /  \
82
///     /    \
83
///   01      05      09
84
///  /  \    /  \    /  \
85
/// 00  02  04  06  08  10  12
86
/// ```
87
///
88
/// Note the absence of internal nodes that would be present in a fully balanced
89
/// tree: inner nodes with indices 7 and 11 are absent. This is owing to the
90
/// fact that node indices are calculated deterministically through in-order
91
/// traversal, not calculated as a sequence.
92
///
93
/// Traversal of a Merkle Mountain Range is still done in the same manner as a
94
/// balanced Merkle tree, using methods to retrieve a `Position's` sibling,
95
/// parent, or uncle `Position`. However, in such cases, the corresponding
96
/// sibling or uncle nodes are not guaranteed to exist in the tree.
97
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
98
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
99
pub struct Position(u64);
100
101
impl Position {
102
7.37M
    pub fn in_order_index(self) -> u64 {
103
7.37M
        self.0
104
7.37M
    }
105
106
0
    pub fn leaf_index(self) -> u64 {
107
0
        assert!(self.is_leaf());
108
0
        self.in_order_index() / 2
109
0
    }
110
111
    /// Construct a position from an in-order index.
112
923k
    pub fn from_in_order_index(index: u64) -> Self {
113
923k
        Position(index)
114
923k
    }
115
116
    /// Construct a position from a leaf index. The in-order index corresponding
117
    /// to the leaf index will always equal the leaf index multiplied by 2.
118
    /// Panics if index is too large to fit into u64.
119
933k
    pub fn from_leaf_index(index: u64) -> Option<Self> {
120
933k
        Some(Position(index.checked_mul(2)?))
121
933k
    }
122
123
    #[cfg(test)]
124
    pub(crate) fn from_leaf_index_unwrap(index: u64) -> Self {
125
        Self::from_leaf_index(index).expect("Index too large")
126
    }
127
128
    /// The parent position.
129
    /// The parent position has a height less 1 relative to this position.
130
923k
    pub fn parent(self) -> Result<Self, GetNodeError> {
131
923k
        let shift = 1u64
132
923k
            .checked_shl(self.height())
133
923k
            .ok_or(GetNodeError::CannotExist)?;
134
923k
        let this = self.in_order_index();
135
923k
        Ok(Self::from_in_order_index(match self.orientation()? {
136
0
            Side::Left => this.checked_sub(shift).ok_or(GetNodeError::CannotExist)?,
137
923k
            Side::Right => this.checked_add(shift).ok_or(GetNodeError::CannotExist)?,
138
        }))
139
923k
    }
140
141
    /// The sibling position.
142
    /// A position shares the same parent and height as its sibling.
143
    #[cfg(test)]
144
    pub fn sibling(self) -> Result<Self, GetNodeError> {
145
        #[allow(clippy::arithmetic_side_effects)] // height() <= 64
146
        let shift = 1u64
147
            .checked_shl(self.height() + 1)
148
            .ok_or(GetNodeError::CannotExist)?;
149
        let this = self.in_order_index();
150
        Ok(Self::from_in_order_index(match self.orientation()? {
151
            Side::Left => this.checked_sub(shift).ok_or(GetNodeError::CannotExist)?,
152
            Side::Right => this.checked_add(shift).ok_or(GetNodeError::CannotExist)?,
153
        }))
154
    }
155
156
    /// The uncle position.
157
    /// The uncle position is the sibling of the parent and has a height less 1
158
    /// relative to this position.
159
    #[cfg(test)]
160
    pub fn uncle(self) -> Result<Self, GetNodeError> {
161
        self.parent()?.sibling()
162
    }
163
164
    /// The child position of the current position given by the direction.
165
    /// A child position has a height less 1 than the current position.
166
    ///
167
    /// A child position is calculated as a function of the current position's
168
    /// index and height, and the supplied direction. The left child
169
    /// position has the in-order index arriving before the current index;
170
    /// the right child position has the in-order index arriving after the
171
    /// current index.
172
0
    pub fn child(self, side: Side) -> Result<Self, GetNodeError> {
173
0
        if !self.is_node() {
174
0
            return Err(GetNodeError::IsLeaf);
175
0
        }
176
0
        let shift = 1u64
177
            .checked_shl(
178
0
                self.height()
179
0
                    .checked_sub(1)
180
0
                    .ok_or(GetNodeError::CannotExist)?,
181
            )
182
0
            .ok_or(GetNodeError::CannotExist)?;
183
0
        let this = self.in_order_index();
184
0
        Ok(Self::from_in_order_index(match side {
185
0
            Side::Left => this.checked_sub(shift).ok_or(GetNodeError::CannotExist)?,
186
0
            Side::Right => this.checked_add(shift).ok_or(GetNodeError::CannotExist)?,
187
        }))
188
0
    }
189
190
    /// Returns the left child of the current position.
191
0
    pub fn left_child(self) -> Result<Self, GetNodeError> {
192
0
        self.child(Side::Left)
193
0
    }
194
195
    /// Returns the right child of the current position.
196
0
    pub fn right_child(self) -> Result<Self, GetNodeError> {
197
0
        self.child(Side::Right)
198
0
    }
199
200
    /// The height of the index in a binary tree.
201
    /// Leaf nodes represent height 0. A leaf's parent represents height 1.
202
    /// Height values monotonically increase as you ascend the tree.
203
    ///
204
    /// Height is deterministically calculated as the number of trailing zeros
205
    /// of the complement of the position's index. The following table
206
    /// demonstrates the relationship between a position's height and the
207
    /// trailing zeros.
208
    ///
209
    /// | Index (Dec) | Index (Bin) | !Index (Bin) | Trailing 0s | Height |
210
    /// |-------------|-------------|--------------|-------------|--------|
211
    /// |           0 |        0000 |         1111 |           0 |      0 |
212
    /// |           2 |        0010 |         1101 |           0 |      0 |
213
    /// |           4 |        0100 |         1011 |           0 |      0 |
214
    /// |           1 |        0001 |         1110 |           1 |      1 |
215
    /// |           5 |        0101 |         1010 |           1 |      1 |
216
    /// |           9 |        1001 |         0110 |           1 |      1 |
217
    /// |           3 |        0011 |         1100 |           2 |      2 |
218
    /// |          11 |        1011 |         0100 |           2 |      2 |
219
5.52M
    pub fn height(self) -> u32 {
220
5.52M
        (!self.in_order_index()).trailing_zeros()
221
5.52M
    }
222
223
    /// Whether or not this position represents a leaf node.
224
    /// Returns `true` if the position is a leaf node.
225
    /// Returns `false` if the position is an internal node.
226
    ///
227
    /// A position is a leaf node if and only if its in-order index is even. A
228
    /// position is an internal node if and only if its in-order index is
229
    /// odd.
230
0
    pub fn is_leaf(self) -> bool {
231
0
        self.in_order_index() % 2 == 0
232
0
    }
233
234
    /// Whether or not this position represents an internal node.
235
    /// Returns `false` if the position is a leaf node.
236
    /// Returns `true` if the position is an internal node.
237
    ///
238
    /// When a position is an internal node, the position will have both a left
239
    /// and right child.
240
0
    pub fn is_node(self) -> bool {
241
0
        !self.is_leaf()
242
0
    }
243
244
    /// Given a leaf position and the total count of leaves in a tree, get the
245
    /// path from this position to the given leaf position. The shape of the
246
    /// tree is defined by the `leaves_count` parameter and constrains the
247
    /// path. See [PositionPath](crate::common::PositionPath).
248
0
    pub fn path(self, leaf: &Self, leaves_count: u64) -> PositionPath {
249
0
        debug_assert!(leaves_count > 0);
250
0
        PositionPath::new(self, *leaf, leaves_count)
251
0
    }
252
253
    /// Orientation of the position index relative to its parent.
254
    ///
255
    /// The orientation is determined by the reading the `n`th rightmost digit
256
    /// of the index's binary value, where `n` = the height of the position
257
    /// `+ 1`. The following table demonstrates the relationships between a
258
    /// position's index, height, and orientation.
259
    ///
260
    /// | Index (Dec) | Index (Bin) | Height | Orientation |
261
    /// |-------------|-------------|--------|-------------|
262
    /// |           0 |        0000 |      0 |           L |
263
    /// |           2 |        0010 |      0 |           R |
264
    /// |           4 |        0100 |      0 |           L |
265
    /// |           6 |        0110 |      0 |           R |
266
    /// |           1 |        0001 |      1 |           L |
267
    /// |           5 |        0101 |      1 |           R |
268
    /// |           9 |        1001 |      1 |           L |
269
    /// |          13 |        1101 |      1 |           R |
270
923k
    fn orientation(self) -> Result<Side, GetNodeError> {
271
        #[allow(clippy::arithmetic_side_effects)] // height() <= 64
272
923k
        let shift = 1u64
273
923k
            .checked_shl(self.height() + 1)
274
923k
            .ok_or(GetNodeError::CannotExist)?;
275
923k
        Ok(match self.in_order_index() & shift {
276
923k
            0 => Side::Right,
277
0
            _ => Side::Left,
278
        })
279
923k
    }
280
}
281
282
impl Node for Position {
283
    type Key = Bytes8;
284
285
0
    fn height(&self) -> u32 {
286
0
        Position::height(*self)
287
0
    }
288
289
    #[allow(clippy::arithmetic_side_effects, clippy::cast_possible_truncation)] // const
290
0
    fn key_size_bits() -> u32 {
291
0
        core::mem::size_of::<Self::Key>() as u32 * 8
292
0
    }
293
294
0
    fn leaf_key(&self) -> Self::Key {
295
0
        Position::leaf_index(*self).to_be_bytes()
296
0
    }
297
298
0
    fn is_leaf(&self) -> bool {
299
0
        Position::is_leaf(*self)
300
0
    }
301
302
0
    fn is_node(&self) -> bool {
303
0
        Position::is_node(*self)
304
0
    }
305
}
306
307
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
308
pub enum GetNodeError {
309
    /// The operation requires a node that can have children.
310
    /// This is a leaf, and cannot have children.
311
    IsLeaf,
312
    /// The requested node cannot exists as it would be out of bounds.
313
    CannotExist,
314
}
315
316
impl ParentNode for Position {
317
    type ChildKey = u64;
318
    type Error = Infallible;
319
320
0
    fn key(&self) -> Self::ChildKey {
321
0
        self.in_order_index()
322
0
    }
323
324
0
    fn left_child(&self) -> ChildResult<Self> {
325
0
        match self.child(Side::Left) {
326
0
            Ok(child) => Ok(child),
327
0
            Err(GetNodeError::IsLeaf) => Err(ChildError::NodeIsLeaf),
328
0
            Err(GetNodeError::CannotExist) => Err(ChildError::ChildCannotExist),
329
        }
330
0
    }
331
332
0
    fn left_child_key(&self) -> ChildKeyResult<Self> {
333
0
        ParentNode::left_child(self).map(|child| child.in_order_index())
334
0
    }
335
336
0
    fn right_child(&self) -> ChildResult<Self> {
337
0
        match self.child(Side::Right) {
338
0
            Ok(child) => Ok(child),
339
0
            Err(GetNodeError::IsLeaf) => Err(ChildError::NodeIsLeaf),
340
0
            Err(GetNodeError::CannotExist) => Err(ChildError::ChildCannotExist),
341
        }
342
0
    }
343
344
0
    fn right_child_key(&self) -> ChildKeyResult<Self> {
345
0
        ParentNode::right_child(self).map(|child| child.in_order_index())
346
0
    }
347
}
348
349
#[cfg(test)]
350
mod test {
351
    use super::*;
352
353
    #[test]
354
    fn test_from_in_order_index() {
355
        assert_eq!(Position::from_in_order_index(0).in_order_index(), 0);
356
        assert_eq!(Position::from_in_order_index(1).in_order_index(), 1);
357
        assert_eq!(Position::from_in_order_index(!0u64).in_order_index(), !0u64);
358
    }
359
360
    #[test]
361
    fn test_from_leaf_index_unwrap() {
362
        assert_eq!(Position::from_leaf_index_unwrap(0).in_order_index(), 0);
363
        assert_eq!(Position::from_leaf_index_unwrap(1).in_order_index(), 2);
364
        assert_eq!(
365
            Position::from_leaf_index_unwrap((!0u64) >> 1).in_order_index(),
366
            !0u64 - 1
367
        );
368
    }
369
370
    #[test]
371
    fn test_equality_returns_true_for_two_equal_positions() {
372
        assert_eq!(Position(0), Position(0));
373
        assert_eq!(Position::from_in_order_index(0), Position(0));
374
        assert_eq!(Position::from_leaf_index_unwrap(1), Position(2));
375
    }
376
377
    #[test]
378
    fn test_equality_returns_false_for_two_unequal_positions() {
379
        assert_ne!(Position(0), Position(1));
380
        assert_ne!(Position::from_in_order_index(0), Position(1));
381
        assert_ne!(Position::from_leaf_index_unwrap(0), Position(2));
382
    }
383
384
    #[test]
385
    fn test_height() {
386
        assert_eq!(Position(0).height(), 0);
387
        assert_eq!(Position(2).height(), 0);
388
        assert_eq!(Position(4).height(), 0);
389
390
        assert_eq!(Position(1).height(), 1);
391
        assert_eq!(Position(5).height(), 1);
392
        assert_eq!(Position(9).height(), 1);
393
394
        assert_eq!(Position(3).height(), 2);
395
        assert_eq!(Position(11).height(), 2);
396
        assert_eq!(Position(19).height(), 2);
397
    }
398
399
    #[test]
400
    fn test_sibling() {
401
        assert_eq!(Position(0).sibling(), Ok(Position(2)));
402
        assert_eq!(Position(2).sibling(), Ok(Position(0)));
403
404
        assert_eq!(Position(1).sibling(), Ok(Position(5)));
405
        assert_eq!(Position(5).sibling(), Ok(Position(1)));
406
407
        assert_eq!(Position(3).sibling(), Ok(Position(11)));
408
        assert_eq!(Position(11).sibling(), Ok(Position(3)));
409
    }
410
411
    #[test]
412
    fn test_parent() {
413
        assert_eq!(Position(0).parent(), Ok(Position(1)));
414
        assert_eq!(Position(2).parent(), Ok(Position(1)));
415
416
        assert_eq!(Position(1).parent(), Ok(Position(3)));
417
        assert_eq!(Position(5).parent(), Ok(Position(3)));
418
419
        assert_eq!(Position(3).parent(), Ok(Position(7)));
420
        assert_eq!(Position(11).parent(), Ok(Position(7)));
421
    }
422
423
    #[test]
424
    fn test_uncle() {
425
        assert_eq!(Position(0).uncle(), Ok(Position(5)));
426
        assert_eq!(Position(2).uncle(), Ok(Position(5)));
427
        assert_eq!(Position(4).uncle(), Ok(Position(1)));
428
        assert_eq!(Position(6).uncle(), Ok(Position(1)));
429
430
        assert_eq!(Position(1).uncle(), Ok(Position(11)));
431
        assert_eq!(Position(5).uncle(), Ok(Position(11)));
432
        assert_eq!(Position(9).uncle(), Ok(Position(3)));
433
        assert_eq!(Position(13).uncle(), Ok(Position(3)));
434
    }
435
436
    #[test]
437
    fn test_left_child() {
438
        assert_eq!(Position(7).left_child(), Ok(Position(3)));
439
        assert_eq!(Position(3).left_child(), Ok(Position(1)));
440
        assert_eq!(Position(1).left_child(), Ok(Position(0)));
441
        assert_eq!(Position(11).left_child(), Ok(Position(9)));
442
        assert_eq!(Position(9).left_child(), Ok(Position(8)));
443
    }
444
445
    #[test]
446
    fn test_right_child() {
447
        assert_eq!(Position(7).right_child(), Ok(Position(11)));
448
        assert_eq!(Position(3).right_child(), Ok(Position(5)));
449
        assert_eq!(Position(1).right_child(), Ok(Position(2)));
450
        assert_eq!(Position(11).right_child(), Ok(Position(13)));
451
        assert_eq!(Position(9).right_child(), Ok(Position(10)));
452
    }
453
454
    #[test]
455
    fn test_is_leaf() {
456
        assert_eq!(Position(0).is_leaf(), true);
457
        assert_eq!(Position(2).is_leaf(), true);
458
        assert_eq!(Position(4).is_leaf(), true);
459
        assert_eq!(Position(6).is_leaf(), true);
460
461
        assert_eq!(Position(1).is_leaf(), false);
462
        assert_eq!(Position(5).is_leaf(), false);
463
        assert_eq!(Position(9).is_leaf(), false);
464
        assert_eq!(Position(13).is_leaf(), false);
465
    }
466
467
    #[test]
468
    fn test_is_node() {
469
        assert_eq!(Position(0).is_node(), false);
470
        assert_eq!(Position(2).is_node(), false);
471
        assert_eq!(Position(4).is_node(), false);
472
        assert_eq!(Position(6).is_node(), false);
473
474
        assert_eq!(Position(1).is_node(), true);
475
        assert_eq!(Position(5).is_node(), true);
476
        assert_eq!(Position(9).is_node(), true);
477
        assert_eq!(Position(13).is_node(), true);
478
    }
479
}
/home/marten/fuel/fuel-vm/fuel-merkle/src/common/storage_map.rs
Line
Count
Source
1
use crate::{
2
    alloc::borrow::ToOwned,
3
    storage::{
4
        Mappable,
5
        StorageInspect,
6
        StorageMutate,
7
    },
8
};
9
10
use alloc::borrow::Cow;
11
use hashbrown::HashMap;
12
13
#[derive(Debug, Clone)]
14
pub struct StorageMap<Type>
15
where
16
    Type: Mappable,
17
{
18
    map: HashMap<Type::OwnedKey, Type::OwnedValue>,
19
}
20
21
impl<Type> Default for StorageMap<Type>
22
where
23
    Type: Mappable,
24
{
25
0
    fn default() -> Self {
26
0
        Self::new()
27
0
    }
28
}
29
30
impl<Type> StorageMap<Type>
31
where
32
    Type: Mappable,
33
{
34
0
    pub fn new() -> Self {
35
0
        Self {
36
0
            map: Default::default(),
37
0
        }
38
0
    }
Unexecuted instantiation: _RNvMs_NtNtCsacfdLYFME8L_11fuel_merkle6common11storage_mapINtB4_10StorageMapNtNtNtB8_6binary9in_memory10NodesTableE3newB8_
Unexecuted instantiation: _RNvMs_NtNtCsacfdLYFME8L_11fuel_merkle6common11storage_mapINtB4_10StorageMapNtNtNtB8_6sparse9in_memory10NodesTableE3newB8_
39
40
0
    pub fn is_empty(&self) -> bool {
41
0
        self.map.is_empty()
42
0
    }
43
44
0
    pub fn len(&self) -> usize {
45
0
        self.map.len()
46
0
    }
47
}
48
49
impl<Type> StorageInspect<Type> for StorageMap<Type>
50
where
51
    Type: Mappable,
52
    Type::Key: Eq + core::hash::Hash,
53
    Type::OwnedKey: Eq + core::hash::Hash + core::borrow::Borrow<Type::Key>,
54
{
55
    type Error = core::convert::Infallible;
56
57
0
    fn get(&self, key: &Type::Key) -> Result<Option<Cow<Type::OwnedValue>>, Self::Error> {
58
0
        let result = self.map.get(key);
59
0
        let value = result.map(Cow::Borrowed);
60
0
        Ok(value)
61
0
    }
Unexecuted instantiation: _RNvXs0_NtNtCsacfdLYFME8L_11fuel_merkle6common11storage_mapINtB5_10StorageMapNtNtNtB9_6binary9in_memory10NodesTableEINtCsemUD0ZWGYFx_12fuel_storage14StorageInspectB1c_E3getB9_
Unexecuted instantiation: _RNvXs0_NtNtCsacfdLYFME8L_11fuel_merkle6common11storage_mapINtB5_10StorageMapNtNtNtB9_6sparse9in_memory10NodesTableEINtCsemUD0ZWGYFx_12fuel_storage14StorageInspectB1c_E3getB9_
62
63
0
    fn contains_key(&self, key: &Type::Key) -> Result<bool, Self::Error> {
64
0
        let contains = self.map.contains_key(key);
65
0
        Ok(contains)
66
0
    }
67
}
68
69
impl<Type> StorageMutate<Type> for StorageMap<Type>
70
where
71
    Type: Mappable,
72
    Type::Key: Eq + core::hash::Hash,
73
    Type::OwnedKey: Eq + core::hash::Hash + core::borrow::Borrow<Type::Key>,
74
{
75
0
    fn replace(
76
0
        &mut self,
77
0
        key: &Type::Key,
78
0
        value: &Type::Value,
79
0
    ) -> Result<Option<Type::OwnedValue>, Self::Error> {
80
0
        let previous = self
81
0
            .map
82
0
            .insert(key.to_owned().into(), value.to_owned().into());
83
0
        Ok(previous)
84
0
    }
Unexecuted instantiation: _RNvXs1_NtNtCsacfdLYFME8L_11fuel_merkle6common11storage_mapINtB5_10StorageMapNtNtNtB9_6binary9in_memory10NodesTableEINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateB1c_E7replaceB9_
Unexecuted instantiation: _RNvXs1_NtNtCsacfdLYFME8L_11fuel_merkle6common11storage_mapINtB5_10StorageMapNtNtNtB9_6sparse9in_memory10NodesTableEINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateB1c_E7replaceB9_
85
86
0
    fn take(&mut self, key: &Type::Key) -> Result<Option<Type::OwnedValue>, Self::Error> {
87
0
        let value = self.map.remove(key);
88
0
        Ok(value)
89
0
    }
90
}
91
92
#[cfg(test)]
93
mod test {
94
    use super::*;
95
96
    #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
97
    struct TestKey(u32);
98
99
    #[derive(Debug, Copy, Clone, PartialEq, Eq)]
100
    struct TestValue(u32);
101
102
    struct TestTable;
103
104
    impl Mappable for TestTable {
105
        type Key = Self::OwnedKey;
106
        type OwnedKey = TestKey;
107
        type OwnedValue = TestValue;
108
        type Value = Self::OwnedValue;
109
    }
110
111
    #[test]
112
    fn test_get_returns_value_for_given_key() {
113
        let key = TestKey(0);
114
        let mut store = StorageMap::<TestTable>::new();
115
        let _ = store.insert(&key, &TestValue(0));
116
117
        assert_eq!(store.get(&key).unwrap(), Some(Cow::Borrowed(&TestValue(0))));
118
    }
119
    #[test]
120
    fn test_get_returns_none_for_invalid_key() {
121
        let key = TestKey(0);
122
        let invalid_key = TestKey(1);
123
        let mut store = StorageMap::<TestTable>::new();
124
        let _ = store.insert(&key, &TestValue(0));
125
126
        assert_eq!(store.get(&invalid_key).unwrap(), None);
127
    }
128
129
    #[test]
130
    fn test_insert_existing_key_updates_value_for_given_key() {
131
        let key = TestKey(0);
132
        let mut store = StorageMap::<TestTable>::new();
133
        let _ = store.insert(&key, &TestValue(0));
134
        let _ = store.insert(&key, &TestValue(1));
135
136
        assert_eq!(store.get(&key).unwrap(), Some(Cow::Borrowed(&TestValue(1))));
137
    }
138
139
    #[test]
140
    fn test_remove_deletes_the_value_for_given_key() {
141
        let key = TestKey(0);
142
        let mut store = StorageMap::<TestTable>::new();
143
        let _ = store.insert(&key, &TestValue(0));
144
        let _ = store.remove(&key);
145
146
        assert_eq!(store.get(&key).unwrap(), None);
147
    }
148
149
    #[test]
150
    fn test_remove_returns_the_deleted_value_for_given_key() {
151
        let key = TestKey(0);
152
        let mut store = StorageMap::<TestTable>::new();
153
        let _ = store.insert(&key, &TestValue(0));
154
155
        assert_eq!(store.take(&key).unwrap(), Some(TestValue(0)));
156
    }
157
158
    #[test]
159
    fn test_remove_returns_none_for_invalid_key() {
160
        let invalid_key = TestKey(0);
161
        let mut store = StorageMap::<TestTable>::new();
162
163
        assert_eq!(store.take(&invalid_key).unwrap(), None);
164
    }
165
166
    #[test]
167
    fn test_contains_key_returns_true_for_valid_key() {
168
        let key = TestKey(0);
169
        let mut store = StorageMap::<TestTable>::new();
170
        let _ = store.insert(&key, &TestValue(0));
171
172
        assert_eq!(store.contains_key(&key).unwrap(), true);
173
    }
174
175
    #[test]
176
    fn test_contains_key_returns_false_for_invalid_key() {
177
        let invalid_key = TestKey(0);
178
        let store = StorageMap::<TestTable>::new();
179
180
        assert_eq!(store.contains_key(&invalid_key).unwrap(), false);
181
    }
182
}
/home/marten/fuel/fuel-vm/fuel-merkle/src/common/path.rs
Line
Count
Source
1
use crate::common::Msb;
2
3
/// The side of a child node in a binary tree.
4
pub enum Side {
5
    Left,
6
    Right,
7
}
8
9
impl From<bool> for Side {
10
0
    fn from(bit: bool) -> Self {
11
0
        match bit {
12
0
            false => Side::Left,
13
0
            true => Side::Right,
14
        }
15
0
    }
Unexecuted instantiation: _RNvXNtNtCsacfdLYFME8L_11fuel_merkle6common4pathNtB2_4SideINtNtCsd3UI3IJrzMw_4core7convert4FrombE4fromCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXNtNtCsacfdLYFME8L_11fuel_merkle6common4pathNtB2_4SideINtNtCsd3UI3IJrzMw_4core7convert4FrombE4fromCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvXNtNtCsacfdLYFME8L_11fuel_merkle6common4pathNtB2_4SideINtNtCsd3UI3IJrzMw_4core7convert4FrombE4fromB6_
16
}
17
18
pub trait Path {
19
    /// Which child node to follow at the given index.
20
    fn get_instruction(&self, index: u32) -> Option<Side>;
21
22
    fn common_path_length(&self, other: &[u8]) -> u64;
23
}
24
25
impl<T> Path for T
26
where
27
    T: Msb,
28
{
29
0
    fn get_instruction(&self, index: u32) -> Option<Side> {
30
0
        self.get_bit_at_index_from_msb(index).map(Into::into)
31
0
    }
Unexecuted instantiation: _RNvXs_NtNtCsacfdLYFME8L_11fuel_merkle6common4pathAhj20_NtB4_4Path15get_instructionCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NtNtCsacfdLYFME8L_11fuel_merkle6common4pathAhj20_NtB4_4Path15get_instructionCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvXs_NtNtCsacfdLYFME8L_11fuel_merkle6common4pathAhj20_NtB4_4Path15get_instructionB8_
Unexecuted instantiation: _RNvXs_NtNtCsacfdLYFME8L_11fuel_merkle6common4pathAhj8_NtB4_4Path15get_instructionB8_
32
33
0
    fn common_path_length(&self, other: &[u8]) -> u64 {
34
0
        self.common_prefix_count(other)
35
0
    }
Unexecuted instantiation: _RNvXs_NtNtCsacfdLYFME8L_11fuel_merkle6common4pathAhj20_NtB4_4Path18common_path_lengthCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NtNtCsacfdLYFME8L_11fuel_merkle6common4pathAhj20_NtB4_4Path18common_path_lengthCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvXs_NtNtCsacfdLYFME8L_11fuel_merkle6common4pathAhj20_NtB4_4Path18common_path_lengthB8_
36
}
/home/marten/fuel/fuel-vm/fuel-merkle/src/common/node.rs
Line
Count
Source
1
use crate::common::{
2
    Bytes32,
3
    Bytes8,
4
};
5
6
use alloc::string::String;
7
use core::fmt;
8
9
pub trait KeyFormatting {
10
    type PrettyType: fmt::Display;
11
12
    fn pretty(&self) -> Self::PrettyType;
13
}
14
15
pub trait Node {
16
    type Key: KeyFormatting;
17
18
    fn key_size_bits() -> u32;
19
    fn height(&self) -> u32;
20
    fn leaf_key(&self) -> Self::Key;
21
    fn is_leaf(&self) -> bool;
22
    fn is_node(&self) -> bool;
23
}
24
25
pub trait ParentNode: Sized + Node {
26
    type Error;
27
    type ChildKey;
28
29
    fn key(&self) -> Self::ChildKey;
30
    fn left_child(&self) -> ChildResult<Self>;
31
    fn left_child_key(&self) -> ChildKeyResult<Self>;
32
    fn right_child(&self) -> ChildResult<Self>;
33
    fn right_child_key(&self) -> ChildKeyResult<Self>;
34
}
35
36
#[allow(type_alias_bounds)]
37
pub type ChildResult<T: ParentNode> = Result<T, ChildError<T::Key, T::Error>>;
38
#[allow(type_alias_bounds)]
39
pub type ChildKeyResult<T: ParentNode> =
40
    Result<T::ChildKey, ChildError<T::Key, T::Error>>;
41
42
0
#[derive(Debug, Clone, derive_more::Display)]
43
pub enum ChildError<Key, E>
44
where
45
    Key: KeyFormatting,
46
{
47
    #[display(fmt = "Child with key {} was not found in storage", _0.pretty())]
48
    ChildNotFound(Key),
49
    #[display(fmt = "Node channot have the requested child")]
50
    ChildCannotExist,
51
    #[display(fmt = "Node is a leaf with no children")]
52
    NodeIsLeaf,
53
    #[display(fmt = "{}", _0)]
54
    Error(E),
55
}
56
57
impl<Key, E> From<E> for ChildError<Key, E>
58
where
59
    Key: KeyFormatting,
60
{
61
0
    fn from(e: E) -> Self {
62
0
        Self::Error(e)
63
0
    }
64
}
65
66
impl KeyFormatting for Bytes8 {
67
    type PrettyType = u64;
68
69
0
    fn pretty(&self) -> Self::PrettyType {
70
0
        u64::from_be_bytes(*self)
71
0
    }
72
}
73
74
impl KeyFormatting for Bytes32 {
75
    type PrettyType = String;
76
77
0
    fn pretty(&self) -> Self::PrettyType {
78
0
        hex::encode(self)
79
0
    }
80
}
/home/marten/fuel/fuel-vm/fuel-merkle/src/common/prefix.rs
Line
Count
Source
1
const NODE: u8 = 0x01;
2
const LEAF: u8 = 0x00;
3
4
#[derive(Clone, Copy, Debug, PartialEq, Eq, Default)]
5
#[repr(u8)]
6
pub enum Prefix {
7
    Node = NODE,
8
    #[default]
9
    Leaf = LEAF,
10
}
11
12
impl From<Prefix> for u8 {
13
0
    fn from(prefix: Prefix) -> Self {
14
0
        match prefix {
15
0
            Prefix::Node => NODE,
16
0
            Prefix::Leaf => LEAF,
17
        }
18
0
    }
19
}
20
21
impl From<Prefix> for [u8; 1] {
22
0
    fn from(prefix: Prefix) -> Self {
23
0
        match prefix {
24
0
            Prefix::Node => [NODE],
25
0
            Prefix::Leaf => [LEAF],
26
        }
27
0
    }
28
}
29
30
0
#[derive(Debug, Clone, derive_more::Display)]
31
pub enum PrefixError {
32
    #[display(fmt = "prefix {_0} is not valid")]
33
    InvalidPrefix(u8),
34
}
35
36
impl TryFrom<u8> for Prefix {
37
    type Error = PrefixError;
38
39
0
    fn try_from(byte: u8) -> Result<Self, Self::Error> {
40
0
        match byte {
41
0
            NODE => Ok(Prefix::Node),
42
0
            LEAF => Ok(Prefix::Leaf),
43
0
            _ => Err(PrefixError::InvalidPrefix(byte)),
44
        }
45
0
    }
46
}
47
48
impl AsRef<[u8]> for Prefix {
49
1.85M
    fn as_ref(&self) -> &[u8] {
50
1.85M
        match self {
51
923k
            Prefix::Node => &[NODE],
52
933k
            Prefix::Leaf => &[LEAF],
53
        }
54
1.85M
    }
55
}
56
57
impl AsRef<[u8; 1]> for Prefix {
58
0
    fn as_ref(&self) -> &[u8; 1] {
59
0
        match self {
60
0
            Prefix::Node => &[NODE],
61
0
            Prefix::Leaf => &[LEAF],
62
        }
63
0
    }
64
}
/home/marten/fuel/fuel-vm/fuel-merkle/src/common/position_path.rs
Line
Count
Source
1
use crate::common::{
2
    node::Node,
3
    path_iterator::PathIter,
4
    AsPathIterator,
5
    Position,
6
};
7
8
use super::path::Side;
9
10
/// # PositionPath
11
///
12
/// A PositionPath represents the path of positions created by traversing a
13
/// binary tree from the root position to the leaf position. The shape of the
14
/// tree determines path traversal, and can be described accurately by the
15
/// number of leaves comprising the tree. For example, traversing to the fifth
16
/// leaf of a balanced eight-leaf tree will generate a different path than
17
/// traversing to the fifth leaf of an imbalanced five-leaf tree.
18
///
19
/// A PositionPath exposes an `iter()` method for performing iteration on this
20
/// path. Each iteration returns a tuple containing the next position in the
21
/// path and the corresponding side node. Because the tree may be imbalanced, as
22
/// described by the path's `leaves_count` parameter, the side node may not
23
/// necessarily be the direct sibling of the path node; rather, it can be a
24
/// position at a lower spot in the tree altogether.
25
pub struct PositionPath {
26
    root: Position,
27
    leaf: Position,
28
    leaves_count: u64,
29
}
30
31
impl PositionPath {
32
0
    pub fn new(root: Position, leaf: Position, leaves_count: u64) -> Self {
33
0
        debug_assert!(leaves_count > 0);
34
0
        Self {
35
0
            root,
36
0
            leaf,
37
0
            leaves_count,
38
0
        }
39
0
    }
40
41
0
    pub fn iter(self) -> PositionPathIter {
42
0
        PositionPathIter::new(self.root, self.leaf, self.leaves_count)
43
0
    }
44
}
45
46
pub struct PositionPathIter {
47
    rightmost_position: Position,
48
    current_side_node: Option<Position>,
49
    path_iter: PathIter<Position>,
50
}
51
52
impl PositionPathIter {
53
    /// Panics if leaves_count is zero, as the tree is not valid
54
0
    pub fn new(root: Position, leaf: Position, leaves_count: u64) -> Self {
55
0
        Self {
56
0
            rightmost_position: Position::from_leaf_index(
57
0
                leaves_count
58
0
                    .checked_sub(1)
59
0
                    .expect("Path to a tree without leaves"),
60
0
            )
61
0
            .unwrap(),
62
0
            current_side_node: None,
63
0
            path_iter: root.as_path_iter(&leaf.leaf_key()),
64
0
        }
65
0
    }
66
}
67
68
impl Iterator for PositionPathIter {
69
    type Item = (Position, Position);
70
71
0
    fn next(&mut self) -> Option<Self::Item> {
72
0
        // Find the next set of path and side positions by iterating from the
73
0
        // given root position to the given leaf position and evaluating each
74
0
        // position against the tree described by the leaves count.
75
0
        let iter = self.path_iter.by_ref().map(|(path, side)| {
76
0
            // SAFETY: Path iteration over positions is infallible. Path
77
0
            // positions and side positions are both guaranteed to be valid in
78
0
            // this context.
79
0
            (path.unwrap(), side.unwrap())
80
0
        });
81
0
        for (path, side) in iter {
82
0
            let mut side = Position::from_in_order_index(side);
83
0
            // To determine if the position is in the tree, we observe that the
84
0
            // highest in-order index belongs to the tree's rightmost leaf
85
0
            // position (as defined by the `leaves_count` parameter) and that
86
0
            // all path nodes will have an in-order index less than or equal to
87
0
            // the in-order index of this rightmost leaf position. If a path
88
0
            // position has an in-order index greater than that of the rightmost
89
0
            // leaf position, it is invalid in the context of this tree and must
90
0
            // be discarded. However, the corresponding side node is valid (or
91
0
            // is the ancestor of a valid side node) and represents the side
92
0
            // node of a deeper path position that is also valid (i.e., has
93
0
            // in-order index less than or equal to that of the rightmost leaf).
94
0
            // We can save reference to it now so that we can generate the path
95
0
            // node and side node pair later, once both nodes are encountered.
96
0
            if path.in_order_index() <= self.rightmost_position.in_order_index() {
97
                // If we previously encountered a side node corresponding to an
98
                // invalid path node, we observe that the next valid path node
99
                // always pairs with this side node. Once the path and side node
100
                // have been paired, we continue to pair path and side nodes
101
                // normally.
102
0
                if let Some(node) = self.current_side_node.take() {
103
0
                    side = node;
104
0
                }
105
106
                // A side node with an in-order index greater than the index of
107
                // the rightmost leaf position is invalid and does not exist in
108
                // the context of this tree. The invalid side node will always
109
                // be the ancestor of the correct side node. Furthermore, the
110
                // correct side node will always be a leftward descendent of
111
                // this invalid side node.
112
0
                while side.in_order_index() > self.rightmost_position.in_order_index() {
113
0
                    side = side.child(Side::Left).expect("Verified above");
114
0
                }
115
116
0
                return Some((path, side))
117
            } else {
118
                // If the path node is invalid, save reference to the
119
                // corresponding side node.
120
0
                if self.current_side_node.is_none() {
121
0
                    self.current_side_node = Some(side);
122
0
                }
123
            }
124
        }
125
126
0
        None
127
0
    }
128
}
129
130
#[cfg(test)]
131
mod test {
132
    use crate::common::Position;
133
    use alloc::vec::Vec;
134
135
    #[test]
136
    fn test_path_set_returns_path_and_side_nodes_for_1_leaf() {
137
        let root = Position::from_in_order_index(0);
138
        let leaf = Position::from_leaf_index_unwrap(0);
139
        let (path_positions, side_positions): (Vec<Position>, Vec<Position>) =
140
            root.path(&leaf, 1).iter().unzip();
141
        let expected_path = [Position::from_in_order_index(0)];
142
        let expected_side = [Position::from_in_order_index(0)];
143
        assert_eq!(path_positions, expected_path);
144
        assert_eq!(side_positions, expected_side);
145
    }
146
147
    #[test]
148
    fn test_path_set_returns_path_and_side_nodes_for_4_leaves() {
149
        //       03
150
        //      /  \
151
        //     /    \
152
        //   01      05
153
        //  /  \    /  \
154
        // 00  02  04  06
155
        // 00  01  02  03
156
157
        let root = Position::from_in_order_index(3);
158
159
        let leaf = Position::from_leaf_index_unwrap(0);
160
        let (path_positions, side_positions): (Vec<Position>, Vec<Position>) =
161
            root.path(&leaf, 4).iter().unzip();
162
        let expected_path = [
163
            Position::from_in_order_index(3),
164
            Position::from_in_order_index(1),
165
            Position::from_in_order_index(0),
166
        ];
167
        let expected_side = [
168
            Position::from_in_order_index(3),
169
            Position::from_in_order_index(5),
170
            Position::from_in_order_index(2),
171
        ];
172
        assert_eq!(path_positions, expected_path);
173
        assert_eq!(side_positions, expected_side);
174
175
        let leaf = Position::from_leaf_index_unwrap(1);
176
        let (path_positions, side_positions): (Vec<Position>, Vec<Position>) =
177
            root.path(&leaf, 4).iter().unzip();
178
        let expected_path = [
179
            Position::from_in_order_index(3),
180
            Position::from_in_order_index(1),
181
            Position::from_in_order_index(2),
182
        ];
183
        let expected_side = [
184
            Position::from_in_order_index(3),
185
            Position::from_in_order_index(5),
186
            Position::from_in_order_index(0),
187
        ];
188
        assert_eq!(path_positions, expected_path);
189
        assert_eq!(side_positions, expected_side);
190
191
        let leaf = Position::from_leaf_index_unwrap(2);
192
        let (path_positions, side_positions): (Vec<Position>, Vec<Position>) =
193
            root.path(&leaf, 4).iter().unzip();
194
        let expected_path = [
195
            Position::from_in_order_index(3),
196
            Position::from_in_order_index(5),
197
            Position::from_in_order_index(4),
198
        ];
199
        let expected_side = [
200
            Position::from_in_order_index(3),
201
            Position::from_in_order_index(1),
202
            Position::from_in_order_index(6),
203
        ];
204
        assert_eq!(path_positions, expected_path);
205
        assert_eq!(side_positions, expected_side);
206
207
        let leaf = Position::from_leaf_index_unwrap(3);
208
        let (path_positions, side_positions): (Vec<Position>, Vec<Position>) =
209
            root.path(&leaf, 4).iter().unzip();
210
        let expected_path = [
211
            Position::from_in_order_index(3),
212
            Position::from_in_order_index(5),
213
            Position::from_in_order_index(6),
214
        ];
215
        let expected_side = [
216
            Position::from_in_order_index(3),
217
            Position::from_in_order_index(1),
218
            Position::from_in_order_index(4),
219
        ];
220
        assert_eq!(path_positions, expected_path);
221
        assert_eq!(side_positions, expected_side);
222
    }
223
224
    #[test]
225
    fn test_path_set_returns_path_and_side_nodes_for_5_leaves() {
226
        //          07
227
        //         /  \
228
        //       03    \
229
        //      /  \    \
230
        //     /    \    \
231
        //   01      05   \
232
        //  /  \    /  \   \
233
        // 00  02  04  06  08
234
        // 00  01  02  03  04
235
236
        let root = Position::from_in_order_index(7);
237
238
        let leaf = Position::from_leaf_index_unwrap(0);
239
        let (path_positions, side_positions): (Vec<Position>, Vec<Position>) =
240
            root.path(&leaf, 5).iter().unzip();
241
        let expected_path = [
242
            Position::from_in_order_index(7),
243
            Position::from_in_order_index(3),
244
            Position::from_in_order_index(1),
245
            Position::from_in_order_index(0),
246
        ];
247
        let expected_side = [
248
            Position::from_in_order_index(7),
249
            Position::from_in_order_index(8),
250
            Position::from_in_order_index(5),
251
            Position::from_in_order_index(2),
252
        ];
253
        assert_eq!(path_positions, expected_path);
254
        assert_eq!(side_positions, expected_side);
255
256
        let leaf = Position::from_leaf_index_unwrap(1);
257
        let (path_positions, side_positions): (Vec<Position>, Vec<Position>) =
258
            root.path(&leaf, 5).iter().unzip();
259
        let expected_path = [
260
            Position::from_in_order_index(7),
261
            Position::from_in_order_index(3),
262
            Position::from_in_order_index(1),
263
            Position::from_in_order_index(2),
264
        ];
265
        let expected_side = [
266
            Position::from_in_order_index(7),
267
            Position::from_in_order_index(8),
268
            Position::from_in_order_index(5),
269
            Position::from_in_order_index(0),
270
        ];
271
        assert_eq!(path_positions, expected_path);
272
        assert_eq!(side_positions, expected_side);
273
274
        let leaf = Position::from_leaf_index_unwrap(2);
275
        let (path_positions, side_positions): (Vec<Position>, Vec<Position>) =
276
            root.path(&leaf, 5).iter().unzip();
277
        let expected_path = [
278
            Position::from_in_order_index(7),
279
            Position::from_in_order_index(3),
280
            Position::from_in_order_index(5),
281
            Position::from_in_order_index(4),
282
        ];
283
        let expected_side = [
284
            Position::from_in_order_index(7),
285
            Position::from_in_order_index(8),
286
            Position::from_in_order_index(1),
287
            Position::from_in_order_index(6),
288
        ];
289
        assert_eq!(path_positions, expected_path);
290
        assert_eq!(side_positions, expected_side);
291
292
        let leaf = Position::from_leaf_index_unwrap(3);
293
        let (path_positions, side_positions): (Vec<Position>, Vec<Position>) =
294
            root.path(&leaf, 5).iter().unzip();
295
        let expected_path = [
296
            Position::from_in_order_index(7),
297
            Position::from_in_order_index(3),
298
            Position::from_in_order_index(5),
299
            Position::from_in_order_index(6),
300
        ];
301
        let expected_side = [
302
            Position::from_in_order_index(7),
303
            Position::from_in_order_index(8),
304
            Position::from_in_order_index(1),
305
            Position::from_in_order_index(4),
306
        ];
307
        assert_eq!(path_positions, expected_path);
308
        assert_eq!(side_positions, expected_side);
309
310
        let leaf = Position::from_leaf_index_unwrap(4);
311
        let (path_positions, side_positions): (Vec<Position>, Vec<Position>) =
312
            root.path(&leaf, 5).iter().unzip();
313
        let expected_path = [
314
            Position::from_in_order_index(7),
315
            Position::from_in_order_index(8),
316
        ];
317
        let expected_side = [
318
            Position::from_in_order_index(7),
319
            Position::from_in_order_index(3),
320
        ];
321
        assert_eq!(path_positions, expected_path);
322
        assert_eq!(side_positions, expected_side);
323
    }
324
325
    #[test]
326
    fn test_path_set_returns_path_and_side_nodes_for_6_leaves() {
327
        //            07
328
        //           /  \
329
        //          /    \
330
        //         /      \
331
        //       03        \
332
        //      /  \        \
333
        //     /    \        \
334
        //   01      05      09
335
        //  /  \    /  \    /  \
336
        // 00  02  04  06  08  10
337
        // 00  01  02  03  04  05
338
339
        let root = Position::from_in_order_index(7);
340
341
        let leaf = Position::from_leaf_index_unwrap(0);
342
        let (path_positions, side_positions): (Vec<Position>, Vec<Position>) =
343
            root.path(&leaf, 6).iter().unzip();
344
        let expected_path = [
345
            Position::from_in_order_index(7),
346
            Position::from_in_order_index(3),
347
            Position::from_in_order_index(1),
348
            Position::from_in_order_index(0),
349
        ];
350
        let expected_side = [
351
            Position::from_in_order_index(7),
352
            Position::from_in_order_index(9),
353
            Position::from_in_order_index(5),
354
            Position::from_in_order_index(2),
355
        ];
356
        assert_eq!(path_positions, expected_path);
357
        assert_eq!(side_positions, expected_side);
358
359
        let leaf = Position::from_leaf_index_unwrap(1);
360
        let (path_positions, side_positions): (Vec<Position>, Vec<Position>) =
361
            root.path(&leaf, 6).iter().unzip();
362
        let expected_path = [
363
            Position::from_in_order_index(7),
364
            Position::from_in_order_index(3),
365
            Position::from_in_order_index(1),
366
            Position::from_in_order_index(2),
367
        ];
368
        let expected_side = [
369
            Position::from_in_order_index(7),
370
            Position::from_in_order_index(9),
371
            Position::from_in_order_index(5),
372
            Position::from_in_order_index(0),
373
        ];
374
        assert_eq!(path_positions, expected_path);
375
        assert_eq!(side_positions, expected_side);
376
377
        let leaf = Position::from_leaf_index_unwrap(2);
378
        let (path_positions, side_positions): (Vec<Position>, Vec<Position>) =
379
            root.path(&leaf, 6).iter().unzip();
380
        let expected_path = [
381
            Position::from_in_order_index(7),
382
            Position::from_in_order_index(3),
383
            Position::from_in_order_index(5),
384
            Position::from_in_order_index(4),
385
        ];
386
        let expected_side = [
387
            Position::from_in_order_index(7),
388
            Position::from_in_order_index(9),
389
            Position::from_in_order_index(1),
390
            Position::from_in_order_index(6),
391
        ];
392
        assert_eq!(path_positions, expected_path);
393
        assert_eq!(side_positions, expected_side);
394
395
        let leaf = Position::from_leaf_index_unwrap(3);
396
        let (path_positions, side_positions): (Vec<Position>, Vec<Position>) =
397
            root.path(&leaf, 6).iter().unzip();
398
        let expected_path = [
399
            Position::from_in_order_index(7),
400
            Position::from_in_order_index(3),
401
            Position::from_in_order_index(5),
402
            Position::from_in_order_index(6),
403
        ];
404
        let expected_side = [
405
            Position::from_in_order_index(7),
406
            Position::from_in_order_index(9),
407
            Position::from_in_order_index(1),
408
            Position::from_in_order_index(4),
409
        ];
410
        assert_eq!(path_positions, expected_path);
411
        assert_eq!(side_positions, expected_side);
412
413
        let leaf = Position::from_leaf_index_unwrap(4);
414
        let (path_positions, side_positions): (Vec<Position>, Vec<Position>) =
415
            root.path(&leaf, 6).iter().unzip();
416
        let expected_path = [
417
            Position::from_in_order_index(7),
418
            Position::from_in_order_index(9),
419
            Position::from_in_order_index(8),
420
        ];
421
        let expected_side = [
422
            Position::from_in_order_index(7),
423
            Position::from_in_order_index(3),
424
            Position::from_in_order_index(10),
425
        ];
426
        assert_eq!(path_positions, expected_path);
427
        assert_eq!(side_positions, expected_side);
428
429
        let leaf = Position::from_leaf_index_unwrap(5);
430
        let (path_positions, side_positions): (Vec<Position>, Vec<Position>) =
431
            root.path(&leaf, 6).iter().unzip();
432
        let expected_path = [
433
            Position::from_in_order_index(7),
434
            Position::from_in_order_index(9),
435
            Position::from_in_order_index(10),
436
        ];
437
        let expected_side = [
438
            Position::from_in_order_index(7),
439
            Position::from_in_order_index(3),
440
            Position::from_in_order_index(8),
441
        ];
442
        assert_eq!(path_positions, expected_path);
443
        assert_eq!(side_positions, expected_side);
444
    }
445
446
    #[test]
447
    fn test_path_set_returns_path_and_side_nodes_for_7_leaves() {
448
        //               07
449
        //              /  \
450
        //             /    \
451
        //            /      \
452
        //           /        \
453
        //          /          \
454
        //         /            \
455
        //       03              11
456
        //      /  \            /  \
457
        //     /    \          /    \
458
        //   01      05      09      \
459
        //  /  \    /  \    /  \      \
460
        // 00  02  04  06  08  10     12
461
        // 00  01  02  03  04  05     06
462
463
        let root = Position::from_in_order_index(7);
464
465
        let leaf = Position::from_leaf_index_unwrap(0);
466
        let (path_positions, side_positions): (Vec<Position>, Vec<Position>) =
467
            root.path(&leaf, 7).iter().unzip();
468
        let expected_path = [
469
            Position::from_in_order_index(7),
470
            Position::from_in_order_index(3),
471
            Position::from_in_order_index(1),
472
            Position::from_in_order_index(0),
473
        ];
474
        let expected_side = [
475
            Position::from_in_order_index(7),
476
            Position::from_in_order_index(11),
477
            Position::from_in_order_index(5),
478
            Position::from_in_order_index(2),
479
        ];
480
        assert_eq!(path_positions, expected_path);
481
        assert_eq!(side_positions, expected_side);
482
483
        let leaf = Position::from_leaf_index_unwrap(1);
484
        let (path_positions, side_positions): (Vec<Position>, Vec<Position>) =
485
            root.path(&leaf, 7).iter().unzip();
486
        let expected_path = [
487
            Position::from_in_order_index(7),
488
            Position::from_in_order_index(3),
489
            Position::from_in_order_index(1),
490
            Position::from_in_order_index(2),
491
        ];
492
        let expected_side = [
493
            Position::from_in_order_index(7),
494
            Position::from_in_order_index(11),
495
            Position::from_in_order_index(5),
496
            Position::from_in_order_index(0),
497
        ];
498
        assert_eq!(path_positions, expected_path);
499
        assert_eq!(side_positions, expected_side);
500
501
        let leaf = Position::from_leaf_index_unwrap(2);
502
        let (path_positions, side_positions): (Vec<Position>, Vec<Position>) =
503
            root.path(&leaf, 7).iter().unzip();
504
        let expected_path = [
505
            Position::from_in_order_index(7),
506
            Position::from_in_order_index(3),
507
            Position::from_in_order_index(5),
508
            Position::from_in_order_index(4),
509
        ];
510
        let expected_side = [
511
            Position::from_in_order_index(7),
512
            Position::from_in_order_index(11),
513
            Position::from_in_order_index(1),
514
            Position::from_in_order_index(6),
515
        ];
516
        assert_eq!(path_positions, expected_path);
517
        assert_eq!(side_positions, expected_side);
518
519
        let leaf = Position::from_leaf_index_unwrap(3);
520
        let (path_positions, side_positions): (Vec<Position>, Vec<Position>) =
521
            root.path(&leaf, 7).iter().unzip();
522
        let expected_path = [
523
            Position::from_in_order_index(7),
524
            Position::from_in_order_index(3),
525
            Position::from_in_order_index(5),
526
            Position::from_in_order_index(6),
527
        ];
528
        let expected_side = [
529
            Position::from_in_order_index(7),
530
            Position::from_in_order_index(11),
531
            Position::from_in_order_index(1),
532
            Position::from_in_order_index(4),
533
        ];
534
        assert_eq!(path_positions, expected_path);
535
        assert_eq!(side_positions, expected_side);
536
537
        let leaf = Position::from_leaf_index_unwrap(4);
538
        let (path_positions, side_positions): (Vec<Position>, Vec<Position>) =
539
            root.path(&leaf, 7).iter().unzip();
540
        let expected_path = [
541
            Position::from_in_order_index(7),
542
            Position::from_in_order_index(11),
543
            Position::from_in_order_index(9),
544
            Position::from_in_order_index(8),
545
        ];
546
        let expected_side = [
547
            Position::from_in_order_index(7),
548
            Position::from_in_order_index(3),
549
            Position::from_in_order_index(12),
550
            Position::from_in_order_index(10),
551
        ];
552
        assert_eq!(path_positions, expected_path);
553
        assert_eq!(side_positions, expected_side);
554
555
        let leaf = Position::from_leaf_index_unwrap(5);
556
        let (path_positions, side_positions): (Vec<Position>, Vec<Position>) =
557
            root.path(&leaf, 7).iter().unzip();
558
        let expected_path = [
559
            Position::from_in_order_index(7),
560
            Position::from_in_order_index(11),
561
            Position::from_in_order_index(9),
562
            Position::from_in_order_index(10),
563
        ];
564
        let expected_side = [
565
            Position::from_in_order_index(7),
566
            Position::from_in_order_index(3),
567
            Position::from_in_order_index(12),
568
            Position::from_in_order_index(8),
569
        ];
570
        assert_eq!(path_positions, expected_path);
571
        assert_eq!(side_positions, expected_side);
572
573
        let leaf = Position::from_leaf_index_unwrap(6);
574
        let (path_positions, side_positions): (Vec<Position>, Vec<Position>) =
575
            root.path(&leaf, 7).iter().unzip();
576
        let expected_path = [
577
            Position::from_in_order_index(7),
578
            Position::from_in_order_index(11),
579
            Position::from_in_order_index(12),
580
        ];
581
        let expected_side = [
582
            Position::from_in_order_index(7),
583
            Position::from_in_order_index(3),
584
            Position::from_in_order_index(9),
585
        ];
586
        assert_eq!(path_positions, expected_path);
587
        assert_eq!(side_positions, expected_side);
588
    }
589
}
/home/marten/fuel/fuel-vm/fuel-merkle/src/common/error.rs
Line
Count
Source
1
use crate::common::PrefixError;
2
3
0
#[derive(Debug, Clone, derive_more::Display)]
4
pub enum DeserializeError {
5
    #[display(fmt = "{}", _0)]
6
    PrefixError(PrefixError),
7
}
8
9
impl From<PrefixError> for DeserializeError {
10
0
    fn from(err: PrefixError) -> Self {
11
0
        DeserializeError::PrefixError(err)
12
0
    }
13
}
/home/marten/fuel/fuel-vm/fuel-merkle/src/common/hash.rs
Line
Count
Source
1
use super::Bytes32;
2
3
0
pub fn sum<T: AsRef<[u8]>>(data: T) -> Bytes32 {
4
    use digest::Digest;
5
0
    let mut hash = sha2::Sha256::new();
6
0
    hash.update(data.as_ref());
7
0
    hash.finalize().into()
8
0
}
Unexecuted instantiation: _RINvNtNtCsacfdLYFME8L_11fuel_merkle6common4hash3sumRRNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32ECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvNtNtCsacfdLYFME8L_11fuel_merkle6common4hash3sumRRNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32ECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvNtNtCsacfdLYFME8L_11fuel_merkle6common4hash3sumRShEB6_
9
10
0
pub fn sum_iter<I: IntoIterator<Item = T>, T: AsRef<[u8]>>(iterator: I) -> Bytes32 {
11
    use digest::Digest;
12
0
    let mut hash = sha2::Sha256::new();
13
0
    for data in iterator {
14
0
        hash.update(data.as_ref());
15
0
    }
16
0
    hash.finalize().into()
17
0
}
/home/marten/fuel/fuel-vm/fuel-merkle/src/sparse.rs
Line
Count
Source
1
mod hash;
2
mod merkle_tree;
3
mod primitive;
4
5
pub(crate) use hash::zero_sum;
6
7
pub use merkle_tree::{
8
    MerkleTree,
9
    MerkleTreeError,
10
    MerkleTreeKey,
11
};
12
pub use primitive::Primitive;
13
pub mod in_memory;
14
pub mod proof;
15
16
use crate::common::Bytes32;
17
18
0
pub const fn empty_sum() -> &'static Bytes32 {
19
0
    zero_sum()
20
0
}
/home/marten/fuel/fuel-vm/fuel-merkle/src/common.rs
Line
Count
Source
1
mod hash;
2
mod msb;
3
mod path_iterator;
4
mod position;
5
mod position_path;
6
mod prefix;
7
mod storage_map;
8
9
pub(crate) mod error;
10
pub(crate) mod node;
11
pub(crate) mod path;
12
13
pub use path_iterator::AsPathIterator;
14
pub use position::Position;
15
pub use storage_map::StorageMap;
16
17
pub(crate) use msb::Msb;
18
pub(crate) use position_path::PositionPath;
19
pub(crate) use prefix::{
20
    Prefix,
21
    PrefixError,
22
};
23
24
pub type Bytes1 = [u8; 1];
25
pub type Bytes2 = [u8; 2];
26
pub type Bytes4 = [u8; 4];
27
pub type Bytes8 = [u8; 8];
28
pub type Bytes16 = [u8; 16];
29
pub type Bytes32 = [u8; 32];
30
31
use alloc::vec::Vec;
32
pub type ProofSet = Vec<Bytes32>;
33
34
pub use hash::{
35
    sum,
36
    sum_iter,
37
};
38
39
// Merkle Tree hash of an empty list
40
// MTH({}) = Hash()
41
0
pub const fn empty_sum_sha256() -> &'static Bytes32 {
42
    const EMPTY_SUM: Bytes32 = [
43
        0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99,
44
        0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95,
45
        0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55,
46
    ];
47
48
0
    &EMPTY_SUM
49
0
}
50
51
#[test]
52
fn empty_sum_sha256_is_empty_hash() {
53
    use digest::Digest;
54
    use sha2::Sha256;
55
56
    let sum = empty_sum_sha256();
57
    let empty = Bytes32::from(Sha256::new().finalize());
58
59
    assert_eq!(&empty, sum);
60
}
/home/marten/fuel/fuel-vm/fuel-merkle/src/sparse/in_memory.rs
Line
Count
Source
1
use crate::{
2
    common::{
3
        Bytes32,
4
        StorageMap,
5
    },
6
    sparse::{
7
        self,
8
        merkle_tree::MerkleTreeKey,
9
        proof::Proof,
10
        Primitive,
11
    },
12
    storage::{
13
        Mappable,
14
        StorageInspect,
15
        StorageMutate,
16
    },
17
};
18
use alloc::{
19
    borrow::Cow,
20
    vec::Vec,
21
};
22
23
/// The table of the Sparse Merkle tree's nodes. [`MerkleTree`] works with it as a sparse
24
/// merkle tree, where the storage key is `Bytes32` and the value is the
25
/// [`Buffer`](crate::sparse::Buffer) (raw presentation of the
26
/// [`Node`](crate::sparse::Node)).
27
#[derive(Debug)]
28
pub struct NodesTable;
29
30
impl Mappable for NodesTable {
31
    type Key = Self::OwnedKey;
32
    type OwnedKey = Bytes32;
33
    type OwnedValue = Primitive;
34
    type Value = Self::OwnedValue;
35
}
36
37
type Storage = StorageMap<NodesTable>;
38
type SparseMerkleTree = sparse::MerkleTree<NodesTable, Storage>;
39
40
#[derive(Debug)]
41
pub struct MerkleTree {
42
    tree: SparseMerkleTree,
43
}
44
45
impl MerkleTree {
46
0
    pub fn new() -> Self {
47
0
        Self {
48
0
            tree: SparseMerkleTree::new(Storage::new()),
49
0
        }
50
0
    }
51
52
    /// Build a sparse Merkle tree from a set of key-value pairs. This is
53
    /// equivalent to creating an empty sparse Merkle tree and sequentially
54
    /// calling [update](Self::update) for each key-value pair. This constructor
55
    /// is more performant than calling individual sequential updates and is the
56
    /// preferred approach when the key-values are known upfront. Leaves can be
57
    /// appended to the returned tree using `update` to further accumulate leaf
58
    /// data.
59
0
    pub fn from_set<I, D>(set: I) -> Self
60
0
    where
61
0
        I: Iterator<Item = (MerkleTreeKey, D)>,
62
0
        D: AsRef<[u8]>,
63
0
    {
64
0
        let tree = SparseMerkleTree::from_set(Storage::new(), set)
65
0
            .expect("`Storage` can't return error");
66
0
        Self { tree }
67
0
    }
68
69
    /// Calculate the sparse Merkle root from a set of key-value pairs. This is
70
    /// similar to constructing a new tree from a set of key-value pairs using
71
    /// [from_set](Self::from_set), except this method returns only the root; it
72
    /// does not write to storage nor return a sparse Merkle tree instance. It
73
    /// is equivalent to calling `from_set(..)`, followed by `root()`, but does
74
    /// not incur the overhead of storage writes. This can be helpful when we
75
    /// know all the key-values in the set upfront and we will not need to
76
    /// update the set in the future.
77
8.77k
    pub fn root_from_set<I, D>(set: I) -> Bytes32
78
8.77k
    where
79
8.77k
        I: Iterator<Item = (MerkleTreeKey, D)>,
80
8.77k
        D: AsRef<[u8]>,
81
8.77k
    {
82
        #[derive(Default)]
83
        struct EmptyStorage;
84
85
        impl StorageInspect<NodesTable> for EmptyStorage {
86
            type Error = core::convert::Infallible;
87
88
0
            fn get(&self, _: &Bytes32) -> Result<Option<Cow<Primitive>>, Self::Error> {
89
0
                Ok(None)
90
0
            }
91
92
0
            fn contains_key(&self, _: &Bytes32) -> Result<bool, Self::Error> {
93
0
                Ok(false)
94
0
            }
95
        }
96
97
        impl StorageMutate<NodesTable> for EmptyStorage {
98
0
            fn insert(&mut self, _: &Bytes32, _: &Primitive) -> Result<(), Self::Error> {
99
0
                Ok(())
100
0
            }
Unexecuted instantiation: _RNvXs_NvMs_NtNtCsacfdLYFME8L_11fuel_merkle6sparse9in_memoryNtB9_10MerkleTree13root_from_setNtB4_12EmptyStorageINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtB9_10NodesTableE6insertCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NvMs_NtNtCsacfdLYFME8L_11fuel_merkle6sparse9in_memoryNtB9_10MerkleTree13root_from_setNtB4_12EmptyStorageINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtB9_10NodesTableE6insertCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvXs_NvMs_NtNtCsacfdLYFME8L_11fuel_merkle6sparse9in_memoryNtB9_10MerkleTree13root_from_setNtB4_12EmptyStorageINtCsemUD0ZWGYFx_12fuel_storage13StorageMutateNtB9_10NodesTableE6insertBd_
101
102
0
            fn replace(
103
0
                &mut self,
104
0
                _: &Bytes32,
105
0
                _: &Primitive,
106
0
            ) -> Result<Option<Primitive>, Self::Error> {
107
0
                Ok(None)
108
0
            }
109
110
0
            fn remove(&mut self, _: &Bytes32) -> Result<(), Self::Error> {
111
0
                Ok(())
112
0
            }
113
114
0
            fn take(&mut self, _: &Bytes32) -> Result<Option<Primitive>, Self::Error> {
115
0
                Ok(None)
116
0
            }
117
        }
118
119
8.77k
        let tree = sparse::MerkleTree::<NodesTable, _>::from_set(EmptyStorage, set)
120
8.77k
            .expect("`Storage` can't return error");
121
8.77k
        tree.root()
122
8.77k
    }
_RINvMs_NtNtCsacfdLYFME8L_11fuel_merkle6sparse9in_memoryNtB5_10MerkleTree13root_from_setINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters3map3MapIB1o_INtNtNtB1w_5slice4iter4IterNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENCINvMNtB2P_8contractNtB3W_8Contract18initial_state_rootB2g_E0ENCB3S_s_0ERNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32ECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
77
2.19k
    pub fn root_from_set<I, D>(set: I) -> Bytes32
78
2.19k
    where
79
2.19k
        I: Iterator<Item = (MerkleTreeKey, D)>,
80
2.19k
        D: AsRef<[u8]>,
81
2.19k
    {
82
        #[derive(Default)]
83
        struct EmptyStorage;
84
85
        impl StorageInspect<NodesTable> for EmptyStorage {
86
            type Error = core::convert::Infallible;
87
88
            fn get(&self, _: &Bytes32) -> Result<Option<Cow<Primitive>>, Self::Error> {
89
                Ok(None)
90
            }
91
92
            fn contains_key(&self, _: &Bytes32) -> Result<bool, Self::Error> {
93
                Ok(false)
94
            }
95
        }
96
97
        impl StorageMutate<NodesTable> for EmptyStorage {
98
            fn insert(&mut self, _: &Bytes32, _: &Primitive) -> Result<(), Self::Error> {
99
                Ok(())
100
            }
101
102
            fn replace(
103
                &mut self,
104
                _: &Bytes32,
105
                _: &Primitive,
106
            ) -> Result<Option<Primitive>, Self::Error> {
107
                Ok(None)
108
            }
109
110
            fn remove(&mut self, _: &Bytes32) -> Result<(), Self::Error> {
111
                Ok(())
112
            }
113
114
            fn take(&mut self, _: &Bytes32) -> Result<Option<Primitive>, Self::Error> {
115
                Ok(None)
116
            }
117
        }
118
119
2.19k
        let tree = sparse::MerkleTree::<NodesTable, _>::from_set(EmptyStorage, set)
120
2.19k
            .expect("`Storage` can't return error");
121
2.19k
        tree.root()
122
2.19k
    }
Unexecuted instantiation: _RINvMs_NtNtCsacfdLYFME8L_11fuel_merkle6sparse9in_memoryNtB5_10MerkleTree13root_from_setINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters3map3MapIB1o_INtNtNtB1u_7sources5empty5EmptyRNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENCINvMNtB2U_8contractNtB41_8Contract18initial_state_rootB2g_E0ENCB3X_s_0ERNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32EB2U_
_RINvMs_NtNtCsacfdLYFME8L_11fuel_merkle6sparse9in_memoryNtB5_10MerkleTree13root_from_setINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters3map3MapIB1o_INtNtNtB1w_5slice4iter4IterNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENCINvMNtB2P_8contractNtB3W_8Contract18initial_state_rootB2g_E0ENCB3S_s_0ERNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32EB2P_
Line
Count
Source
77
6.57k
    pub fn root_from_set<I, D>(set: I) -> Bytes32
78
6.57k
    where
79
6.57k
        I: Iterator<Item = (MerkleTreeKey, D)>,
80
6.57k
        D: AsRef<[u8]>,
81
6.57k
    {
82
        #[derive(Default)]
83
        struct EmptyStorage;
84
85
        impl StorageInspect<NodesTable> for EmptyStorage {
86
            type Error = core::convert::Infallible;
87
88
            fn get(&self, _: &Bytes32) -> Result<Option<Cow<Primitive>>, Self::Error> {
89
                Ok(None)
90
            }
91
92
            fn contains_key(&self, _: &Bytes32) -> Result<bool, Self::Error> {
93
                Ok(false)
94
            }
95
        }
96
97
        impl StorageMutate<NodesTable> for EmptyStorage {
98
            fn insert(&mut self, _: &Bytes32, _: &Primitive) -> Result<(), Self::Error> {
99
                Ok(())
100
            }
101
102
            fn replace(
103
                &mut self,
104
                _: &Bytes32,
105
                _: &Primitive,
106
            ) -> Result<Option<Primitive>, Self::Error> {
107
                Ok(None)
108
            }
109
110
            fn remove(&mut self, _: &Bytes32) -> Result<(), Self::Error> {
111
                Ok(())
112
            }
113
114
            fn take(&mut self, _: &Bytes32) -> Result<Option<Primitive>, Self::Error> {
115
                Ok(None)
116
            }
117
        }
118
119
6.57k
        let tree = sparse::MerkleTree::<NodesTable, _>::from_set(EmptyStorage, set)
120
6.57k
            .expect("`Storage` can't return error");
121
6.57k
        tree.root()
122
6.57k
    }
Unexecuted instantiation: _RINvMs_NtNtCsacfdLYFME8L_11fuel_merkle6sparse9in_memoryNtB5_10MerkleTree13root_from_setppEB9_
123
124
    /// Calculate the sparse Merkle root as well as all nodes in the Merkle tree
125
    /// from a set of key-value pairs. This is similar to constructing a new
126
    /// tree from a set of key-value pairs using [from_set](Self::from_set),
127
    /// except this method returns only the root and the list of leaves and
128
    /// nodes in the tree; it does not return a sparse Merkle tree instance.
129
    /// This can be helpful when we know all the key-values in the set upfront
130
    /// and we need to defer storage writes, such as expensive database inserts,
131
    /// for batch operations later in the process.
132
0
    pub fn nodes_from_set<I, D>(set: I) -> (Bytes32, Vec<(Bytes32, Primitive)>)
133
0
    where
134
0
        I: Iterator<Item = (MerkleTreeKey, D)>,
135
0
        D: AsRef<[u8]>,
136
0
    {
137
        #[derive(Default)]
138
        struct VectorStorage {
139
            storage: Vec<(Bytes32, Primitive)>,
140
        }
141
142
        impl StorageInspect<NodesTable> for VectorStorage {
143
            type Error = core::convert::Infallible;
144
145
0
            fn get(&self, _: &Bytes32) -> Result<Option<Cow<Primitive>>, Self::Error> {
146
0
                unimplemented!("Read operation is not supported")
147
            }
148
149
0
            fn contains_key(&self, _: &Bytes32) -> Result<bool, Self::Error> {
150
0
                unimplemented!("Read operation is not supported")
151
            }
152
        }
153
154
        impl StorageMutate<NodesTable> for VectorStorage {
155
0
            fn insert(
156
0
                &mut self,
157
0
                key: &Bytes32,
158
0
                value: &Primitive,
159
0
            ) -> Result<(), Self::Error> {
160
0
                self.storage.push((*key, *value));
161
0
                Ok(())
162
0
            }
163
164
0
            fn replace(
165
0
                &mut self,
166
0
                key: &Bytes32,
167
0
                value: &Primitive,
168
0
            ) -> Result<Option<Primitive>, Self::Error> {
169
0
                self.storage.push((*key, *value));
170
0
                Ok(None)
171
0
            }
172
173
0
            fn remove(&mut self, _: &Bytes32) -> Result<(), Self::Error> {
174
0
                unimplemented!("Remove operation is not supported")
175
            }
176
177
0
            fn take(&mut self, _: &Bytes32) -> Result<Option<Primitive>, Self::Error> {
178
0
                unimplemented!("Take operation is not supported")
179
            }
180
        }
181
182
0
        let tree =
183
0
            sparse::MerkleTree::<NodesTable, _>::from_set(VectorStorage::default(), set)
184
0
                .expect("`Storage` can't return error");
185
0
        let root = tree.root();
186
0
        let nodes = tree.into_storage().storage;
187
0
188
0
        (root, nodes)
189
0
    }
190
191
0
    pub fn update(&mut self, key: MerkleTreeKey, data: &[u8]) {
192
0
        let _ = self.tree.update(key, data);
193
0
    }
194
195
0
    pub fn delete(&mut self, key: MerkleTreeKey) {
196
0
        let _ = self.tree.delete(key);
197
0
    }
198
199
0
    pub fn root(&self) -> Bytes32 {
200
0
        self.tree.root()
201
0
    }
202
203
0
    pub fn generate_proof(&self, key: &MerkleTreeKey) -> Option<Proof> {
204
0
        self.tree.generate_proof(key).ok()
205
0
    }
206
}
207
208
impl Default for MerkleTree {
209
0
    fn default() -> Self {
210
0
        Self::new()
211
0
    }
212
}
213
214
#[cfg(test)]
215
mod test {
216
    use super::*;
217
    use crate::common::sum;
218
219
    fn key(data: &[u8]) -> MerkleTreeKey {
220
        MerkleTreeKey::new_without_hash(sum(data))
221
    }
222
223
    #[test]
224
    fn test_empty_root() {
225
        let tree = MerkleTree::new();
226
        let root = tree.root();
227
        let expected_root =
228
            "0000000000000000000000000000000000000000000000000000000000000000";
229
        assert_eq!(hex::encode(root), expected_root);
230
    }
231
232
    #[test]
233
    fn test_update_1() {
234
        let mut tree = MerkleTree::new();
235
236
        tree.update(key(b"\x00\x00\x00\x00"), b"DATA");
237
238
        let root = tree.root();
239
        let expected_root =
240
            "39f36a7cb4dfb1b46f03d044265df6a491dffc1034121bc1071a34ddce9bb14b";
241
        assert_eq!(hex::encode(root), expected_root);
242
    }
243
244
    #[test]
245
    fn test_update_2() {
246
        let mut tree = MerkleTree::new();
247
248
        tree.update(key(b"\x00\x00\x00\x00"), b"DATA");
249
        tree.update(key(b"\x00\x00\x00\x01"), b"DATA");
250
251
        let root = tree.root();
252
        let expected_root =
253
            "8d0ae412ca9ca0afcb3217af8bcd5a673e798bd6fd1dfacad17711e883f494cb";
254
        assert_eq!(hex::encode(root), expected_root);
255
    }
256
257
    #[test]
258
    fn test_update_3() {
259
        let mut tree = MerkleTree::new();
260
261
        tree.update(key(b"\x00\x00\x00\x00"), b"DATA");
262
        tree.update(key(b"\x00\x00\x00\x01"), b"DATA");
263
        tree.update(key(b"\x00\x00\x00\x02"), b"DATA");
264
265
        let root = tree.root();
266
        let expected_root =
267
            "52295e42d8de2505fdc0cc825ff9fead419cbcf540d8b30c7c4b9c9b94c268b7";
268
        assert_eq!(hex::encode(root), expected_root);
269
    }
270
271
    #[test]
272
    fn test_update_1_delete_1() {
273
        let mut tree = MerkleTree::new();
274
275
        tree.update(key(b"\x00\x00\x00\x00"), b"DATA");
276
        tree.delete(key(b"\x00\x00\x00\x00"));
277
278
        let root = tree.root();
279
        let expected_root =
280
            "0000000000000000000000000000000000000000000000000000000000000000";
281
        assert_eq!(hex::encode(root), expected_root);
282
    }
283
284
    #[test]
285
    fn test_update_2_delete_1() {
286
        let mut tree = MerkleTree::new();
287
288
        tree.update(key(b"\x00\x00\x00\x00"), b"DATA");
289
        tree.update(key(b"\x00\x00\x00\x01"), b"DATA");
290
        tree.delete(key(b"\x00\x00\x00\x01"));
291
292
        let root = tree.root();
293
        let expected_root =
294
            "39f36a7cb4dfb1b46f03d044265df6a491dffc1034121bc1071a34ddce9bb14b";
295
        assert_eq!(hex::encode(root), expected_root);
296
    }
297
}
/home/marten/fuel/fuel-vm/fuel-merkle/src/sparse/primitive.rs
Line
Count
Source
1
use crate::common::{
2
    Bytes32,
3
    Prefix,
4
    PrefixError,
5
};
6
7
/// **Leaf buffer:**
8
///
9
/// | Allocation | Data                       |
10
/// |------------|----------------------------|
11
/// | `00 - 04`  | Height (4 bytes)           |
12
/// | `04 - 05`  | Prefix (1 byte, `0x00`)    |
13
/// | `05 - 37`  | hash(Key) (32 bytes)       |
14
/// | `37 - 69`  | hash(Data) (32 bytes)      |
15
///
16
/// **Node buffer:**
17
///
18
/// | Allocation | Data                       |
19
/// |------------|----------------------------|
20
/// | `00 - 04`  | Height (4 bytes)           |
21
/// | `04 - 05`  | Prefix (1 byte, `0x01`)    |
22
/// | `05 - 37`  | Left child key (32 bytes)  |
23
/// | `37 - 69`  | Right child key (32 bytes) |
24
pub type Primitive = (u32, u8, Bytes32, Bytes32);
25
26
pub trait PrimitiveView {
27
    fn height(&self) -> u32;
28
    fn prefix(&self) -> Result<Prefix, PrefixError>;
29
    fn bytes_lo(&self) -> &Bytes32;
30
    fn bytes_hi(&self) -> &Bytes32;
31
}
32
33
impl PrimitiveView for Primitive {
34
0
    fn height(&self) -> u32 {
35
0
        self.0
36
0
    }
37
38
0
    fn prefix(&self) -> Result<Prefix, PrefixError> {
39
0
        Prefix::try_from(self.1)
40
0
    }
41
42
0
    fn bytes_lo(&self) -> &Bytes32 {
43
0
        &self.2
44
0
    }
45
46
0
    fn bytes_hi(&self) -> &Bytes32 {
47
0
        &self.3
48
0
    }
49
}
/home/marten/fuel/fuel-vm/fuel-merkle/src/sparse/proof.rs
Line
Count
Source
1
use crate::{
2
    common::{
3
        path::{
4
            Path,
5
            Side,
6
        },
7
        sum,
8
        Bytes32,
9
        ProofSet,
10
    },
11
    sparse::{
12
        hash::{
13
            calculate_leaf_hash,
14
            calculate_node_hash,
15
        },
16
        zero_sum,
17
        MerkleTreeKey,
18
    },
19
};
20
21
use alloc::vec::Vec;
22
use core::{
23
    fmt,
24
    fmt::Debug,
25
};
26
27
#[derive(Debug, Clone, Eq, PartialEq)]
28
pub enum Proof {
29
    Inclusion(InclusionProof),
30
    Exclusion(ExclusionProof),
31
}
32
33
impl Proof {
34
0
    pub fn proof_set(&self) -> &ProofSet {
35
0
        match self {
36
0
            Proof::Inclusion(proof) => &proof.proof_set,
37
0
            Proof::Exclusion(proof) => &proof.proof_set,
38
        }
39
0
    }
40
41
0
    pub fn is_inclusion(&self) -> bool {
42
0
        match self {
43
0
            Proof::Inclusion(_) => true,
44
0
            Proof::Exclusion(_) => false,
45
        }
46
0
    }
47
48
0
    pub fn is_exclusion(&self) -> bool {
49
0
        !self.is_inclusion()
50
0
    }
51
}
52
53
#[derive(Clone, Eq, PartialEq)]
54
pub struct InclusionProof {
55
    pub proof_set: ProofSet,
56
}
57
58
impl InclusionProof {
59
0
    pub fn verify(&self, root: &Bytes32, key: &MerkleTreeKey, value: &[u8]) -> bool {
60
0
        let Self { proof_set } = self;
61
0
62
0
        if proof_set.len() > 256usize {
63
0
            return false;
64
0
        }
65
0
66
0
        let mut current = calculate_leaf_hash(key, &sum(value));
67
0
        for (i, side_hash) in proof_set.iter().enumerate() {
68
            #[allow(clippy::arithmetic_side_effects)] // Cannot underflow
69
0
            let index =
70
0
                u32::try_from(proof_set.len() - 1 - i).expect("We've checked it above");
71
0
            current = match key.get_instruction(index).expect("Infallible") {
72
0
                Side::Left => calculate_node_hash(&current, side_hash),
73
0
                Side::Right => calculate_node_hash(side_hash, &current),
74
            };
75
        }
76
0
        current == *root
77
0
    }
78
}
79
80
impl Debug for InclusionProof {
81
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
82
0
        let proof_set = self.proof_set.iter().map(hex::encode).collect::<Vec<_>>();
83
0
        f.debug_struct("InclusionProof")
84
0
            .field("Proof set", &proof_set)
85
0
            .finish()
86
0
    }
87
}
88
89
#[derive(Debug, Clone, Eq, PartialEq)]
90
pub enum ExclusionLeaf {
91
    Leaf(ExclusionLeafData),
92
    Placeholder,
93
}
94
95
#[derive(Clone, Eq, PartialEq)]
96
pub struct ExclusionLeafData {
97
    /// The leaf key.
98
    pub leaf_key: Bytes32,
99
    /// Hash of the value of the leaf.
100
    pub leaf_value: Bytes32,
101
}
102
103
impl Debug for ExclusionLeafData {
104
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
105
0
        f.debug_struct("ExclusionLeafData")
106
0
            .field("Leaf key", &hex::encode(self.leaf_key))
107
0
            .field("Leaf value", &hex::encode(self.leaf_value))
108
0
            .finish()
109
0
    }
110
}
111
112
impl ExclusionLeaf {
113
0
    fn hash(&self) -> Bytes32 {
114
0
        match self {
115
0
            ExclusionLeaf::Leaf(data) => {
116
0
                calculate_leaf_hash(&data.leaf_key, &data.leaf_value)
117
            }
118
0
            ExclusionLeaf::Placeholder => *zero_sum(),
119
        }
120
0
    }
121
}
122
123
#[derive(Clone, Eq, PartialEq)]
124
pub struct ExclusionProof {
125
    pub proof_set: ProofSet,
126
    pub leaf: ExclusionLeaf,
127
}
128
129
impl ExclusionProof {
130
0
    pub fn verify(&self, root: &Bytes32, key: &MerkleTreeKey) -> bool {
131
0
        let Self { proof_set, leaf } = self;
132
133
0
        if let ExclusionLeaf::Leaf(data) = leaf {
134
0
            if data.leaf_key == key.as_ref() {
135
0
                return false;
136
0
            }
137
0
        }
138
139
0
        if proof_set.len() > 256usize {
140
0
            return false;
141
0
        }
142
0
143
0
        let mut current = leaf.hash();
144
0
        for (i, side_hash) in proof_set.iter().enumerate() {
145
            #[allow(clippy::arithmetic_side_effects)] // Cannot underflow
146
0
            let index =
147
0
                u32::try_from(proof_set.len() - 1 - i).expect("We've checked it above");
148
0
            current = match key.get_instruction(index).expect("Infallible") {
149
0
                Side::Left => calculate_node_hash(&current, side_hash),
150
0
                Side::Right => calculate_node_hash(side_hash, &current),
151
            };
152
        }
153
0
        current == *root
154
0
    }
155
}
156
157
impl Debug for ExclusionProof {
158
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
159
0
        let proof_set = self.proof_set.iter().map(hex::encode).collect::<Vec<_>>();
160
0
        f.debug_struct("ExclusionProof")
161
0
            .field("Proof set", &proof_set)
162
0
            .field("Leaf", &self.leaf)
163
0
            .finish()
164
0
    }
165
}
166
167
#[cfg(test)]
168
#[allow(non_snake_case)]
169
mod test {
170
    use crate::{
171
        common::{
172
            Bytes32,
173
            StorageMap,
174
        },
175
        sparse::{
176
            proof::Proof,
177
            MerkleTree,
178
            Primitive,
179
        },
180
    };
181
    use fuel_storage::Mappable;
182
183
    #[derive(Debug)]
184
    struct TestTable;
185
186
    impl Mappable for TestTable {
187
        type Key = Self::OwnedKey;
188
        type OwnedKey = Bytes32;
189
        type OwnedValue = Primitive;
190
        type Value = Self::OwnedValue;
191
    }
192
193
    #[test]
194
    fn inclusion_proof__verify__returns_true_for_correct_key_and_correct_value() {
195
        let mut storage = StorageMap::<TestTable>::new();
196
        let mut tree = MerkleTree::new(&mut storage);
197
198
        // 256:           N4
199
        //               /  \
200
        // 255:         N3   \
201
        //             /  \   \
202
        // 254:       /   N2   \
203
        //           /   /  \   \
204
        // 253:     /   N1   \   \
205
        //         /   /  \   \   \
206
        // 252:   /   N0   \   \   \
207
        // ...   /   /  \   \   \   \
208
        //   0: L0  L1  L3  P1  L2  P0
209
        //      K0  K1  K3      K2
210
211
        let k0 = [0u8; 32].into();
212
        let v0 = b"DATA_0";
213
        tree.update(k0, v0).expect("Expected successful update");
214
215
        let mut k1 = [0u8; 32];
216
        k1[0] = 0b01000000;
217
        let k1 = k1.into();
218
        let v1 = b"DATA_1";
219
        tree.update(k1, v1).expect("Expected successful update");
220
221
        let mut k2 = [0u8; 32];
222
        k2[0] = 0b01100000;
223
        let k2 = k2.into();
224
        let v2 = b"DATA_2";
225
        tree.update(k2, v2).expect("Expected successful update");
226
227
        let mut k3 = [0u8; 32];
228
        k3[0] = 0b01001000;
229
        let k3 = k3.into();
230
        let v3 = b"DATA_3";
231
        tree.update(k3, v3).expect("Expected successful update");
232
233
        let root = tree.root();
234
235
        {
236
            // Given
237
            let proof = tree.generate_proof(&k0).unwrap();
238
239
            // When
240
            let inclusion = match proof {
241
                Proof::Inclusion(proof) => proof.verify(&root, &k0, b"DATA_0"),
242
                Proof::Exclusion(_) => panic!("Expected InclusionProof"),
243
            };
244
245
            // Then
246
            assert!(inclusion);
247
        }
248
249
        {
250
            // Given
251
            let proof = tree.generate_proof(&k1).unwrap();
252
253
            // When
254
            let inclusion = match proof {
255
                Proof::Inclusion(proof) => proof.verify(&root, &k1, b"DATA_1"),
256
                Proof::Exclusion(_) => panic!("Expected InclusionProof"),
257
            };
258
259
            // Then
260
            assert!(inclusion);
261
        }
262
263
        {
264
            // Given
265
            let proof = tree.generate_proof(&k2).unwrap();
266
267
            // When
268
            let inclusion = match proof {
269
                Proof::Inclusion(proof) => proof.verify(&root, &k2, b"DATA_2"),
270
                Proof::Exclusion(_) => panic!("Expected InclusionProof"),
271
            };
272
273
            // Then
274
            assert!(inclusion);
275
        }
276
277
        {
278
            // Given
279
            let proof = tree.generate_proof(&k3).unwrap();
280
281
            // When
282
            let inclusion = match proof {
283
                Proof::Inclusion(proof) => proof.verify(&root, &k3, b"DATA_3"),
284
                Proof::Exclusion(_) => panic!("Expected InclusionProof"),
285
            };
286
287
            // Then
288
            assert!(inclusion);
289
        }
290
    }
291
292
    #[test]
293
    fn inclusion_proof__verify__returns_false_for_correct_key_and_incorrect_value() {
294
        let mut storage = StorageMap::<TestTable>::new();
295
        let mut tree = MerkleTree::new(&mut storage);
296
297
        // 256:           N4
298
        //               /  \
299
        // 255:         N3   \
300
        //             /  \   \
301
        // 254:       /   N2   \
302
        //           /   /  \   \
303
        // 253:     /   N1   \   \
304
        //         /   /  \   \   \
305
        // 252:   /   N0   \   \   \
306
        // ...   /   /  \   \   \   \
307
        //   0: L0  L1  L3  P1  L2  P0
308
        //      K0  K1  K3      K2
309
310
        let k0 = [0u8; 32].into();
311
        let v0 = b"DATA_0";
312
        tree.update(k0, v0).expect("Expected successful update");
313
314
        let mut k1 = [0u8; 32];
315
        k1[0] = 0b01000000;
316
        let k1 = k1.into();
317
        let v1 = b"DATA_1";
318
        tree.update(k1, v1).expect("Expected successful update");
319
320
        let mut k2 = [0u8; 32];
321
        k2[0] = 0b01100000;
322
        let k2 = k2.into();
323
        let v2 = b"DATA_2";
324
        tree.update(k2, v2).expect("Expected successful update");
325
326
        let mut k3 = [0u8; 32];
327
        k3[0] = 0b01001000;
328
        let k3 = k3.into();
329
        let v3 = b"DATA_3";
330
        tree.update(k3, v3).expect("Expected successful update");
331
332
        let root = tree.root();
333
334
        {
335
            // Given
336
            let proof = tree.generate_proof(&k0).unwrap();
337
338
            // When
339
            let inclusion = match proof {
340
                Proof::Inclusion(proof) => proof.verify(&root, &k0, b"DATA_100"),
341
                Proof::Exclusion(_) => panic!("Expected InclusionProof"),
342
            };
343
344
            // Then
345
            assert!(!inclusion);
346
        }
347
348
        {
349
            // Given
350
            let proof = tree.generate_proof(&k1).unwrap();
351
352
            // When
353
            let inclusion = match proof {
354
                Proof::Inclusion(proof) => proof.verify(&root, &k1, b"DATA_100"),
355
                Proof::Exclusion(_) => panic!("Expected InclusionProof"),
356
            };
357
358
            // Then
359
            assert!(!inclusion);
360
        }
361
362
        {
363
            // Given
364
            let proof = tree.generate_proof(&k2).unwrap();
365
366
            // When
367
            let inclusion = match proof {
368
                Proof::Inclusion(proof) => proof.verify(&root, &k2, b"DATA_100"),
369
                Proof::Exclusion(_) => panic!("Expected InclusionProof"),
370
            };
371
372
            // Then
373
            assert!(!inclusion);
374
        }
375
376
        {
377
            // Given
378
            let proof = tree.generate_proof(&k3).unwrap();
379
380
            // When
381
            let inclusion = match proof {
382
                Proof::Inclusion(proof) => proof.verify(&root, &k3, b"DATA_100"),
383
                Proof::Exclusion(_) => panic!("Expected InclusionProof"),
384
            };
385
            // Then
386
            assert!(!inclusion);
387
        }
388
    }
389
390
    #[test]
391
    fn inclusion_proof__verify__returns_false_for_incorrect_key() {
392
        let mut storage = StorageMap::<TestTable>::new();
393
        let mut tree = MerkleTree::new(&mut storage);
394
395
        // 256:           N4
396
        //               /  \
397
        // 255:         N3   \
398
        //             /  \   \
399
        // 254:       /   N2   \
400
        //           /   /  \   \
401
        // 253:     /   N1   \   \
402
        //         /   /  \   \   \
403
        // 252:   /   N0   \   \   \
404
        // ...   /   /  \   \   \   \
405
        //   0: L0  L1  L3  P1  L2  P0
406
        //      K0  K1  K3      K2
407
408
        let k0 = [0u8; 32].into();
409
        let v0 = b"DATA_0";
410
        tree.update(k0, v0).expect("Expected successful update");
411
412
        let mut k1 = [0u8; 32];
413
        k1[0] = 0b01000000;
414
        let k1 = k1.into();
415
        let v1 = b"DATA_1";
416
        tree.update(k1, v1).expect("Expected successful update");
417
418
        let mut k2 = [0u8; 32];
419
        k2[0] = 0b01100000;
420
        let k2 = k2.into();
421
        let v2 = b"DATA_2";
422
        tree.update(k2, v2).expect("Expected successful update");
423
424
        let mut k3 = [0u8; 32];
425
        k3[0] = 0b01001000;
426
        let k3 = k3.into();
427
        let v3 = b"DATA_3";
428
        tree.update(k3, v3).expect("Expected successful update");
429
430
        let root = tree.root();
431
432
        // Given
433
        let proof = tree.generate_proof(&k3).unwrap();
434
435
        // When
436
        let key = [1u8; 32].into();
437
        let inclusion = match proof {
438
            Proof::Inclusion(proof) => proof.verify(&root, &key, b"DATA_3"),
439
            Proof::Exclusion(_) => panic!("Expected InclusionProof"),
440
        };
441
442
        // Then
443
        assert!(!inclusion);
444
    }
445
446
    #[test]
447
    fn exclusion_proof__verify__returns_true_for_correct_key() {
448
        let mut storage = StorageMap::<TestTable>::new();
449
        let mut tree = MerkleTree::new(&mut storage);
450
451
        // 256:           N4
452
        //               /  \
453
        // 255:         N3   \
454
        //             /  \   \
455
        // 254:       /   N2   \
456
        //           /   /  \   \
457
        // 253:     /   N1   \   \
458
        //         /   /  \   \   \
459
        // 252:   /   N0   \   \   \
460
        // ...   /   /  \   \   \   \
461
        //   0: L0  L1  L3  P1  L2  P0
462
        //      K0  K1  K3      K2
463
464
        let k0 = [0u8; 32];
465
        let v0 = b"DATA_0";
466
        tree.update(k0.into(), v0)
467
            .expect("Expected successful update");
468
469
        let mut k1 = [0u8; 32];
470
        k1[0] = 0b01000000;
471
        let v1 = b"DATA_1";
472
        tree.update(k1.into(), v1)
473
            .expect("Expected successful update");
474
475
        let mut k2 = [0u8; 32];
476
        k2[0] = 0b01100000;
477
        let v2 = b"DATA_2";
478
        tree.update(k2.into(), v2)
479
            .expect("Expected successful update");
480
481
        let mut k3 = [0u8; 32];
482
        k3[0] = 0b01001000;
483
        let v3 = b"DATA_3";
484
        tree.update(k3.into(), v3)
485
            .expect("Expected successful update");
486
487
        let root = tree.root();
488
489
        // Given
490
        let key = [0xffu8; 32].into();
491
        let proof = tree.generate_proof(&key).unwrap();
492
493
        // When
494
        let exclusion = match proof {
495
            Proof::Inclusion(_) => panic!("Expected ExclusionProof"),
496
            Proof::Exclusion(proof) => proof.verify(&root, &key),
497
        };
498
499
        // Then
500
        assert!(exclusion);
501
    }
502
503
    #[test]
504
    fn exclusion_proof__verify__returns_false_for_incorrect_key() {
505
        let mut storage = StorageMap::<TestTable>::new();
506
        let mut tree = MerkleTree::new(&mut storage);
507
508
        // 256:           N4
509
        //               /  \
510
        // 255:         N3   \
511
        //             /  \   \
512
        // 254:       /   N2   \
513
        //           /   /  \   \
514
        // 253:     /   N1   \   \
515
        //         /   /  \   \   \
516
        // 252:   /   N0   \   \   \
517
        // ...   /   /  \   \   \   \
518
        //   0: L0  L1  L3  P1  L2  P0
519
        //      K0  K1  K3      K2
520
521
        let k0 = [0u8; 32].into();
522
        let v0 = b"DATA_0";
523
        tree.update(k0, v0).expect("Expected successful update");
524
525
        let mut k1 = [0u8; 32];
526
        k1[0] = 0b01000000;
527
        let k1 = k1.into();
528
        let v1 = b"DATA_1";
529
        tree.update(k1, v1).expect("Expected successful update");
530
531
        let mut k2 = [0u8; 32];
532
        k2[0] = 0b01100000;
533
        let k2 = k2.into();
534
        let v2 = b"DATA_2";
535
        tree.update(k2, v2).expect("Expected successful update");
536
537
        let mut k3 = [0u8; 32];
538
        k3[0] = 0b01001000;
539
        let k3 = k3.into();
540
        let v3 = b"DATA_3";
541
        tree.update(k3, v3).expect("Expected successful update");
542
543
        let root = tree.root();
544
545
        // Given
546
        let key = [0xffu8; 32].into();
547
        let proof = tree.generate_proof(&key).unwrap();
548
549
        // When
550
        let exclusion = match proof {
551
            Proof::Inclusion(_) => panic!("Expected ExclusionProof"),
552
            Proof::Exclusion(proof) => proof.verify(&root, &k1),
553
        };
554
555
        // Then
556
        assert!(!exclusion);
557
    }
558
559
    #[test]
560
    fn exclusion_proof__verify__returns_true_for_placeholder() {
561
        let mut storage = StorageMap::<TestTable>::new();
562
        let mut tree = MerkleTree::new(&mut storage);
563
564
        // 256:           N4
565
        //               /  \
566
        // 255:         N3   \
567
        //             /  \   \
568
        // 254:       /   N2   \
569
        //           /   /  \   \
570
        // 253:     /   N1   \   \
571
        //         /   /  \   \   \
572
        // 252:   /   N0   \   \   \
573
        // ...   /   /  \   \   \   \
574
        //   0: P1  L0  L2  P0  L1  P2
575
        //          K0  K2      K1
576
577
        let mut k0 = [0u8; 32];
578
        k0[0] = 0b01000000;
579
        let k0 = k0.into();
580
        let v0 = b"DATA_0";
581
        tree.update(k0, v0).expect("Expected successful update");
582
583
        let mut k1 = [0u8; 32];
584
        k1[0] = 0b01100000;
585
        let k1 = k1.into();
586
        let v1 = b"DATA_1";
587
        tree.update(k1, v1).expect("Expected successful update");
588
589
        let mut k2 = [0u8; 32];
590
        k2[0] = 0b01001000;
591
        let k2 = k2.into();
592
        let v2 = b"DATA_2";
593
        tree.update(k2, v2).expect("Expected successful update");
594
595
        let root = tree.root();
596
597
        // Given
598
        let key = [0b00000000; 32].into();
599
        let proof = tree.generate_proof(&key).unwrap();
600
601
        // When
602
        let exclusion = match proof {
603
            Proof::Inclusion(_) => panic!("Expected ExclusionProof"),
604
            Proof::Exclusion(proof) => proof.verify(&root, &key),
605
        };
606
607
        // Then
608
        assert!(exclusion);
609
    }
610
}
611
612
#[cfg(test)]
613
#[allow(non_snake_case)]
614
mod test_random {
615
    use crate::{
616
        common::{
617
            Bytes32,
618
            StorageMap,
619
        },
620
        sparse::{
621
            proof::Proof,
622
            MerkleTree,
623
            MerkleTreeKey,
624
            Primitive,
625
        },
626
    };
627
    use fuel_storage::Mappable;
628
629
    use rand::{
630
        prelude::StdRng,
631
        SeedableRng,
632
    };
633
634
    #[derive(Debug)]
635
    struct TestTable;
636
637
    impl Mappable for TestTable {
638
        type Key = Self::OwnedKey;
639
        type OwnedKey = Bytes32;
640
        type OwnedValue = Primitive;
641
        type Value = Self::OwnedValue;
642
    }
643
644
    fn random_bytes32<R>(rng: &mut R) -> Bytes32
645
    where
646
        R: rand::Rng + ?Sized,
647
    {
648
        let mut bytes = [0u8; 32];
649
        rng.fill(bytes.as_mut());
650
        bytes
651
    }
652
653
    #[test]
654
    fn inclusion_proof__verify__returns_true_for_correct_key_and_correct_value() {
655
        let mut rng = StdRng::seed_from_u64(0xDEADBEEF);
656
        let mut storage = StorageMap::<TestTable>::new();
657
        let mut tree = MerkleTree::new(&mut storage);
658
659
        let key = random_bytes32(&mut rng).into();
660
        let value = random_bytes32(&mut rng);
661
        tree.update(key, &value).unwrap();
662
663
        for _ in 0..1_000 {
664
            let key = random_bytes32(&mut rng).into();
665
            let value = random_bytes32(&mut rng);
666
            tree.update(key, &value).unwrap();
667
        }
668
669
        let root = tree.root();
670
671
        // Given
672
        let proof = tree.generate_proof(&key).unwrap();
673
674
        // When
675
        let inclusion = match proof {
676
            Proof::Inclusion(proof) => proof.verify(&root, &key, &value),
677
            Proof::Exclusion(_) => panic!("Expected InclusionProof"),
678
        };
679
680
        // Then
681
        assert!(inclusion);
682
    }
683
684
    #[test]
685
    fn inclusion_proof__verify__returns_false_for_correct_key_and_incorrect_value() {
686
        let mut rng = StdRng::seed_from_u64(0xDEADBEEF);
687
        let mut storage = StorageMap::<TestTable>::new();
688
        let mut tree = MerkleTree::new(&mut storage);
689
690
        let key = random_bytes32(&mut rng).into();
691
        let value = random_bytes32(&mut rng);
692
        tree.update(key, &value).unwrap();
693
694
        for _ in 0..1_000 {
695
            let key = random_bytes32(&mut rng).into();
696
            let value = random_bytes32(&mut rng);
697
            tree.update(key, &value).unwrap();
698
        }
699
700
        let root = tree.root();
701
702
        // Given
703
        let proof = tree.generate_proof(&key).unwrap();
704
705
        // When
706
        let inclusion = match proof {
707
            Proof::Inclusion(proof) => proof.verify(&root, &key, b"DATA"),
708
            Proof::Exclusion(_) => panic!("Expected InclusionProof"),
709
        };
710
711
        // Then
712
        assert!(!inclusion);
713
    }
714
715
    #[test]
716
    fn inclusion_proof__verify__returns_false_for_incorrect_key() {
717
        let mut rng = StdRng::seed_from_u64(0xDEADBEEF);
718
        let mut storage = StorageMap::<TestTable>::new();
719
        let mut tree = MerkleTree::new(&mut storage);
720
721
        let key_1 = random_bytes32(&mut rng).into();
722
        let value_1 = random_bytes32(&mut rng);
723
        tree.update(key_1, &value_1).unwrap();
724
725
        let key_2 = random_bytes32(&mut rng).into();
726
        let value_2 = random_bytes32(&mut rng);
727
        tree.update(key_2, &value_2).unwrap();
728
729
        for _ in 0..1_000 {
730
            let key = random_bytes32(&mut rng).into();
731
            let value = random_bytes32(&mut rng);
732
            tree.update(key, &value).unwrap();
733
        }
734
735
        let root = tree.root();
736
737
        // Given
738
        // - Generate a proof with key_1
739
        let proof = tree.generate_proof(&key_1).unwrap();
740
741
        // When
742
        // - Attempt to verify the proof with key_2
743
        let inclusion = match proof {
744
            Proof::Inclusion(proof) => proof.verify(&root, &key_2, &value_2),
745
            Proof::Exclusion(_) => panic!("Expected InclusionProof"),
746
        };
747
748
        // Then
749
        assert!(!inclusion);
750
    }
751
752
    #[test]
753
    fn exclusion_proof__verify__returns_true_for_correct_key() {
754
        let mut rng = StdRng::seed_from_u64(0xDEADBEEF);
755
        let mut storage = StorageMap::<TestTable>::new();
756
        let mut tree = MerkleTree::new(&mut storage);
757
758
        for _ in 0..1_000 {
759
            let key = random_bytes32(&mut rng);
760
            let value = random_bytes32(&mut rng);
761
            tree.update(key.into(), &value).unwrap();
762
        }
763
764
        let root = tree.root();
765
766
        // Given
767
        let key: MerkleTreeKey = random_bytes32(&mut rng).into();
768
        let proof = tree.generate_proof(&key).unwrap();
769
770
        // When
771
        let exclusion = match proof {
772
            Proof::Inclusion(_) => panic!("Expected ExclusionProof"),
773
            Proof::Exclusion(proof) => proof.verify(&root, &key),
774
        };
775
776
        // Then
777
        assert!(exclusion);
778
    }
779
780
    #[test]
781
    fn exclusion_proof__verify__returns_true_for_any_key_in_empty_tree() {
782
        let mut rng = StdRng::seed_from_u64(0xDEADBEEF);
783
        let mut storage = StorageMap::<TestTable>::new();
784
        let tree = MerkleTree::new(&mut storage);
785
        let root = tree.root();
786
787
        // Given
788
        let key = random_bytes32(&mut rng).into();
789
        let proof = tree.generate_proof(&key).unwrap();
790
791
        // When
792
        let exclusion = match proof {
793
            Proof::Inclusion(_) => panic!("Expected ExclusionProof"),
794
            Proof::Exclusion(proof) => proof.verify(&root, &key),
795
        };
796
797
        // Then
798
        assert!(exclusion);
799
    }
800
}
/home/marten/fuel/fuel-vm/fuel-merkle/src/sparse/merkle_tree/node.rs
Line
Count
Source
1
use crate::{
2
    common::{
3
        error::DeserializeError,
4
        node::{
5
            ChildError,
6
            ChildResult,
7
            Node as NodeTrait,
8
            ParentNode as ParentNodeTrait,
9
        },
10
        path::{
11
            Path,
12
            Side,
13
        },
14
        sum,
15
        Bytes32,
16
        Prefix,
17
    },
18
    sparse::{
19
        hash::{
20
            calculate_hash,
21
            calculate_leaf_hash,
22
            calculate_node_hash,
23
        },
24
        primitive::{
25
            Primitive,
26
            PrimitiveView,
27
        },
28
        zero_sum,
29
    },
30
    storage::{
31
        Mappable,
32
        StorageInspect,
33
    },
34
};
35
36
use crate::common::node::ChildKeyResult;
37
use core::{
38
    fmt,
39
    marker::PhantomData,
40
};
41
42
#[derive(Clone, PartialEq, Eq)]
43
pub(super) enum Node {
44
    Node {
45
        hash: Bytes32,
46
        height: u32,
47
        prefix: Prefix,
48
        bytes_lo: Bytes32,
49
        bytes_hi: Bytes32,
50
    },
51
    Placeholder,
52
}
53
54
impl Node {
55
0
    pub fn max_height() -> u32 {
56
0
        Node::key_size_bits()
57
0
    }
Unexecuted instantiation: _RNvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB2_4Node10max_heightCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB2_4Node10max_heightCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB2_4Node10max_heightB8_
58
59
0
    pub fn new(
60
0
        height: u32,
61
0
        prefix: Prefix,
62
0
        bytes_lo: Bytes32,
63
0
        bytes_hi: Bytes32,
64
0
    ) -> Self {
65
0
        Self::Node {
66
0
            hash: calculate_hash(&prefix, &bytes_lo, &bytes_hi),
67
0
            height,
68
0
            prefix,
69
0
            bytes_lo,
70
0
            bytes_hi,
71
0
        }
72
0
    }
73
74
0
    pub fn create_leaf<D: AsRef<[u8]>>(key: &Bytes32, data: D) -> Self {
75
0
        let bytes_hi = sum(data);
76
0
        Self::Node {
77
0
            hash: calculate_leaf_hash(key, &bytes_hi),
78
0
            height: 0u32,
79
0
            prefix: Prefix::Leaf,
80
0
            bytes_lo: *key,
81
0
            bytes_hi,
82
0
        }
83
0
    }
Unexecuted instantiation: _RINvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB3_4Node11create_leafRRNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32ECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB3_4Node11create_leafRRNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32ECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB3_4Node11create_leafRShEB9_
84
85
0
    pub fn create_node(left_child: &Node, right_child: &Node, height: u32) -> Self {
86
0
        let bytes_lo = *left_child.hash();
87
0
        let bytes_hi = *right_child.hash();
88
0
        Self::Node {
89
0
            hash: calculate_node_hash(&bytes_lo, &bytes_hi),
90
0
            height,
91
0
            prefix: Prefix::Node,
92
0
            bytes_lo,
93
0
            bytes_hi,
94
0
        }
95
0
    }
96
97
0
    pub fn create_node_from_hashes(
98
0
        bytes_lo: Bytes32,
99
0
        bytes_hi: Bytes32,
100
0
        height: u32,
101
0
    ) -> Self {
102
0
        Self::Node {
103
0
            hash: calculate_node_hash(&bytes_lo, &bytes_hi),
104
0
            height,
105
0
            prefix: Prefix::Node,
106
0
            bytes_lo,
107
0
            bytes_hi,
108
0
        }
109
0
    }
110
111
0
    pub fn create_node_on_path(
112
0
        path: &dyn Path,
113
0
        path_node: &Node,
114
0
        side_node: &Node,
115
0
    ) -> Self {
116
0
        if path_node.is_leaf() && side_node.is_leaf() {
117
            // When joining two leaves, the joined node is found where the paths
118
            // of the two leaves diverge. The joined node may be a direct parent
119
            // of the leaves or an ancestor multiple generations above the
120
            // leaves.
121
            #[allow(clippy::cast_possible_truncation)] // Key is 32 bytes
122
0
            let parent_depth = path_node.common_path_length(side_node) as u32;
123
0
            #[allow(clippy::arithmetic_side_effects)] // parent_depth <= max_height
124
0
            let parent_height = Node::max_height() - parent_depth;
125
0
            match path.get_instruction(parent_depth).unwrap() {
126
0
                Side::Left => Node::create_node(path_node, side_node, parent_height),
127
0
                Side::Right => Node::create_node(side_node, path_node, parent_height),
128
            }
129
        } else {
130
            // When joining two nodes, or a node and a leaf, the joined node is
131
            // the direct parent of the node with the greater height and an
132
            // ancestor of the node with the lesser height.
133
            // N.B.: A leaf can be a placeholder.
134
            #[allow(clippy::arithmetic_side_effects)] // Neither node cannot be root
135
0
            let parent_height = path_node.height().max(side_node.height()) + 1;
136
0
            #[allow(clippy::arithmetic_side_effects)] // parent_height <= max_height
137
0
            let parent_depth = Node::max_height() - parent_height;
138
0
            match path.get_instruction(parent_depth).unwrap() {
139
0
                Side::Left => Node::create_node(path_node, side_node, parent_height),
140
0
                Side::Right => Node::create_node(side_node, path_node, parent_height),
141
            }
142
        }
143
0
    }
144
145
8.77k
    pub fn create_placeholder() -> Self {
146
8.77k
        Self::Placeholder
147
8.77k
    }
_RNvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB2_4Node18create_placeholderCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
145
2.19k
    pub fn create_placeholder() -> Self {
146
2.19k
        Self::Placeholder
147
2.19k
    }
_RNvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB2_4Node18create_placeholderCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
145
6.57k
    pub fn create_placeholder() -> Self {
146
6.57k
        Self::Placeholder
147
6.57k
    }
Unexecuted instantiation: _RNvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB2_4Node18create_placeholderB8_
148
149
0
    pub fn common_path_length(&self, other: &Node) -> u64 {
150
0
        debug_assert!(self.is_leaf());
151
0
        debug_assert!(other.is_leaf());
152
153
        // If either of the nodes is a placeholder, the common path length is
154
        // defined to be 0. This is needed to prevent a 0 bit in the
155
        // placeholder's key from producing an erroneous match with a 0 bit in
156
        // the leaf's key.
157
0
        if self.is_placeholder() || other.is_placeholder() {
158
0
            0
159
        } else {
160
0
            self.leaf_key().common_path_length(other.leaf_key())
161
        }
162
0
    }
163
164
0
    pub fn height(&self) -> u32 {
165
0
        match self {
166
0
            Node::Node { height, .. } => *height,
167
0
            Node::Placeholder => 0,
168
        }
169
0
    }
Unexecuted instantiation: _RNvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB2_4Node6heightCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB2_4Node6heightCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB2_4Node6heightB8_
170
171
0
    pub fn is_leaf(&self) -> bool {
172
0
        self.prefix() == Prefix::Leaf || self.is_placeholder()
173
0
    }
174
175
0
    pub fn is_node(&self) -> bool {
176
0
        self.prefix() == Prefix::Node
177
0
    }
Unexecuted instantiation: _RNvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB2_4Node7is_nodeCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB2_4Node7is_nodeCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB2_4Node7is_nodeB8_
178
179
0
    pub fn is_placeholder(&self) -> bool {
180
0
        &Self::Placeholder == self
181
0
    }
182
183
8.77k
    pub fn hash(&self) -> &Bytes32 {
184
8.77k
        match self {
185
0
            Node::Node { hash, .. } => hash,
186
8.77k
            Node::Placeholder => zero_sum(),
187
        }
188
8.77k
    }
_RNvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB2_4Node4hashCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
183
2.19k
    pub fn hash(&self) -> &Bytes32 {
184
2.19k
        match self {
185
0
            Node::Node { hash, .. } => hash,
186
2.19k
            Node::Placeholder => zero_sum(),
187
        }
188
2.19k
    }
_RNvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB2_4Node4hashCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
183
6.57k
    pub fn hash(&self) -> &Bytes32 {
184
6.57k
        match self {
185
0
            Node::Node { hash, .. } => hash,
186
6.57k
            Node::Placeholder => zero_sum(),
187
        }
188
6.57k
    }
Unexecuted instantiation: _RNvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB2_4Node4hashB8_
189
190
0
    fn prefix(&self) -> Prefix {
191
0
        match self {
192
0
            Node::Node { prefix, .. } => *prefix,
193
0
            Node::Placeholder => Prefix::Leaf,
194
        }
195
0
    }
Unexecuted instantiation: _RNvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB2_4Node6prefixCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB2_4Node6prefixCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB2_4Node6prefixB8_
196
197
0
    pub fn bytes_lo(&self) -> &Bytes32 {
198
0
        match self {
199
0
            Node::Node { bytes_lo, .. } => bytes_lo,
200
0
            Node::Placeholder => zero_sum(),
201
        }
202
0
    }
Unexecuted instantiation: _RNvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB2_4Node8bytes_loCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB2_4Node8bytes_loCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB2_4Node8bytes_loB8_
203
204
0
    pub fn bytes_hi(&self) -> &Bytes32 {
205
0
        match self {
206
0
            Node::Node { bytes_hi, .. } => bytes_hi,
207
0
            Node::Placeholder => zero_sum(),
208
        }
209
0
    }
Unexecuted instantiation: _RNvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB2_4Node8bytes_hiCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB2_4Node8bytes_hiCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvMNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB2_4Node8bytes_hiB8_
210
211
    /// Get the leaf key of a leaf node.
212
    ///
213
    /// The leaf key is the lower 32 bytes stored in a leaf node.
214
    /// This method expects the node to be a leaf node, and this precondition
215
    /// must be guaranteed at the call site for correctness. This method should
216
    /// only be used within contexts where this precondition can be guaranteed,
217
    /// such as the [MerkleTree](super::MerkleTree).
218
    ///
219
    /// In `debug`, this method will panic if the node is not a leaf node to
220
    /// indicate to the developer that there is a potential problem in the
221
    /// tree's implementation.  
222
0
    pub(super) fn leaf_key(&self) -> &Bytes32 {
223
0
        debug_assert!(self.is_leaf());
224
0
        self.bytes_lo()
225
0
    }
226
227
    /// Get the leaf data of a leaf node.
228
    ///
229
    /// The leaf key is the upper 32 bytes stored in a leaf node.
230
    /// This method expects the node to be a leaf node, and this precondition
231
    /// must be guaranteed at the call site for correctness. This method should
232
    /// only be used within contexts where this precondition can be guaranteed,
233
    /// such as the [MerkleTree](super::MerkleTree).
234
    ///
235
    /// In `debug`, this method will panic if the node is not a leaf node to
236
    /// indicate to the developer that there is a potential problem in the
237
    /// tree's implementation.
238
0
    pub(super) fn leaf_data(&self) -> &Bytes32 {
239
0
        debug_assert!(self.is_leaf());
240
0
        self.bytes_hi()
241
0
    }
242
243
    /// Get the left child key of an internal node.
244
    ///
245
    /// The left child key is the lower 32 bytes stored in an internal node.
246
    /// This method expects the node to be an internal node, and this
247
    /// precondition must be guaranteed at the call site for correctness. This
248
    /// method should only be used within contexts where this precondition can
249
    /// be guaranteed, such as the [MerkleTree](super::MerkleTree).
250
    ///
251
    /// In `debug`, this method will panic if the node is not an internal node
252
    /// to indicate to the developer that there is a potential problem in the
253
    /// tree's implementation.
254
0
    pub(super) fn left_child_key(&self) -> &Bytes32 {
255
0
        debug_assert!(self.is_node());
256
0
        self.bytes_lo()
257
0
    }
258
259
    /// Get the right child key of an internal node.
260
    ///
261
    /// The right child key is the upper 32 bytes stored in an internal node.
262
    /// This method expects the node to be an internal node, and this
263
    /// precondition must be guaranteed at the call site for correctness. This
264
    /// method should only be used within contexts where this precondition can
265
    /// be guaranteed, such as the [MerkleTree](super::MerkleTree).
266
    ///
267
    /// In `debug`, this method will panic if the node is not an internal node
268
    /// to indicate to the developer that there is a potential problem in the
269
    /// tree's implementation.
270
0
    pub(super) fn right_child_key(&self) -> &Bytes32 {
271
0
        debug_assert!(self.is_node());
272
0
        self.bytes_hi()
273
0
    }
274
}
275
276
impl AsRef<Node> for Node {
277
0
    fn as_ref(&self) -> &Node {
278
0
        self
279
0
    }
Unexecuted instantiation: _RNvXs_NtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB4_4NodeINtNtCsd3UI3IJrzMw_4core7convert5AsRefB10_E6as_refCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs_NtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB4_4NodeINtNtCsd3UI3IJrzMw_4core7convert5AsRefB10_E6as_refCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvXs_NtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB4_4NodeINtNtCsd3UI3IJrzMw_4core7convert5AsRefB10_E6as_refBa_
280
}
281
282
impl NodeTrait for Node {
283
    type Key = Bytes32;
284
285
0
    fn height(&self) -> u32 {
286
0
        Node::height(self)
287
0
    }
288
289
    #[allow(clippy::arithmetic_side_effects, clippy::cast_possible_truncation)] // const
290
0
    fn key_size_bits() -> u32 {
291
0
        core::mem::size_of::<Self::Key>() as u32 * 8
292
0
    }
Unexecuted instantiation: _RNvXs0_NtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB5_4NodeNtNtNtBb_6common4node4Node13key_size_bitsCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs0_NtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB5_4NodeNtNtNtBb_6common4node4Node13key_size_bitsCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvXs0_NtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeNtB5_4NodeNtNtNtBb_6common4node4Node13key_size_bitsBb_
293
294
0
    fn leaf_key(&self) -> Self::Key {
295
0
        *Node::leaf_key(self)
296
0
    }
297
298
0
    fn is_leaf(&self) -> bool {
299
0
        Node::is_leaf(self)
300
0
    }
301
302
0
    fn is_node(&self) -> bool {
303
0
        Node::is_node(self)
304
0
    }
305
}
306
307
impl From<&Node> for Primitive {
308
0
    fn from(node: &Node) -> Self {
309
0
        (
310
0
            node.height(),
311
0
            node.prefix() as u8,
312
0
            *node.bytes_lo(),
313
0
            *node.bytes_hi(),
314
0
        )
315
0
    }
Unexecuted instantiation: _RNvXs1_NtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeTmhAhj20_B14_EINtNtCsd3UI3IJrzMw_4core7convert4FromRNtB5_4NodeE4fromCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs1_NtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeTmhAhj20_B14_EINtNtCsd3UI3IJrzMw_4core7convert4FromRNtB5_4NodeE4fromCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvXs1_NtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree4nodeTmhAhj20_B14_EINtNtCsd3UI3IJrzMw_4core7convert4FromRNtB5_4NodeE4fromBb_
316
}
317
318
impl TryFrom<Primitive> for Node {
319
    type Error = DeserializeError;
320
321
0
    fn try_from(primitive: Primitive) -> Result<Self, Self::Error> {
322
0
        let height = primitive.height();
323
0
        let prefix = primitive.prefix()?;
324
0
        let bytes_lo = *primitive.bytes_lo();
325
0
        let bytes_hi = *primitive.bytes_hi();
326
0
        let node = Self::new(height, prefix, bytes_lo, bytes_hi);
327
0
        Ok(node)
328
0
    }
329
}
330
331
impl fmt::Debug for Node {
332
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
333
0
        if self.is_node() {
334
0
            f.debug_struct("Node (Internal)")
335
0
                .field("Height", &self.height())
336
0
                .field("Hash", &hex::encode(self.hash()))
337
0
                .field("Left child key", &hex::encode(self.left_child_key()))
338
0
                .field("Right child key", &hex::encode(self.right_child_key()))
339
0
                .finish()
340
        } else {
341
0
            f.debug_struct("Node (Leaf)")
342
0
                .field("Height", &self.height())
343
0
                .field("Hash", &hex::encode(self.hash()))
344
0
                .field("Leaf key", &hex::encode(self.leaf_key()))
345
0
                .field("Leaf data", &hex::encode(self.leaf_data()))
346
0
                .finish()
347
        }
348
0
    }
349
}
350
351
pub(super) struct StorageNode<'storage, TableType, StorageType> {
352
    storage: &'storage StorageType,
353
    node: Node,
354
    phantom_table: PhantomData<TableType>,
355
}
356
357
impl<TableType, StorageType> Clone for StorageNode<'_, TableType, StorageType> {
358
0
    fn clone(&self) -> Self {
359
0
        Self {
360
0
            storage: self.storage,
361
0
            node: self.node.clone(),
362
0
            phantom_table: Default::default(),
363
0
        }
364
0
    }
365
}
366
367
impl<'s, TableType, StorageType> StorageNode<'s, TableType, StorageType> {
368
0
    pub fn new(storage: &'s StorageType, node: Node) -> Self {
369
0
        Self {
370
0
            node,
371
0
            storage,
372
0
            phantom_table: Default::default(),
373
0
        }
374
0
    }
375
}
376
377
impl<TableType, StorageType> StorageNode<'_, TableType, StorageType> {
378
0
    pub fn hash(&self) -> &Bytes32 {
379
0
        self.node.hash()
380
0
    }
381
382
0
    pub fn into_node(self) -> Node {
383
0
        self.node
384
0
    }
385
}
386
387
impl<TableType, StorageType> NodeTrait for StorageNode<'_, TableType, StorageType> {
388
    type Key = Bytes32;
389
390
0
    fn height(&self) -> u32 {
391
0
        self.node.height()
392
0
    }
393
394
    #[allow(clippy::arithmetic_side_effects, clippy::cast_possible_truncation)] // const
395
0
    fn key_size_bits() -> u32 {
396
0
        core::mem::size_of::<Self::Key>() as u32 * 8
397
0
    }
398
399
0
    fn leaf_key(&self) -> Self::Key {
400
0
        *self.node.leaf_key()
401
0
    }
402
403
0
    fn is_leaf(&self) -> bool {
404
0
        self.node.is_leaf()
405
0
    }
406
407
0
    fn is_node(&self) -> bool {
408
0
        self.node.is_node()
409
0
    }
410
}
411
412
0
#[derive(Debug, Clone, derive_more::Display)]
413
pub enum StorageNodeError<StorageError> {
414
    #[display(fmt = "{}", _0)]
415
    StorageError(StorageError),
416
    #[display(fmt = "{}", _0)]
417
    DeserializeError(DeserializeError),
418
}
419
420
impl<TableType, StorageType> ParentNodeTrait for StorageNode<'_, TableType, StorageType>
421
where
422
    StorageType: StorageInspect<TableType>,
423
    TableType: Mappable<Key = Bytes32, Value = Primitive, OwnedValue = Primitive>,
424
{
425
    type ChildKey = Bytes32;
426
    type Error = StorageNodeError<StorageType::Error>;
427
428
0
    fn key(&self) -> Self::ChildKey {
429
0
        *self.hash()
430
0
    }
431
432
0
    fn left_child(&self) -> ChildResult<Self> {
433
0
        if self.is_leaf() {
434
0
            return Err(ChildError::NodeIsLeaf)
435
0
        }
436
0
        let key = self.node.left_child_key();
437
0
        if key == zero_sum() {
438
0
            return Ok(Self::new(self.storage, Node::create_placeholder()))
439
0
        }
440
0
        let primitive = self
441
0
            .storage
442
0
            .get(key)
443
0
            .map_err(StorageNodeError::StorageError)?
444
0
            .ok_or(ChildError::ChildNotFound(*key))?;
445
0
        Ok(primitive
446
0
            .into_owned()
447
0
            .try_into()
448
0
            .map(|node| Self::new(self.storage, node))
449
0
            .map_err(StorageNodeError::DeserializeError)?)
450
0
    }
451
452
0
    fn left_child_key(&self) -> ChildKeyResult<Self> {
453
0
        if self.is_leaf() {
454
0
            return Err(ChildError::NodeIsLeaf)
455
0
        }
456
0
        Ok(*self.node.left_child_key())
457
0
    }
458
459
0
    fn right_child(&self) -> ChildResult<Self> {
460
0
        if self.is_leaf() {
461
0
            return Err(ChildError::NodeIsLeaf)
462
0
        }
463
0
        let key = self.node.right_child_key();
464
0
        if key == zero_sum() {
465
0
            return Ok(Self::new(self.storage, Node::create_placeholder()))
466
0
        }
467
0
        let primitive = self
468
0
            .storage
469
0
            .get(key)
470
0
            .map_err(StorageNodeError::StorageError)?
471
0
            .ok_or(ChildError::ChildNotFound(*key))?;
472
0
        Ok(primitive
473
0
            .into_owned()
474
0
            .try_into()
475
0
            .map(|node| Self::new(self.storage, node))
476
0
            .map_err(StorageNodeError::DeserializeError)?)
477
0
    }
478
479
0
    fn right_child_key(&self) -> ChildKeyResult<Self> {
480
0
        if self.is_leaf() {
481
0
            return Err(ChildError::NodeIsLeaf)
482
0
        }
483
0
        Ok(*self.node.right_child_key())
484
0
    }
485
}
486
487
impl<TableType, StorageType> fmt::Debug for StorageNode<'_, TableType, StorageType>
488
where
489
    StorageType: StorageInspect<TableType>,
490
    TableType: Mappable<Key = Bytes32, Value = Primitive, OwnedValue = Primitive>,
491
{
492
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
493
0
        if self.is_node() {
494
0
            f.debug_struct("StorageNode (Internal)")
495
0
                .field("Height", &self.height())
496
0
                .field("Hash", &hex::encode(self.hash()))
497
0
                .field("Left child key", &hex::encode(self.node.left_child_key()))
498
0
                .field("Right child key", &hex::encode(self.node.right_child_key()))
499
0
                .finish()
500
        } else {
501
0
            f.debug_struct("StorageNode (Leaf)")
502
0
                .field("Height", &self.height())
503
0
                .field("Hash", &hex::encode(self.hash()))
504
0
                .field("Leaf key", &hex::encode(self.node.leaf_key()))
505
0
                .field("Leaf data", &hex::encode(self.node.leaf_data()))
506
0
                .finish()
507
        }
508
0
    }
509
}
510
511
#[cfg(test)]
512
mod test_node {
513
    use super::Node;
514
    use crate::{
515
        common::{
516
            error::DeserializeError,
517
            sum,
518
            Bytes32,
519
            Prefix,
520
            PrefixError,
521
        },
522
        sparse::{
523
            zero_sum,
524
            Primitive,
525
        },
526
    };
527
528
    fn leaf_hash(key: &Bytes32, data: &[u8]) -> Bytes32 {
529
        let mut buffer = [0; 65];
530
        buffer[0..1].clone_from_slice(Prefix::Leaf.as_ref());
531
        buffer[1..33].clone_from_slice(key);
532
        buffer[33..65].clone_from_slice(&sum(data));
533
        sum(buffer)
534
    }
535
536
    #[test]
537
    fn test_create_leaf_returns_a_valid_leaf() {
538
        let leaf = Node::create_leaf(&sum(b"LEAF"), [1u8; 32]);
539
        assert_eq!(leaf.is_leaf(), true);
540
        assert_eq!(leaf.is_node(), false);
541
        assert_eq!(leaf.height(), 0);
542
        assert_eq!(leaf.prefix(), Prefix::Leaf);
543
        assert_eq!(*leaf.leaf_key(), sum(b"LEAF"));
544
        assert_eq!(*leaf.leaf_data(), sum([1u8; 32]));
545
    }
546
547
    #[test]
548
    fn test_create_node_returns_a_valid_node() {
549
        let left_child = Node::create_leaf(&sum(b"LEFT CHILD"), [1u8; 32]);
550
        let right_child = Node::create_leaf(&sum(b"RIGHT CHILD"), [1u8; 32]);
551
        let node = Node::create_node(&left_child, &right_child, 1);
552
        assert_eq!(node.is_leaf(), false);
553
        assert_eq!(node.is_node(), true);
554
        assert_eq!(node.height(), 1);
555
        assert_eq!(node.prefix(), Prefix::Node);
556
        assert_eq!(
557
            *node.left_child_key(),
558
            leaf_hash(&sum(b"LEFT CHILD"), &[1u8; 32])
559
        );
560
        assert_eq!(
561
            *node.right_child_key(),
562
            leaf_hash(&sum(b"RIGHT CHILD"), &[1u8; 32])
563
        );
564
    }
565
566
    #[test]
567
    fn test_create_placeholder_returns_a_placeholder_node() {
568
        let node = Node::create_placeholder();
569
        assert_eq!(node.is_placeholder(), true);
570
        assert_eq!(node.hash(), zero_sum());
571
    }
572
573
    #[test]
574
    fn test_create_leaf_from_primitive_returns_a_valid_leaf() {
575
        let primitive = (0, Prefix::Leaf as u8, [0xff; 32], [0xff; 32]);
576
577
        let node: Node = primitive.try_into().unwrap();
578
        assert_eq!(node.is_leaf(), true);
579
        assert_eq!(node.is_node(), false);
580
        assert_eq!(node.height(), 0);
581
        assert_eq!(node.prefix(), Prefix::Leaf);
582
        assert_eq!(*node.leaf_key(), [0xff; 32]);
583
        assert_eq!(*node.leaf_data(), [0xff; 32]);
584
    }
585
586
    #[test]
587
    fn test_create_node_from_primitive_returns_a_valid_node() {
588
        let primitive = (255, Prefix::Node as u8, [0xff; 32], [0xff; 32]);
589
590
        let node: Node = primitive.try_into().unwrap();
591
        assert_eq!(node.is_leaf(), false);
592
        assert_eq!(node.is_node(), true);
593
        assert_eq!(node.height(), 255);
594
        assert_eq!(node.prefix(), Prefix::Node);
595
        assert_eq!(*node.left_child_key(), [0xff; 32]);
596
        assert_eq!(*node.right_child_key(), [0xff; 32]);
597
    }
598
599
    #[test]
600
    fn test_create_from_primitive_returns_deserialize_error_if_invalid_prefix() {
601
        let primitive = (0xff, 0xff, [0xff; 32], [0xff; 32]);
602
603
        // Should return Error; prefix 0xff is does not represent a node or leaf
604
        let err = Node::try_from(primitive)
605
            .expect_err("Expected try_from() to be Error; got OK");
606
        assert!(matches!(
607
            err,
608
            DeserializeError::PrefixError(PrefixError::InvalidPrefix(0xff))
609
        ));
610
    }
611
612
    /// For leaf node `node` of leaf data `d` with key `k`:
613
    /// ```node = (0x00, k, h(serialize(d)))```
614
    #[test]
615
    fn test_leaf_primitive_returns_expected_primitive() {
616
        let expected_primitive =
617
            (0_u32, Prefix::Leaf as u8, sum(b"LEAF"), sum([1u8; 32]));
618
619
        let leaf = Node::create_leaf(&sum(b"LEAF"), [1u8; 32]);
620
        let primitive = Primitive::from(&leaf);
621
622
        assert_eq!(primitive, expected_primitive);
623
    }
624
625
    /// For internal node `node` with children `l` and `r`:
626
    /// ```node = (0x01, l.v, r.v)```
627
    #[test]
628
    fn test_node_primitive_returns_expected_primitive() {
629
        let expected_primitive = (
630
            1_u32,
631
            Prefix::Node as u8,
632
            leaf_hash(&sum(b"LEFT CHILD"), &[1u8; 32]),
633
            leaf_hash(&sum(b"RIGHT CHILD"), &[1u8; 32]),
634
        );
635
636
        let left_child = Node::create_leaf(&sum(b"LEFT CHILD"), [1u8; 32]);
637
        let right_child = Node::create_leaf(&sum(b"RIGHT CHILD"), [1u8; 32]);
638
        let node = Node::create_node(&left_child, &right_child, 1);
639
        let primitive = Primitive::from(&node);
640
641
        assert_eq!(primitive, expected_primitive);
642
    }
643
644
    /// For leaf node `node` of leaf data `d` with key `k`:
645
    /// ```node.v = h(0x00, k, h(serialize(d)))```
646
    #[test]
647
    fn test_leaf_hash_returns_expected_hash_value() {
648
        let mut expected_buffer = [0u8; 65];
649
        expected_buffer[0..1].clone_from_slice(Prefix::Leaf.as_ref());
650
        expected_buffer[1..33].clone_from_slice(&sum(b"LEAF"));
651
        expected_buffer[33..65].clone_from_slice(&sum([1u8; 32]));
652
        let expected_value = sum(expected_buffer);
653
654
        let node = Node::create_leaf(&sum(b"LEAF"), [1u8; 32]);
655
        let value = *node.hash();
656
657
        assert_eq!(value, expected_value);
658
    }
659
660
    /// For internal node `node` with children `l` and `r`:
661
    /// ```node.v = h(0x01, l.v, r.v)```
662
    #[test]
663
    fn test_node_hash_returns_expected_hash_value() {
664
        let mut expected_buffer = [0u8; 65];
665
        expected_buffer[0..1].clone_from_slice(Prefix::Node.as_ref());
666
        expected_buffer[1..33]
667
            .clone_from_slice(&leaf_hash(&sum(b"LEFT CHILD"), &[1u8; 32]));
668
        expected_buffer[33..65]
669
            .clone_from_slice(&leaf_hash(&sum(b"RIGHT CHILD"), &[1u8; 32]));
670
        let expected_value = sum(expected_buffer);
671
672
        let left_child = Node::create_leaf(&sum(b"LEFT CHILD"), [1u8; 32]);
673
        let right_child = Node::create_leaf(&sum(b"RIGHT CHILD"), [1u8; 32]);
674
        let node = Node::create_node(&left_child, &right_child, 1);
675
        let value = *node.hash();
676
677
        assert_eq!(value, expected_value);
678
    }
679
}
680
681
#[cfg(test)]
682
mod test_storage_node {
683
    use super::{
684
        Node,
685
        StorageNode,
686
        StorageNodeError,
687
    };
688
    use crate::{
689
        common::{
690
            error::DeserializeError,
691
            node::{
692
                ChildError,
693
                ParentNode,
694
            },
695
            sum,
696
            Bytes32,
697
            PrefixError,
698
            StorageMap,
699
        },
700
        sparse::Primitive,
701
        storage::{
702
            Mappable,
703
            StorageMutate,
704
        },
705
    };
706
707
    pub struct TestTable;
708
709
    impl Mappable for TestTable {
710
        type Key = Self::OwnedKey;
711
        type OwnedKey = Bytes32;
712
        type OwnedValue = Primitive;
713
        type Value = Self::OwnedValue;
714
    }
715
716
    #[test]
717
    fn test_node_left_child_returns_the_left_child() {
718
        let mut s = StorageMap::<TestTable>::new();
719
720
        let leaf_0 = Node::create_leaf(&sum(b"Hello World"), [1u8; 32]);
721
        let _ = s.insert(leaf_0.hash(), &leaf_0.as_ref().into());
722
723
        let leaf_1 = Node::create_leaf(&sum(b"Goodbye World"), [1u8; 32]);
724
        let _ = s.insert(leaf_1.hash(), &leaf_1.as_ref().into());
725
726
        let node_0 = Node::create_node(&leaf_0, &leaf_1, 1);
727
        let _ = s.insert(node_0.hash(), &node_0.as_ref().into());
728
729
        let storage_node = StorageNode::new(&s, node_0);
730
        let child = storage_node.left_child().unwrap();
731
732
        assert_eq!(child.hash(), leaf_0.hash());
733
    }
734
735
    #[test]
736
    fn test_node_right_child_returns_the_right_child() {
737
        let mut s = StorageMap::<TestTable>::new();
738
739
        let leaf_0 = Node::create_leaf(&sum(b"Hello World"), [1u8; 32]);
740
        let _ = s.insert(leaf_0.hash(), &leaf_0.as_ref().into());
741
742
        let leaf_1 = Node::create_leaf(&sum(b"Goodbye World"), [1u8; 32]);
743
        let _ = s.insert(leaf_1.hash(), &leaf_1.as_ref().into());
744
745
        let node_0 = Node::create_node(&leaf_0, &leaf_1, 1);
746
        let _ = s.insert(node_0.hash(), &node_0.as_ref().into());
747
748
        let storage_node = StorageNode::new(&s, node_0);
749
        let child = storage_node.right_child().unwrap();
750
751
        assert_eq!(child.hash(), leaf_1.hash());
752
    }
753
754
    #[test]
755
    fn test_node_left_child_returns_placeholder_when_key_is_zero_sum() {
756
        let mut s = StorageMap::<TestTable>::new();
757
758
        let leaf = Node::create_leaf(&sum(b"Goodbye World"), [1u8; 32]);
759
        let _ = s.insert(leaf.hash(), &leaf.as_ref().into());
760
761
        let node_0 = Node::create_node(&Node::create_placeholder(), &leaf, 1);
762
        let _ = s.insert(node_0.hash(), &node_0.as_ref().into());
763
764
        let storage_node = StorageNode::new(&s, node_0);
765
        let child = storage_node.left_child().unwrap();
766
767
        assert!(child.node.is_placeholder());
768
    }
769
770
    #[test]
771
    fn test_node_right_child_returns_placeholder_when_key_is_zero_sum() {
772
        let mut s = StorageMap::<TestTable>::new();
773
774
        let leaf = Node::create_leaf(&sum(b"Goodbye World"), [1u8; 32]);
775
        let _ = s.insert(leaf.hash(), &leaf.as_ref().into());
776
777
        let node_0 = Node::create_node(&leaf, &Node::create_placeholder(), 1);
778
        let _ = s.insert(node_0.hash(), &node_0.as_ref().into());
779
780
        let storage_node = StorageNode::new(&s, node_0);
781
        let child = storage_node.right_child().unwrap();
782
783
        assert!(child.node.is_placeholder());
784
    }
785
786
    #[test]
787
    fn test_node_left_child_returns_error_when_node_is_leaf() {
788
        let s = StorageMap::<TestTable>::new();
789
790
        let leaf_0 = Node::create_leaf(&sum(b"Hello World"), [1u8; 32]);
791
        let storage_node = StorageNode::new(&s, leaf_0);
792
        let err = storage_node
793
            .left_child()
794
            .expect_err("Expected left_child() to return Error; got OK");
795
796
        assert!(matches!(err, ChildError::NodeIsLeaf));
797
    }
798
799
    #[test]
800
    fn test_node_right_child_returns_error_when_node_is_leaf() {
801
        let s = StorageMap::<TestTable>::new();
802
803
        let leaf_0 = Node::create_leaf(&sum(b"Hello World"), [1u8; 32]);
804
        let storage_node = StorageNode::new(&s, leaf_0);
805
        let err = storage_node
806
            .right_child()
807
            .expect_err("Expected right_child() to return Error; got OK");
808
809
        assert!(matches!(err, ChildError::NodeIsLeaf));
810
    }
811
812
    #[test]
813
    fn test_node_left_child_returns_error_when_key_is_not_found() {
814
        let s = StorageMap::<TestTable>::new();
815
816
        let leaf_0 = Node::create_leaf(&sum(b"Hello World"), [0u8; 32]);
817
        let leaf_1 = Node::create_leaf(&sum(b"Goodbye World"), [1u8; 32]);
818
        let node_0 = Node::create_node(&leaf_0, &leaf_1, 1);
819
820
        let storage_node = StorageNode::new(&s, node_0);
821
        let err = storage_node
822
            .left_child()
823
            .expect_err("Expected left_child() to return Error; got Ok");
824
825
        let key = *storage_node.into_node().left_child_key();
826
        assert!(matches!(
827
            err,
828
            ChildError::ChildNotFound(k) if k == key
829
        ));
830
    }
831
832
    #[test]
833
    fn test_node_right_child_returns_error_when_key_is_not_found() {
834
        let s = StorageMap::<TestTable>::new();
835
836
        let leaf_0 = Node::create_leaf(&sum(b"Hello World"), [1u8; 32]);
837
        let leaf_1 = Node::create_leaf(&sum(b"Goodbye World"), [1u8; 32]);
838
        let node_0 = Node::create_node(&leaf_0, &leaf_1, 1);
839
840
        let storage_node = StorageNode::new(&s, node_0);
841
        let err = storage_node
842
            .right_child()
843
            .expect_err("Expected right_child() to return Error; got Ok");
844
845
        let key = *storage_node.into_node().right_child_key();
846
        assert!(matches!(
847
            err,
848
            ChildError::ChildNotFound(k) if k == key
849
        ));
850
    }
851
852
    #[test]
853
    fn test_node_left_child_returns_deserialize_error_when_primitive_is_invalid() {
854
        let mut s = StorageMap::<TestTable>::new();
855
856
        let leaf_0 = Node::create_leaf(&sum(b"Hello World"), [1u8; 32]);
857
        let _ = s.insert(leaf_0.hash(), &(0xff, 0xff, [0xff; 32], [0xff; 32]));
858
        let leaf_1 = Node::create_leaf(&sum(b"Goodbye World"), [1u8; 32]);
859
        let node_0 = Node::create_node(&leaf_0, &leaf_1, 1);
860
861
        let storage_node = StorageNode::new(&s, node_0);
862
        let err = storage_node
863
            .left_child()
864
            .expect_err("Expected left_child() to be Error; got Ok");
865
866
        assert!(matches!(
867
            err,
868
            ChildError::Error(StorageNodeError::DeserializeError(
869
                DeserializeError::PrefixError(PrefixError::InvalidPrefix(0xff))
870
            ))
871
        ));
872
    }
873
874
    #[test]
875
    fn test_node_right_child_returns_deserialize_error_when_primitive_is_invalid() {
876
        let mut s = StorageMap::<TestTable>::new();
877
878
        let leaf_0 = Node::create_leaf(&sum(b"Hello World"), [1u8; 32]);
879
        let leaf_1 = Node::create_leaf(&sum(b"Goodbye World"), [1u8; 32]);
880
        let _ = s.insert(leaf_1.hash(), &(0xff, 0xff, [0xff; 32], [0xff; 32]));
881
        let node_0 = Node::create_node(&leaf_0, &leaf_1, 1);
882
883
        let storage_node = StorageNode::new(&s, node_0);
884
        let err = storage_node
885
            .right_child()
886
            .expect_err("Expected right_child() to be Error; got Ok");
887
888
        assert!(matches!(
889
            err,
890
            ChildError::Error(StorageNodeError::DeserializeError(
891
                DeserializeError::PrefixError(PrefixError::InvalidPrefix(0xff))
892
            ))
893
        ));
894
    }
895
}
/home/marten/fuel/fuel-vm/fuel-merkle/src/sparse/merkle_tree/branch.rs
Line
Count
Source
1
use super::Node;
2
use crate::{
3
    common::{
4
        path::Path,
5
        Bytes32,
6
    },
7
    sparse::Primitive,
8
};
9
use fuel_storage::{
10
    Mappable,
11
    StorageMutate,
12
};
13
14
use core::iter;
15
16
pub(super) struct Branch {
17
    pub bits: Bytes32,
18
    pub node: Node,
19
}
20
21
impl From<Node> for Branch {
22
0
    fn from(leaf: Node) -> Self {
23
0
        Self {
24
0
            bits: *leaf.leaf_key(),
25
0
            node: leaf,
26
0
        }
27
0
    }
28
}
29
30
0
pub(super) fn merge_branches<Storage, Table>(
31
0
    storage: &mut Storage,
32
0
    mut left_branch: Branch,
33
0
    mut right_branch: Branch,
34
0
) -> Result<Branch, Storage::Error>
35
0
where
36
0
    Storage: StorageMutate<Table>,
37
0
    Table: Mappable<Key = Bytes32, Value = Primitive, OwnedValue = Primitive>,
38
0
{
39
    #[allow(clippy::cast_possible_truncation)] // Key is 32 bytes, never truncates
40
0
    let ancestor_height = if left_branch.node.is_leaf() && right_branch.node.is_leaf() {
41
0
        let parent_depth = left_branch.node.common_path_length(&right_branch.node) as u32;
42
0
        #[allow(clippy::arithmetic_side_effects)] // common_path_length <= max_height
43
0
        let parent_height = Node::max_height() - parent_depth;
44
0
        parent_height
45
    } else {
46
0
        let ancestor_depth =
47
0
            left_branch.bits.common_path_length(&right_branch.bits) as u32;
48
0
        #[allow(clippy::arithmetic_side_effects)] // common_path_length <= max_height
49
0
        let ancestor_height = Node::max_height() - ancestor_depth;
50
51
0
        for branch in [&mut right_branch, &mut left_branch] {
52
0
            if branch.node.is_node() {
53
0
                let path = branch.bits;
54
0
                #[allow(clippy::arithmetic_side_effects)]
55
0
                // branch cannot be at max height
56
0
                let parent_height = branch.node.height() + 1;
57
0
                #[allow(clippy::arithmetic_side_effects)]
58
0
                // common_path_length <= max_height
59
0
                let stale_depth = ancestor_height - parent_height;
60
0
                let placeholders =
61
0
                    iter::repeat(Node::create_placeholder()).take(stale_depth as usize);
62
0
                for placeholder in placeholders {
63
0
                    branch.node =
64
0
                        Node::create_node_on_path(&path, &branch.node, &placeholder);
65
0
                    storage.insert(branch.node.hash(), &branch.node.as_ref().into())?;
66
                }
67
0
            }
68
        }
69
0
        ancestor_height
70
    };
71
0
    let node = Node::create_node(&left_branch.node, &right_branch.node, ancestor_height);
72
0
    storage.insert(node.hash(), &node.as_ref().into())?;
73
0
    Ok(Branch {
74
0
        bits: left_branch.bits,
75
0
        node,
76
0
    })
77
0
}
Unexecuted instantiation: _RINvNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree6branch14merge_branchesNtNvMs_NtB6_9in_memoryNtB1n_10MerkleTree13root_from_set12EmptyStorageNtB1n_10NodesTableECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree6branch14merge_branchesNtNvMs_NtB6_9in_memoryNtB1n_10MerkleTree13root_from_set12EmptyStorageNtB1n_10NodesTableECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvNtNtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_tree6branch14merge_branchesppEB8_
/home/marten/fuel/fuel-vm/fuel-merkle/src/sparse/merkle_tree.rs
Line
Count
Source
1
mod branch;
2
mod node;
3
4
use branch::{
5
    merge_branches,
6
    Branch,
7
};
8
use node::{
9
    Node,
10
    StorageNode,
11
    StorageNodeError,
12
};
13
14
use crate::{
15
    common::{
16
        error::DeserializeError,
17
        node::ChildError,
18
        AsPathIterator,
19
        Bytes32,
20
    },
21
    sparse::{
22
        empty_sum,
23
        proof::{
24
            ExclusionLeaf,
25
            ExclusionLeafData,
26
            ExclusionProof,
27
            InclusionProof,
28
            Proof,
29
        },
30
        Primitive,
31
    },
32
    storage::{
33
        Mappable,
34
        StorageInspect,
35
        StorageMutate,
36
    },
37
};
38
use alloc::{
39
    format,
40
    vec::Vec,
41
};
42
use core::{
43
    fmt::{
44
        Debug,
45
        Formatter,
46
    },
47
    iter,
48
    marker::PhantomData,
49
    ops::Deref,
50
};
51
52
0
#[derive(Debug, Clone, derive_more::Display)]
53
pub enum MerkleTreeError<StorageError> {
54
    #[display(
55
        fmt = "cannot load node with key {}; the key is not found in storage",
56
        "hex::encode(_0)"
57
    )]
58
    LoadError(Bytes32),
59
60
    #[display(fmt = "{}", _0)]
61
    StorageError(StorageError),
62
63
    #[display(fmt = "{}", _0)]
64
    DeserializeError(DeserializeError),
65
66
    #[display(fmt = "{}", _0)]
67
    ChildError(ChildError<Bytes32, StorageNodeError<StorageError>>),
68
}
69
70
impl<StorageError> From<StorageError> for MerkleTreeError<StorageError> {
71
0
    fn from(err: StorageError) -> MerkleTreeError<StorageError> {
72
0
        MerkleTreeError::StorageError(err)
73
0
    }
74
}
75
76
/// The safe Merkle tree storage key prevents Merkle tree structure manipulations.
77
/// The type contains only one constructor that hashes the storage key.
78
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
79
#[cfg_attr(test, derive(proptest_derive::Arbitrary))]
80
pub struct MerkleTreeKey(Bytes32);
81
82
impl MerkleTreeKey {
83
    /// The safe way to create a `Self`. It hashes the `storage_key`, making
84
    /// it entirely random and preventing SMT structure manipulation.
85
0
    pub fn new<B>(storage_key: B) -> Self
86
0
    where
87
0
        B: AsRef<[u8]>,
88
0
    {
89
        use digest::Digest;
90
0
        let mut hash = sha2::Sha256::new();
91
0
        hash.update(storage_key.as_ref());
92
0
        let hash = hash.finalize().into();
93
0
94
0
        Self(hash)
95
0
    }
Unexecuted instantiation: _RINvMs_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeNtB5_13MerkleTreeKey3newNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32ECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvMs_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeNtB5_13MerkleTreeKey3newNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32ECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvMs_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeNtB5_13MerkleTreeKey3newpEB9_
96
97
    /// Unsafe analog to create a `Self` that doesn't hash the `storage_key` unlike
98
    /// `Self::new`.
99
    ///
100
    /// # Safety
101
    ///
102
    /// It is safe to use this method if you know that `storage_key`
103
    /// was randomly generated like `ContractId` or `AssetId`.
104
0
    pub unsafe fn convert<B>(storage_key: B) -> Self
105
0
    where
106
0
        B: Into<Bytes32>,
107
0
    {
108
0
        Self(storage_key.into())
109
0
    }
110
111
    #[cfg(any(test, feature = "test-helpers"))]
112
    pub fn new_without_hash<B>(storage_key: B) -> Self
113
    where
114
        B: Into<Bytes32>,
115
    {
116
        unsafe { Self::convert(storage_key) }
117
    }
118
}
119
120
impl Debug for MerkleTreeKey {
121
0
    fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
122
0
        f.write_str(&format!("MerkleTreeKey({})", hex::encode(self.0)))
123
0
    }
124
}
125
126
impl From<MerkleTreeKey> for Bytes32 {
127
0
    fn from(value: MerkleTreeKey) -> Self {
128
0
        value.0
129
0
    }
Unexecuted instantiation: _RNvXs1_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeAhj20_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_13MerkleTreeKeyE4fromCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs1_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeAhj20_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_13MerkleTreeKeyE4fromCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvXs1_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeAhj20_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_13MerkleTreeKeyE4fromB9_
130
}
131
132
impl AsRef<[u8]> for MerkleTreeKey {
133
0
    fn as_ref(&self) -> &[u8] {
134
0
        self.0.as_ref()
135
0
    }
136
}
137
138
impl AsRef<Bytes32> for MerkleTreeKey {
139
0
    fn as_ref(&self) -> &Bytes32 {
140
0
        &self.0
141
0
    }
142
}
143
144
impl Deref for MerkleTreeKey {
145
    type Target = Bytes32;
146
147
0
    fn deref(&self) -> &Self::Target {
148
0
        &self.0
149
0
    }
150
}
151
152
#[cfg(any(test, feature = "test-helpers"))]
153
impl From<Bytes32> for MerkleTreeKey {
154
    fn from(value: Bytes32) -> Self {
155
        Self::new_without_hash(value)
156
    }
157
}
158
159
#[derive(Debug)]
160
pub struct MerkleTree<TableType, StorageType> {
161
    root_node: Node,
162
    storage: StorageType,
163
    phantom_table: PhantomData<TableType>,
164
}
165
166
impl<TableType, StorageType> MerkleTree<TableType, StorageType> {
167
0
    pub const fn empty_root() -> &'static Bytes32 {
168
0
        empty_sum()
169
0
    }
170
171
8.77k
    pub fn root(&self) -> Bytes32 {
172
8.77k
        *self.root_node().hash()
173
8.77k
    }
_RNvMs5_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB5_10MerkleTreeNtNtB7_9in_memory10NodesTableNtNvMs_B1e_NtB1e_10MerkleTree13root_from_set12EmptyStorageE4rootCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
171
2.19k
    pub fn root(&self) -> Bytes32 {
172
2.19k
        *self.root_node().hash()
173
2.19k
    }
_RNvMs5_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB5_10MerkleTreeNtNtB7_9in_memory10NodesTableNtNvMs_B1e_NtB1e_10MerkleTree13root_from_set12EmptyStorageE4rootCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
171
6.57k
    pub fn root(&self) -> Bytes32 {
172
6.57k
        *self.root_node().hash()
173
6.57k
    }
Unexecuted instantiation: _RNvMs5_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB5_10MerkleTreeNtNtB7_9in_memory10NodesTableINtNtNtB9_6common11storage_map10StorageMapB1c_EE4rootB9_
174
175
0
    pub fn into_storage(self) -> StorageType {
176
0
        self.storage
177
0
    }
178
179
0
    pub fn storage(&self) -> &StorageType {
180
0
        &self.storage
181
0
    }
182
183
8.77k
    fn root_node(&self) -> &Node {
184
8.77k
        &self.root_node
185
8.77k
    }
_RNvMs5_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB5_10MerkleTreeNtNtB7_9in_memory10NodesTableNtNvMs_B1e_NtB1e_10MerkleTree13root_from_set12EmptyStorageE9root_nodeCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
183
2.19k
    fn root_node(&self) -> &Node {
184
2.19k
        &self.root_node
185
2.19k
    }
_RNvMs5_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB5_10MerkleTreeNtNtB7_9in_memory10NodesTableNtNvMs_B1e_NtB1e_10MerkleTree13root_from_set12EmptyStorageE9root_nodeCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
183
6.57k
    fn root_node(&self) -> &Node {
184
6.57k
        &self.root_node
185
6.57k
    }
Unexecuted instantiation: _RNvMs5_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB5_10MerkleTreeNtNtB7_9in_memory10NodesTableINtNtNtB9_6common11storage_map10StorageMapB1c_EE9root_nodeB9_
186
187
0
    fn set_root_node(&mut self, node: Node) {
188
0
        debug_assert!(node.is_leaf() || node.height() == Node::max_height());
189
0
        self.root_node = node;
190
0
    }
Unexecuted instantiation: _RNvMs5_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB5_10MerkleTreeNtNtB7_9in_memory10NodesTableNtNvMs_B1e_NtB1e_10MerkleTree13root_from_set12EmptyStorageE13set_root_nodeCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMs5_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB5_10MerkleTreeNtNtB7_9in_memory10NodesTableNtNvMs_B1e_NtB1e_10MerkleTree13root_from_set12EmptyStorageE13set_root_nodeCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvMs5_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB5_10MerkleTreeNtNtB7_9in_memory10NodesTableINtNtNtB9_6common11storage_map10StorageMapB1c_EE13set_root_nodeB9_
191
}
192
193
impl<TableType, StorageType, StorageError> MerkleTree<TableType, StorageType>
194
where
195
    TableType: Mappable<Key = Bytes32, Value = Primitive, OwnedValue = Primitive>,
196
    StorageType: StorageInspect<TableType, Error = StorageError>,
197
{
198
8.77k
    pub fn new(storage: StorageType) -> Self {
199
8.77k
        Self {
200
8.77k
            root_node: Node::create_placeholder(),
201
8.77k
            storage,
202
8.77k
            phantom_table: Default::default(),
203
8.77k
        }
204
8.77k
    }
_RNvMs6_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB5_10MerkleTreeNtNtB7_9in_memory10NodesTableNtNvMs_B1e_NtB1e_10MerkleTree13root_from_set12EmptyStorageE3newCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
198
2.19k
    pub fn new(storage: StorageType) -> Self {
199
2.19k
        Self {
200
2.19k
            root_node: Node::create_placeholder(),
201
2.19k
            storage,
202
2.19k
            phantom_table: Default::default(),
203
2.19k
        }
204
2.19k
    }
_RNvMs6_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB5_10MerkleTreeNtNtB7_9in_memory10NodesTableNtNvMs_B1e_NtB1e_10MerkleTree13root_from_set12EmptyStorageE3newCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
198
6.57k
    pub fn new(storage: StorageType) -> Self {
199
6.57k
        Self {
200
6.57k
            root_node: Node::create_placeholder(),
201
6.57k
            storage,
202
6.57k
            phantom_table: Default::default(),
203
6.57k
        }
204
6.57k
    }
Unexecuted instantiation: _RNvMs6_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB5_10MerkleTreeNtNtB7_9in_memory10NodesTableINtNtNtB9_6common11storage_map10StorageMapB1c_EE3newB9_
205
206
0
    pub fn load(
207
0
        storage: StorageType,
208
0
        root: &Bytes32,
209
0
    ) -> Result<Self, MerkleTreeError<StorageError>> {
210
0
        if root == Self::empty_root() {
211
0
            let tree = Self::new(storage);
212
0
            Ok(tree)
213
        } else {
214
0
            let primitive = storage
215
0
                .get(root)?
216
0
                .ok_or_else(|| MerkleTreeError::LoadError(*root))?
217
0
                .into_owned();
218
0
            let tree = Self {
219
0
                root_node: primitive
220
0
                    .try_into()
221
0
                    .map_err(MerkleTreeError::DeserializeError)?,
222
0
                storage,
223
0
                phantom_table: Default::default(),
224
0
            };
225
0
            Ok(tree)
226
        }
227
0
    }
228
229
0
    fn path_set(
230
0
        &self,
231
0
        leaf_key: &Bytes32,
232
0
    ) -> Result<(Vec<Node>, Vec<Bytes32>), MerkleTreeError<StorageError>> {
233
0
        let root_node = self.root_node().clone();
234
0
        let root_storage_node = StorageNode::new(&self.storage, root_node);
235
0
        let (mut path_nodes, mut side_nodes): (Vec<Node>, Vec<Bytes32>) =
236
0
            root_storage_node
237
0
                .as_path_iter(leaf_key)
238
0
                .map(|(path_node, side_node)| {
239
0
                    Ok((
240
0
                        path_node.map_err(MerkleTreeError::ChildError)?.into_node(),
241
0
                        side_node.map_err(MerkleTreeError::ChildError)?,
242
                    ))
243
0
                })
244
0
                .collect::<Result<Vec<_>, MerkleTreeError<StorageError>>>()?
245
0
                .into_iter()
246
0
                .unzip();
247
0
        path_nodes.reverse();
248
0
        side_nodes.reverse();
249
0
        side_nodes.pop(); // The last element in the side nodes list is the
250
0
                          // root; remove it.
251
0
252
0
        Ok((path_nodes, side_nodes))
253
0
    }
254
}
255
256
impl<TableType, StorageType, StorageError> MerkleTree<TableType, StorageType>
257
where
258
    TableType: Mappable<Key = Bytes32, Value = Primitive, OwnedValue = Primitive>,
259
    StorageType: StorageMutate<TableType, Error = StorageError>,
260
{
261
    /// Build a sparse Merkle tree from a set of key-value pairs. This is
262
    /// equivalent to creating an empty sparse Merkle tree and sequentially
263
    /// calling [update](Self::update) for each key-value pair. This constructor
264
    /// is more performant than calling individual sequential updates and is the
265
    /// preferred approach when the key-values are known upfront. Leaves can be
266
    /// appended to the returned tree using `update` to further accumulate leaf
267
    /// data.
268
8.77k
    pub fn from_set<B, I, D>(
269
8.77k
        mut storage: StorageType,
270
8.77k
        set: I,
271
8.77k
    ) -> Result<Self, StorageError>
272
8.77k
    where
273
8.77k
        I: Iterator<Item = (B, D)>,
274
8.77k
        B: Into<Bytes32>,
275
8.77k
        D: AsRef<[u8]>,
276
8.77k
    {
277
8.77k
        let sorted = set
278
8.77k
            .into_iter()
279
8.77k
            .map(|(k, v)| (k.into(), v))
Unexecuted instantiation: _RNCINvMs7_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB8_10MerkleTreeNtNtBa_9in_memory10NodesTableNtNvMs_B1h_NtB1h_10MerkleTree13root_from_set12EmptyStorageE8from_setNtB8_13MerkleTreeKeyINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters3map3MapIB39_INtNtNtB3h_5slice4iter4IterNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENCINvMNtB4A_8contractNtB5H_8Contract18initial_state_rootB41_E0ENCB5D_s_0ERNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32E0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCINvMs7_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB8_10MerkleTreeNtNtBa_9in_memory10NodesTableNtNvMs_B1h_NtB1h_10MerkleTree13root_from_set12EmptyStorageE8from_setNtB8_13MerkleTreeKeyINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters3map3MapIB39_INtNtNtB3f_7sources5empty5EmptyRNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENCINvMNtB4F_8contractNtB5M_8Contract18initial_state_rootB41_E0ENCB5I_s_0ERNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32E0B4F_
Unexecuted instantiation: _RNCINvMs7_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB8_10MerkleTreeNtNtBa_9in_memory10NodesTableNtNvMs_B1h_NtB1h_10MerkleTree13root_from_set12EmptyStorageE8from_setNtB8_13MerkleTreeKeyINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters3map3MapIB39_INtNtNtB3h_5slice4iter4IterNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENCINvMNtB4A_8contractNtB5H_8Contract18initial_state_rootB41_E0ENCB5D_s_0ERNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32E0B4A_
Unexecuted instantiation: _RNCINvMs7_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB8_10MerkleTreeppE8from_setpppE0Bc_
280
8.77k
            .collect::<alloc::collections::BTreeMap<Bytes32, D>>();
281
8.77k
        let mut branches = sorted
282
8.77k
            .iter()
283
8.77k
            .filter(|(_, value)| !value.as_ref().is_empty())
Unexecuted instantiation: _RNCINvMs7_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB8_10MerkleTreeNtNtBa_9in_memory10NodesTableNtNvMs_B1h_NtB1h_10MerkleTree13root_from_set12EmptyStorageE8from_setNtB8_13MerkleTreeKeyINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters3map3MapIB39_INtNtNtB3h_5slice4iter4IterNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENCINvMNtB4A_8contractNtB5H_8Contract18initial_state_rootB41_E0ENCB5D_s_0ERNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32Es_0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCINvMs7_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB8_10MerkleTreeNtNtBa_9in_memory10NodesTableNtNvMs_B1h_NtB1h_10MerkleTree13root_from_set12EmptyStorageE8from_setNtB8_13MerkleTreeKeyINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters3map3MapIB39_INtNtNtB3f_7sources5empty5EmptyRNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENCINvMNtB4F_8contractNtB5M_8Contract18initial_state_rootB41_E0ENCB5I_s_0ERNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32Es_0B4F_
Unexecuted instantiation: _RNCINvMs7_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB8_10MerkleTreeNtNtBa_9in_memory10NodesTableNtNvMs_B1h_NtB1h_10MerkleTree13root_from_set12EmptyStorageE8from_setNtB8_13MerkleTreeKeyINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters3map3MapIB39_INtNtNtB3h_5slice4iter4IterNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENCINvMNtB4A_8contractNtB5H_8Contract18initial_state_rootB41_E0ENCB5D_s_0ERNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32Es_0B4A_
Unexecuted instantiation: _RNCINvMs7_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB8_10MerkleTreeppE8from_setpppEs_0Bc_
284
8.77k
            .map(|(key, data)| Node::create_leaf(key, data))
Unexecuted instantiation: _RNCINvMs7_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB8_10MerkleTreeNtNtBa_9in_memory10NodesTableNtNvMs_B1h_NtB1h_10MerkleTree13root_from_set12EmptyStorageE8from_setNtB8_13MerkleTreeKeyINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters3map3MapIB39_INtNtNtB3h_5slice4iter4IterNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENCINvMNtB4A_8contractNtB5H_8Contract18initial_state_rootB41_E0ENCB5D_s_0ERNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32Es0_0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCINvMs7_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB8_10MerkleTreeNtNtBa_9in_memory10NodesTableNtNvMs_B1h_NtB1h_10MerkleTree13root_from_set12EmptyStorageE8from_setNtB8_13MerkleTreeKeyINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters3map3MapIB39_INtNtNtB3f_7sources5empty5EmptyRNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENCINvMNtB4F_8contractNtB5M_8Contract18initial_state_rootB41_E0ENCB5I_s_0ERNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32Es0_0B4F_
Unexecuted instantiation: _RNCINvMs7_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB8_10MerkleTreeNtNtBa_9in_memory10NodesTableNtNvMs_B1h_NtB1h_10MerkleTree13root_from_set12EmptyStorageE8from_setNtB8_13MerkleTreeKeyINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters3map3MapIB39_INtNtNtB3h_5slice4iter4IterNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENCINvMNtB4A_8contractNtB5H_8Contract18initial_state_rootB41_E0ENCB5D_s_0ERNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32Es0_0B4A_
Unexecuted instantiation: _RNCINvMs7_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB8_10MerkleTreeppE8from_setpppEs0_0Bc_
285
8.77k
            .map(Into::<Branch>::into)
286
8.77k
            .collect::<Vec<_>>();
287
288
8.77k
        for branch in branches.iter() {
289
0
            let leaf = &branch.node;
290
0
            storage.insert(leaf.hash(), &leaf.as_ref().into())?;
291
        }
292
293
8.77k
        if branches.is_empty() {
294
8.77k
            let tree = Self::new(storage);
295
8.77k
            return Ok(tree)
296
0
        }
297
0
298
0
        if branches.len() == 1 {
299
0
            let leaf = branches.pop().expect("Expected at least 1 leaf").node;
300
0
            let mut tree = Self::new(storage);
301
0
            tree.set_root_node(leaf);
302
0
            return Ok(tree)
303
0
        }
304
0
305
0
        let mut nodes = Vec::<Branch>::with_capacity(branches.len());
306
0
        let mut proximities = Vec::<u32>::with_capacity(branches.len());
307
308
        // Building the tree starts by merging all leaf nodes where possible.
309
        // Given a set of leaf nodes sorted left to right (i.e., keys are sorted
310
        // in lexical order), we scan the leaf set right to left, and analyze a
311
        // moving window of three leaves: a center (or "current") leaf, its left
312
        // neighbor, and its right neighbor.
313
        //
314
        // When merging leaf nodes, we analyze this three-node window to
315
        // determine if the condition for merging is met: When the current node
316
        // is closer to its right neighbor than it is to its left neighbor, we
317
        // merge the current node with its right neighbor. The merged node then
318
        // becomes the center of the window, and we must check the merge
319
        // condition again. We calculate proximity using the common path length
320
        // between two nodes, which is also the depth of their shared ancestor
321
        // in the tree.
322
        //
323
        // This three-node window is centered around a current node, and moves
324
        // leftward: At the next iteration, the current node is now the right
325
        // node, the left node is now the current node, and so on. When we have
326
        // checked all windows, we know that we have merged all leaf nodes where
327
        // possible.
328
0
        while let Some(left) = branches.pop() {
329
0
            if let Some(current) = nodes.last() {
330
                #[allow(clippy::cast_possible_truncation)] // Key is 32 bytes
331
0
                let left_proximity = current.node.common_path_length(&left.node) as u32;
332
                while {
333
                    // The current node's proximity to its right neighbor was
334
                    // stored previously. We now compare the distances between
335
                    // the current node's left and right neighbors. If, and only
336
                    // if, the current node is closer to its right neighbor, we
337
                    // merge these nodes to form an ancestor node. We then
338
                    // reform the window, using the ancestor node in the center,
339
                    // to check if we must merge again.
340
                    //
341
                    // If the current node is closer to its left, we do not have
342
                    // enough information to merge nodes, and we must continue
343
                    // scanning the leaf set leftwards to find a configuration
344
                    // that satisfies the merge condition.
345
0
                    if let Some(right_proximity) = proximities.last() {
346
0
                        *right_proximity > left_proximity
347
                    } else {
348
0
                        false
349
                    }
350
                } {
351
                    // The current node is closer to its right neighbor than its
352
                    // left neighbor. We now merge the current node with its
353
                    // right neighbor.
354
0
                    let current =
355
0
                        nodes.pop().expect("Expected current node to be present");
356
0
                    let right = nodes.pop().expect("Expected right node to be present");
357
0
                    let merged = merge_branches(&mut storage, current, right)?;
358
0
                    nodes.push(merged);
359
0
360
0
                    // Now that the current node and its right neighbour are
361
0
                    // merged, the distance between them has collapsed and their
362
0
                    // proximity is no longer needed.
363
0
                    proximities.pop();
364
                }
365
0
                proximities.push(left_proximity);
366
0
            }
367
0
            nodes.push(left);
368
        }
369
370
        // Where possible, all the leaves have been merged. The remaining leaves
371
        // and nodes are stacked in order of height descending. This means that
372
        // they are also ordered with the leftmost leaves at the top and the
373
        // rightmost nodes at the bottom. We can iterate through the stack and
374
        // merge them left to right.
375
0
        let top = {
376
0
            let mut node = nodes
377
0
                .pop()
378
0
                .expect("Nodes stack must have at least 1 element");
379
0
            while let Some(next) = nodes.pop() {
380
0
                node = merge_branches(&mut storage, node, next)?;
381
            }
382
0
            node
383
0
        };
384
0
385
0
        // Lastly, all leaves and nodes are merged into one. The resulting node
386
0
        // may still be an ancestor node below the root. To calculate the final
387
0
        // root, we merge placeholder nodes along the path until the resulting
388
0
        // node has the final height and forms the root node.
389
0
        let mut node = top.node;
390
0
        let path = top.bits;
391
0
        let height = node.height();
392
0
        #[allow(clippy::arithmetic_side_effects)] // height <= max_height
393
0
        let depth = Node::max_height() - height;
394
0
        let placeholders = iter::repeat(Node::create_placeholder()).take(depth as usize);
395
0
        for placeholder in placeholders {
396
0
            node = Node::create_node_on_path(&path, &node, &placeholder);
397
0
            storage.insert(node.hash(), &node.as_ref().into())?;
398
        }
399
400
0
        let tree = Self {
401
0
            root_node: node,
402
0
            storage,
403
0
            phantom_table: Default::default(),
404
0
        };
405
0
        Ok(tree)
406
8.77k
    }
_RINvMs7_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB6_10MerkleTreeNtNtB8_9in_memory10NodesTableNtNvMs_B1f_NtB1f_10MerkleTree13root_from_set12EmptyStorageE8from_setNtB6_13MerkleTreeKeyINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters3map3MapIB37_INtNtNtB3f_5slice4iter4IterNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENCINvMNtB4y_8contractNtB5F_8Contract18initial_state_rootB3Z_E0ENCB5B_s_0ERNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32ECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
268
2.19k
    pub fn from_set<B, I, D>(
269
2.19k
        mut storage: StorageType,
270
2.19k
        set: I,
271
2.19k
    ) -> Result<Self, StorageError>
272
2.19k
    where
273
2.19k
        I: Iterator<Item = (B, D)>,
274
2.19k
        B: Into<Bytes32>,
275
2.19k
        D: AsRef<[u8]>,
276
2.19k
    {
277
2.19k
        let sorted = set
278
2.19k
            .into_iter()
279
2.19k
            .map(|(k, v)| (k.into(), v))
280
2.19k
            .collect::<alloc::collections::BTreeMap<Bytes32, D>>();
281
2.19k
        let mut branches = sorted
282
2.19k
            .iter()
283
2.19k
            .filter(|(_, value)| !value.as_ref().is_empty())
284
2.19k
            .map(|(key, data)| Node::create_leaf(key, data))
285
2.19k
            .map(Into::<Branch>::into)
286
2.19k
            .collect::<Vec<_>>();
287
288
2.19k
        for branch in branches.iter() {
289
0
            let leaf = &branch.node;
290
0
            storage.insert(leaf.hash(), &leaf.as_ref().into())?;
291
        }
292
293
2.19k
        if branches.is_empty() {
294
2.19k
            let tree = Self::new(storage);
295
2.19k
            return Ok(tree)
296
0
        }
297
0
298
0
        if branches.len() == 1 {
299
0
            let leaf = branches.pop().expect("Expected at least 1 leaf").node;
300
0
            let mut tree = Self::new(storage);
301
0
            tree.set_root_node(leaf);
302
0
            return Ok(tree)
303
0
        }
304
0
305
0
        let mut nodes = Vec::<Branch>::with_capacity(branches.len());
306
0
        let mut proximities = Vec::<u32>::with_capacity(branches.len());
307
308
        // Building the tree starts by merging all leaf nodes where possible.
309
        // Given a set of leaf nodes sorted left to right (i.e., keys are sorted
310
        // in lexical order), we scan the leaf set right to left, and analyze a
311
        // moving window of three leaves: a center (or "current") leaf, its left
312
        // neighbor, and its right neighbor.
313
        //
314
        // When merging leaf nodes, we analyze this three-node window to
315
        // determine if the condition for merging is met: When the current node
316
        // is closer to its right neighbor than it is to its left neighbor, we
317
        // merge the current node with its right neighbor. The merged node then
318
        // becomes the center of the window, and we must check the merge
319
        // condition again. We calculate proximity using the common path length
320
        // between two nodes, which is also the depth of their shared ancestor
321
        // in the tree.
322
        //
323
        // This three-node window is centered around a current node, and moves
324
        // leftward: At the next iteration, the current node is now the right
325
        // node, the left node is now the current node, and so on. When we have
326
        // checked all windows, we know that we have merged all leaf nodes where
327
        // possible.
328
0
        while let Some(left) = branches.pop() {
329
0
            if let Some(current) = nodes.last() {
330
                #[allow(clippy::cast_possible_truncation)] // Key is 32 bytes
331
0
                let left_proximity = current.node.common_path_length(&left.node) as u32;
332
                while {
333
                    // The current node's proximity to its right neighbor was
334
                    // stored previously. We now compare the distances between
335
                    // the current node's left and right neighbors. If, and only
336
                    // if, the current node is closer to its right neighbor, we
337
                    // merge these nodes to form an ancestor node. We then
338
                    // reform the window, using the ancestor node in the center,
339
                    // to check if we must merge again.
340
                    //
341
                    // If the current node is closer to its left, we do not have
342
                    // enough information to merge nodes, and we must continue
343
                    // scanning the leaf set leftwards to find a configuration
344
                    // that satisfies the merge condition.
345
0
                    if let Some(right_proximity) = proximities.last() {
346
0
                        *right_proximity > left_proximity
347
                    } else {
348
0
                        false
349
                    }
350
                } {
351
                    // The current node is closer to its right neighbor than its
352
                    // left neighbor. We now merge the current node with its
353
                    // right neighbor.
354
0
                    let current =
355
0
                        nodes.pop().expect("Expected current node to be present");
356
0
                    let right = nodes.pop().expect("Expected right node to be present");
357
0
                    let merged = merge_branches(&mut storage, current, right)?;
358
0
                    nodes.push(merged);
359
0
360
0
                    // Now that the current node and its right neighbour are
361
0
                    // merged, the distance between them has collapsed and their
362
0
                    // proximity is no longer needed.
363
0
                    proximities.pop();
364
                }
365
0
                proximities.push(left_proximity);
366
0
            }
367
0
            nodes.push(left);
368
        }
369
370
        // Where possible, all the leaves have been merged. The remaining leaves
371
        // and nodes are stacked in order of height descending. This means that
372
        // they are also ordered with the leftmost leaves at the top and the
373
        // rightmost nodes at the bottom. We can iterate through the stack and
374
        // merge them left to right.
375
0
        let top = {
376
0
            let mut node = nodes
377
0
                .pop()
378
0
                .expect("Nodes stack must have at least 1 element");
379
0
            while let Some(next) = nodes.pop() {
380
0
                node = merge_branches(&mut storage, node, next)?;
381
            }
382
0
            node
383
0
        };
384
0
385
0
        // Lastly, all leaves and nodes are merged into one. The resulting node
386
0
        // may still be an ancestor node below the root. To calculate the final
387
0
        // root, we merge placeholder nodes along the path until the resulting
388
0
        // node has the final height and forms the root node.
389
0
        let mut node = top.node;
390
0
        let path = top.bits;
391
0
        let height = node.height();
392
0
        #[allow(clippy::arithmetic_side_effects)] // height <= max_height
393
0
        let depth = Node::max_height() - height;
394
0
        let placeholders = iter::repeat(Node::create_placeholder()).take(depth as usize);
395
0
        for placeholder in placeholders {
396
0
            node = Node::create_node_on_path(&path, &node, &placeholder);
397
0
            storage.insert(node.hash(), &node.as_ref().into())?;
398
        }
399
400
0
        let tree = Self {
401
0
            root_node: node,
402
0
            storage,
403
0
            phantom_table: Default::default(),
404
0
        };
405
0
        Ok(tree)
406
2.19k
    }
Unexecuted instantiation: _RINvMs7_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB6_10MerkleTreeNtNtB8_9in_memory10NodesTableNtNvMs_B1f_NtB1f_10MerkleTree13root_from_set12EmptyStorageE8from_setNtB6_13MerkleTreeKeyINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters3map3MapIB37_INtNtNtB3d_7sources5empty5EmptyRNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENCINvMNtB4D_8contractNtB5K_8Contract18initial_state_rootB3Z_E0ENCB5G_s_0ERNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32EB4D_
_RINvMs7_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB6_10MerkleTreeNtNtB8_9in_memory10NodesTableNtNvMs_B1f_NtB1f_10MerkleTree13root_from_set12EmptyStorageE8from_setNtB6_13MerkleTreeKeyINtNtNtNtCsd3UI3IJrzMw_4core4iter8adapters3map3MapIB37_INtNtNtB3f_5slice4iter4IterNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENCINvMNtB4y_8contractNtB5F_8Contract18initial_state_rootB3Z_E0ENCB5B_s_0ERNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32EB4y_
Line
Count
Source
268
6.57k
    pub fn from_set<B, I, D>(
269
6.57k
        mut storage: StorageType,
270
6.57k
        set: I,
271
6.57k
    ) -> Result<Self, StorageError>
272
6.57k
    where
273
6.57k
        I: Iterator<Item = (B, D)>,
274
6.57k
        B: Into<Bytes32>,
275
6.57k
        D: AsRef<[u8]>,
276
6.57k
    {
277
6.57k
        let sorted = set
278
6.57k
            .into_iter()
279
6.57k
            .map(|(k, v)| (k.into(), v))
280
6.57k
            .collect::<alloc::collections::BTreeMap<Bytes32, D>>();
281
6.57k
        let mut branches = sorted
282
6.57k
            .iter()
283
6.57k
            .filter(|(_, value)| !value.as_ref().is_empty())
284
6.57k
            .map(|(key, data)| Node::create_leaf(key, data))
285
6.57k
            .map(Into::<Branch>::into)
286
6.57k
            .collect::<Vec<_>>();
287
288
6.57k
        for branch in branches.iter() {
289
0
            let leaf = &branch.node;
290
0
            storage.insert(leaf.hash(), &leaf.as_ref().into())?;
291
        }
292
293
6.57k
        if branches.is_empty() {
294
6.57k
            let tree = Self::new(storage);
295
6.57k
            return Ok(tree)
296
0
        }
297
0
298
0
        if branches.len() == 1 {
299
0
            let leaf = branches.pop().expect("Expected at least 1 leaf").node;
300
0
            let mut tree = Self::new(storage);
301
0
            tree.set_root_node(leaf);
302
0
            return Ok(tree)
303
0
        }
304
0
305
0
        let mut nodes = Vec::<Branch>::with_capacity(branches.len());
306
0
        let mut proximities = Vec::<u32>::with_capacity(branches.len());
307
308
        // Building the tree starts by merging all leaf nodes where possible.
309
        // Given a set of leaf nodes sorted left to right (i.e., keys are sorted
310
        // in lexical order), we scan the leaf set right to left, and analyze a
311
        // moving window of three leaves: a center (or "current") leaf, its left
312
        // neighbor, and its right neighbor.
313
        //
314
        // When merging leaf nodes, we analyze this three-node window to
315
        // determine if the condition for merging is met: When the current node
316
        // is closer to its right neighbor than it is to its left neighbor, we
317
        // merge the current node with its right neighbor. The merged node then
318
        // becomes the center of the window, and we must check the merge
319
        // condition again. We calculate proximity using the common path length
320
        // between two nodes, which is also the depth of their shared ancestor
321
        // in the tree.
322
        //
323
        // This three-node window is centered around a current node, and moves
324
        // leftward: At the next iteration, the current node is now the right
325
        // node, the left node is now the current node, and so on. When we have
326
        // checked all windows, we know that we have merged all leaf nodes where
327
        // possible.
328
0
        while let Some(left) = branches.pop() {
329
0
            if let Some(current) = nodes.last() {
330
                #[allow(clippy::cast_possible_truncation)] // Key is 32 bytes
331
0
                let left_proximity = current.node.common_path_length(&left.node) as u32;
332
                while {
333
                    // The current node's proximity to its right neighbor was
334
                    // stored previously. We now compare the distances between
335
                    // the current node's left and right neighbors. If, and only
336
                    // if, the current node is closer to its right neighbor, we
337
                    // merge these nodes to form an ancestor node. We then
338
                    // reform the window, using the ancestor node in the center,
339
                    // to check if we must merge again.
340
                    //
341
                    // If the current node is closer to its left, we do not have
342
                    // enough information to merge nodes, and we must continue
343
                    // scanning the leaf set leftwards to find a configuration
344
                    // that satisfies the merge condition.
345
0
                    if let Some(right_proximity) = proximities.last() {
346
0
                        *right_proximity > left_proximity
347
                    } else {
348
0
                        false
349
                    }
350
                } {
351
                    // The current node is closer to its right neighbor than its
352
                    // left neighbor. We now merge the current node with its
353
                    // right neighbor.
354
0
                    let current =
355
0
                        nodes.pop().expect("Expected current node to be present");
356
0
                    let right = nodes.pop().expect("Expected right node to be present");
357
0
                    let merged = merge_branches(&mut storage, current, right)?;
358
0
                    nodes.push(merged);
359
0
360
0
                    // Now that the current node and its right neighbour are
361
0
                    // merged, the distance between them has collapsed and their
362
0
                    // proximity is no longer needed.
363
0
                    proximities.pop();
364
                }
365
0
                proximities.push(left_proximity);
366
0
            }
367
0
            nodes.push(left);
368
        }
369
370
        // Where possible, all the leaves have been merged. The remaining leaves
371
        // and nodes are stacked in order of height descending. This means that
372
        // they are also ordered with the leftmost leaves at the top and the
373
        // rightmost nodes at the bottom. We can iterate through the stack and
374
        // merge them left to right.
375
0
        let top = {
376
0
            let mut node = nodes
377
0
                .pop()
378
0
                .expect("Nodes stack must have at least 1 element");
379
0
            while let Some(next) = nodes.pop() {
380
0
                node = merge_branches(&mut storage, node, next)?;
381
            }
382
0
            node
383
0
        };
384
0
385
0
        // Lastly, all leaves and nodes are merged into one. The resulting node
386
0
        // may still be an ancestor node below the root. To calculate the final
387
0
        // root, we merge placeholder nodes along the path until the resulting
388
0
        // node has the final height and forms the root node.
389
0
        let mut node = top.node;
390
0
        let path = top.bits;
391
0
        let height = node.height();
392
0
        #[allow(clippy::arithmetic_side_effects)] // height <= max_height
393
0
        let depth = Node::max_height() - height;
394
0
        let placeholders = iter::repeat(Node::create_placeholder()).take(depth as usize);
395
0
        for placeholder in placeholders {
396
0
            node = Node::create_node_on_path(&path, &node, &placeholder);
397
0
            storage.insert(node.hash(), &node.as_ref().into())?;
398
        }
399
400
0
        let tree = Self {
401
0
            root_node: node,
402
0
            storage,
403
0
            phantom_table: Default::default(),
404
0
        };
405
0
        Ok(tree)
406
6.57k
    }
Unexecuted instantiation: _RINvMs7_NtNtCsacfdLYFME8L_11fuel_merkle6sparse11merkle_treeINtB6_10MerkleTreeppE8from_setpppEBa_
407
408
0
    pub fn update(
409
0
        &mut self,
410
0
        key: MerkleTreeKey,
411
0
        data: &[u8],
412
0
    ) -> Result<(), MerkleTreeError<StorageError>> {
413
0
        if data.is_empty() {
414
            // If the data is empty, this signifies a delete operation for the
415
            // given key.
416
0
            self.delete(key)?;
417
0
            return Ok(())
418
0
        }
419
0
420
0
        let leaf_node = Node::create_leaf(key.as_ref(), data);
421
0
        self.storage
422
0
            .insert(leaf_node.hash(), &leaf_node.as_ref().into())?;
423
424
0
        if self.root_node().is_placeholder() {
425
0
            self.set_root_node(leaf_node);
426
0
        } else {
427
0
            let (path_nodes, side_nodes) = self.path_set(key.as_ref())?;
428
0
            self.update_with_path_set(
429
0
                &leaf_node,
430
0
                path_nodes.as_slice(),
431
0
                side_nodes.as_slice(),
432
0
            )?;
433
        }
434
435
0
        Ok(())
436
0
    }
437
438
0
    pub fn delete(
439
0
        &mut self,
440
0
        key: MerkleTreeKey,
441
0
    ) -> Result<(), MerkleTreeError<StorageError>> {
442
0
        if self.root() == *Self::empty_root() {
443
            // The zero root signifies that all leaves are empty, including the
444
            // given key.
445
0
            return Ok(())
446
0
        }
447
448
0
        let (path_nodes, side_nodes): (Vec<Node>, Vec<_>) =
449
0
            self.path_set(key.as_ref())?;
450
451
0
        match path_nodes.first() {
452
0
            Some(node) if *node.leaf_key() == key.as_ref() => {
453
0
                self.delete_with_path_set(path_nodes.as_slice(), side_nodes.as_slice())?;
454
            }
455
0
            _ => {}
456
        };
457
458
0
        Ok(())
459
0
    }
460
461
0
    fn update_with_path_set(
462
0
        &mut self,
463
0
        requested_leaf_node: &Node,
464
0
        path_nodes: &[Node],
465
0
        side_nodes: &[Bytes32],
466
0
    ) -> Result<(), StorageError> {
467
0
        let path = requested_leaf_node.leaf_key();
468
0
        let actual_leaf_node = &path_nodes[0];
469
0
470
0
        if requested_leaf_node == actual_leaf_node {
471
0
            return Ok(())
472
0
        }
473
0
474
0
        // Build the tree upwards starting with the requested leaf node.
475
0
        let mut current_node = requested_leaf_node.clone();
476
0
477
0
        // If we are creating a new leaf node, the corresponding side node will
478
0
        // be the first node in the path set. The side node will be the leaf
479
0
        // node currently closest to the requested new leaf node. When creating
480
0
        // a new leaf node, we must merge the leaf node with its corresponding
481
0
        // side node to create a common ancestor. We then continue building the
482
0
        // tree upwards from this ancestor node. This may require creating new
483
0
        // placeholder side nodes, in addition to the existing side node set.
484
0
        //
485
0
        // If we are updating an existing leaf node, the leaf node we are
486
0
        // updating is the first node in the path set. The side node set will
487
0
        // already include all the side nodes needed to build up the tree from
488
0
        // the requested leaf node, since these side nodes were already built
489
0
        // during the creation of the leaf node.
490
0
        //
491
0
        // We can determine if we are updating an existing leaf node, or if we
492
0
        // are creating a new leaf node, by comparing the paths of the requested
493
0
        // leaf node and the leaf node at the start of the path set. When the
494
0
        // paths are equal, it means the leaf nodes occupy the same location,
495
0
        // and we are updating an existing leaf. Otherwise, it means we are
496
0
        // adding a new leaf node.
497
0
        if requested_leaf_node.leaf_key() != actual_leaf_node.leaf_key() {
498
            // Merge leaves
499
0
            if !actual_leaf_node.is_placeholder() {
500
0
                current_node =
501
0
                    Node::create_node_on_path(path, &current_node, actual_leaf_node);
502
0
                self.storage
503
0
                    .insert(current_node.hash(), &current_node.as_ref().into())?;
504
0
            }
505
506
            // Merge placeholders
507
0
            let ancestor_depth = requested_leaf_node.common_path_length(actual_leaf_node);
508
0
            #[allow(clippy::cast_possible_truncation)] // Key is 32 bytes
509
0
            let placeholders_count =
510
0
                (ancestor_depth as usize).saturating_sub(side_nodes.len());
511
0
            let placeholders =
512
0
                iter::repeat(Node::create_placeholder()).take(placeholders_count);
513
0
            for placeholder in placeholders {
514
0
                current_node =
515
0
                    Node::create_node_on_path(path, &current_node, &placeholder);
516
0
                self.storage
517
0
                    .insert(current_node.hash(), &current_node.as_ref().into())?;
518
            }
519
        } else {
520
0
            self.storage.remove(actual_leaf_node.hash())?;
521
        }
522
523
        // Merge side nodes
524
0
        for (side_node, old_parent) in
525
0
            side_nodes.iter().zip(path_nodes.iter().skip(1 /* leaf */))
526
        {
527
0
            let new_parent = if old_parent.bytes_lo() == side_node {
528
0
                Node::create_node_from_hashes(
529
0
                    *side_node,
530
0
                    *current_node.hash(),
531
0
                    old_parent.height(),
532
0
                )
533
            } else {
534
0
                Node::create_node_from_hashes(
535
0
                    *current_node.hash(),
536
0
                    *side_node,
537
0
                    old_parent.height(),
538
0
                )
539
            };
540
541
0
            current_node = new_parent;
542
0
            self.storage
543
0
                .insert(current_node.hash(), &current_node.as_ref().into())?;
544
0
            self.storage.remove(old_parent.hash())?;
545
        }
546
547
0
        self.set_root_node(current_node);
548
0
549
0
        Ok(())
550
0
    }
551
552
0
    fn delete_with_path_set(
553
0
        &mut self,
554
0
        path_nodes: &[Node],
555
0
        side_nodes: &[Bytes32],
556
0
    ) -> Result<(), MerkleTreeError<StorageError>> {
557
0
        for node in path_nodes {
558
0
            self.storage.remove(node.hash())?;
559
        }
560
561
0
        let mut side_nodes_iter = side_nodes.iter();
562
0
        let mut path_nodes_iter = path_nodes.iter();
563
0
        path_nodes_iter.next(); // Skip the requested leaf node
564
0
565
0
        // The deleted leaf is replaced by a placeholder. Build the tree upwards
566
0
        // starting with the placeholder.
567
0
        let mut current_node = Node::create_placeholder();
568
569
        // If the first side node is a leaf, it means the ancestor node is now
570
        // parent to a placeholder (the deleted leaf node) and a leaf node (the
571
        // first side node). We can immediately discard the ancestor node from
572
        // further calculation and attach the orphaned leaf node to its next
573
        // ancestor. Any subsequent ancestor nodes composed of this leaf node
574
        // and a placeholder must be similarly discarded from further
575
        // calculation. We then create a valid ancestor node for the orphaned
576
        // leaf node by joining it with the earliest non-placeholder side node.
577
0
        if let Some(first_side_node) = side_nodes.first() {
578
0
            let first_side_node: Node = self
579
0
                .storage
580
0
                .get(first_side_node)?
581
0
                .ok_or(MerkleTreeError::LoadError(*first_side_node))?
582
0
                .into_owned()
583
0
                .try_into()
584
0
                .map_err(MerkleTreeError::DeserializeError)?;
585
586
0
            if first_side_node.is_leaf() {
587
0
                side_nodes_iter.next();
588
0
                current_node = first_side_node.clone();
589
590
                // Advance the side node iterator to the next non-placeholder
591
                // node. This may be either another leaf node or an internal
592
                // node. If only placeholder nodes exist beyond the first leaf
593
                // node, then that leaf node is, in fact, the new root node.
594
                //
595
                // Using `find(..)` advances the iterator beyond the next
596
                // non-placeholder side node and returns it. Therefore, we must
597
                // consume the side node at this point. If another non-
598
                // placeholder node was found in the side node collection, merge
599
                // it with the first side node. This guarantees that the current
600
                // node will be an internal node, and not a leaf, by the time we
601
                // start merging the remaining side nodes.
602
                // See https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.find.
603
0
                if let Some(side_node) = side_nodes_iter
604
0
                    .find(|side_node| *side_node != Node::Placeholder.hash())
605
                {
606
                    // Skip parents until the parent of the first side node is found
607
0
                    if let Some(old_parent) = path_nodes_iter.find(|parent| {
608
0
                        parent.bytes_lo() == side_node || parent.bytes_hi() == side_node
609
0
                    }) {
610
0
                        let new_parent = if old_parent.bytes_lo() == side_node {
611
0
                            Node::create_node_from_hashes(
612
0
                                *side_node,
613
0
                                *current_node.hash(),
614
0
                                old_parent.height(),
615
0
                            )
616
                        } else {
617
0
                            Node::create_node_from_hashes(
618
0
                                *current_node.hash(),
619
0
                                *side_node,
620
0
                                old_parent.height(),
621
0
                            )
622
                        };
623
0
                        current_node = new_parent;
624
0
                        self.storage
625
0
                            .insert(current_node.hash(), &current_node.as_ref().into())?;
626
0
                    }
627
0
                }
628
0
            }
629
0
        }
630
631
        // Merge side nodes
632
0
        for (side_node, old_parent) in side_nodes_iter.zip(path_nodes_iter) {
633
0
            let new_parent = if old_parent.bytes_lo() == side_node {
634
0
                Node::create_node_from_hashes(
635
0
                    *side_node,
636
0
                    *current_node.hash(),
637
0
                    old_parent.height(),
638
0
                )
639
            } else {
640
0
                Node::create_node_from_hashes(
641
0
                    *current_node.hash(),
642
0
                    *side_node,
643
0
                    old_parent.height(),
644
0
                )
645
            };
646
647
0
            current_node = new_parent;
648
0
            self.storage
649
0
                .insert(current_node.hash(), &current_node.as_ref().into())?;
650
        }
651
652
0
        self.set_root_node(current_node);
653
0
654
0
        Ok(())
655
0
    }
656
}
657
658
impl<TableType, StorageType, StorageError> MerkleTree<TableType, StorageType>
659
where
660
    TableType: Mappable<Key = Bytes32, Value = Primitive, OwnedValue = Primitive>,
661
    StorageType: StorageInspect<TableType, Error = StorageError>,
662
{
663
0
    pub fn generate_proof(
664
0
        &self,
665
0
        key: &MerkleTreeKey,
666
0
    ) -> Result<Proof, MerkleTreeError<StorageError>> {
667
0
        let path = key.as_ref();
668
0
        let (path_nodes, side_nodes) = self.path_set(path)?;
669
        // Identify the closest leaf that is included in the tree to the
670
        // requested leaf. The closest leaf, as returned by the path set
671
        // corresponding to the requested leaf, will be the requested leaf
672
        // itself, a different leaf than requested, or a placeholder.
673
        //
674
        // If the closest leaf is the requested leaf, then the requested leaf is
675
        // included in the tree, and we are requesting an inclusion proof.
676
        // Otherwise (i.e, the closest leaf is either another leaf or a
677
        // placeholder), the requested leaf is not in the tree, and we are
678
        // requesting an exclusion proof.
679
        //
680
0
        let actual_leaf = &path_nodes[0];
681
0
        let proof_set = side_nodes;
682
0
        let proof = if !actual_leaf.is_placeholder() && actual_leaf.leaf_key() == path {
683
            // If the requested key is part of the tree, build an inclusion
684
            // proof.
685
0
            let inclusion_proof = InclusionProof { proof_set };
686
0
            Proof::Inclusion(inclusion_proof)
687
        } else {
688
            // If the requested key is not part of the tree, we are verifying
689
            // that the given key is a placeholder, and we must build an
690
            // exclusion proof. When building an exclusion proof, the requested
691
            // leaf is unset and is currently a placeholder. The path to this
692
            // placeholder is designated by the requested leaf's key.
693
            //
694
            // If the closest leaf is a real leaf, and not a placeholder, we can
695
            // build the root upwards using this leaf's key and value. If the
696
            // closest leaf is a placeholder, it has a leaf key and a
697
            // placeholder value (the zero sum). The leaf key of this
698
            // placeholder leaf is unknown (since placeholders do not store
699
            // their leaf key), and by extension, the path from the root to the
700
            // placeholder is also unknown.
701
            //
702
            // However, in both cases, the path defined by the requested
703
            // placeholder is sufficiently close: All branches stemming from the
704
            // point where the paths of the requested placeholder and closest
705
            // leaf diverge are saturated with the closest leaf's hash. In the
706
            // case where the closest leaf is a placeholder, this hash is simply
707
            // the zero sum. The hash of any placeholder under this point of
708
            // divergence equates to this hash.
709
            //
710
0
            let leaf = if actual_leaf.is_placeholder() {
711
0
                ExclusionLeaf::Placeholder
712
            } else {
713
0
                ExclusionLeaf::Leaf(ExclusionLeafData {
714
0
                    leaf_key: *actual_leaf.leaf_key(),
715
0
                    leaf_value: *actual_leaf.leaf_data(),
716
0
                })
717
            };
718
719
0
            let exclusion_proof = ExclusionProof { proof_set, leaf };
720
0
            Proof::Exclusion(exclusion_proof)
721
        };
722
0
        Ok(proof)
723
0
    }
724
}
725
726
#[cfg(test)]
727
#[allow(non_snake_case)]
728
mod test {
729
    use super::Node;
730
    use crate::{
731
        common::{
732
            sum,
733
            Bytes32,
734
            StorageMap,
735
        },
736
        sparse::{
737
            empty_sum,
738
            MerkleTree,
739
            MerkleTreeError,
740
            MerkleTreeKey,
741
            Primitive,
742
        },
743
    };
744
    use fuel_storage::Mappable;
745
    use hex;
746
747
    fn random_bytes32<R>(rng: &mut R) -> Bytes32
748
    where
749
        R: rand::Rng + ?Sized,
750
    {
751
        let mut bytes = [0u8; 32];
752
        rng.fill(bytes.as_mut());
753
        bytes
754
    }
755
756
    #[derive(Debug)]
757
    struct TestTable;
758
759
    impl Mappable for TestTable {
760
        type Key = Self::OwnedKey;
761
        type OwnedKey = Bytes32;
762
        type OwnedValue = Primitive;
763
        type Value = Self::OwnedValue;
764
    }
765
766
    fn key<B: AsRef<[u8]>>(data: B) -> MerkleTreeKey {
767
        MerkleTreeKey::new(data.as_ref())
768
    }
769
770
    #[test]
771
    fn test_empty_root() {
772
        let mut storage = StorageMap::<TestTable>::new();
773
        let tree = MerkleTree::new(&mut storage);
774
        let root = tree.root();
775
        let expected_root =
776
            "0000000000000000000000000000000000000000000000000000000000000000";
777
        assert_eq!(hex::encode(root), expected_root);
778
    }
779
780
    #[test]
781
    fn test_update_1() {
782
        let mut storage = StorageMap::<TestTable>::new();
783
        let mut tree = MerkleTree::new(&mut storage);
784
785
        tree.update(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
786
787
        let root = tree.root();
788
        let expected_root =
789
            "39f36a7cb4dfb1b46f03d044265df6a491dffc1034121bc1071a34ddce9bb14b";
790
        assert_eq!(hex::encode(root), expected_root);
791
    }
792
793
    #[test]
794
    fn test_update_2() {
795
        let mut storage = StorageMap::<TestTable>::new();
796
        let mut tree = MerkleTree::new(&mut storage);
797
798
        tree.update(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
799
        tree.update(key(b"\x00\x00\x00\x01"), b"DATA").unwrap();
800
801
        let root = tree.root();
802
        let expected_root =
803
            "8d0ae412ca9ca0afcb3217af8bcd5a673e798bd6fd1dfacad17711e883f494cb";
804
        assert_eq!(hex::encode(root), expected_root);
805
    }
806
807
    #[test]
808
    fn test_update_3() {
809
        let mut storage = StorageMap::<TestTable>::new();
810
        let mut tree = MerkleTree::new(&mut storage);
811
812
        tree.update(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
813
        tree.update(key(b"\x00\x00\x00\x01"), b"DATA").unwrap();
814
        tree.update(key(b"\x00\x00\x00\x02"), b"DATA").unwrap();
815
816
        let root = tree.root();
817
        let expected_root =
818
            "52295e42d8de2505fdc0cc825ff9fead419cbcf540d8b30c7c4b9c9b94c268b7";
819
        assert_eq!(hex::encode(root), expected_root);
820
    }
821
822
    #[test]
823
    fn test_update_5() {
824
        let mut storage = StorageMap::<TestTable>::new();
825
        let mut tree = MerkleTree::new(&mut storage);
826
827
        tree.update(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
828
        tree.update(key(b"\x00\x00\x00\x01"), b"DATA").unwrap();
829
        tree.update(key(b"\x00\x00\x00\x02"), b"DATA").unwrap();
830
        tree.update(key(b"\x00\x00\x00\x03"), b"DATA").unwrap();
831
        tree.update(key(b"\x00\x00\x00\x04"), b"DATA").unwrap();
832
833
        let root = tree.root();
834
        let expected_root =
835
            "108f731f2414e33ae57e584dc26bd276db07874436b2264ca6e520c658185c6b";
836
        assert_eq!(hex::encode(root), expected_root);
837
    }
838
839
    #[test]
840
    fn test_update_10() {
841
        let mut storage = StorageMap::<TestTable>::new();
842
        let mut tree = MerkleTree::new(&mut storage);
843
844
        for i in 0_u32..10 {
845
            let key = key(i.to_be_bytes());
846
            tree.update(key, b"DATA").unwrap();
847
        }
848
849
        let root = tree.root();
850
        let expected_root =
851
            "21ca4917e99da99a61de93deaf88c400d4c082991cb95779e444d43dd13e8849";
852
        assert_eq!(hex::encode(root), expected_root);
853
    }
854
855
    #[test]
856
    fn test_update_100() {
857
        let mut storage = StorageMap::<TestTable>::new();
858
        let mut tree = MerkleTree::new(&mut storage);
859
860
        for i in 0_u32..100 {
861
            let key = key(i.to_be_bytes());
862
            tree.update(key, b"DATA").unwrap();
863
        }
864
865
        let root = tree.root();
866
        let expected_root =
867
            "82bf747d455a55e2f7044a03536fc43f1f55d43b855e72c0110c986707a23e4d";
868
        assert_eq!(hex::encode(root), expected_root);
869
    }
870
871
    #[test]
872
    fn test_update_with_repeated_inputs() {
873
        let mut storage = StorageMap::<TestTable>::new();
874
        let mut tree = MerkleTree::new(&mut storage);
875
876
        tree.update(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
877
        tree.update(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
878
879
        let root = tree.root();
880
        let expected_root =
881
            "39f36a7cb4dfb1b46f03d044265df6a491dffc1034121bc1071a34ddce9bb14b";
882
        assert_eq!(hex::encode(root), expected_root);
883
    }
884
885
    #[test]
886
    fn test_update_overwrite_key() {
887
        let mut storage = StorageMap::<TestTable>::new();
888
        let mut tree = MerkleTree::new(&mut storage);
889
890
        tree.update(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
891
        tree.update(key(b"\x00\x00\x00\x00"), b"CHANGE").unwrap();
892
893
        let root = tree.root();
894
        let expected_root =
895
            "dd97174c80e5e5aa3a31c61b05e279c1495c8a07b2a08bca5dbc9fb9774f9457";
896
        assert_eq!(hex::encode(root), expected_root);
897
    }
898
899
    #[test]
900
    fn test_update_overwrite_key_2() {
901
        let mut storage = StorageMap::<TestTable>::new();
902
        let mut tree = MerkleTree::new(&mut storage);
903
904
        for i in 0_u32..10 {
905
            let key = key(i.to_be_bytes());
906
            tree.update(key, b"DATA").unwrap();
907
        }
908
909
        let root_hash_before = tree.root();
910
911
        for i in 3_u32..7 {
912
            let key = key(i.to_be_bytes());
913
            tree.update(key, b"DATA_2").unwrap();
914
        }
915
916
        for i in 3_u32..7 {
917
            let key = key(i.to_be_bytes());
918
            tree.update(key, b"DATA").unwrap();
919
        }
920
921
        let root_hash_after = tree.root();
922
923
        assert_eq!(root_hash_before, root_hash_after);
924
    }
925
926
    #[test]
927
    fn test_update_union() {
928
        let mut storage = StorageMap::<TestTable>::new();
929
        let mut tree = MerkleTree::new(&mut storage);
930
931
        for i in 0_u32..5 {
932
            let key = key(i.to_be_bytes());
933
            tree.update(key, b"DATA").unwrap();
934
        }
935
936
        for i in 10_u32..15 {
937
            let key = key(i.to_be_bytes());
938
            tree.update(key, b"DATA").unwrap();
939
        }
940
941
        for i in 20_u32..25 {
942
            let key = key(i.to_be_bytes());
943
            tree.update(key, b"DATA").unwrap();
944
        }
945
946
        let root = tree.root();
947
        let expected_root =
948
            "7e6643325042cfe0fc76626c043b97062af51c7e9fc56665f12b479034bce326";
949
        assert_eq!(hex::encode(root), expected_root);
950
    }
951
952
    #[test]
953
    fn test_update_sparse_union() {
954
        let mut storage = StorageMap::<TestTable>::new();
955
        let mut tree = MerkleTree::new(&mut storage);
956
957
        tree.update(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
958
        tree.update(key(b"\x00\x00\x00\x02"), b"DATA").unwrap();
959
        tree.update(key(b"\x00\x00\x00\x04"), b"DATA").unwrap();
960
        tree.update(key(b"\x00\x00\x00\x06"), b"DATA").unwrap();
961
        tree.update(key(b"\x00\x00\x00\x08"), b"DATA").unwrap();
962
963
        let root = tree.root();
964
        let expected_root =
965
            "e912e97abc67707b2e6027338292943b53d01a7fbd7b244674128c7e468dd696";
966
        assert_eq!(hex::encode(root), expected_root);
967
    }
968
969
    #[test]
970
    fn test_update_with_empty_data_does_not_change_root() {
971
        let mut storage = StorageMap::<TestTable>::new();
972
        let mut tree = MerkleTree::new(&mut storage);
973
974
        tree.update(key(b"\x00\x00\x00\x00"), b"").unwrap();
975
976
        let root = tree.root();
977
        let expected_root =
978
            "0000000000000000000000000000000000000000000000000000000000000000";
979
        assert_eq!(hex::encode(root), expected_root);
980
    }
981
982
    #[test]
983
    fn test_update_with_empty_data_performs_delete() {
984
        let mut storage = StorageMap::<TestTable>::new();
985
        let mut tree = MerkleTree::new(&mut storage);
986
987
        tree.update(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
988
        tree.update(key(b"\x00\x00\x00\x00"), b"").unwrap();
989
990
        let root = tree.root();
991
        let expected_root =
992
            "0000000000000000000000000000000000000000000000000000000000000000";
993
        assert_eq!(hex::encode(root), expected_root);
994
    }
995
996
    #[test]
997
    fn test_update_1_delete_1() {
998
        let mut storage = StorageMap::<TestTable>::new();
999
        let mut tree = MerkleTree::new(&mut storage);
1000
1001
        tree.update(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
1002
        tree.delete(key(b"\x00\x00\x00\x00")).unwrap();
1003
1004
        let root = tree.root();
1005
        let expected_root =
1006
            "0000000000000000000000000000000000000000000000000000000000000000";
1007
        assert_eq!(hex::encode(root), expected_root);
1008
    }
1009
1010
    #[test]
1011
    fn test_update_2_delete_1() {
1012
        let mut storage = StorageMap::<TestTable>::new();
1013
        let mut tree = MerkleTree::new(&mut storage);
1014
1015
        tree.update(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
1016
        tree.update(key(b"\x00\x00\x00\x01"), b"DATA").unwrap();
1017
        tree.delete(key(b"\x00\x00\x00\x01")).unwrap();
1018
1019
        let root = tree.root();
1020
        let expected_root =
1021
            "39f36a7cb4dfb1b46f03d044265df6a491dffc1034121bc1071a34ddce9bb14b";
1022
        assert_eq!(hex::encode(root), expected_root);
1023
    }
1024
1025
    #[test]
1026
    fn test_update_10_delete_5() {
1027
        let mut storage = StorageMap::<TestTable>::new();
1028
        let mut tree = MerkleTree::new(&mut storage);
1029
1030
        for i in 0_u32..10 {
1031
            let key = key(i.to_be_bytes());
1032
            tree.update(key, b"DATA").unwrap();
1033
        }
1034
1035
        for i in 5_u32..10 {
1036
            let key = key(i.to_be_bytes());
1037
            tree.delete(key).unwrap();
1038
        }
1039
1040
        let root = tree.root();
1041
        let expected_root =
1042
            "108f731f2414e33ae57e584dc26bd276db07874436b2264ca6e520c658185c6b";
1043
        assert_eq!(hex::encode(root), expected_root);
1044
    }
1045
1046
    #[test]
1047
    fn test_delete_non_existent_key() {
1048
        let mut storage = StorageMap::<TestTable>::new();
1049
        let mut tree = MerkleTree::new(&mut storage);
1050
1051
        tree.update(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
1052
        tree.update(key(b"\x00\x00\x00\x01"), b"DATA").unwrap();
1053
        tree.update(key(b"\x00\x00\x00\x02"), b"DATA").unwrap();
1054
        tree.update(key(b"\x00\x00\x00\x03"), b"DATA").unwrap();
1055
        tree.update(key(b"\x00\x00\x00\x04"), b"DATA").unwrap();
1056
        tree.delete(key(b"\x00\x00\x04\x00")).unwrap();
1057
1058
        let root = tree.root();
1059
        let expected_root =
1060
            "108f731f2414e33ae57e584dc26bd276db07874436b2264ca6e520c658185c6b";
1061
        assert_eq!(hex::encode(root), expected_root);
1062
    }
1063
1064
    #[test]
1065
    fn test_interleaved_update_delete() {
1066
        let mut storage = StorageMap::<TestTable>::new();
1067
        let mut tree = MerkleTree::new(&mut storage);
1068
1069
        for i in 0_u32..10 {
1070
            let key = key(i.to_be_bytes());
1071
            tree.update(key, b"DATA").unwrap();
1072
        }
1073
1074
        for i in 5_u32..15 {
1075
            let key = key(i.to_be_bytes());
1076
            tree.delete(key).unwrap();
1077
        }
1078
1079
        for i in 10_u32..20 {
1080
            let key = key(i.to_be_bytes());
1081
            tree.update(key, b"DATA").unwrap();
1082
        }
1083
1084
        for i in 15_u32..25 {
1085
            let key = key(i.to_be_bytes());
1086
            tree.delete(key).unwrap();
1087
        }
1088
1089
        for i in 20_u32..30 {
1090
            let key = key(i.to_be_bytes());
1091
            tree.update(key, b"DATA").unwrap();
1092
        }
1093
1094
        for i in 25_u32..35 {
1095
            let key = key(i.to_be_bytes());
1096
            tree.delete(key).unwrap();
1097
        }
1098
1099
        let root = tree.root();
1100
        let expected_root =
1101
            "7e6643325042cfe0fc76626c043b97062af51c7e9fc56665f12b479034bce326";
1102
        assert_eq!(hex::encode(root), expected_root);
1103
    }
1104
1105
    #[test]
1106
    fn test_update_removes_old_entries() {
1107
        let mut storage = StorageMap::<TestTable>::new();
1108
        let mut tree = MerkleTree::new(&mut storage);
1109
        let tenth_index = 9u32;
1110
1111
        for i in 0_u32..tenth_index {
1112
            let key = key(i.to_be_bytes());
1113
            tree.update(key, b"DATA").unwrap();
1114
        }
1115
        let size_before_tenth = tree.storage().len();
1116
        let tenth_key = key(tenth_index.to_be_bytes());
1117
1118
        // Given
1119
        tree.update(tenth_key, b"DATA").unwrap();
1120
        let size_after_tenth = tree.storage().len();
1121
        assert_ne!(size_after_tenth, size_before_tenth);
1122
1123
        // When
1124
        tree.update(tenth_key, b"ANOTHER_DATA").unwrap();
1125
1126
        // Then
1127
        assert_eq!(tree.storage().len(), size_after_tenth);
1128
    }
1129
1130
    #[test]
1131
    fn test_update_with_the_same_value_does_not_remove_old_entries() {
1132
        let mut storage = StorageMap::<TestTable>::new();
1133
        let mut tree = MerkleTree::new(&mut storage);
1134
        let tenth_index = 9u32;
1135
1136
        for i in 0_u32..tenth_index {
1137
            let key = key(i.to_be_bytes());
1138
            tree.update(key, b"DATA").unwrap();
1139
        }
1140
        let size_before_tenth = tree.storage().len();
1141
        let tenth_key = key(tenth_index.to_be_bytes());
1142
1143
        // Given
1144
        tree.update(tenth_key, b"DATA").unwrap();
1145
        let size_after_tenth = tree.storage().len();
1146
        assert_ne!(size_after_tenth, size_before_tenth);
1147
1148
        // When
1149
        tree.update(tenth_key, b"DATA").unwrap();
1150
1151
        // Then
1152
        assert_eq!(tree.storage().len(), size_after_tenth);
1153
    }
1154
1155
    #[test]
1156
    fn test_delete_removes_path_entries() {
1157
        let mut storage = StorageMap::<TestTable>::new();
1158
        let mut tree = MerkleTree::new(&mut storage);
1159
        let tenth_index = 9u32;
1160
1161
        for i in 0_u32..tenth_index {
1162
            let key = key(i.to_be_bytes());
1163
            tree.update(key, b"DATA").unwrap();
1164
        }
1165
        let size_before_tenth = tree.storage().len();
1166
        let tenth_key = key(tenth_index.to_be_bytes());
1167
1168
        // Given
1169
        tree.update(tenth_key, b"DATA").unwrap();
1170
        let size_after_tenth = tree.storage().len();
1171
        assert_ne!(size_after_tenth, size_before_tenth);
1172
1173
        // When
1174
        tree.delete(tenth_key).unwrap();
1175
1176
        // Then
1177
        assert_eq!(tree.storage().len(), size_before_tenth);
1178
    }
1179
1180
    #[test]
1181
    fn test_delete_sparse_union() {
1182
        let mut storage = StorageMap::<TestTable>::new();
1183
        let mut tree = MerkleTree::new(&mut storage);
1184
1185
        for i in 0_u32..10 {
1186
            let key = key(i.to_be_bytes());
1187
            tree.update(key, b"DATA").unwrap();
1188
        }
1189
1190
        for i in 0_u32..5 {
1191
            let key = key((i * 2 + 1).to_be_bytes());
1192
            tree.delete(key).unwrap();
1193
        }
1194
1195
        let root = tree.root();
1196
        let expected_root =
1197
            "e912e97abc67707b2e6027338292943b53d01a7fbd7b244674128c7e468dd696";
1198
        assert_eq!(hex::encode(root), expected_root);
1199
    }
1200
1201
    #[test]
1202
    fn test_override_hash_key() {
1203
        use fuel_storage::StorageInspect;
1204
        let mut storage = StorageMap::<TestTable>::new();
1205
        let mut tree = MerkleTree::new(&mut storage);
1206
1207
        let leaf_1_key = key(b"\x00\x00\x00\x00");
1208
        let leaf_1_data = b"DATA_1";
1209
        let leaf_1 = Node::create_leaf(&leaf_1_key.0, leaf_1_data);
1210
1211
        let leaf_2_key = MerkleTreeKey::new_without_hash(*leaf_1.hash());
1212
        let leaf_2_data = b"DATA_2";
1213
        let leaf_2 = Node::create_leaf(&leaf_2_key.0, leaf_2_data);
1214
1215
        tree.update(leaf_2_key, leaf_2_data).unwrap();
1216
        tree.update(leaf_1_key, leaf_1_data).unwrap();
1217
        assert_eq!(
1218
            tree.storage
1219
                .get(leaf_2.hash())
1220
                .unwrap()
1221
                .unwrap()
1222
                .into_owned(),
1223
            leaf_2.as_ref().into()
1224
        );
1225
        assert_eq!(
1226
            tree.storage
1227
                .get(leaf_1.hash())
1228
                .unwrap()
1229
                .unwrap()
1230
                .into_owned(),
1231
            leaf_1.as_ref().into()
1232
        );
1233
    }
1234
1235
    #[test]
1236
    fn test_load_returns_a_valid_tree() {
1237
        // Instantiate a new key-value storage backing and populate it using a sparse
1238
        // Merkle tree. The root of the Merkle tree is the key that maps to the buffer
1239
        // of the root node in the storage. When loading a Merkle tree from storage, we
1240
        // need a reference to the storage object, as well as the root that allows us to
1241
        // look up the buffer of the root node. We will later use this storage backing
1242
        // and root to load a Merkle tree.
1243
        let (mut storage_to_load, root_to_load) = {
1244
            let mut storage = StorageMap::<TestTable>::new();
1245
            let mut tree = MerkleTree::new(&mut storage);
1246
            tree.update(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
1247
            tree.update(key(b"\x00\x00\x00\x01"), b"DATA").unwrap();
1248
            tree.update(key(b"\x00\x00\x00\x02"), b"DATA").unwrap();
1249
            tree.update(key(b"\x00\x00\x00\x03"), b"DATA").unwrap();
1250
            tree.update(key(b"\x00\x00\x00\x04"), b"DATA").unwrap();
1251
            let root = tree.root();
1252
            (storage, root)
1253
        };
1254
1255
        // Generate an expected root for this test by using both the set of `update`
1256
        // data used when generating the loadable storage above and an additional set of
1257
        // `update` data.
1258
        let expected_root = {
1259
            let mut storage = StorageMap::<TestTable>::new();
1260
            let mut tree = MerkleTree::new(&mut storage);
1261
            tree.update(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
1262
            tree.update(key(b"\x00\x00\x00\x01"), b"DATA").unwrap();
1263
            tree.update(key(b"\x00\x00\x00\x02"), b"DATA").unwrap();
1264
            tree.update(key(b"\x00\x00\x00\x03"), b"DATA").unwrap();
1265
            tree.update(key(b"\x00\x00\x00\x04"), b"DATA").unwrap();
1266
            tree.update(key(b"\x00\x00\x00\x05"), b"DATA").unwrap();
1267
            tree.update(key(b"\x00\x00\x00\x06"), b"DATA").unwrap();
1268
            tree.update(key(b"\x00\x00\x00\x07"), b"DATA").unwrap();
1269
            tree.update(key(b"\x00\x00\x00\x08"), b"DATA").unwrap();
1270
            tree.update(key(b"\x00\x00\x00\x09"), b"DATA").unwrap();
1271
            tree.root()
1272
        };
1273
1274
        let root = {
1275
            // Create a Merkle tree by loading the generated storage and root.
1276
            let mut tree = MerkleTree::load(&mut storage_to_load, &root_to_load).unwrap();
1277
            // Build up the loaded tree using the additional set of `update` data so its
1278
            // root matches the expected root. This verifies that the loaded tree has
1279
            // successfully wrapped the given storage backing and assumed the correct
1280
            // state so that future updates can be made seamlessly.
1281
            tree.update(key(b"\x00\x00\x00\x05"), b"DATA").unwrap();
1282
            tree.update(key(b"\x00\x00\x00\x06"), b"DATA").unwrap();
1283
            tree.update(key(b"\x00\x00\x00\x07"), b"DATA").unwrap();
1284
            tree.update(key(b"\x00\x00\x00\x08"), b"DATA").unwrap();
1285
            tree.update(key(b"\x00\x00\x00\x09"), b"DATA").unwrap();
1286
            tree.root()
1287
        };
1288
1289
        assert_eq!(root, expected_root);
1290
    }
1291
1292
    #[test]
1293
    fn test_load_returns_an_empty_tree_for_empty_sum_root() {
1294
        let mut storage = StorageMap::<TestTable>::new();
1295
        let tree = MerkleTree::load(&mut storage, empty_sum()).unwrap();
1296
        let root = tree.root();
1297
1298
        assert_eq!(root, *empty_sum());
1299
    }
1300
1301
    #[test]
1302
    fn test_load_returns_a_load_error_if_the_storage_is_not_valid_for_the_root() {
1303
        let mut storage = StorageMap::<TestTable>::new();
1304
1305
        {
1306
            let mut tree = MerkleTree::new(&mut storage);
1307
            tree.update(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
1308
            tree.update(key(b"\x00\x00\x00\x01"), b"DATA").unwrap();
1309
            tree.update(key(b"\x00\x00\x00\x02"), b"DATA").unwrap();
1310
            tree.update(key(b"\x00\x00\x00\x03"), b"DATA").unwrap();
1311
            tree.update(key(b"\x00\x00\x00\x04"), b"DATA").unwrap();
1312
        }
1313
1314
        let root = &sum(b"\xff\xff\xff\xff");
1315
        let err = MerkleTree::load(&mut storage, root)
1316
            .expect_err("Expected load() to return Error; got Ok");
1317
        assert!(matches!(err, MerkleTreeError::LoadError(_)));
1318
    }
1319
1320
    #[test]
1321
    fn test_load_returns_a_deserialize_error_if_the_storage_is_corrupted() {
1322
        use fuel_storage::StorageMutate;
1323
1324
        let mut storage = StorageMap::<TestTable>::new();
1325
1326
        let mut tree = MerkleTree::new(&mut storage);
1327
        tree.update(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
1328
        tree.update(key(b"\x00\x00\x00\x01"), b"DATA").unwrap();
1329
        tree.update(key(b"\x00\x00\x00\x02"), b"DATA").unwrap();
1330
        tree.update(key(b"\x00\x00\x00\x03"), b"DATA").unwrap();
1331
        tree.update(key(b"\x00\x00\x00\x04"), b"DATA").unwrap();
1332
        let root = tree.root();
1333
1334
        // Overwrite the root key-value with an invalid primitive to create a
1335
        // DeserializeError.
1336
        let primitive = (0xff, 0xff, [0xff; 32], [0xff; 32]);
1337
        storage.insert(&root, &primitive).unwrap();
1338
1339
        let err = MerkleTree::load(&mut storage, &root)
1340
            .expect_err("Expected load() to return Error; got Ok");
1341
        assert!(matches!(err, MerkleTreeError::DeserializeError(_)));
1342
    }
1343
1344
    #[test]
1345
    fn test_from_set_yields_expected_root() {
1346
        let rng = &mut rand::thread_rng();
1347
        let gen = || {
1348
            Some((
1349
                MerkleTreeKey::new_without_hash(random_bytes32(rng)),
1350
                random_bytes32(rng),
1351
            ))
1352
        };
1353
        let data = std::iter::from_fn(gen).take(1_000).collect::<Vec<_>>();
1354
1355
        let expected_root = {
1356
            let mut storage = StorageMap::<TestTable>::new();
1357
            let mut tree = MerkleTree::new(&mut storage);
1358
            let input = data.clone();
1359
            for (key, value) in input.into_iter() {
1360
                tree.update(key, &value).unwrap();
1361
            }
1362
            tree.root()
1363
        };
1364
1365
        let root = {
1366
            let mut storage = StorageMap::<TestTable>::new();
1367
            let tree = MerkleTree::from_set(&mut storage, data.into_iter()).unwrap();
1368
            tree.root()
1369
        };
1370
1371
        assert_eq!(root, expected_root);
1372
    }
1373
1374
    #[test]
1375
    fn test_from_empty_set_yields_expected_root() {
1376
        let rng = &mut rand::thread_rng();
1377
        let gen = || {
1378
            Some((
1379
                MerkleTreeKey::new_without_hash(random_bytes32(rng)),
1380
                random_bytes32(rng),
1381
            ))
1382
        };
1383
        let data = std::iter::from_fn(gen).take(0).collect::<Vec<_>>();
1384
1385
        let expected_root = {
1386
            let mut storage = StorageMap::<TestTable>::new();
1387
            let mut tree = MerkleTree::new(&mut storage);
1388
            let input = data.clone();
1389
            for (key, value) in input.into_iter() {
1390
                tree.update(key, &value).unwrap();
1391
            }
1392
            tree.root()
1393
        };
1394
1395
        let root = {
1396
            let mut storage = StorageMap::<TestTable>::new();
1397
            let tree = MerkleTree::from_set(&mut storage, data.into_iter()).unwrap();
1398
            tree.root()
1399
        };
1400
1401
        assert_eq!(root, expected_root);
1402
    }
1403
1404
    #[test]
1405
    fn test_from_unit_set_yields_expected_root() {
1406
        let rng = &mut rand::thread_rng();
1407
        let gen = || {
1408
            Some((
1409
                MerkleTreeKey::new_without_hash(random_bytes32(rng)),
1410
                random_bytes32(rng),
1411
            ))
1412
        };
1413
        let data = std::iter::from_fn(gen).take(1).collect::<Vec<_>>();
1414
1415
        let expected_root = {
1416
            let mut storage = StorageMap::<TestTable>::new();
1417
            let mut tree = MerkleTree::new(&mut storage);
1418
            let input = data.clone();
1419
            for (key, value) in input.into_iter() {
1420
                tree.update(key, &value).unwrap();
1421
            }
1422
            tree.root()
1423
        };
1424
1425
        let root = {
1426
            let mut storage = StorageMap::<TestTable>::new();
1427
            let tree = MerkleTree::from_set(&mut storage, data.into_iter()).unwrap();
1428
            tree.root()
1429
        };
1430
1431
        assert_eq!(root, expected_root);
1432
    }
1433
1434
    #[test]
1435
    fn test_from_set_with_duplicate_keys_yields_expected_root() {
1436
        let rng = &mut rand::thread_rng();
1437
        let keys = [
1438
            key(b"\x00\x00\x00\x00"),
1439
            key(b"\x00\x00\x00\x01"),
1440
            key(b"\x00\x00\x00\x02"),
1441
        ];
1442
        let data = [
1443
            (keys[0], random_bytes32(rng)),
1444
            (keys[1], random_bytes32(rng)),
1445
            (keys[2], random_bytes32(rng)),
1446
            (keys[0], random_bytes32(rng)),
1447
            (keys[1], random_bytes32(rng)),
1448
            (keys[2], random_bytes32(rng)),
1449
        ];
1450
1451
        let expected_root = {
1452
            let mut storage = StorageMap::<TestTable>::new();
1453
            let mut tree = MerkleTree::new(&mut storage);
1454
            let input = data;
1455
            for (key, value) in input.into_iter() {
1456
                tree.update(key, &value).unwrap();
1457
            }
1458
            tree.root()
1459
        };
1460
1461
        let root = {
1462
            let mut storage = StorageMap::<TestTable>::new();
1463
            let tree = MerkleTree::from_set(&mut storage, data.into_iter()).unwrap();
1464
            tree.root()
1465
        };
1466
1467
        assert_eq!(root, expected_root);
1468
    }
1469
1470
    #[test]
1471
    fn test_from_set_with_empty_data_yields_expected_root() {
1472
        let rng = &mut rand::thread_rng();
1473
        let keys = [
1474
            key(b"\x00\x00\x00\x00"),
1475
            key(b"\x00\x00\x00\x01"),
1476
            key(b"\x00\x00\x00\x02"),
1477
        ];
1478
        let data = [
1479
            (keys[0], random_bytes32(rng).to_vec()),
1480
            (keys[1], random_bytes32(rng).to_vec()),
1481
            (keys[2], random_bytes32(rng).to_vec()),
1482
            (keys[0], b"".to_vec()),
1483
            (keys[1], b"".to_vec()),
1484
            (keys[2], b"".to_vec()),
1485
        ];
1486
1487
        let expected_root = {
1488
            let mut storage = StorageMap::<TestTable>::new();
1489
            let mut tree = MerkleTree::new(&mut storage);
1490
            let input = data.clone();
1491
            for (key, value) in input.into_iter() {
1492
                tree.update(key, &value).unwrap();
1493
            }
1494
            tree.root()
1495
        };
1496
1497
        let root = {
1498
            let mut storage = StorageMap::<TestTable>::new();
1499
            let tree = MerkleTree::from_set(&mut storage, data.into_iter()).unwrap();
1500
            tree.root()
1501
        };
1502
1503
        assert_eq!(root, expected_root);
1504
    }
1505
1506
    #[test]
1507
    fn merkle_tree__generate_proof__returns_proof_with_proof_set_for_given_key() {
1508
        // Given
1509
        let mut storage = StorageMap::<TestTable>::new();
1510
        let mut tree = MerkleTree::new(&mut storage);
1511
1512
        // 256:           N4
1513
        //               /  \
1514
        // 255:         N3   \
1515
        //             /  \   \
1516
        // 254:       /   N2   \
1517
        //           /   /  \   \
1518
        // 253:     /   N1   \   \
1519
        //         /   /  \   \   \
1520
        // 252:   /   N0   \   \   \
1521
        // ...   /   /  \   \   \   \
1522
        //   0: L0  L1  L3  P1  L2  P0
1523
        //      K0  K1  K3      K2
1524
1525
        let k0 = [0u8; 32];
1526
        let v0 = sum(b"DATA");
1527
        tree.update(MerkleTreeKey::new_without_hash(k0), &v0)
1528
            .expect("Expected successful update");
1529
1530
        let mut k1 = [0u8; 32];
1531
        k1[0] = 0b01000000;
1532
        let v1 = sum(b"DATA");
1533
        tree.update(MerkleTreeKey::new_without_hash(k1), &v1)
1534
            .expect("Expected successful update");
1535
1536
        let mut k2 = [0u8; 32];
1537
        k2[0] = 0b01100000;
1538
        let v2 = sum(b"DATA");
1539
        tree.update(MerkleTreeKey::new_without_hash(k2), &v2)
1540
            .expect("Expected successful update");
1541
1542
        let mut k3 = [0u8; 32];
1543
        k3[0] = 0b01001000;
1544
        let v3 = sum(b"DATA");
1545
        tree.update(MerkleTreeKey::new_without_hash(k3), &v3)
1546
            .expect("Expected successful update");
1547
1548
        let l0 = Node::create_leaf(&k0, v0);
1549
        let l1 = Node::create_leaf(&k1, v1);
1550
        let l2 = Node::create_leaf(&k2, v2);
1551
        let l3 = Node::create_leaf(&k3, v3);
1552
        let n0 = Node::create_node(&l1, &l3, 252);
1553
        let n1 = Node::create_node(&n0, &Node::create_placeholder(), 253);
1554
        let n2 = Node::create_node(&n1, &l2, 254);
1555
        let n3 = Node::create_node(&l0, &n2, 255);
1556
1557
        {
1558
            // When
1559
            let proof = tree.generate_proof(&k0.into()).expect("Expected proof");
1560
            let expected_proof_set = [*n2.hash(), *Node::create_placeholder().hash()];
1561
1562
            // Then
1563
            assert_eq!(*proof.proof_set(), expected_proof_set);
1564
        }
1565
1566
        {
1567
            // When
1568
            let proof = tree.generate_proof(&k1.into()).expect("Expected proof");
1569
            let expected_proof_set = [
1570
                *l3.hash(),
1571
                *Node::create_placeholder().hash(),
1572
                *l2.hash(),
1573
                *l0.hash(),
1574
                *Node::create_placeholder().hash(),
1575
            ];
1576
1577
            // Then
1578
            assert_eq!(*proof.proof_set(), expected_proof_set);
1579
        }
1580
1581
        {
1582
            // When
1583
            let proof = tree.generate_proof(&k2.into()).expect("Expected proof");
1584
            let expected_proof_set =
1585
                [*n1.hash(), *l0.hash(), *Node::create_placeholder().hash()];
1586
1587
            // Then
1588
            assert_eq!(*proof.proof_set(), expected_proof_set);
1589
        }
1590
1591
        {
1592
            // When
1593
            let proof = tree.generate_proof(&k3.into()).expect("Expected proof");
1594
            let expected_proof_set = [
1595
                *l1.hash(),
1596
                *Node::create_placeholder().hash(),
1597
                *l2.hash(),
1598
                *l0.hash(),
1599
                *Node::create_placeholder().hash(),
1600
            ];
1601
1602
            // Then
1603
            assert_eq!(*proof.proof_set(), expected_proof_set);
1604
        }
1605
1606
        {
1607
            // Test that supplying an arbitrary leaf "outside" the range of
1608
            // leaves produces a valid proof set
1609
1610
            // When
1611
            let key = [255u8; 32];
1612
            let proof = tree.generate_proof(&key.into()).expect("Expected proof");
1613
            let expected_proof_set = [*n3.hash()];
1614
1615
            // Then
1616
            assert_eq!(*proof.proof_set(), expected_proof_set);
1617
        }
1618
    }
1619
1620
    #[test]
1621
    fn merkle_tree__generate_proof__returns_inclusion_proof_for_included_key() {
1622
        // Given
1623
        let mut storage = StorageMap::<TestTable>::new();
1624
        let mut tree = MerkleTree::new(&mut storage);
1625
1626
        // 256:           N4
1627
        //               /  \
1628
        // 255:         N3   \
1629
        //             /  \   \
1630
        // 254:       /   N2   \
1631
        //           /   /  \   \
1632
        // 253:     /   N1   \   \
1633
        //         /   /  \   \   \
1634
        // 252:   /   N0   \   \   \
1635
        // ...   /   /  \   \   \   \
1636
        //   0: L0  L1  L3  P1  L2  P0
1637
        //      K0  K1  K3      K2
1638
1639
        let k0 = [0u8; 32];
1640
        let v0 = sum(b"DATA");
1641
        tree.update(MerkleTreeKey::new_without_hash(k0), &v0)
1642
            .expect("Expected successful update");
1643
1644
        let mut k1 = [0u8; 32];
1645
        k1[0] = 0b01000000;
1646
        let v1 = sum(b"DATA");
1647
        tree.update(MerkleTreeKey::new_without_hash(k1), &v1)
1648
            .expect("Expected successful update");
1649
1650
        let mut k2 = [0u8; 32];
1651
        k2[0] = 0b01100000;
1652
        let v2 = sum(b"DATA");
1653
        tree.update(MerkleTreeKey::new_without_hash(k2), &v2)
1654
            .expect("Expected successful update");
1655
1656
        let mut k3 = [0u8; 32];
1657
        k3[0] = 0b01001000;
1658
        let v3 = sum(b"DATA");
1659
        tree.update(MerkleTreeKey::new_without_hash(k3), &v3)
1660
            .expect("Expected successful update");
1661
1662
        // When
1663
        let proof = tree.generate_proof(&k1.into()).expect("Expected proof");
1664
1665
        // Then
1666
        assert!(proof.is_inclusion());
1667
    }
1668
1669
    #[test]
1670
    fn merkle_tree__generate_proof__returns_exclusion_proof_for_excluded_key() {
1671
        // Given
1672
        let mut storage = StorageMap::<TestTable>::new();
1673
        let mut tree = MerkleTree::new(&mut storage);
1674
1675
        // 256:           N4
1676
        //               /  \
1677
        // 255:         N3   \
1678
        //             /  \   \
1679
        // 254:       /   N2   \
1680
        //           /   /  \   \
1681
        // 253:     /   N1   \   \
1682
        //         /   /  \   \   \
1683
        // 252:   /   N0   \   \   \
1684
        // ...   /   /  \   \   \   \
1685
        //   0: L0  L1  L3  P1  L2  P0
1686
        //      K0  K1  K3      K2
1687
1688
        let k0 = [0u8; 32];
1689
        let v0 = sum(b"DATA");
1690
        tree.update(MerkleTreeKey::new_without_hash(k0), &v0)
1691
            .expect("Expected successful update");
1692
1693
        let mut k1 = [0u8; 32];
1694
        k1[0] = 0b01000000;
1695
        let v1 = sum(b"DATA");
1696
        tree.update(MerkleTreeKey::new_without_hash(k1), &v1)
1697
            .expect("Expected successful update");
1698
1699
        let mut k2 = [0u8; 32];
1700
        k2[0] = 0b01100000;
1701
        let v2 = sum(b"DATA");
1702
        tree.update(MerkleTreeKey::new_without_hash(k2), &v2)
1703
            .expect("Expected successful update");
1704
1705
        let mut k3 = [0u8; 32];
1706
        k3[0] = 0b01001000;
1707
        let v3 = sum(b"DATA");
1708
        tree.update(MerkleTreeKey::new_without_hash(k3), &v3)
1709
            .expect("Expected successful update");
1710
1711
        // When
1712
        let key = [255u8; 32];
1713
        let proof = tree.generate_proof(&key.into()).expect("Expected proof");
1714
1715
        // Then
1716
        assert!(proof.is_exclusion());
1717
    }
1718
}
/home/marten/fuel/fuel-vm/fuel-merkle/src/sparse/hash.rs
Line
Count
Source
1
use crate::common::{
2
    sum_iter,
3
    Bytes32,
4
    Prefix,
5
};
6
7
8.77k
pub const fn zero_sum() -> &'static Bytes32 {
8
    const ZERO_SUM: Bytes32 = [0; 32];
9
10
8.77k
    &ZERO_SUM
11
8.77k
}
_RNvNtNtCsacfdLYFME8L_11fuel_merkle6sparse4hash8zero_sumCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
7
2.19k
pub const fn zero_sum() -> &'static Bytes32 {
8
    const ZERO_SUM: Bytes32 = [0; 32];
9
10
2.19k
    &ZERO_SUM
11
2.19k
}
_RNvNtNtCsacfdLYFME8L_11fuel_merkle6sparse4hash8zero_sumCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
7
6.57k
pub const fn zero_sum() -> &'static Bytes32 {
8
    const ZERO_SUM: Bytes32 = [0; 32];
9
10
6.57k
    &ZERO_SUM
11
6.57k
}
Unexecuted instantiation: _RNvNtNtCsacfdLYFME8L_11fuel_merkle6sparse4hash8zero_sumB5_
12
13
0
pub fn calculate_hash(
14
0
    prefix: &Prefix,
15
0
    bytes_lo: &Bytes32,
16
0
    bytes_hi: &Bytes32,
17
0
) -> Bytes32 {
18
0
    let input = [prefix.as_ref(), bytes_lo.as_ref(), bytes_hi.as_ref()];
19
0
    sum_iter(input)
20
0
}
21
22
0
pub fn calculate_leaf_hash(leaf_key: &Bytes32, leaf_value: &Bytes32) -> Bytes32 {
23
0
    calculate_hash(&Prefix::Leaf, leaf_key, leaf_value)
24
0
}
25
26
0
pub fn calculate_node_hash(left_child: &Bytes32, right_child: &Bytes32) -> Bytes32 {
27
0
    calculate_hash(&Prefix::Node, left_child, right_child)
28
0
}
/home/marten/fuel/fuel-vm/fuel-types/src/canonical.rs
Line
Count
Source
1
//! Canonical serialization and deserialization of Fuel types.
2
//!
3
//! This module provides the `Serialize` and `Deserialize` traits, which
4
//! allow for automatic serialization and deserialization of Fuel types.
5
6
#![allow(unsafe_code)]
7
8
#[cfg(feature = "alloc")]
9
use alloc::vec::Vec;
10
use core::fmt;
11
12
use core::mem::MaybeUninit;
13
pub use fuel_derive::{
14
    Deserialize,
15
    Serialize,
16
};
17
18
/// Error when serializing or deserializing.
19
#[derive(Debug, Eq, PartialEq)]
20
#[non_exhaustive]
21
pub enum Error {
22
    /// The buffer is to short for writing or reading.
23
    BufferIsTooShort,
24
    /// Got unknown enum's discriminant.
25
    UnknownDiscriminant,
26
    /// Struct prefix (set with `#[canonical(prefix = ...)]`) was invalid.
27
    InvalidPrefix,
28
    /// Allocation too large to be correct.
29
    AllocationLimit,
30
    /// Unknown error.
31
    Unknown(&'static str),
32
}
33
34
impl Error {
35
0
    pub(crate) fn as_str(&self) -> &'static str {
36
0
        match self {
37
0
            Error::BufferIsTooShort => "buffer is too short",
38
0
            Error::UnknownDiscriminant => "unknown discriminant",
39
            Error::InvalidPrefix => {
40
0
                "prefix set with #[canonical(prefix = ...)] was invalid"
41
            }
42
0
            Error::AllocationLimit => "allocation too large",
43
0
            Error::Unknown(str) => str,
44
        }
45
0
    }
46
}
47
48
impl fmt::Display for Error {
49
    /// Shows a human-readable description of the `Error`.
50
0
    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
51
0
        fmt.write_str(self.as_str())
52
0
    }
53
}
54
55
/// Allows writing of data.
56
pub trait Output {
57
    /// Write bytes to the output buffer.
58
    fn write(&mut self, bytes: &[u8]) -> Result<(), Error>;
59
60
    /// Write a single byte to the output buffer.
61
755k
    fn push_byte(&mut self, byte: u8) -> Result<(), Error> {
62
755k
        self.write(&[byte])
63
755k
    }
Unexecuted instantiation: _RNvYINtNtCs5vansr6XbJU_5alloc3vec3VechENtNtCsklA9joyWMfk_10fuel_types9canonical6Output9push_byteCs9ElU2YR0Zcw_12fuel_vm_fuzz
_RNvYINtNtCs5vansr6XbJU_5alloc3vec3VechENtNtCsklA9joyWMfk_10fuel_types9canonical6Output9push_byteCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
61
376k
    fn push_byte(&mut self, byte: u8) -> Result<(), Error> {
62
376k
        self.write(&[byte])
63
376k
    }
_RNvYQShNtNtCsklA9joyWMfk_10fuel_types9canonical6Output9push_byteCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
61
13.1k
    fn push_byte(&mut self, byte: u8) -> Result<(), Error> {
62
13.1k
        self.write(&[byte])
63
13.1k
    }
_RNvYINtNtCs5vansr6XbJU_5alloc3vec3VechENtNtCsklA9joyWMfk_10fuel_types9canonical6Output9push_byteCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
61
366k
    fn push_byte(&mut self, byte: u8) -> Result<(), Error> {
62
366k
        self.write(&[byte])
63
366k
    }
Unexecuted instantiation: _RNvYINtNtCs5vansr6XbJU_5alloc3vec3VechENtNtCsklA9joyWMfk_10fuel_types9canonical6Output9push_byteCs6P3fQNJKMy0_8fuel_asm
Unexecuted instantiation: _RNvYINtNtCs5vansr6XbJU_5alloc3vec3VechENtNtCsklA9joyWMfk_10fuel_types9canonical6Output9push_byteBF_
Unexecuted instantiation: _RNvYQShNtNtCsklA9joyWMfk_10fuel_types9canonical6Output9push_byteB9_
64
}
65
66
/// Allows serialize the type into the `Output`.
67
/// https://github.com/FuelLabs/fuel-specs/blob/master/specs/protocol/tx_format.md#transaction
68
pub trait Serialize {
69
    /// !INTERNAL USAGE ONLY!
70
    /// Array of bytes that are now aligned by themselves.
71
    #[doc(hidden)]
72
    const UNALIGNED_BYTES: bool = false;
73
74
    /// Size of the static part of the serialized object, in bytes.
75
    /// Saturates to usize::MAX on overflow.
76
    fn size_static(&self) -> usize;
77
78
    /// Size of the dynamic part, in bytes.
79
    /// Saturates to usize::MAX on overflow.
80
    fn size_dynamic(&self) -> usize;
81
82
    /// Total size of the serialized object, in bytes.
83
    /// Saturates to usize::MAX on overflow.
84
1.99M
    fn size(&self) -> usize {
85
1.99M
        self.size_static().saturating_add(self.size_dynamic())
86
1.99M
    }
_RNvYNtNtCsg6P9hFxt0iW_7fuel_vm4call4CallNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeCs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
84
2.19k
    fn size(&self) -> usize {
85
2.19k
        self.size_static().saturating_add(self.size_dynamic())
86
2.19k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeCsg6P9hFxt0iW_7fuel_vm
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
84
30.7k
    fn size(&self) -> usize {
85
30.7k
        self.size_static().saturating_add(self.size_dynamic())
86
30.7k
    }
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
84
52.6k
    fn size(&self) -> usize {
85
52.6k
        self.size_static().saturating_add(self.size_dynamic())
86
52.6k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1D_14UploadMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeCsg6P9hFxt0iW_7fuel_vm
_RNvYNtNtCseSMGV7FMBK4_7fuel_tx11transaction11TransactionNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
84
4.38k
    fn size(&self) -> usize {
85
4.38k
        self.size_static().saturating_add(self.size_dynamic())
86
4.38k
    }
_RNvYNtNtCseSMGV7FMBK4_7fuel_tx7receipt7ReceiptNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
84
924k
    fn size(&self) -> usize {
85
924k
        self.size_static().saturating_add(self.size_dynamic())
86
924k
    }
Unexecuted instantiation: _RNvYNtNtCsg6P9hFxt0iW_7fuel_vm4call4CallNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeB6_
_RNvYNtNtCsg6P9hFxt0iW_7fuel_vm4call9CallFrameNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeB6_
Line
Count
Source
84
12.3k
    fn size(&self) -> usize {
85
12.3k
        self.size_static().saturating_add(self.size_dynamic())
86
12.3k
    }
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32NtNtB6_9canonical9Serialize4sizeCsg6P9hFxt0iW_7fuel_vm
_RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5InputNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
84
135k
    fn size(&self) -> usize {
85
135k
        self.size_static().saturating_add(self.size_dynamic())
86
135k
    }
_RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output6OutputNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
84
142k
    fn size(&self) -> usize {
85
142k
        self.size_static().saturating_add(self.size_dynamic())
86
142k
    }
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeCsg6P9hFxt0iW_7fuel_vm
_RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witness7WitnessNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
84
146k
    fn size(&self) -> usize {
85
146k
        self.size_static().saturating_add(self.size_dynamic())
86
146k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeBb_
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeBb_
Line
Count
Source
84
26.3k
    fn size(&self) -> usize {
85
26.3k
        self.size_static().saturating_add(self.size_dynamic())
86
26.3k
    }
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeBb_
Line
Count
Source
84
4.38k
    fn size(&self) -> usize {
85
4.38k
        self.size_static().saturating_add(self.size_dynamic())
86
4.38k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1D_14UploadMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeBb_
Unexecuted instantiation: _RNvYNtNtCseSMGV7FMBK4_7fuel_tx10tx_pointer9TxPointerNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeB6_
Unexecuted instantiation: _RNvYNtNtCseSMGV7FMBK4_7fuel_tx11transaction11TransactionNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeB6_
Unexecuted instantiation: _RNvYNtNtCseSMGV7FMBK4_7fuel_tx7receipt7ReceiptNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeB6_
Unexecuted instantiation: _RNvYNtNtCseSMGV7FMBK4_7fuel_tx8contract8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32NtNtB6_9canonical9Serialize4sizeCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvYNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction4repr15TransactionReprNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeB8_
Unexecuted instantiation: _RNvYNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8policies8PoliciesNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeB8_
Unexecuted instantiation: _RNvYNtNtNtCseSMGV7FMBK4_7fuel_tx7receipt13script_result21ScriptExecutionResultNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeB8_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blob8BlobBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mint4MintNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeBa_
_RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5InputNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeBa_
Line
Count
Source
84
107k
    fn size(&self) -> usize {
85
107k
        self.size_static().saturating_add(self.size_dynamic())
86
107k
    }
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6create10CreateBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeBa_
_RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output6OutputNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeBa_
Line
Count
Source
84
81.1k
    fn size(&self) -> usize {
85
81.1k
        self.size_static().saturating_add(self.size_dynamic())
86
81.1k
    }
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6script10ScriptBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6script10ScriptCodeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6upload10UploadBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrade11UpgradeBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrade14UpgradePurposeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_id6UtxoIdNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeBa_
_RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witness7WitnessNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeBa_
Line
Count
Source
84
63.5k
    fn size(&self) -> usize {
85
63.5k
        self.size_static().saturating_add(self.size_dynamic())
86
63.5k
    }
Unexecuted instantiation: _RNvYNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4repr9InputReprNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeBc_
Unexecuted instantiation: _RNvYNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input8contract8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeBc_
Unexecuted instantiation: _RNvYNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input9predicate13PredicateCodeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeBc_
Unexecuted instantiation: _RNvYNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output8contract8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeBc_
_RNvYyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
84
259k
    fn size(&self) -> usize {
85
259k
        self.size_static().saturating_add(self.size_dynamic())
86
259k
    }
Unexecuted instantiation: _RNvYNtNtCs6P3fQNJKMy0_8fuel_asm17panic_instruction16PanicInstructionNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types10ContractIdNtNtB6_9canonical9Serialize4sizeB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types4SaltNtNtB6_9canonical9Serialize4sizeB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types4TxIdNtNtB6_9canonical9Serialize4sizeB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types5NonceNtNtB6_9canonical9Serialize4sizeB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types6BlobIdNtNtB6_9canonical9Serialize4sizeB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types6Bytes4NtNtB6_9canonical9Serialize4sizeB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types6Bytes8NtNtB6_9canonical9Serialize4sizeB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types7AddressNtNtB6_9canonical9Serialize4sizeB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types7AssetIdNtNtB6_9canonical9Serialize4sizeB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes20NtNtB6_9canonical9Serialize4sizeB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32NtNtB6_9canonical9Serialize4sizeB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes64NtNtB6_9canonical9Serialize4sizeB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types9MessageIdNtNtB6_9canonical9Serialize4sizeB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types13numeric_types11BlockHeightNtNtB6_9canonical9Serialize4sizeB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types13numeric_types7ChainIdNtNtB6_9canonical9Serialize4sizeB6_
Unexecuted instantiation: _RNvYhNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeB7_
Unexecuted instantiation: _RNvYjNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeB7_
Unexecuted instantiation: _RNvYmNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeB7_
Unexecuted instantiation: _RNvYoNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeB7_
Unexecuted instantiation: _RNvYtNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeB7_
Unexecuted instantiation: _RNvYuNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeB7_
Unexecuted instantiation: _RNvYyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize4sizeB7_
87
88
    /// Encodes `Self` into the `buffer`.
89
    ///
90
    /// It is better to not implement this function directly, instead implement
91
    /// `encode_static` and `encode_dynamic`.
92
2.27M
    fn encode<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
93
2.27M
        self.encode_static(buffer)?;
94
2.27M
        self.encode_dynamic(buffer)
95
2.27M
    }
_RINvYNtNtCsg6P9hFxt0iW_7fuel_vm4call4CallNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEECs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
92
2.19k
    fn encode<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
93
2.19k
        self.encode_static(buffer)?;
94
2.19k
        self.encode_dynamic(buffer)
95
2.19k
    }
Unexecuted instantiation: _RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB8_4blob8BlobBodyNtB1E_12BlobMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
_RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB8_6create10CreateBodyNtB1E_14CreateMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
92
4.38k
    fn encode<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
93
4.38k
        self.encode_static(buffer)?;
94
4.38k
        self.encode_dynamic(buffer)
95
4.38k
    }
_RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB8_6script10ScriptBodyNtB1E_14ScriptMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
92
4.38k
    fn encode<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
93
4.38k
        self.encode_static(buffer)?;
94
4.38k
        self.encode_dynamic(buffer)
95
4.38k
    }
Unexecuted instantiation: _RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB8_6upload10UploadBodyNtB1E_14UploadMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB8_7upgrade11UpgradeBodyNtB1E_15UpgradeMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
_RINvYNtNtCseSMGV7FMBK4_7fuel_tx7receipt7ReceiptNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
92
924k
    fn encode<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
93
924k
        self.encode_static(buffer)?;
94
924k
        self.encode_dynamic(buffer)
95
924k
    }
Unexecuted instantiation: _RINvYNtNtCsg6P9hFxt0iW_7fuel_vm4call4CallNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
_RINvYNtNtCsg6P9hFxt0iW_7fuel_vm4call9CallFrameNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Line
Count
Source
92
12.3k
    fn encode<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
93
12.3k
        self.encode_static(buffer)?;
94
12.3k
        self.encode_dynamic(buffer)
95
12.3k
    }
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32NtNtB7_9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
_RINvYNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction4repr15TransactionReprNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
92
8.77k
    fn encode<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
93
8.77k
        self.encode_static(buffer)?;
94
8.77k
        self.encode_dynamic(buffer)
95
8.77k
    }
_RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5InputNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
92
13.1k
    fn encode<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
93
13.1k
        self.encode_static(buffer)?;
94
13.1k
        self.encode_dynamic(buffer)
95
13.1k
    }
_RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output6OutputNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
92
13.1k
    fn encode<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
93
13.1k
        self.encode_static(buffer)?;
94
13.1k
        self.encode_dynamic(buffer)
95
13.1k
    }
_RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output6OutputNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeQShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
92
6.57k
    fn encode<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
93
6.57k
        self.encode_static(buffer)?;
94
6.57k
        self.encode_dynamic(buffer)
95
6.57k
    }
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
_RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witness7WitnessNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
92
6.57k
    fn encode<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
93
6.57k
        self.encode_static(buffer)?;
94
6.57k
        self.encode_dynamic(buffer)
95
6.57k
    }
_RINvYyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
92
1.03M
    fn encode<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
93
1.03M
        self.encode_static(buffer)?;
94
1.03M
        self.encode_dynamic(buffer)
95
1.03M
    }
_RINvYyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeQShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
92
6.57k
    fn encode<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
93
6.57k
        self.encode_static(buffer)?;
94
6.57k
        self.encode_dynamic(buffer)
95
6.57k
    }
Unexecuted instantiation: _RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB8_4blob8BlobBodyNtB1E_12BlobMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEBc_
_RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB8_6create10CreateBodyNtB1E_14CreateMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEBc_
Line
Count
Source
92
4.38k
    fn encode<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
93
4.38k
        self.encode_static(buffer)?;
94
4.38k
        self.encode_dynamic(buffer)
95
4.38k
    }
_RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB8_6script10ScriptBodyNtB1E_14ScriptMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEBc_
Line
Count
Source
92
4.38k
    fn encode<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
93
4.38k
        self.encode_static(buffer)?;
94
4.38k
        self.encode_dynamic(buffer)
95
4.38k
    }
Unexecuted instantiation: _RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB8_6upload10UploadBodyNtB1E_14UploadMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEBc_
Unexecuted instantiation: _RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB8_7upgrade11UpgradeBodyNtB1E_15UpgradeMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEBc_
Unexecuted instantiation: _RINvYNtNtCseSMGV7FMBK4_7fuel_tx10tx_pointer9TxPointerNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvYNtNtCseSMGV7FMBK4_7fuel_tx11transaction11TransactionNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvYNtNtCseSMGV7FMBK4_7fuel_tx7receipt7ReceiptNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvYNtNtCseSMGV7FMBK4_7fuel_tx8contract8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32NtNtB7_9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
_RINvYNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction4repr15TransactionReprNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB9_
Line
Count
Source
92
8.77k
    fn encode<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
93
8.77k
        self.encode_static(buffer)?;
94
8.77k
        self.encode_dynamic(buffer)
95
8.77k
    }
Unexecuted instantiation: _RINvYNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8policies8PoliciesNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB9_
Unexecuted instantiation: _RINvYNtNtNtCseSMGV7FMBK4_7fuel_tx7receipt13script_result21ScriptExecutionResultNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB9_
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blob8BlobBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mint4MintNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
_RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5InputNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Line
Count
Source
92
13.1k
    fn encode<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
93
13.1k
        self.encode_static(buffer)?;
94
13.1k
        self.encode_dynamic(buffer)
95
13.1k
    }
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6create10CreateBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
_RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output6OutputNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Line
Count
Source
92
13.1k
    fn encode<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
93
13.1k
        self.encode_static(buffer)?;
94
13.1k
        self.encode_dynamic(buffer)
95
13.1k
    }
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6script10ScriptBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6script10ScriptCodeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6upload10UploadBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrade11UpgradeBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrade14UpgradePurposeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_id6UtxoIdNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witness7WitnessNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEBb_
Unexecuted instantiation: _RINvYNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4repr9InputReprNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEBd_
Unexecuted instantiation: _RINvYNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input8contract8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEBd_
Unexecuted instantiation: _RINvYNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input9predicate13PredicateCodeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEBd_
Unexecuted instantiation: _RINvYNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output8contract8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEBd_
_RINvYyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
92
194k
    fn encode<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
93
194k
        self.encode_static(buffer)?;
94
194k
        self.encode_dynamic(buffer)
95
194k
    }
Unexecuted instantiation: _RINvYNtNtCs6P3fQNJKMy0_8fuel_asm17panic_instruction16PanicInstructionNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types10ContractIdNtNtB7_9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types4SaltNtNtB7_9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types4TxIdNtNtB7_9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types5NonceNtNtB7_9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types6BlobIdNtNtB7_9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types6Bytes4NtNtB7_9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types6Bytes8NtNtB7_9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types7AddressNtNtB7_9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types7AssetIdNtNtB7_9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes20NtNtB7_9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32NtNtB7_9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes64NtNtB7_9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types9MessageIdNtNtB7_9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types13numeric_types11BlockHeightNtNtB7_9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types13numeric_types7ChainIdNtNtB7_9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvYhNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
Unexecuted instantiation: _RINvYjNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
Unexecuted instantiation: _RINvYmNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
Unexecuted instantiation: _RINvYoNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
Unexecuted instantiation: _RINvYtNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
Unexecuted instantiation: _RINvYuNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
Unexecuted instantiation: _RINvYyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize6encodeINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
96
97
    /// Encodes staticly-sized part of `Self`.
98
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error>;
99
100
    /// Encodes dynamically-sized part of `Self`.
101
    /// The default implementation does nothing. Dynamically-sized contains should
102
    /// override this.
103
58.6M
    fn encode_dynamic<O: Output + ?Sized>(&self, _buffer: &mut O) -> Result<(), Error> {
104
58.6M
        Ok(())
105
58.6M
    }
_RINvYyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
103
4.38k
    fn encode_dynamic<O: Output + ?Sized>(&self, _buffer: &mut O) -> Result<(), Error> {
104
4.38k
        Ok(())
105
4.38k
    }
_RINvYhNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
103
70.1k
    fn encode_dynamic<O: Output + ?Sized>(&self, _buffer: &mut O) -> Result<(), Error> {
104
70.1k
        Ok(())
105
70.1k
    }
_RINvYyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
103
7.02M
    fn encode_dynamic<O: Output + ?Sized>(&self, _buffer: &mut O) -> Result<(), Error> {
104
7.02M
        Ok(())
105
7.02M
    }
_RINvYmNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
103
15.3k
    fn encode_dynamic<O: Output + ?Sized>(&self, _buffer: &mut O) -> Result<(), Error> {
104
15.3k
        Ok(())
105
15.3k
    }
_RINvYtNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
103
43.8k
    fn encode_dynamic<O: Output + ?Sized>(&self, _buffer: &mut O) -> Result<(), Error> {
104
43.8k
        Ok(())
105
43.8k
    }
_RINvYyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicQShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
103
8.77k
    fn encode_dynamic<O: Output + ?Sized>(&self, _buffer: &mut O) -> Result<(), Error> {
104
8.77k
        Ok(())
105
8.77k
    }
_RINvYtNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicQShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
103
2.19k
    fn encode_dynamic<O: Output + ?Sized>(&self, _buffer: &mut O) -> Result<(), Error> {
104
2.19k
        Ok(())
105
2.19k
    }
_RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5EmptyINtNtCs5vansr6XbJU_5alloc3vec3VechEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicB13_ECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
103
8.77k
    fn encode_dynamic<O: Output + ?Sized>(&self, _buffer: &mut O) -> Result<(), Error> {
104
8.77k
        Ok(())
105
8.77k
    }
_RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5EmptyNtNtB6_9predicate13PredicateCodeENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
103
8.77k
    fn encode_dynamic<O: Output + ?Sized>(&self, _buffer: &mut O) -> Result<(), Error> {
104
8.77k
        Ok(())
105
8.77k
    }
Unexecuted instantiation: _RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5EmptytENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
_RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5EmptyyENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
103
8.77k
    fn encode_dynamic<O: Output + ?Sized>(&self, _buffer: &mut O) -> Result<(), Error> {
104
8.77k
        Ok(())
105
8.77k
    }
_RINvYhNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
103
48.1M
    fn encode_dynamic<O: Output + ?Sized>(&self, _buffer: &mut O) -> Result<(), Error> {
104
48.1M
        Ok(())
105
48.1M
    }
_RINvYhNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicQShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
103
421k
    fn encode_dynamic<O: Output + ?Sized>(&self, _buffer: &mut O) -> Result<(), Error> {
104
421k
        Ok(())
105
421k
    }
_RINvYjNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
103
12.3k
    fn encode_dynamic<O: Output + ?Sized>(&self, _buffer: &mut O) -> Result<(), Error> {
104
12.3k
        Ok(())
105
12.3k
    }
_RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5EmptyINtNtCs5vansr6XbJU_5alloc3vec3VechEENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicB13_EBc_
Line
Count
Source
103
8.77k
    fn encode_dynamic<O: Output + ?Sized>(&self, _buffer: &mut O) -> Result<(), Error> {
104
8.77k
        Ok(())
105
8.77k
    }
_RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5EmptyNtNtB6_9predicate13PredicateCodeENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBc_
Line
Count
Source
103
8.77k
    fn encode_dynamic<O: Output + ?Sized>(&self, _buffer: &mut O) -> Result<(), Error> {
104
8.77k
        Ok(())
105
8.77k
    }
Unexecuted instantiation: _RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5EmptytENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBc_
_RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5EmptyyENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEBc_
Line
Count
Source
103
8.77k
    fn encode_dynamic<O: Output + ?Sized>(&self, _buffer: &mut O) -> Result<(), Error> {
104
8.77k
        Ok(())
105
8.77k
    }
_RINvYhNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
103
2.52M
    fn encode_dynamic<O: Output + ?Sized>(&self, _buffer: &mut O) -> Result<(), Error> {
104
2.52M
        Ok(())
105
2.52M
    }
_RINvYtNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
103
43.8k
    fn encode_dynamic<O: Output + ?Sized>(&self, _buffer: &mut O) -> Result<(), Error> {
104
43.8k
        Ok(())
105
43.8k
    }
_RINvYyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
103
211k
    fn encode_dynamic<O: Output + ?Sized>(&self, _buffer: &mut O) -> Result<(), Error> {
104
211k
        Ok(())
105
211k
    }
_RINvYmNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
103
13.1k
    fn encode_dynamic<O: Output + ?Sized>(&self, _buffer: &mut O) -> Result<(), Error> {
104
13.1k
        Ok(())
105
13.1k
    }
Unexecuted instantiation: _RINvYmNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECs6P3fQNJKMy0_8fuel_asm
Unexecuted instantiation: _RINvYhNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
Unexecuted instantiation: _RINvYjNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
Unexecuted instantiation: _RINvYmNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
Unexecuted instantiation: _RINvYoNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
Unexecuted instantiation: _RINvYtNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
Unexecuted instantiation: _RINvYuNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
Unexecuted instantiation: _RINvYyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
106
107
    /// Encodes `Self` into bytes vector. Required known size.
108
    #[cfg(feature = "alloc")]
109
1.04M
    fn to_bytes(&self) -> Vec<u8> {
110
1.04M
        let mut vec = Vec::with_capacity(self.size());
111
1.04M
        self.encode(&mut vec).expect("Unable to encode self");
112
1.04M
        vec
113
1.04M
    }
_RNvYNtNtCsg6P9hFxt0iW_7fuel_vm4call4CallNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesCs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
109
2.19k
    fn to_bytes(&self) -> Vec<u8> {
110
2.19k
        let mut vec = Vec::with_capacity(self.size());
111
2.19k
        self.encode(&mut vec).expect("Unable to encode self");
112
2.19k
        vec
113
2.19k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesCsg6P9hFxt0iW_7fuel_vm
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
109
4.38k
    fn to_bytes(&self) -> Vec<u8> {
110
4.38k
        let mut vec = Vec::with_capacity(self.size());
111
4.38k
        self.encode(&mut vec).expect("Unable to encode self");
112
4.38k
        vec
113
4.38k
    }
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
109
4.38k
    fn to_bytes(&self) -> Vec<u8> {
110
4.38k
        let mut vec = Vec::with_capacity(self.size());
111
4.38k
        self.encode(&mut vec).expect("Unable to encode self");
112
4.38k
        vec
113
4.38k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1D_14UploadMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesCsg6P9hFxt0iW_7fuel_vm
_RNvYNtNtCseSMGV7FMBK4_7fuel_tx7receipt7ReceiptNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
109
924k
    fn to_bytes(&self) -> Vec<u8> {
110
924k
        let mut vec = Vec::with_capacity(self.size());
111
924k
        self.encode(&mut vec).expect("Unable to encode self");
112
924k
        vec
113
924k
    }
Unexecuted instantiation: _RNvYNtNtCsg6P9hFxt0iW_7fuel_vm4call4CallNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesB6_
_RNvYNtNtCsg6P9hFxt0iW_7fuel_vm4call9CallFrameNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesB6_
Line
Count
Source
109
12.3k
    fn to_bytes(&self) -> Vec<u8> {
110
12.3k
        let mut vec = Vec::with_capacity(self.size());
111
12.3k
        self.encode(&mut vec).expect("Unable to encode self");
112
12.3k
        vec
113
12.3k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_4blob8BlobBodyNtB1D_12BlobMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesBb_
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6create10CreateBodyNtB1D_14CreateMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesBb_
Line
Count
Source
109
4.38k
    fn to_bytes(&self) -> Vec<u8> {
110
4.38k
        let mut vec = Vec::with_capacity(self.size());
111
4.38k
        self.encode(&mut vec).expect("Unable to encode self");
112
4.38k
        vec
113
4.38k
    }
_RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6script10ScriptBodyNtB1D_14ScriptMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesBb_
Line
Count
Source
109
4.38k
    fn to_bytes(&self) -> Vec<u8> {
110
4.38k
        let mut vec = Vec::with_capacity(self.size());
111
4.38k
        self.encode(&mut vec).expect("Unable to encode self");
112
4.38k
        vec
113
4.38k
    }
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_6upload10UploadBodyNtB1D_14UploadMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesBb_
Unexecuted instantiation: _RNvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types22chargeable_transaction21ChargeableTransactionNtNtB7_7upgrade11UpgradeBodyNtB1D_15UpgradeMetadataENtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesBb_
Unexecuted instantiation: _RNvYNtNtCseSMGV7FMBK4_7fuel_tx10tx_pointer9TxPointerNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesB6_
Unexecuted instantiation: _RNvYNtNtCseSMGV7FMBK4_7fuel_tx11transaction11TransactionNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesB6_
Unexecuted instantiation: _RNvYNtNtCseSMGV7FMBK4_7fuel_tx7receipt7ReceiptNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesB6_
Unexecuted instantiation: _RNvYNtNtCseSMGV7FMBK4_7fuel_tx8contract8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesB6_
Unexecuted instantiation: _RNvYNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction4repr15TransactionReprNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesB8_
Unexecuted instantiation: _RNvYNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8policies8PoliciesNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesB8_
Unexecuted instantiation: _RNvYNtNtNtCseSMGV7FMBK4_7fuel_tx7receipt13script_result21ScriptExecutionResultNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesB8_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blob8BlobBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mint4MintNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5InputNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6create10CreateBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output6OutputNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6script10ScriptBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6script10ScriptCodeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6upload10UploadBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrade11UpgradeBodyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrade14UpgradePurposeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_id6UtxoIdNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witness7WitnessNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesBa_
Unexecuted instantiation: _RNvYNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4repr9InputReprNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesBc_
Unexecuted instantiation: _RNvYNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input8contract8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesBc_
Unexecuted instantiation: _RNvYNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input9predicate13PredicateCodeNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesBc_
Unexecuted instantiation: _RNvYNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output8contract8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesBc_
_RNvYyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
109
88.9k
    fn to_bytes(&self) -> Vec<u8> {
110
88.9k
        let mut vec = Vec::with_capacity(self.size());
111
88.9k
        self.encode(&mut vec).expect("Unable to encode self");
112
88.9k
        vec
113
88.9k
    }
Unexecuted instantiation: _RNvYNtNtCs6P3fQNJKMy0_8fuel_asm17panic_instruction16PanicInstructionNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types10ContractIdNtNtB6_9canonical9Serialize8to_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types4SaltNtNtB6_9canonical9Serialize8to_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types4TxIdNtNtB6_9canonical9Serialize8to_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types5NonceNtNtB6_9canonical9Serialize8to_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types6BlobIdNtNtB6_9canonical9Serialize8to_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types6Bytes4NtNtB6_9canonical9Serialize8to_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types6Bytes8NtNtB6_9canonical9Serialize8to_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types7AddressNtNtB6_9canonical9Serialize8to_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types7AssetIdNtNtB6_9canonical9Serialize8to_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes20NtNtB6_9canonical9Serialize8to_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32NtNtB6_9canonical9Serialize8to_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes64NtNtB6_9canonical9Serialize8to_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types9MessageIdNtNtB6_9canonical9Serialize8to_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types13numeric_types11BlockHeightNtNtB6_9canonical9Serialize8to_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types13numeric_types7ChainIdNtNtB6_9canonical9Serialize8to_bytesB6_
Unexecuted instantiation: _RNvYhNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesB7_
Unexecuted instantiation: _RNvYjNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesB7_
Unexecuted instantiation: _RNvYmNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesB7_
Unexecuted instantiation: _RNvYoNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesB7_
Unexecuted instantiation: _RNvYtNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesB7_
Unexecuted instantiation: _RNvYuNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesB7_
Unexecuted instantiation: _RNvYyNtNtCsklA9joyWMfk_10fuel_types9canonical9Serialize8to_bytesB7_
114
}
115
116
/// Allows reading of data into a slice.
117
pub trait Input {
118
    /// Returns the remaining length of the input data.
119
    fn remaining(&mut self) -> usize;
120
121
    /// Peek the exact number of bytes required to fill the given buffer.
122
    fn peek(&self, buf: &mut [u8]) -> Result<(), Error>;
123
124
    /// Read the exact number of bytes required to fill the given buffer.
125
    fn read(&mut self, buf: &mut [u8]) -> Result<(), Error>;
126
127
    /// Peek a single byte from the input.
128
0
    fn peek_byte(&mut self) -> Result<u8, Error> {
129
0
        let mut buf = [0u8];
130
0
        self.peek(&mut buf[..])?;
131
0
        Ok(buf[0])
132
0
    }
133
134
    /// Read a single byte from the input.
135
1.98M
    fn read_byte(&mut self) -> Result<u8, Error> {
136
1.98M
        let mut buf = [0u8];
137
1.98M
        self.read(&mut buf[..])?;
138
1.98M
        Ok(buf[0])
139
1.98M
    }
_RNvYRShNtNtCsklA9joyWMfk_10fuel_types9canonical5Input9read_byteCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
135
1.98M
    fn read_byte(&mut self) -> Result<u8, Error> {
136
1.98M
        let mut buf = [0u8];
137
1.98M
        self.read(&mut buf[..])?;
138
1.98M
        Ok(buf[0])
139
1.98M
    }
Unexecuted instantiation: _RNvYRShNtNtCsklA9joyWMfk_10fuel_types9canonical5Input9read_byteCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvYRShNtNtCsklA9joyWMfk_10fuel_types9canonical5Input9read_byteB9_
140
141
    /// Skips next `n` bytes.
142
    fn skip(&mut self, n: usize) -> Result<(), Error>;
143
}
144
145
/// Allows deserialize the type from the `Input`.
146
/// https://github.com/FuelLabs/fuel-specs/blob/master/specs/protocol/tx_format.md#transaction
147
pub trait Deserialize: Sized {
148
    /// !INTERNAL USAGE ONLY!
149
    /// Array of bytes that are now aligned by themselves.
150
    #[doc(hidden)]
151
    const UNALIGNED_BYTES: bool = false;
152
153
    /// Decodes `Self` from the `buffer`.
154
    ///
155
    /// It is better to not implement this function directly, instead implement
156
    /// `decode_static` and `decode_dynamic`.
157
115k
    fn decode<I: Input + ?Sized>(buffer: &mut I) -> Result<Self, Error> {
158
115k
        let mut object = Self::decode_static(buffer)?;
159
115k
        object.decode_dynamic(buffer)?;
160
115k
        Ok(object)
161
115k
    }
_RINvYNtNtCseSMGV7FMBK4_7fuel_tx11transaction11TransactionNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
157
4.38k
    fn decode<I: Input + ?Sized>(buffer: &mut I) -> Result<Self, Error> {
158
4.38k
        let mut object = Self::decode_static(buffer)?;
159
4.38k
        object.decode_dynamic(buffer)?;
160
4.38k
        Ok(object)
161
4.38k
    }
_RINvYNtNtCsg6P9hFxt0iW_7fuel_vm4call4CallNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEB7_
Line
Count
Source
157
12.3k
    fn decode<I: Input + ?Sized>(buffer: &mut I) -> Result<Self, Error> {
158
12.3k
        let mut object = Self::decode_static(buffer)?;
159
12.3k
        object.decode_dynamic(buffer)?;
160
12.3k
        Ok(object)
161
12.3k
    }
Unexecuted instantiation: _RINvYNtNtCsg6P9hFxt0iW_7fuel_vm4call9CallFrameNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32NtNtB7_9canonical11Deserialize6decodeRShECsg6P9hFxt0iW_7fuel_vm
_RINvYNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction4repr15TransactionReprNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
157
4.38k
    fn decode<I: Input + ?Sized>(buffer: &mut I) -> Result<Self, Error> {
158
4.38k
        let mut object = Self::decode_static(buffer)?;
159
4.38k
        object.decode_dynamic(buffer)?;
160
4.38k
        Ok(object)
161
4.38k
    }
_RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5InputNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
157
6.57k
    fn decode<I: Input + ?Sized>(buffer: &mut I) -> Result<Self, Error> {
158
6.57k
        let mut object = Self::decode_static(buffer)?;
159
6.57k
        object.decode_dynamic(buffer)?;
160
6.57k
        Ok(object)
161
6.57k
    }
_RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output6OutputNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
157
6.57k
    fn decode<I: Input + ?Sized>(buffer: &mut I) -> Result<Self, Error> {
158
6.57k
        let mut object = Self::decode_static(buffer)?;
159
6.57k
        object.decode_dynamic(buffer)?;
160
6.57k
        Ok(object)
161
6.57k
    }
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShECsg6P9hFxt0iW_7fuel_vm
_RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witness7WitnessNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
157
6.57k
    fn decode<I: Input + ?Sized>(buffer: &mut I) -> Result<Self, Error> {
158
6.57k
        let mut object = Self::decode_static(buffer)?;
159
6.57k
        object.decode_dynamic(buffer)?;
160
6.57k
        Ok(object)
161
6.57k
    }
_RINvYNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4repr9InputReprNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
157
6.57k
    fn decode<I: Input + ?Sized>(buffer: &mut I) -> Result<Self, Error> {
158
6.57k
        let mut object = Self::decode_static(buffer)?;
159
6.57k
        object.decode_dynamic(buffer)?;
160
6.57k
        Ok(object)
161
6.57k
    }
_RINvYmNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
157
4.38k
    fn decode<I: Input + ?Sized>(buffer: &mut I) -> Result<Self, Error> {
158
4.38k
        let mut object = Self::decode_static(buffer)?;
159
4.38k
        object.decode_dynamic(buffer)?;
160
4.38k
        Ok(object)
161
4.38k
    }
_RINvYyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
157
63.5k
    fn decode<I: Input + ?Sized>(buffer: &mut I) -> Result<Self, Error> {
158
63.5k
        let mut object = Self::decode_static(buffer)?;
159
63.5k
        object.decode_dynamic(buffer)?;
160
63.5k
        Ok(object)
161
63.5k
    }
Unexecuted instantiation: _RINvYNtNtCseSMGV7FMBK4_7fuel_tx10tx_pointer9TxPointerNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEB7_
Unexecuted instantiation: _RINvYNtNtCseSMGV7FMBK4_7fuel_tx11transaction11TransactionNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEB7_
Unexecuted instantiation: _RINvYNtNtCseSMGV7FMBK4_7fuel_tx7receipt7ReceiptNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEB7_
Unexecuted instantiation: _RINvYNtNtCseSMGV7FMBK4_7fuel_tx8contract8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32NtNtB7_9canonical11Deserialize6decodeRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvYNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction4repr15TransactionReprNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEB9_
Unexecuted instantiation: _RINvYNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8policies8PoliciesNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEB9_
Unexecuted instantiation: _RINvYNtNtNtCseSMGV7FMBK4_7fuel_tx7receipt13script_result21ScriptExecutionResultNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEB9_
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blob8BlobBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEBb_
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mint4MintNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEBb_
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5InputNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEBb_
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6create10CreateBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEBb_
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output6OutputNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEBb_
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6script10ScriptBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEBb_
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6script10ScriptCodeNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEBb_
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6upload10UploadBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEBb_
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEBb_
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrade11UpgradeBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEBb_
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrade14UpgradePurposeNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEBb_
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_id6UtxoIdNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEBb_
Unexecuted instantiation: _RINvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witness7WitnessNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEBb_
Unexecuted instantiation: _RINvYNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4repr9InputReprNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEBd_
Unexecuted instantiation: _RINvYNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input8contract8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEBd_
Unexecuted instantiation: _RINvYNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input9predicate13PredicateCodeNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEBd_
Unexecuted instantiation: _RINvYNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output8contract8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEBd_
Unexecuted instantiation: _RINvYmNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvYyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvYNtNtCs6P3fQNJKMy0_8fuel_asm17panic_instruction16PanicInstructionNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types10ContractIdNtNtB7_9canonical11Deserialize6decodeRShEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types4SaltNtNtB7_9canonical11Deserialize6decodeRShEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types4TxIdNtNtB7_9canonical11Deserialize6decodeRShEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types5NonceNtNtB7_9canonical11Deserialize6decodeRShEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types6BlobIdNtNtB7_9canonical11Deserialize6decodeRShEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types6Bytes4NtNtB7_9canonical11Deserialize6decodeRShEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types6Bytes8NtNtB7_9canonical11Deserialize6decodeRShEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types7AddressNtNtB7_9canonical11Deserialize6decodeRShEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types7AssetIdNtNtB7_9canonical11Deserialize6decodeRShEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes20NtNtB7_9canonical11Deserialize6decodeRShEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32NtNtB7_9canonical11Deserialize6decodeRShEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes64NtNtB7_9canonical11Deserialize6decodeRShEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types11array_types9MessageIdNtNtB7_9canonical11Deserialize6decodeRShEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types13numeric_types11BlockHeightNtNtB7_9canonical11Deserialize6decodeRShEB7_
Unexecuted instantiation: _RINvYNtNtCsklA9joyWMfk_10fuel_types13numeric_types7ChainIdNtNtB7_9canonical11Deserialize6decodeRShEB7_
Unexecuted instantiation: _RINvYhNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEB8_
Unexecuted instantiation: _RINvYjNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEB8_
Unexecuted instantiation: _RINvYmNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEB8_
Unexecuted instantiation: _RINvYoNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEB8_
Unexecuted instantiation: _RINvYtNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEB8_
Unexecuted instantiation: _RINvYuNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEB8_
Unexecuted instantiation: _RINvYyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize6decodeRShEB8_
162
163
    /// Decodes static part of `Self` from the `buffer`.
164
    fn decode_static<I: Input + ?Sized>(buffer: &mut I) -> Result<Self, Error>;
165
166
    /// Decodes dynamic part of the information from the `buffer` to fill `Self`.
167
    /// The default implementation does nothing. Dynamically-sized contains should
168
    /// override this.
169
1.80M
    fn decode_dynamic<I: Input + ?Sized>(
170
1.80M
        &mut self,
171
1.80M
        _buffer: &mut I,
172
1.80M
    ) -> Result<(), Error> {
173
1.80M
        Ok(())
174
1.80M
    }
_RINvYtNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
169
21.9k
    fn decode_dynamic<I: Input + ?Sized>(
170
21.9k
        &mut self,
171
21.9k
        _buffer: &mut I,
172
21.9k
    ) -> Result<(), Error> {
173
21.9k
        Ok(())
174
21.9k
    }
_RINvYmNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
169
10.9k
    fn decode_dynamic<I: Input + ?Sized>(
170
10.9k
        &mut self,
171
10.9k
        _buffer: &mut I,
172
10.9k
    ) -> Result<(), Error> {
173
10.9k
        Ok(())
174
10.9k
    }
_RINvYyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
169
97.1k
    fn decode_dynamic<I: Input + ?Sized>(
170
97.1k
        &mut self,
171
97.1k
        _buffer: &mut I,
172
97.1k
    ) -> Result<(), Error> {
173
97.1k
        Ok(())
174
97.1k
    }
_RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5EmptyINtNtCs5vansr6XbJU_5alloc3vec3VechEENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
169
4.38k
    fn decode_dynamic<I: Input + ?Sized>(
170
4.38k
        &mut self,
171
4.38k
        _buffer: &mut I,
172
4.38k
    ) -> Result<(), Error> {
173
4.38k
        Ok(())
174
4.38k
    }
_RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5EmptyNtNtB6_9predicate13PredicateCodeENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
169
4.38k
    fn decode_dynamic<I: Input + ?Sized>(
170
4.38k
        &mut self,
171
4.38k
        _buffer: &mut I,
172
4.38k
    ) -> Result<(), Error> {
173
4.38k
        Ok(())
174
4.38k
    }
Unexecuted instantiation: _RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5EmptytENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
_RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5EmptyyENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
169
4.38k
    fn decode_dynamic<I: Input + ?Sized>(
170
4.38k
        &mut self,
171
4.38k
        _buffer: &mut I,
172
4.38k
    ) -> Result<(), Error> {
173
4.38k
        Ok(())
174
4.38k
    }
_RINvYhNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
169
1.65M
    fn decode_dynamic<I: Input + ?Sized>(
170
1.65M
        &mut self,
171
1.65M
        _buffer: &mut I,
172
1.65M
    ) -> Result<(), Error> {
173
1.65M
        Ok(())
174
1.65M
    }
Unexecuted instantiation: _RINvYjNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5EmptyINtNtCs5vansr6XbJU_5alloc3vec3VechEENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBc_
Unexecuted instantiation: _RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5EmptyNtNtB6_9predicate13PredicateCodeENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBc_
Unexecuted instantiation: _RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5EmptytENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBc_
Unexecuted instantiation: _RINvYINtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5EmptyyENtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEBc_
Unexecuted instantiation: _RINvYhNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvYmNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvYtNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvYyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvYmNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShECs6P3fQNJKMy0_8fuel_asm
Unexecuted instantiation: _RINvYhNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEB8_
Unexecuted instantiation: _RINvYjNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEB8_
Unexecuted instantiation: _RINvYmNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEB8_
Unexecuted instantiation: _RINvYoNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEB8_
Unexecuted instantiation: _RINvYtNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEB8_
Unexecuted instantiation: _RINvYuNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEB8_
Unexecuted instantiation: _RINvYyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize14decode_dynamicRShEB8_
175
176
    /// Helper method for deserializing `Self` from bytes.
177
0
    fn from_bytes(mut buffer: &[u8]) -> Result<Self, Error> {
178
0
        Self::decode(&mut buffer)
179
0
    }
Unexecuted instantiation: _RNvYNtNtCsg6P9hFxt0iW_7fuel_vm4call4CallNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsg6P9hFxt0iW_7fuel_vm4call9CallFrameNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesB6_
Unexecuted instantiation: _RNvYNtNtCseSMGV7FMBK4_7fuel_tx10tx_pointer9TxPointerNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesB6_
Unexecuted instantiation: _RNvYNtNtCseSMGV7FMBK4_7fuel_tx11transaction11TransactionNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesB6_
Unexecuted instantiation: _RNvYNtNtCseSMGV7FMBK4_7fuel_tx7receipt7ReceiptNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesB6_
Unexecuted instantiation: _RNvYNtNtCseSMGV7FMBK4_7fuel_tx8contract8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesB6_
Unexecuted instantiation: _RNvYNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction4repr15TransactionReprNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesB8_
Unexecuted instantiation: _RNvYNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction8policies8PoliciesNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesB8_
Unexecuted instantiation: _RNvYNtNtNtCseSMGV7FMBK4_7fuel_tx7receipt13script_result21ScriptExecutionResultNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesB8_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4blob8BlobBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types4mint4MintNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5InputNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6create10CreateBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output6OutputNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6script10ScriptBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6script10ScriptCodeNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6upload10UploadBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrade11UpgradeBodyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7upgrade14UpgradePurposeNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7utxo_id6UtxoIdNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesBa_
Unexecuted instantiation: _RNvYNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witness7WitnessNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesBa_
Unexecuted instantiation: _RNvYNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input4repr9InputReprNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesBc_
Unexecuted instantiation: _RNvYNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input8contract8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesBc_
Unexecuted instantiation: _RNvYNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input9predicate13PredicateCodeNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesBc_
Unexecuted instantiation: _RNvYNtNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output8contract8ContractNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesBc_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32NtNtB6_9canonical11Deserialize10from_bytesCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvYNtNtCs6P3fQNJKMy0_8fuel_asm17panic_instruction16PanicInstructionNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types10ContractIdNtNtB6_9canonical11Deserialize10from_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types4SaltNtNtB6_9canonical11Deserialize10from_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types4TxIdNtNtB6_9canonical11Deserialize10from_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types5NonceNtNtB6_9canonical11Deserialize10from_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types6BlobIdNtNtB6_9canonical11Deserialize10from_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types6Bytes4NtNtB6_9canonical11Deserialize10from_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types6Bytes8NtNtB6_9canonical11Deserialize10from_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types7AddressNtNtB6_9canonical11Deserialize10from_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types7AssetIdNtNtB6_9canonical11Deserialize10from_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes20NtNtB6_9canonical11Deserialize10from_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes32NtNtB6_9canonical11Deserialize10from_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types7Bytes64NtNtB6_9canonical11Deserialize10from_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types11array_types9MessageIdNtNtB6_9canonical11Deserialize10from_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types13numeric_types11BlockHeightNtNtB6_9canonical11Deserialize10from_bytesB6_
Unexecuted instantiation: _RNvYNtNtCsklA9joyWMfk_10fuel_types13numeric_types7ChainIdNtNtB6_9canonical11Deserialize10from_bytesB6_
Unexecuted instantiation: _RNvYhNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesB7_
Unexecuted instantiation: _RNvYjNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesB7_
Unexecuted instantiation: _RNvYmNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesB7_
Unexecuted instantiation: _RNvYoNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesB7_
Unexecuted instantiation: _RNvYtNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesB7_
Unexecuted instantiation: _RNvYuNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesB7_
Unexecuted instantiation: _RNvYyNtNtCsklA9joyWMfk_10fuel_types9canonical11Deserialize10from_bytesB7_
180
}
181
182
/// The data of each field should be aligned to 64 bits.
183
pub const ALIGN: usize = 8;
184
185
/// The number of padding bytes required to align the given length correctly.
186
#[allow(clippy::arithmetic_side_effects)] // Safety: (a % b) < b
187
20.6M
const fn alignment_bytes(len: usize) -> usize {
188
20.6M
    let modulo = len % ALIGN;
189
20.6M
    if modulo == 0 {
190
19.2M
        0
191
    } else {
192
1.38M
        ALIGN - modulo
193
    }
194
20.6M
}
195
196
/// Size after alignment. Saturates on overflow.
197
11.4M
pub const fn aligned_size(len: usize) -> usize {
198
11.4M
    len.saturating_add(alignment_bytes(len))
199
11.4M
}
200
201
macro_rules! impl_for_primitives {
202
    ($t:ident, $unpadded:literal) => {
203
        impl Serialize for $t {
204
            const UNALIGNED_BYTES: bool = $unpadded;
205
206
            #[inline(always)]
207
7.84M
            fn size_static(&self) -> usize {
208
7.84M
                aligned_size(::core::mem::size_of::<$t>())
209
7.84M
            }
_RNvXsl_NtCsklA9joyWMfk_10fuel_types9canonicalyNtB5_9Serialize11size_static
Line
Count
Source
207
6.68M
            fn size_static(&self) -> usize {
208
6.68M
                aligned_size(::core::mem::size_of::<$t>())
209
6.68M
            }
_RNvXsh_NtCsklA9joyWMfk_10fuel_types9canonicalmNtB5_9Serialize11size_static
Line
Count
Source
207
364k
            fn size_static(&self) -> usize {
208
364k
                aligned_size(::core::mem::size_of::<$t>())
209
364k
            }
_RNvXsf_NtCsklA9joyWMfk_10fuel_types9canonicaltNtB5_9Serialize11size_static
Line
Count
Source
207
782k
            fn size_static(&self) -> usize {
208
782k
                aligned_size(::core::mem::size_of::<$t>())
209
782k
            }
_RNvXsj_NtCsklA9joyWMfk_10fuel_types9canonicaljNtB5_9Serialize11size_static
Line
Count
Source
207
12.3k
            fn size_static(&self) -> usize {
208
12.3k
                aligned_size(::core::mem::size_of::<$t>())
209
12.3k
            }
Unexecuted instantiation: _RNvXsd_NtCsklA9joyWMfk_10fuel_types9canonicalhNtB5_9Serialize11size_static
Unexecuted instantiation: _RNvXsn_NtCsklA9joyWMfk_10fuel_types9canonicaloNtB5_9Serialize11size_static
210
211
            #[inline(always)]
212
7.56M
            fn size_dynamic(&self) -> usize {
213
7.56M
                0
214
7.56M
            }
_RNvXsl_NtCsklA9joyWMfk_10fuel_types9canonicalyNtB5_9Serialize12size_dynamic
Line
Count
Source
212
6.52M
            fn size_dynamic(&self) -> usize {
213
6.52M
                0
214
6.52M
            }
_RNvXsh_NtCsklA9joyWMfk_10fuel_types9canonicalmNtB5_9Serialize12size_dynamic
Line
Count
Source
212
245k
            fn size_dynamic(&self) -> usize {
213
245k
                0
214
245k
            }
_RNvXsf_NtCsklA9joyWMfk_10fuel_types9canonicaltNtB5_9Serialize12size_dynamic
Line
Count
Source
212
782k
            fn size_dynamic(&self) -> usize {
213
782k
                0
214
782k
            }
_RNvXsj_NtCsklA9joyWMfk_10fuel_types9canonicaljNtB5_9Serialize12size_dynamic
Line
Count
Source
212
12.3k
            fn size_dynamic(&self) -> usize {
213
12.3k
                0
214
12.3k
            }
Unexecuted instantiation: _RNvXsd_NtCsklA9joyWMfk_10fuel_types9canonicalhNtB5_9Serialize12size_dynamic
Unexecuted instantiation: _RNvXsn_NtCsklA9joyWMfk_10fuel_types9canonicaloNtB5_9Serialize12size_dynamic
215
216
            #[inline(always)]
217
7.41M
            fn encode_static<O: Output + ?Sized>(
218
7.41M
                &self,
219
7.41M
                buffer: &mut O,
220
7.41M
            ) -> Result<(), Error> {
221
7.41M
                // Primitive types are zero-padded on left side to a 8-byte boundary.
222
7.41M
                // The resulting value is always well-aligned.
223
7.41M
                let bytes = <$t>::to_be_bytes(*self);
224
7.41M
                for _ in 0..alignment_bytes(bytes.len()) {
225
                    // Zero-pad
226
723k
                    buffer.push_byte(0)?;
227
                }
228
7.41M
                buffer.write(bytes.as_ref())?;
229
7.41M
                Ok(())
230
7.41M
            }
_RINvXsl_NtCsklA9joyWMfk_10fuel_types9canonicalyNtB6_9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
217
4.38k
            fn encode_static<O: Output + ?Sized>(
218
4.38k
                &self,
219
4.38k
                buffer: &mut O,
220
4.38k
            ) -> Result<(), Error> {
221
4.38k
                // Primitive types are zero-padded on left side to a 8-byte boundary.
222
4.38k
                // The resulting value is always well-aligned.
223
4.38k
                let bytes = <$t>::to_be_bytes(*self);
224
4.38k
                for _ in 0..alignment_bytes(bytes.len()) {
225
                    // Zero-pad
226
0
                    buffer.push_byte(0)?;
227
                }
228
4.38k
                buffer.write(bytes.as_ref())?;
229
4.38k
                Ok(())
230
4.38k
            }
_RINvXsf_NtCsklA9joyWMfk_10fuel_types9canonicaltNtB6_9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
217
43.8k
            fn encode_static<O: Output + ?Sized>(
218
43.8k
                &self,
219
43.8k
                buffer: &mut O,
220
43.8k
            ) -> Result<(), Error> {
221
43.8k
                // Primitive types are zero-padded on left side to a 8-byte boundary.
222
43.8k
                // The resulting value is always well-aligned.
223
43.8k
                let bytes = <$t>::to_be_bytes(*self);
224
43.8k
                for _ in 0..alignment_bytes(bytes.len()) {
225
                    // Zero-pad
226
263k
                    buffer.push_byte(0)?;
227
                }
228
43.8k
                buffer.write(bytes.as_ref())?;
229
43.8k
                Ok(())
230
43.8k
            }
_RINvXsf_NtCsklA9joyWMfk_10fuel_types9canonicaltNtB6_9Serialize13encode_staticQShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
217
2.19k
            fn encode_static<O: Output + ?Sized>(
218
2.19k
                &self,
219
2.19k
                buffer: &mut O,
220
2.19k
            ) -> Result<(), Error> {
221
2.19k
                // Primitive types are zero-padded on left side to a 8-byte boundary.
222
2.19k
                // The resulting value is always well-aligned.
223
2.19k
                let bytes = <$t>::to_be_bytes(*self);
224
2.19k
                for _ in 0..alignment_bytes(bytes.len()) {
225
                    // Zero-pad
226
13.1k
                    buffer.push_byte(0)?;
227
                }
228
2.19k
                buffer.write(bytes.as_ref())?;
229
2.19k
                Ok(())
230
2.19k
            }
_RINvXsh_NtCsklA9joyWMfk_10fuel_types9canonicalmNtB6_9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
217
24.0k
            fn encode_static<O: Output + ?Sized>(
218
24.0k
                &self,
219
24.0k
                buffer: &mut O,
220
24.0k
            ) -> Result<(), Error> {
221
24.0k
                // Primitive types are zero-padded on left side to a 8-byte boundary.
222
24.0k
                // The resulting value is always well-aligned.
223
24.0k
                let bytes = <$t>::to_be_bytes(*self);
224
24.0k
                for _ in 0..alignment_bytes(bytes.len()) {
225
                    // Zero-pad
226
96.3k
                    buffer.push_byte(0)?;
227
                }
228
24.0k
                buffer.write(bytes.as_ref())?;
229
24.0k
                Ok(())
230
24.0k
            }
_RINvXsj_NtCsklA9joyWMfk_10fuel_types9canonicaljNtB6_9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
217
12.3k
            fn encode_static<O: Output + ?Sized>(
218
12.3k
                &self,
219
12.3k
                buffer: &mut O,
220
12.3k
            ) -> Result<(), Error> {
221
12.3k
                // Primitive types are zero-padded on left side to a 8-byte boundary.
222
12.3k
                // The resulting value is always well-aligned.
223
12.3k
                let bytes = <$t>::to_be_bytes(*self);
224
12.3k
                for _ in 0..alignment_bytes(bytes.len()) {
225
                    // Zero-pad
226
0
                    buffer.push_byte(0)?;
227
                }
228
12.3k
                buffer.write(bytes.as_ref())?;
229
12.3k
                Ok(())
230
12.3k
            }
_RINvXsl_NtCsklA9joyWMfk_10fuel_types9canonicalyNtB6_9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
217
7.03M
            fn encode_static<O: Output + ?Sized>(
218
7.03M
                &self,
219
7.03M
                buffer: &mut O,
220
7.03M
            ) -> Result<(), Error> {
221
7.03M
                // Primitive types are zero-padded on left side to a 8-byte boundary.
222
7.03M
                // The resulting value is always well-aligned.
223
7.03M
                let bytes = <$t>::to_be_bytes(*self);
224
7.03M
                for _ in 0..alignment_bytes(bytes.len()) {
225
                    // Zero-pad
226
0
                    buffer.push_byte(0)?;
227
                }
228
7.03M
                buffer.write(bytes.as_ref())?;
229
7.03M
                Ok(())
230
7.03M
            }
_RINvXsl_NtCsklA9joyWMfk_10fuel_types9canonicalyNtB6_9Serialize13encode_staticQShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
217
8.77k
            fn encode_static<O: Output + ?Sized>(
218
8.77k
                &self,
219
8.77k
                buffer: &mut O,
220
8.77k
            ) -> Result<(), Error> {
221
8.77k
                // Primitive types are zero-padded on left side to a 8-byte boundary.
222
8.77k
                // The resulting value is always well-aligned.
223
8.77k
                let bytes = <$t>::to_be_bytes(*self);
224
8.77k
                for _ in 0..alignment_bytes(bytes.len()) {
225
                    // Zero-pad
226
0
                    buffer.push_byte(0)?;
227
                }
228
8.77k
                buffer.write(bytes.as_ref())?;
229
8.77k
                Ok(())
230
8.77k
            }
_RINvXsf_NtCsklA9joyWMfk_10fuel_types9canonicaltNtB6_9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
217
43.8k
            fn encode_static<O: Output + ?Sized>(
218
43.8k
                &self,
219
43.8k
                buffer: &mut O,
220
43.8k
            ) -> Result<(), Error> {
221
43.8k
                // Primitive types are zero-padded on left side to a 8-byte boundary.
222
43.8k
                // The resulting value is always well-aligned.
223
43.8k
                let bytes = <$t>::to_be_bytes(*self);
224
43.8k
                for _ in 0..alignment_bytes(bytes.len()) {
225
                    // Zero-pad
226
263k
                    buffer.push_byte(0)?;
227
                }
228
43.8k
                buffer.write(bytes.as_ref())?;
229
43.8k
                Ok(())
230
43.8k
            }
_RINvXsh_NtCsklA9joyWMfk_10fuel_types9canonicalmNtB6_9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
217
21.9k
            fn encode_static<O: Output + ?Sized>(
218
21.9k
                &self,
219
21.9k
                buffer: &mut O,
220
21.9k
            ) -> Result<(), Error> {
221
21.9k
                // Primitive types are zero-padded on left side to a 8-byte boundary.
222
21.9k
                // The resulting value is always well-aligned.
223
21.9k
                let bytes = <$t>::to_be_bytes(*self);
224
21.9k
                for _ in 0..alignment_bytes(bytes.len()) {
225
                    // Zero-pad
226
87.7k
                    buffer.push_byte(0)?;
227
                }
228
21.9k
                buffer.write(bytes.as_ref())?;
229
21.9k
                Ok(())
230
21.9k
            }
_RINvXsl_NtCsklA9joyWMfk_10fuel_types9canonicalyNtB6_9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
217
220k
            fn encode_static<O: Output + ?Sized>(
218
220k
                &self,
219
220k
                buffer: &mut O,
220
220k
            ) -> Result<(), Error> {
221
220k
                // Primitive types are zero-padded on left side to a 8-byte boundary.
222
220k
                // The resulting value is always well-aligned.
223
220k
                let bytes = <$t>::to_be_bytes(*self);
224
220k
                for _ in 0..alignment_bytes(bytes.len()) {
225
                    // Zero-pad
226
0
                    buffer.push_byte(0)?;
227
                }
228
220k
                buffer.write(bytes.as_ref())?;
229
220k
                Ok(())
230
220k
            }
Unexecuted instantiation: _RINvXsh_NtCsklA9joyWMfk_10fuel_types9canonicalmNtB6_9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECs6P3fQNJKMy0_8fuel_asm
Unexecuted instantiation: _RINvXsd_NtCsklA9joyWMfk_10fuel_types9canonicalhNtB6_9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
Unexecuted instantiation: _RINvXsf_NtCsklA9joyWMfk_10fuel_types9canonicaltNtB6_9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
Unexecuted instantiation: _RINvXsh_NtCsklA9joyWMfk_10fuel_types9canonicalmNtB6_9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
Unexecuted instantiation: _RINvXsj_NtCsklA9joyWMfk_10fuel_types9canonicaljNtB6_9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
Unexecuted instantiation: _RINvXsl_NtCsklA9joyWMfk_10fuel_types9canonicalyNtB6_9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
Unexecuted instantiation: _RINvXsn_NtCsklA9joyWMfk_10fuel_types9canonicaloNtB6_9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
231
        }
232
233
        impl Deserialize for $t {
234
            const UNALIGNED_BYTES: bool = $unpadded;
235
236
134k
            fn decode_static<I: Input + ?Sized>(buffer: &mut I) -> Result<Self, Error> {
237
134k
                let mut asset = [0u8; ::core::mem::size_of::<$t>()];
238
134k
                buffer.skip(alignment_bytes(asset.len()))?; // Skip zero-padding
239
134k
                buffer.read(asset.as_mut())?;
240
134k
                Ok(<$t>::from_be_bytes(asset))
241
134k
            }
_RINvXsg_NtCsklA9joyWMfk_10fuel_types9canonicaltNtB6_11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
236
21.9k
            fn decode_static<I: Input + ?Sized>(buffer: &mut I) -> Result<Self, Error> {
237
21.9k
                let mut asset = [0u8; ::core::mem::size_of::<$t>()];
238
21.9k
                buffer.skip(alignment_bytes(asset.len()))?; // Skip zero-padding
239
21.9k
                buffer.read(asset.as_mut())?;
240
21.9k
                Ok(<$t>::from_be_bytes(asset))
241
21.9k
            }
_RINvXsi_NtCsklA9joyWMfk_10fuel_types9canonicalmNtB6_11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
236
10.9k
            fn decode_static<I: Input + ?Sized>(buffer: &mut I) -> Result<Self, Error> {
237
10.9k
                let mut asset = [0u8; ::core::mem::size_of::<$t>()];
238
10.9k
                buffer.skip(alignment_bytes(asset.len()))?; // Skip zero-padding
239
10.9k
                buffer.read(asset.as_mut())?;
240
10.9k
                Ok(<$t>::from_be_bytes(asset))
241
10.9k
            }
Unexecuted instantiation: _RINvXsk_NtCsklA9joyWMfk_10fuel_types9canonicaljNtB6_11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
_RINvXsm_NtCsklA9joyWMfk_10fuel_types9canonicalyNtB6_11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
236
101k
            fn decode_static<I: Input + ?Sized>(buffer: &mut I) -> Result<Self, Error> {
237
101k
                let mut asset = [0u8; ::core::mem::size_of::<$t>()];
238
101k
                buffer.skip(alignment_bytes(asset.len()))?; // Skip zero-padding
239
101k
                buffer.read(asset.as_mut())?;
240
101k
                Ok(<$t>::from_be_bytes(asset))
241
101k
            }
Unexecuted instantiation: _RINvXsg_NtCsklA9joyWMfk_10fuel_types9canonicaltNtB6_11Deserialize13decode_staticRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXsi_NtCsklA9joyWMfk_10fuel_types9canonicalmNtB6_11Deserialize13decode_staticRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXsm_NtCsklA9joyWMfk_10fuel_types9canonicalyNtB6_11Deserialize13decode_staticRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXsi_NtCsklA9joyWMfk_10fuel_types9canonicalmNtB6_11Deserialize13decode_staticRShECs6P3fQNJKMy0_8fuel_asm
Unexecuted instantiation: _RINvXse_NtCsklA9joyWMfk_10fuel_types9canonicalhNtB6_11Deserialize13decode_staticRShEB8_
Unexecuted instantiation: _RINvXsg_NtCsklA9joyWMfk_10fuel_types9canonicaltNtB6_11Deserialize13decode_staticRShEB8_
Unexecuted instantiation: _RINvXsi_NtCsklA9joyWMfk_10fuel_types9canonicalmNtB6_11Deserialize13decode_staticRShEB8_
Unexecuted instantiation: _RINvXsk_NtCsklA9joyWMfk_10fuel_types9canonicaljNtB6_11Deserialize13decode_staticRShEB8_
Unexecuted instantiation: _RINvXsm_NtCsklA9joyWMfk_10fuel_types9canonicalyNtB6_11Deserialize13decode_staticRShEB8_
Unexecuted instantiation: _RINvXso_NtCsklA9joyWMfk_10fuel_types9canonicaloNtB6_11Deserialize13decode_staticRShEB8_
242
        }
243
    };
244
}
245
246
impl_for_primitives!(u8, true);
247
impl_for_primitives!(u16, false);
248
impl_for_primitives!(u32, false);
249
impl_for_primitives!(usize, false);
250
impl_for_primitives!(u64, false);
251
impl_for_primitives!(u128, false);
252
253
// Empty tuple `()`, i.e. the unit type takes up no space.
254
impl Serialize for () {
255
0
    fn size_static(&self) -> usize {
256
0
        0
257
0
    }
258
259
    #[inline(always)]
260
0
    fn size_dynamic(&self) -> usize {
261
0
        0
262
0
    }
263
264
    #[inline(always)]
265
0
    fn encode_static<O: Output + ?Sized>(&self, _buffer: &mut O) -> Result<(), Error> {
266
0
        Ok(())
267
0
    }
268
}
269
270
impl Deserialize for () {
271
0
    fn decode_static<I: Input + ?Sized>(_buffer: &mut I) -> Result<Self, Error> {
272
0
        Ok(())
273
0
    }
274
}
275
276
/// To protect against malicious large inputs, vector size is limited when decoding.
277
pub const VEC_DECODE_LIMIT: usize = 100 * (1 << 20); // 100 MiB
278
279
#[cfg(feature = "alloc")]
280
impl<T: Serialize> Serialize for Vec<T> {
281
1.06M
    fn size_static(&self) -> usize {
282
1.06M
        8
283
1.06M
    }
_RNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5InputENtB5_9Serialize11size_staticCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
281
83.3k
    fn size_static(&self) -> usize {
282
83.3k
        8
283
83.3k
    }
_RNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output6OutputENtB5_9Serialize11size_staticCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
281
83.3k
    fn size_static(&self) -> usize {
282
83.3k
        8
283
83.3k
    }
_RNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witness7WitnessENtB5_9Serialize11size_staticCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
281
83.3k
    fn size_static(&self) -> usize {
282
83.3k
        8
283
83.3k
    }
_RNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENtB5_9Serialize11size_staticCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
281
30.7k
    fn size_static(&self) -> usize {
282
30.7k
        8
283
30.7k
    }
_RNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VechENtB5_9Serialize11size_staticCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
281
252k
    fn size_static(&self) -> usize {
282
252k
        8
283
252k
    }
Unexecuted instantiation: _RNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtB7_11array_types7Bytes32ENtB5_9Serialize11size_staticCsg6P9hFxt0iW_7fuel_vm
_RNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VechENtB5_9Serialize11size_staticCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
281
401k
    fn size_static(&self) -> usize {
282
401k
        8
283
401k
    }
_RNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5InputENtB5_9Serialize11size_staticB1m_
Line
Count
Source
281
35.0k
    fn size_static(&self) -> usize {
282
35.0k
        8
283
35.0k
    }
_RNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output6OutputENtB5_9Serialize11size_staticB1m_
Line
Count
Source
281
35.0k
    fn size_static(&self) -> usize {
282
35.0k
        8
283
35.0k
    }
_RNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witness7WitnessENtB5_9Serialize11size_staticB1m_
Line
Count
Source
281
35.0k
    fn size_static(&self) -> usize {
282
35.0k
        8
283
35.0k
    }
_RNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENtB5_9Serialize11size_staticB1m_
Line
Count
Source
281
28.5k
    fn size_static(&self) -> usize {
282
28.5k
        8
283
28.5k
    }
Unexecuted instantiation: _RNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtB7_11array_types7Bytes32ENtB5_9Serialize11size_staticCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvXININtCsklA9joyWMfk_10fuel_types9canonicals2_0pEINtNtCs5vansr6XbJU_5alloc3vec3VecpENtB5_9Serialize11size_staticB7_
284
285
    #[inline(always)]
286
769k
    fn size_dynamic(&self) -> usize {
287
769k
        if T::UNALIGNED_BYTES {
288
328k
            aligned_size(self.len())
289
        } else {
290
440k
            aligned_size(
291
440k
                self.iter()
292
552k
                    .map(|e| e.size())
Unexecuted instantiation: _RNCNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtB9_11array_types7Bytes32ENtB7_9Serialize12size_dynamic0Csg6P9hFxt0iW_7fuel_vm
_RNCNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5InputENtB7_9Serialize12size_dynamic0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
292
135k
                    .map(|e| e.size())
_RNCNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output6OutputENtB7_9Serialize12size_dynamic0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
292
135k
                    .map(|e| e.size())
Unexecuted instantiation: _RNCNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENtB7_9Serialize12size_dynamic0Csg6P9hFxt0iW_7fuel_vm
_RNCNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witness7WitnessENtB7_9Serialize12size_dynamic0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
292
146k
                    .map(|e| e.size())
Unexecuted instantiation: _RNCNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtB9_11array_types7Bytes32ENtB7_9Serialize12size_dynamic0CseSMGV7FMBK4_7fuel_tx
_RNCNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5InputENtB7_9Serialize12size_dynamic0B1o_
Line
Count
Source
292
41.6k
                    .map(|e| e.size())
_RNCNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output6OutputENtB7_9Serialize12size_dynamic0B1o_
Line
Count
Source
292
41.6k
                    .map(|e| e.size())
Unexecuted instantiation: _RNCNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENtB7_9Serialize12size_dynamic0B1o_
_RNCNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witness7WitnessENtB7_9Serialize12size_dynamic0B1o_
Line
Count
Source
292
50.4k
                    .map(|e| e.size())
Unexecuted instantiation: _RNCNvXININtCsklA9joyWMfk_10fuel_types9canonicals2_0pEINtNtCs5vansr6XbJU_5alloc3vec3VecpENtB7_9Serialize12size_dynamic0B9_
293
440k
                    .reduce(usize::saturating_add)
294
440k
                    .unwrap_or_default(),
295
440k
            )
296
        }
297
769k
    }
Unexecuted instantiation: _RNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtB7_11array_types7Bytes32ENtB5_9Serialize12size_dynamicCsg6P9hFxt0iW_7fuel_vm
_RNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5InputENtB5_9Serialize12size_dynamicCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
286
83.3k
    fn size_dynamic(&self) -> usize {
287
83.3k
        if T::UNALIGNED_BYTES {
288
0
            aligned_size(self.len())
289
        } else {
290
83.3k
            aligned_size(
291
83.3k
                self.iter()
292
83.3k
                    .map(|e| e.size())
293
83.3k
                    .reduce(usize::saturating_add)
294
83.3k
                    .unwrap_or_default(),
295
83.3k
            )
296
        }
297
83.3k
    }
_RNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output6OutputENtB5_9Serialize12size_dynamicCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
286
83.3k
    fn size_dynamic(&self) -> usize {
287
83.3k
        if T::UNALIGNED_BYTES {
288
0
            aligned_size(self.len())
289
        } else {
290
83.3k
            aligned_size(
291
83.3k
                self.iter()
292
83.3k
                    .map(|e| e.size())
293
83.3k
                    .reduce(usize::saturating_add)
294
83.3k
                    .unwrap_or_default(),
295
83.3k
            )
296
        }
297
83.3k
    }
_RNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENtB5_9Serialize12size_dynamicCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
286
30.7k
    fn size_dynamic(&self) -> usize {
287
30.7k
        if T::UNALIGNED_BYTES {
288
0
            aligned_size(self.len())
289
        } else {
290
30.7k
            aligned_size(
291
30.7k
                self.iter()
292
30.7k
                    .map(|e| e.size())
293
30.7k
                    .reduce(usize::saturating_add)
294
30.7k
                    .unwrap_or_default(),
295
30.7k
            )
296
        }
297
30.7k
    }
_RNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witness7WitnessENtB5_9Serialize12size_dynamicCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
286
109k
    fn size_dynamic(&self) -> usize {
287
109k
        if T::UNALIGNED_BYTES {
288
0
            aligned_size(self.len())
289
        } else {
290
109k
            aligned_size(
291
109k
                self.iter()
292
109k
                    .map(|e| e.size())
293
109k
                    .reduce(usize::saturating_add)
294
109k
                    .unwrap_or_default(),
295
109k
            )
296
        }
297
109k
    }
_RNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VechENtB5_9Serialize12size_dynamicCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
286
252k
    fn size_dynamic(&self) -> usize {
287
252k
        if T::UNALIGNED_BYTES {
288
252k
            aligned_size(self.len())
289
        } else {
290
0
            aligned_size(
291
0
                self.iter()
292
0
                    .map(|e| e.size())
293
0
                    .reduce(usize::saturating_add)
294
0
                    .unwrap_or_default(),
295
0
            )
296
        }
297
252k
    }
Unexecuted instantiation: _RNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtB7_11array_types7Bytes32ENtB5_9Serialize12size_dynamicCseSMGV7FMBK4_7fuel_tx
_RNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5InputENtB5_9Serialize12size_dynamicB1m_
Line
Count
Source
286
35.0k
    fn size_dynamic(&self) -> usize {
287
35.0k
        if T::UNALIGNED_BYTES {
288
0
            aligned_size(self.len())
289
        } else {
290
35.0k
            aligned_size(
291
35.0k
                self.iter()
292
35.0k
                    .map(|e| e.size())
293
35.0k
                    .reduce(usize::saturating_add)
294
35.0k
                    .unwrap_or_default(),
295
35.0k
            )
296
        }
297
35.0k
    }
_RNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output6OutputENtB5_9Serialize12size_dynamicB1m_
Line
Count
Source
286
35.0k
    fn size_dynamic(&self) -> usize {
287
35.0k
        if T::UNALIGNED_BYTES {
288
0
            aligned_size(self.len())
289
        } else {
290
35.0k
            aligned_size(
291
35.0k
                self.iter()
292
35.0k
                    .map(|e| e.size())
293
35.0k
                    .reduce(usize::saturating_add)
294
35.0k
                    .unwrap_or_default(),
295
35.0k
            )
296
        }
297
35.0k
    }
_RNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENtB5_9Serialize12size_dynamicB1m_
Line
Count
Source
286
28.5k
    fn size_dynamic(&self) -> usize {
287
28.5k
        if T::UNALIGNED_BYTES {
288
0
            aligned_size(self.len())
289
        } else {
290
28.5k
            aligned_size(
291
28.5k
                self.iter()
292
28.5k
                    .map(|e| e.size())
293
28.5k
                    .reduce(usize::saturating_add)
294
28.5k
                    .unwrap_or_default(),
295
28.5k
            )
296
        }
297
28.5k
    }
_RNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witness7WitnessENtB5_9Serialize12size_dynamicB1m_
Line
Count
Source
286
35.0k
    fn size_dynamic(&self) -> usize {
287
35.0k
        if T::UNALIGNED_BYTES {
288
0
            aligned_size(self.len())
289
        } else {
290
35.0k
            aligned_size(
291
35.0k
                self.iter()
292
35.0k
                    .map(|e| e.size())
293
35.0k
                    .reduce(usize::saturating_add)
294
35.0k
                    .unwrap_or_default(),
295
35.0k
            )
296
        }
297
35.0k
    }
_RNvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VechENtB5_9Serialize12size_dynamicCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
286
76.7k
    fn size_dynamic(&self) -> usize {
287
76.7k
        if T::UNALIGNED_BYTES {
288
76.7k
            aligned_size(self.len())
289
        } else {
290
0
            aligned_size(
291
0
                self.iter()
292
0
                    .map(|e| e.size())
293
0
                    .reduce(usize::saturating_add)
294
0
                    .unwrap_or_default(),
295
0
            )
296
        }
297
76.7k
    }
Unexecuted instantiation: _RNvXININtCsklA9joyWMfk_10fuel_types9canonicals2_0pEINtNtCs5vansr6XbJU_5alloc3vec3VecpENtB5_9Serialize12size_dynamicB7_
298
299
    #[inline(always)]
300
    // Encode only the size of the vector. Elements will be encoded in the
301
    // `encode_dynamic` method.
302
120k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
303
120k
        if self.len() > VEC_DECODE_LIMIT {
304
0
            return Err(Error::AllocationLimit)
305
120k
        }
306
120k
        let len: u64 = self.len().try_into().expect("msg.len() > u64::MAX");
307
120k
        len.encode(buffer)
308
120k
    }
_RINvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5InputENtB6_9Serialize13encode_staticIBJ_hEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
302
8.77k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
303
8.77k
        if self.len() > VEC_DECODE_LIMIT {
304
0
            return Err(Error::AllocationLimit)
305
8.77k
        }
306
8.77k
        let len: u64 = self.len().try_into().expect("msg.len() > u64::MAX");
307
8.77k
        len.encode(buffer)
308
8.77k
    }
_RINvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output6OutputENtB6_9Serialize13encode_staticIBJ_hEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
302
8.77k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
303
8.77k
        if self.len() > VEC_DECODE_LIMIT {
304
0
            return Err(Error::AllocationLimit)
305
8.77k
        }
306
8.77k
        let len: u64 = self.len().try_into().expect("msg.len() > u64::MAX");
307
8.77k
        len.encode(buffer)
308
8.77k
    }
_RINvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witness7WitnessENtB6_9Serialize13encode_staticIBJ_hEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
302
8.77k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
303
8.77k
        if self.len() > VEC_DECODE_LIMIT {
304
0
            return Err(Error::AllocationLimit)
305
8.77k
        }
306
8.77k
        let len: u64 = self.len().try_into().expect("msg.len() > u64::MAX");
307
8.77k
        len.encode(buffer)
308
8.77k
    }
_RINvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENtB6_9Serialize13encode_staticIBJ_hEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
302
4.38k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
303
4.38k
        if self.len() > VEC_DECODE_LIMIT {
304
0
            return Err(Error::AllocationLimit)
305
4.38k
        }
306
4.38k
        let len: u64 = self.len().try_into().expect("msg.len() > u64::MAX");
307
4.38k
        len.encode(buffer)
308
4.38k
    }
_RINvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VechENtB6_9Serialize13encode_staticBI_ECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
302
32.8k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
303
32.8k
        if self.len() > VEC_DECODE_LIMIT {
304
0
            return Err(Error::AllocationLimit)
305
32.8k
        }
306
32.8k
        let len: u64 = self.len().try_into().expect("msg.len() > u64::MAX");
307
32.8k
        len.encode(buffer)
308
32.8k
    }
Unexecuted instantiation: _RINvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtB8_11array_types7Bytes32ENtB6_9Serialize13encode_staticIBJ_hEECsg6P9hFxt0iW_7fuel_vm
_RINvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VechENtB6_9Serialize13encode_staticBI_ECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
302
26.3k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
303
26.3k
        if self.len() > VEC_DECODE_LIMIT {
304
0
            return Err(Error::AllocationLimit)
305
26.3k
        }
306
26.3k
        let len: u64 = self.len().try_into().expect("msg.len() > u64::MAX");
307
26.3k
        len.encode(buffer)
308
26.3k
    }
_RINvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5InputENtB6_9Serialize13encode_staticIBJ_hEEB1n_
Line
Count
Source
302
8.77k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
303
8.77k
        if self.len() > VEC_DECODE_LIMIT {
304
0
            return Err(Error::AllocationLimit)
305
8.77k
        }
306
8.77k
        let len: u64 = self.len().try_into().expect("msg.len() > u64::MAX");
307
8.77k
        len.encode(buffer)
308
8.77k
    }
_RINvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output6OutputENtB6_9Serialize13encode_staticIBJ_hEEB1n_
Line
Count
Source
302
8.77k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
303
8.77k
        if self.len() > VEC_DECODE_LIMIT {
304
0
            return Err(Error::AllocationLimit)
305
8.77k
        }
306
8.77k
        let len: u64 = self.len().try_into().expect("msg.len() > u64::MAX");
307
8.77k
        len.encode(buffer)
308
8.77k
    }
_RINvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witness7WitnessENtB6_9Serialize13encode_staticIBJ_hEEB1n_
Line
Count
Source
302
8.77k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
303
8.77k
        if self.len() > VEC_DECODE_LIMIT {
304
0
            return Err(Error::AllocationLimit)
305
8.77k
        }
306
8.77k
        let len: u64 = self.len().try_into().expect("msg.len() > u64::MAX");
307
8.77k
        len.encode(buffer)
308
8.77k
    }
_RINvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENtB6_9Serialize13encode_staticIBJ_hEEB1n_
Line
Count
Source
302
4.38k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
303
4.38k
        if self.len() > VEC_DECODE_LIMIT {
304
0
            return Err(Error::AllocationLimit)
305
4.38k
        }
306
4.38k
        let len: u64 = self.len().try_into().expect("msg.len() > u64::MAX");
307
4.38k
        len.encode(buffer)
308
4.38k
    }
Unexecuted instantiation: _RINvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtB8_11array_types7Bytes32ENtB6_9Serialize13encode_staticIBJ_hEECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXININtCsklA9joyWMfk_10fuel_types9canonicals2_0pEINtNtCs5vansr6XbJU_5alloc3vec3VecpENtB6_9Serialize13encode_staticpEB8_
309
310
85.5k
    fn encode_dynamic<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
311
85.5k
        // Bytes - Vec<u8> it a separate case without padding for each element.
312
85.5k
        // It should padded at the end if is not % ALIGN
313
85.5k
        if T::UNALIGNED_BYTES {
314
            // SAFETY: `UNALIGNED_BYTES` only set for `u8`.
315
24.1k
            let bytes = unsafe { ::core::mem::transmute::<&Vec<T>, &Vec<u8>>(self) };
316
24.1k
            buffer.write(bytes.as_slice())?;
317
24.1k
            for _ in 0..alignment_bytes(self.len()) {
318
32.3k
                buffer.push_byte(0)?;
319
            }
320
        } else {
321
61.4k
            for e in self.iter() {
322
59.2k
                e.encode(buffer)?;
323
            }
324
        }
325
85.5k
        Ok(())
326
85.5k
    }
Unexecuted instantiation: _RINvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtB8_11array_types7Bytes32ENtB6_9Serialize14encode_dynamicIBJ_hEECsg6P9hFxt0iW_7fuel_vm
_RINvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5InputENtB6_9Serialize14encode_dynamicIBJ_hEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
310
8.77k
    fn encode_dynamic<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
311
8.77k
        // Bytes - Vec<u8> it a separate case without padding for each element.
312
8.77k
        // It should padded at the end if is not % ALIGN
313
8.77k
        if T::UNALIGNED_BYTES {
314
            // SAFETY: `UNALIGNED_BYTES` only set for `u8`.
315
0
            let bytes = unsafe { ::core::mem::transmute::<&Vec<T>, &Vec<u8>>(self) };
316
0
            buffer.write(bytes.as_slice())?;
317
0
            for _ in 0..alignment_bytes(self.len()) {
318
0
                buffer.push_byte(0)?;
319
            }
320
        } else {
321
13.1k
            for e in self.iter() {
322
13.1k
                e.encode(buffer)?;
323
            }
324
        }
325
8.77k
        Ok(())
326
8.77k
    }
_RINvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output6OutputENtB6_9Serialize14encode_dynamicIBJ_hEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
310
8.77k
    fn encode_dynamic<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
311
8.77k
        // Bytes - Vec<u8> it a separate case without padding for each element.
312
8.77k
        // It should padded at the end if is not % ALIGN
313
8.77k
        if T::UNALIGNED_BYTES {
314
            // SAFETY: `UNALIGNED_BYTES` only set for `u8`.
315
0
            let bytes = unsafe { ::core::mem::transmute::<&Vec<T>, &Vec<u8>>(self) };
316
0
            buffer.write(bytes.as_slice())?;
317
0
            for _ in 0..alignment_bytes(self.len()) {
318
0
                buffer.push_byte(0)?;
319
            }
320
        } else {
321
13.1k
            for e in self.iter() {
322
13.1k
                e.encode(buffer)?;
323
            }
324
        }
325
8.77k
        Ok(())
326
8.77k
    }
_RINvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENtB6_9Serialize14encode_dynamicIBJ_hEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
310
4.38k
    fn encode_dynamic<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
311
4.38k
        // Bytes - Vec<u8> it a separate case without padding for each element.
312
4.38k
        // It should padded at the end if is not % ALIGN
313
4.38k
        if T::UNALIGNED_BYTES {
314
            // SAFETY: `UNALIGNED_BYTES` only set for `u8`.
315
0
            let bytes = unsafe { ::core::mem::transmute::<&Vec<T>, &Vec<u8>>(self) };
316
0
            buffer.write(bytes.as_slice())?;
317
0
            for _ in 0..alignment_bytes(self.len()) {
318
0
                buffer.push_byte(0)?;
319
            }
320
        } else {
321
4.38k
            for e in self.iter() {
322
0
                e.encode(buffer)?;
323
            }
324
        }
325
4.38k
        Ok(())
326
4.38k
    }
_RINvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witness7WitnessENtB6_9Serialize14encode_dynamicIBJ_hEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
310
8.77k
    fn encode_dynamic<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
311
8.77k
        // Bytes - Vec<u8> it a separate case without padding for each element.
312
8.77k
        // It should padded at the end if is not % ALIGN
313
8.77k
        if T::UNALIGNED_BYTES {
314
            // SAFETY: `UNALIGNED_BYTES` only set for `u8`.
315
0
            let bytes = unsafe { ::core::mem::transmute::<&Vec<T>, &Vec<u8>>(self) };
316
0
            buffer.write(bytes.as_slice())?;
317
0
            for _ in 0..alignment_bytes(self.len()) {
318
0
                buffer.push_byte(0)?;
319
            }
320
        } else {
321
8.77k
            for e in self.iter() {
322
6.57k
                e.encode(buffer)?;
323
            }
324
        }
325
8.77k
        Ok(())
326
8.77k
    }
_RINvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VechENtB6_9Serialize14encode_dynamicBI_ECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
310
15.3k
    fn encode_dynamic<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
311
15.3k
        // Bytes - Vec<u8> it a separate case without padding for each element.
312
15.3k
        // It should padded at the end if is not % ALIGN
313
15.3k
        if T::UNALIGNED_BYTES {
314
            // SAFETY: `UNALIGNED_BYTES` only set for `u8`.
315
15.3k
            let bytes = unsafe { ::core::mem::transmute::<&Vec<T>, &Vec<u8>>(self) };
316
15.3k
            buffer.write(bytes.as_slice())?;
317
15.3k
            for _ in 0..alignment_bytes(self.len()) {
318
16.9k
                buffer.push_byte(0)?;
319
            }
320
        } else {
321
0
            for e in self.iter() {
322
0
                e.encode(buffer)?;
323
            }
324
        }
325
15.3k
        Ok(())
326
15.3k
    }
Unexecuted instantiation: _RINvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtB8_11array_types7Bytes32ENtB6_9Serialize14encode_dynamicIBJ_hEECseSMGV7FMBK4_7fuel_tx
_RINvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5InputENtB6_9Serialize14encode_dynamicIBJ_hEEB1n_
Line
Count
Source
310
8.77k
    fn encode_dynamic<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
311
8.77k
        // Bytes - Vec<u8> it a separate case without padding for each element.
312
8.77k
        // It should padded at the end if is not % ALIGN
313
8.77k
        if T::UNALIGNED_BYTES {
314
            // SAFETY: `UNALIGNED_BYTES` only set for `u8`.
315
0
            let bytes = unsafe { ::core::mem::transmute::<&Vec<T>, &Vec<u8>>(self) };
316
0
            buffer.write(bytes.as_slice())?;
317
0
            for _ in 0..alignment_bytes(self.len()) {
318
0
                buffer.push_byte(0)?;
319
            }
320
        } else {
321
13.1k
            for e in self.iter() {
322
13.1k
                e.encode(buffer)?;
323
            }
324
        }
325
8.77k
        Ok(())
326
8.77k
    }
_RINvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output6OutputENtB6_9Serialize14encode_dynamicIBJ_hEEB1n_
Line
Count
Source
310
8.77k
    fn encode_dynamic<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
311
8.77k
        // Bytes - Vec<u8> it a separate case without padding for each element.
312
8.77k
        // It should padded at the end if is not % ALIGN
313
8.77k
        if T::UNALIGNED_BYTES {
314
            // SAFETY: `UNALIGNED_BYTES` only set for `u8`.
315
0
            let bytes = unsafe { ::core::mem::transmute::<&Vec<T>, &Vec<u8>>(self) };
316
0
            buffer.write(bytes.as_slice())?;
317
0
            for _ in 0..alignment_bytes(self.len()) {
318
0
                buffer.push_byte(0)?;
319
            }
320
        } else {
321
13.1k
            for e in self.iter() {
322
13.1k
                e.encode(buffer)?;
323
            }
324
        }
325
8.77k
        Ok(())
326
8.77k
    }
_RINvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENtB6_9Serialize14encode_dynamicIBJ_hEEB1n_
Line
Count
Source
310
4.38k
    fn encode_dynamic<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
311
4.38k
        // Bytes - Vec<u8> it a separate case without padding for each element.
312
4.38k
        // It should padded at the end if is not % ALIGN
313
4.38k
        if T::UNALIGNED_BYTES {
314
            // SAFETY: `UNALIGNED_BYTES` only set for `u8`.
315
0
            let bytes = unsafe { ::core::mem::transmute::<&Vec<T>, &Vec<u8>>(self) };
316
0
            buffer.write(bytes.as_slice())?;
317
0
            for _ in 0..alignment_bytes(self.len()) {
318
0
                buffer.push_byte(0)?;
319
            }
320
        } else {
321
4.38k
            for e in self.iter() {
322
0
                e.encode(buffer)?;
323
            }
324
        }
325
4.38k
        Ok(())
326
4.38k
    }
_RINvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witness7WitnessENtB6_9Serialize14encode_dynamicIBJ_hEEB1n_
Line
Count
Source
310
8.77k
    fn encode_dynamic<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
311
8.77k
        // Bytes - Vec<u8> it a separate case without padding for each element.
312
8.77k
        // It should padded at the end if is not % ALIGN
313
8.77k
        if T::UNALIGNED_BYTES {
314
            // SAFETY: `UNALIGNED_BYTES` only set for `u8`.
315
0
            let bytes = unsafe { ::core::mem::transmute::<&Vec<T>, &Vec<u8>>(self) };
316
0
            buffer.write(bytes.as_slice())?;
317
0
            for _ in 0..alignment_bytes(self.len()) {
318
0
                buffer.push_byte(0)?;
319
            }
320
        } else {
321
8.77k
            for e in self.iter() {
322
0
                e.encode(buffer)?;
323
            }
324
        }
325
8.77k
        Ok(())
326
8.77k
    }
_RINvXs2_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VechENtB6_9Serialize14encode_dynamicBI_ECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
310
8.77k
    fn encode_dynamic<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
311
8.77k
        // Bytes - Vec<u8> it a separate case without padding for each element.
312
8.77k
        // It should padded at the end if is not % ALIGN
313
8.77k
        if T::UNALIGNED_BYTES {
314
            // SAFETY: `UNALIGNED_BYTES` only set for `u8`.
315
8.77k
            let bytes = unsafe { ::core::mem::transmute::<&Vec<T>, &Vec<u8>>(self) };
316
8.77k
            buffer.write(bytes.as_slice())?;
317
8.77k
            for _ in 0..alignment_bytes(self.len()) {
318
15.4k
                buffer.push_byte(0)?;
319
            }
320
        } else {
321
0
            for e in self.iter() {
322
0
                e.encode(buffer)?;
323
            }
324
        }
325
8.77k
        Ok(())
326
8.77k
    }
Unexecuted instantiation: _RINvXININtCsklA9joyWMfk_10fuel_types9canonicals2_0pEINtNtCs5vansr6XbJU_5alloc3vec3VecpENtB6_9Serialize14encode_dynamicpEB8_
327
}
328
329
#[cfg(feature = "alloc")]
330
impl<T: Deserialize> Deserialize for Vec<T> {
331
    // Decode only the capacity of the vector. Elements will be decoded in the
332
    // `decode_dynamic` method. The capacity is needed for iteration there.
333
35.0k
    fn decode_static<I: Input + ?Sized>(buffer: &mut I) -> Result<Self, Error> {
334
35.0k
        let cap = u64::decode(buffer)?;
335
35.0k
        let cap: usize = cap.try_into().map_err(|_| Error::AllocationLimit)?;
336
35.0k
        if cap > VEC_DECODE_LIMIT {
337
0
            return Err(Error::AllocationLimit)
338
35.0k
        }
339
35.0k
        Ok(Vec::with_capacity(cap))
340
35.0k
    }
Unexecuted instantiation: _RINvXs3_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtB8_11array_types7Bytes32ENtB6_11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
_RINvXs3_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5InputENtB6_11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
333
4.38k
    fn decode_static<I: Input + ?Sized>(buffer: &mut I) -> Result<Self, Error> {
334
4.38k
        let cap = u64::decode(buffer)?;
335
4.38k
        let cap: usize = cap.try_into().map_err(|_| Error::AllocationLimit)?;
336
4.38k
        if cap > VEC_DECODE_LIMIT {
337
0
            return Err(Error::AllocationLimit)
338
4.38k
        }
339
4.38k
        Ok(Vec::with_capacity(cap))
340
4.38k
    }
_RINvXs3_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output6OutputENtB6_11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
333
4.38k
    fn decode_static<I: Input + ?Sized>(buffer: &mut I) -> Result<Self, Error> {
334
4.38k
        let cap = u64::decode(buffer)?;
335
4.38k
        let cap: usize = cap.try_into().map_err(|_| Error::AllocationLimit)?;
336
4.38k
        if cap > VEC_DECODE_LIMIT {
337
0
            return Err(Error::AllocationLimit)
338
4.38k
        }
339
4.38k
        Ok(Vec::with_capacity(cap))
340
4.38k
    }
_RINvXs3_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENtB6_11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
333
2.19k
    fn decode_static<I: Input + ?Sized>(buffer: &mut I) -> Result<Self, Error> {
334
2.19k
        let cap = u64::decode(buffer)?;
335
2.19k
        let cap: usize = cap.try_into().map_err(|_| Error::AllocationLimit)?;
336
2.19k
        if cap > VEC_DECODE_LIMIT {
337
0
            return Err(Error::AllocationLimit)
338
2.19k
        }
339
2.19k
        Ok(Vec::with_capacity(cap))
340
2.19k
    }
_RINvXs3_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witness7WitnessENtB6_11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
333
4.38k
    fn decode_static<I: Input + ?Sized>(buffer: &mut I) -> Result<Self, Error> {
334
4.38k
        let cap = u64::decode(buffer)?;
335
4.38k
        let cap: usize = cap.try_into().map_err(|_| Error::AllocationLimit)?;
336
4.38k
        if cap > VEC_DECODE_LIMIT {
337
0
            return Err(Error::AllocationLimit)
338
4.38k
        }
339
4.38k
        Ok(Vec::with_capacity(cap))
340
4.38k
    }
_RINvXs3_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VechENtB6_11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
333
19.7k
    fn decode_static<I: Input + ?Sized>(buffer: &mut I) -> Result<Self, Error> {
334
19.7k
        let cap = u64::decode(buffer)?;
335
19.7k
        let cap: usize = cap.try_into().map_err(|_| Error::AllocationLimit)?;
336
19.7k
        if cap > VEC_DECODE_LIMIT {
337
0
            return Err(Error::AllocationLimit)
338
19.7k
        }
339
19.7k
        Ok(Vec::with_capacity(cap))
340
19.7k
    }
Unexecuted instantiation: _RINvXs3_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtB8_11array_types7Bytes32ENtB6_11Deserialize13decode_staticRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXs3_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5InputENtB6_11Deserialize13decode_staticRShEB1n_
Unexecuted instantiation: _RINvXs3_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output6OutputENtB6_11Deserialize13decode_staticRShEB1n_
Unexecuted instantiation: _RINvXs3_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENtB6_11Deserialize13decode_staticRShEB1n_
Unexecuted instantiation: _RINvXs3_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witness7WitnessENtB6_11Deserialize13decode_staticRShEB1n_
Unexecuted instantiation: _RINvXs3_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VechENtB6_11Deserialize13decode_staticRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXININtCsklA9joyWMfk_10fuel_types9canonicals3_0pEINtNtCs5vansr6XbJU_5alloc3vec3VecpENtB6_11Deserialize13decode_staticpEB8_
341
342
26.3k
    fn decode_dynamic<I: Input + ?Sized>(&mut self, buffer: &mut I) -> Result<(), Error> {
343
26.3k
        for _ in 0..self.capacity() {
344
            // Bytes - Vec<u8> it a separate case without unpadding for each element.
345
            // It should unpadded at the end if is not % ALIGN
346
2.00M
            if T::UNALIGNED_BYTES {
347
1.98M
                let byte = buffer.read_byte()?;
348
                // SAFETY: `UNALIGNED_BYTES` implemented set for `u8`.
349
1.98M
                let _self =
350
1.98M
                    unsafe { ::core::mem::transmute::<&mut Vec<T>, &mut Vec<u8>>(self) };
351
1.98M
                _self.push(byte);
352
            } else {
353
19.7k
                self.push(T::decode(buffer)?);
354
            }
355
        }
356
357
26.3k
        if T::UNALIGNED_BYTES {
358
10.9k
            buffer.skip(alignment_bytes(self.capacity()))?;
359
15.3k
        }
360
361
26.3k
        Ok(())
362
26.3k
    }
Unexecuted instantiation: _RINvXs3_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtB8_11array_types7Bytes32ENtB6_11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
_RINvXs3_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5InputENtB6_11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
342
4.38k
    fn decode_dynamic<I: Input + ?Sized>(&mut self, buffer: &mut I) -> Result<(), Error> {
343
4.38k
        for _ in 0..self.capacity() {
344
            // Bytes - Vec<u8> it a separate case without unpadding for each element.
345
            // It should unpadded at the end if is not % ALIGN
346
6.57k
            if T::UNALIGNED_BYTES {
347
0
                let byte = buffer.read_byte()?;
348
                // SAFETY: `UNALIGNED_BYTES` implemented set for `u8`.
349
0
                let _self =
350
0
                    unsafe { ::core::mem::transmute::<&mut Vec<T>, &mut Vec<u8>>(self) };
351
0
                _self.push(byte);
352
            } else {
353
6.57k
                self.push(T::decode(buffer)?);
354
            }
355
        }
356
357
4.38k
        if T::UNALIGNED_BYTES {
358
0
            buffer.skip(alignment_bytes(self.capacity()))?;
359
4.38k
        }
360
361
4.38k
        Ok(())
362
4.38k
    }
_RINvXs3_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output6OutputENtB6_11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
342
4.38k
    fn decode_dynamic<I: Input + ?Sized>(&mut self, buffer: &mut I) -> Result<(), Error> {
343
4.38k
        for _ in 0..self.capacity() {
344
            // Bytes - Vec<u8> it a separate case without unpadding for each element.
345
            // It should unpadded at the end if is not % ALIGN
346
6.57k
            if T::UNALIGNED_BYTES {
347
0
                let byte = buffer.read_byte()?;
348
                // SAFETY: `UNALIGNED_BYTES` implemented set for `u8`.
349
0
                let _self =
350
0
                    unsafe { ::core::mem::transmute::<&mut Vec<T>, &mut Vec<u8>>(self) };
351
0
                _self.push(byte);
352
            } else {
353
6.57k
                self.push(T::decode(buffer)?);
354
            }
355
        }
356
357
4.38k
        if T::UNALIGNED_BYTES {
358
0
            buffer.skip(alignment_bytes(self.capacity()))?;
359
4.38k
        }
360
361
4.38k
        Ok(())
362
4.38k
    }
_RINvXs3_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENtB6_11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
342
2.19k
    fn decode_dynamic<I: Input + ?Sized>(&mut self, buffer: &mut I) -> Result<(), Error> {
343
2.19k
        for _ in 0..self.capacity() {
344
            // Bytes - Vec<u8> it a separate case without unpadding for each element.
345
            // It should unpadded at the end if is not % ALIGN
346
0
            if T::UNALIGNED_BYTES {
347
0
                let byte = buffer.read_byte()?;
348
                // SAFETY: `UNALIGNED_BYTES` implemented set for `u8`.
349
0
                let _self =
350
0
                    unsafe { ::core::mem::transmute::<&mut Vec<T>, &mut Vec<u8>>(self) };
351
0
                _self.push(byte);
352
            } else {
353
0
                self.push(T::decode(buffer)?);
354
            }
355
        }
356
357
2.19k
        if T::UNALIGNED_BYTES {
358
0
            buffer.skip(alignment_bytes(self.capacity()))?;
359
2.19k
        }
360
361
2.19k
        Ok(())
362
2.19k
    }
_RINvXs3_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witness7WitnessENtB6_11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
342
4.38k
    fn decode_dynamic<I: Input + ?Sized>(&mut self, buffer: &mut I) -> Result<(), Error> {
343
4.38k
        for _ in 0..self.capacity() {
344
            // Bytes - Vec<u8> it a separate case without unpadding for each element.
345
            // It should unpadded at the end if is not % ALIGN
346
6.57k
            if T::UNALIGNED_BYTES {
347
0
                let byte = buffer.read_byte()?;
348
                // SAFETY: `UNALIGNED_BYTES` implemented set for `u8`.
349
0
                let _self =
350
0
                    unsafe { ::core::mem::transmute::<&mut Vec<T>, &mut Vec<u8>>(self) };
351
0
                _self.push(byte);
352
            } else {
353
6.57k
                self.push(T::decode(buffer)?);
354
            }
355
        }
356
357
4.38k
        if T::UNALIGNED_BYTES {
358
0
            buffer.skip(alignment_bytes(self.capacity()))?;
359
4.38k
        }
360
361
4.38k
        Ok(())
362
4.38k
    }
_RINvXs3_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VechENtB6_11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
342
10.9k
    fn decode_dynamic<I: Input + ?Sized>(&mut self, buffer: &mut I) -> Result<(), Error> {
343
10.9k
        for _ in 0..self.capacity() {
344
            // Bytes - Vec<u8> it a separate case without unpadding for each element.
345
            // It should unpadded at the end if is not % ALIGN
346
1.98M
            if T::UNALIGNED_BYTES {
347
1.98M
                let byte = buffer.read_byte()?;
348
                // SAFETY: `UNALIGNED_BYTES` implemented set for `u8`.
349
1.98M
                let _self =
350
1.98M
                    unsafe { ::core::mem::transmute::<&mut Vec<T>, &mut Vec<u8>>(self) };
351
1.98M
                _self.push(byte);
352
            } else {
353
0
                self.push(T::decode(buffer)?);
354
            }
355
        }
356
357
10.9k
        if T::UNALIGNED_BYTES {
358
10.9k
            buffer.skip(alignment_bytes(self.capacity()))?;
359
0
        }
360
361
10.9k
        Ok(())
362
10.9k
    }
Unexecuted instantiation: _RINvXs3_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtB8_11array_types7Bytes32ENtB6_11Deserialize14decode_dynamicRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXs3_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types5input5InputENtB6_11Deserialize14decode_dynamicRShEB1n_
Unexecuted instantiation: _RINvXs3_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types6output6OutputENtB6_11Deserialize14decode_dynamicRShEB1n_
Unexecuted instantiation: _RINvXs3_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7storage11StorageSlotENtB6_11Deserialize14decode_dynamicRShEB1n_
Unexecuted instantiation: _RINvXs3_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VecNtNtNtNtCseSMGV7FMBK4_7fuel_tx11transaction5types7witness7WitnessENtB6_11Deserialize14decode_dynamicRShEB1n_
Unexecuted instantiation: _RINvXs3_NtCsklA9joyWMfk_10fuel_types9canonicalINtNtCs5vansr6XbJU_5alloc3vec3VechENtB6_11Deserialize14decode_dynamicRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXININtCsklA9joyWMfk_10fuel_types9canonicals3_0pEINtNtCs5vansr6XbJU_5alloc3vec3VecpENtB6_11Deserialize14decode_dynamicpEB8_
363
}
364
365
impl<const N: usize, T: Serialize> Serialize for [T; N] {
366
2.81M
    fn size_static(&self) -> usize {
367
2.81M
        if T::UNALIGNED_BYTES {
368
2.80M
            aligned_size(N)
369
        } else {
370
12.3k
            aligned_size(
371
12.3k
                self.iter()
372
791k
                    .map(|e| e.size_static())
_RNCNvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAyj40_NtB7_9Serialize11size_static0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
372
791k
                    .map(|e| e.size_static())
Unexecuted instantiation: _RNCNvXININtCsklA9joyWMfk_10fuel_types9canonicals4_0KppEAppNtB7_9Serialize11size_static0B9_
373
12.3k
                    .reduce(usize::saturating_add)
374
12.3k
                    .unwrap_or_default(),
375
12.3k
            )
376
        }
377
2.81M
    }
_RNvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj20_NtB5_9Serialize11size_staticCs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
366
2.19k
    fn size_static(&self) -> usize {
367
2.19k
        if T::UNALIGNED_BYTES {
368
2.19k
            aligned_size(N)
369
        } else {
370
0
            aligned_size(
371
0
                self.iter()
372
0
                    .map(|e| e.size_static())
373
0
                    .reduce(usize::saturating_add)
374
0
                    .unwrap_or_default(),
375
0
            )
376
        }
377
2.19k
    }
_RNvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj20_NtB5_9Serialize11size_staticCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
366
1.79M
    fn size_static(&self) -> usize {
367
1.79M
        if T::UNALIGNED_BYTES {
368
1.79M
            aligned_size(N)
369
        } else {
370
0
            aligned_size(
371
0
                self.iter()
372
0
                    .map(|e| e.size_static())
373
0
                    .reduce(usize::saturating_add)
374
0
                    .unwrap_or_default(),
375
0
            )
376
        }
377
1.79M
    }
_RNvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAyj40_NtB5_9Serialize11size_staticCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
366
12.3k
    fn size_static(&self) -> usize {
367
12.3k
        if T::UNALIGNED_BYTES {
368
0
            aligned_size(N)
369
        } else {
370
12.3k
            aligned_size(
371
12.3k
                self.iter()
372
12.3k
                    .map(|e| e.size_static())
373
12.3k
                    .reduce(usize::saturating_add)
374
12.3k
                    .unwrap_or_default(),
375
12.3k
            )
376
        }
377
12.3k
    }
_RNvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj20_NtB5_9Serialize11size_staticCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
366
1.00M
    fn size_static(&self) -> usize {
367
1.00M
        if T::UNALIGNED_BYTES {
368
1.00M
            aligned_size(N)
369
        } else {
370
0
            aligned_size(
371
0
                self.iter()
372
0
                    .map(|e| e.size_static())
373
0
                    .reduce(usize::saturating_add)
374
0
                    .unwrap_or_default(),
375
0
            )
376
        }
377
1.00M
    }
Unexecuted instantiation: _RNvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj14_NtB5_9Serialize11size_staticB7_
Unexecuted instantiation: _RNvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj20_NtB5_9Serialize11size_staticB7_
Unexecuted instantiation: _RNvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj40_NtB5_9Serialize11size_staticB7_
Unexecuted instantiation: _RNvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj4_NtB5_9Serialize11size_staticB7_
Unexecuted instantiation: _RNvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj8_NtB5_9Serialize11size_staticB7_
378
379
    #[inline(always)]
380
2.81M
    fn size_dynamic(&self) -> usize {
381
2.81M
        if T::UNALIGNED_BYTES {
382
2.80M
            0
383
        } else {
384
12.3k
            aligned_size(
385
12.3k
                self.iter()
386
791k
                    .map(|e| e.size_dynamic())
_RNCNvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAyj40_NtB7_9Serialize12size_dynamic0Csg6P9hFxt0iW_7fuel_vm
Line
Count
Source
386
791k
                    .map(|e| e.size_dynamic())
Unexecuted instantiation: _RNCNvXININtCsklA9joyWMfk_10fuel_types9canonicals4_0KppEAppNtB7_9Serialize12size_dynamic0B9_
387
12.3k
                    .reduce(usize::saturating_add)
388
12.3k
                    .unwrap_or_default(),
389
12.3k
            )
390
        }
391
2.81M
    }
_RNvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj20_NtB5_9Serialize12size_dynamicCs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
380
2.19k
    fn size_dynamic(&self) -> usize {
381
2.19k
        if T::UNALIGNED_BYTES {
382
2.19k
            0
383
        } else {
384
0
            aligned_size(
385
0
                self.iter()
386
0
                    .map(|e| e.size_dynamic())
387
0
                    .reduce(usize::saturating_add)
388
0
                    .unwrap_or_default(),
389
0
            )
390
        }
391
2.19k
    }
_RNvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj20_NtB5_9Serialize12size_dynamicCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
380
1.79M
    fn size_dynamic(&self) -> usize {
381
1.79M
        if T::UNALIGNED_BYTES {
382
1.79M
            0
383
        } else {
384
0
            aligned_size(
385
0
                self.iter()
386
0
                    .map(|e| e.size_dynamic())
387
0
                    .reduce(usize::saturating_add)
388
0
                    .unwrap_or_default(),
389
0
            )
390
        }
391
1.79M
    }
_RNvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAyj40_NtB5_9Serialize12size_dynamicCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
380
12.3k
    fn size_dynamic(&self) -> usize {
381
12.3k
        if T::UNALIGNED_BYTES {
382
0
            0
383
        } else {
384
12.3k
            aligned_size(
385
12.3k
                self.iter()
386
12.3k
                    .map(|e| e.size_dynamic())
387
12.3k
                    .reduce(usize::saturating_add)
388
12.3k
                    .unwrap_or_default(),
389
12.3k
            )
390
        }
391
12.3k
    }
_RNvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj20_NtB5_9Serialize12size_dynamicCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
380
1.00M
    fn size_dynamic(&self) -> usize {
381
1.00M
        if T::UNALIGNED_BYTES {
382
1.00M
            0
383
        } else {
384
0
            aligned_size(
385
0
                self.iter()
386
0
                    .map(|e| e.size_dynamic())
387
0
                    .reduce(usize::saturating_add)
388
0
                    .unwrap_or_default(),
389
0
            )
390
        }
391
1.00M
    }
Unexecuted instantiation: _RNvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj14_NtB5_9Serialize12size_dynamicB7_
Unexecuted instantiation: _RNvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj20_NtB5_9Serialize12size_dynamicB7_
Unexecuted instantiation: _RNvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj40_NtB5_9Serialize12size_dynamicB7_
Unexecuted instantiation: _RNvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj4_NtB5_9Serialize12size_dynamicB7_
Unexecuted instantiation: _RNvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj8_NtB5_9Serialize12size_dynamicB7_
392
393
    #[inline(always)]
394
1.61M
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
395
1.61M
        // Bytes - [u8; N] it a separate case without padding for each element.
396
1.61M
        // It should padded at the end if is not % ALIGN
397
1.61M
        if T::UNALIGNED_BYTES {
398
            // SAFETY: `Type::U8` implemented only for `u8`.
399
1.59M
            let bytes = unsafe { ::core::mem::transmute::<&[T; N], &[u8; N]>(self) };
400
1.59M
            buffer.write(bytes.as_slice())?;
401
1.59M
            for _ in 0..alignment_bytes(N) {
402
0
                buffer.push_byte(0)?;
403
            }
404
        } else {
405
791k
            for e in self.iter() {
406
791k
                e.encode_static(buffer)?;
407
            }
408
        }
409
1.61M
        Ok(())
410
1.61M
    }
_RINvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj20_NtB6_9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
394
2.19k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
395
2.19k
        // Bytes - [u8; N] it a separate case without padding for each element.
396
2.19k
        // It should padded at the end if is not % ALIGN
397
2.19k
        if T::UNALIGNED_BYTES {
398
            // SAFETY: `Type::U8` implemented only for `u8`.
399
2.19k
            let bytes = unsafe { ::core::mem::transmute::<&[T; N], &[u8; N]>(self) };
400
2.19k
            buffer.write(bytes.as_slice())?;
401
2.19k
            for _ in 0..alignment_bytes(N) {
402
0
                buffer.push_byte(0)?;
403
            }
404
        } else {
405
0
            for e in self.iter() {
406
0
                e.encode_static(buffer)?;
407
            }
408
        }
409
2.19k
        Ok(())
410
2.19k
    }
_RINvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj20_NtB6_9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
394
1.50M
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
395
1.50M
        // Bytes - [u8; N] it a separate case without padding for each element.
396
1.50M
        // It should padded at the end if is not % ALIGN
397
1.50M
        if T::UNALIGNED_BYTES {
398
            // SAFETY: `Type::U8` implemented only for `u8`.
399
1.50M
            let bytes = unsafe { ::core::mem::transmute::<&[T; N], &[u8; N]>(self) };
400
1.50M
            buffer.write(bytes.as_slice())?;
401
1.50M
            for _ in 0..alignment_bytes(N) {
402
0
                buffer.push_byte(0)?;
403
            }
404
        } else {
405
0
            for e in self.iter() {
406
0
                e.encode_static(buffer)?;
407
            }
408
        }
409
1.50M
        Ok(())
410
1.50M
    }
_RINvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj20_NtB6_9Serialize13encode_staticQShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
394
13.1k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
395
13.1k
        // Bytes - [u8; N] it a separate case without padding for each element.
396
13.1k
        // It should padded at the end if is not % ALIGN
397
13.1k
        if T::UNALIGNED_BYTES {
398
            // SAFETY: `Type::U8` implemented only for `u8`.
399
13.1k
            let bytes = unsafe { ::core::mem::transmute::<&[T; N], &[u8; N]>(self) };
400
13.1k
            buffer.write(bytes.as_slice())?;
401
13.1k
            for _ in 0..alignment_bytes(N) {
402
0
                buffer.push_byte(0)?;
403
            }
404
        } else {
405
0
            for e in self.iter() {
406
0
                e.encode_static(buffer)?;
407
            }
408
        }
409
13.1k
        Ok(())
410
13.1k
    }
_RINvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAyj40_NtB6_9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
394
12.3k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
395
12.3k
        // Bytes - [u8; N] it a separate case without padding for each element.
396
12.3k
        // It should padded at the end if is not % ALIGN
397
12.3k
        if T::UNALIGNED_BYTES {
398
            // SAFETY: `Type::U8` implemented only for `u8`.
399
0
            let bytes = unsafe { ::core::mem::transmute::<&[T; N], &[u8; N]>(self) };
400
0
            buffer.write(bytes.as_slice())?;
401
0
            for _ in 0..alignment_bytes(N) {
402
0
                buffer.push_byte(0)?;
403
            }
404
        } else {
405
791k
            for e in self.iter() {
406
791k
                e.encode_static(buffer)?;
407
            }
408
        }
409
12.3k
        Ok(())
410
12.3k
    }
_RINvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj20_NtB6_9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
394
78.9k
    fn encode_static<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
395
78.9k
        // Bytes - [u8; N] it a separate case without padding for each element.
396
78.9k
        // It should padded at the end if is not % ALIGN
397
78.9k
        if T::UNALIGNED_BYTES {
398
            // SAFETY: `Type::U8` implemented only for `u8`.
399
78.9k
            let bytes = unsafe { ::core::mem::transmute::<&[T; N], &[u8; N]>(self) };
400
78.9k
            buffer.write(bytes.as_slice())?;
401
78.9k
            for _ in 0..alignment_bytes(N) {
402
0
                buffer.push_byte(0)?;
403
            }
404
        } else {
405
0
            for e in self.iter() {
406
0
                e.encode_static(buffer)?;
407
            }
408
        }
409
78.9k
        Ok(())
410
78.9k
    }
Unexecuted instantiation: _RINvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj14_NtB6_9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
Unexecuted instantiation: _RINvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj20_NtB6_9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
Unexecuted instantiation: _RINvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj40_NtB6_9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
Unexecuted instantiation: _RINvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj4_NtB6_9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
Unexecuted instantiation: _RINvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj8_NtB6_9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
411
412
1.61M
    fn encode_dynamic<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
413
51.9M
        for e in self.iter() {
414
51.9M
            e.encode_dynamic(buffer)?;
415
        }
416
417
1.61M
        Ok(())
418
1.61M
    }
_RINvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj20_NtB6_9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
412
2.19k
    fn encode_dynamic<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
413
70.1k
        for e in self.iter() {
414
70.1k
            e.encode_dynamic(buffer)?;
415
        }
416
417
2.19k
        Ok(())
418
2.19k
    }
_RINvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj20_NtB6_9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
412
1.50M
    fn encode_dynamic<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
413
48.1M
        for e in self.iter() {
414
48.1M
            e.encode_dynamic(buffer)?;
415
        }
416
417
1.50M
        Ok(())
418
1.50M
    }
_RINvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj20_NtB6_9Serialize14encode_dynamicQShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
412
13.1k
    fn encode_dynamic<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
413
421k
        for e in self.iter() {
414
421k
            e.encode_dynamic(buffer)?;
415
        }
416
417
13.1k
        Ok(())
418
13.1k
    }
_RINvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAyj40_NtB6_9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
412
12.3k
    fn encode_dynamic<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
413
791k
        for e in self.iter() {
414
791k
            e.encode_dynamic(buffer)?;
415
        }
416
417
12.3k
        Ok(())
418
12.3k
    }
_RINvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj20_NtB6_9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
412
78.9k
    fn encode_dynamic<O: Output + ?Sized>(&self, buffer: &mut O) -> Result<(), Error> {
413
2.52M
        for e in self.iter() {
414
2.52M
            e.encode_dynamic(buffer)?;
415
        }
416
417
78.9k
        Ok(())
418
78.9k
    }
Unexecuted instantiation: _RINvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj14_NtB6_9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
Unexecuted instantiation: _RINvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj20_NtB6_9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
Unexecuted instantiation: _RINvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj40_NtB6_9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
Unexecuted instantiation: _RINvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj4_NtB6_9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
Unexecuted instantiation: _RINvXs4_NtCsklA9joyWMfk_10fuel_types9canonicalAhj8_NtB6_9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB8_
419
}
420
421
impl<const N: usize, T: Deserialize> Deserialize for [T; N] {
422
51.8k
    fn decode_static<I: Input + ?Sized>(buffer: &mut I) -> Result<Self, Error> {
423
51.8k
        if T::UNALIGNED_BYTES {
424
51.8k
            let mut bytes: [u8; N] = [0; N];
425
51.8k
            buffer.read(bytes.as_mut())?;
426
51.8k
            buffer.skip(alignment_bytes(N))?;
427
51.8k
            let ref_typed: &[T; N] = unsafe { core::mem::transmute(&bytes) };
428
51.8k
            let typed: [T; N] = unsafe { core::ptr::read(ref_typed) };
429
51.8k
            Ok(typed)
430
        } else {
431
            // Spec doesn't say how to deserialize arrays with unaligned
432
            // primitives(as `u16`, `u32`, `usize`), so unpad them.
433
            // SAFETY: `uninit`` is an array of `MaybUninit`, which do not require
434
            // initialization
435
0
            let mut uninit: [MaybeUninit<T>; N] =
436
0
                unsafe { MaybeUninit::uninit().assume_init() };
437
            // The following line coerces the pointer to the array to a pointer
438
            // to the first array element which is equivalent.
439
0
            for i in 0..N {
440
0
                match T::decode_static(buffer) {
441
0
                    Err(e) => {
442
0
                        for item in uninit.iter_mut().take(i) {
443
                            // SAFETY: all elements up to index i (excluded have been
444
                            // initialised)
445
0
                            unsafe {
446
0
                                item.assume_init_drop();
447
0
                            }
448
                        }
449
0
                        return Err(e)
450
                    }
451
0
                    Ok(decoded) => {
452
0
                        // SAFETY: `uninit[i]` is a MaybeUninit which can be
453
0
                        // safely overwritten.
454
0
                        uninit[i].write(decoded);
455
0
456
0
                        // SAFETY: Point to the next element after every iteration.
457
0
                        //     We do this N times therefore this is safe.
458
0
                    }
459
                }
460
            }
461
462
            // SAFETY: All array elements have been initialized above.
463
0
            let init = uninit.map(|v| unsafe { v.assume_init() });
Unexecuted instantiation: _RNCINvXs5_NtCsklA9joyWMfk_10fuel_types9canonicalAyj40_NtB8_11Deserialize13decode_staticRShE0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCINvXININtCsklA9joyWMfk_10fuel_types9canonicals5_0KppEAppNtB8_11Deserialize13decode_staticpE0Ba_
464
0
            Ok(init)
465
        }
466
51.8k
    }
_RINvXs5_NtCsklA9joyWMfk_10fuel_types9canonicalAhj20_NtB6_11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
422
51.8k
    fn decode_static<I: Input + ?Sized>(buffer: &mut I) -> Result<Self, Error> {
423
51.8k
        if T::UNALIGNED_BYTES {
424
51.8k
            let mut bytes: [u8; N] = [0; N];
425
51.8k
            buffer.read(bytes.as_mut())?;
426
51.8k
            buffer.skip(alignment_bytes(N))?;
427
51.8k
            let ref_typed: &[T; N] = unsafe { core::mem::transmute(&bytes) };
428
51.8k
            let typed: [T; N] = unsafe { core::ptr::read(ref_typed) };
429
51.8k
            Ok(typed)
430
        } else {
431
            // Spec doesn't say how to deserialize arrays with unaligned
432
            // primitives(as `u16`, `u32`, `usize`), so unpad them.
433
            // SAFETY: `uninit`` is an array of `MaybUninit`, which do not require
434
            // initialization
435
0
            let mut uninit: [MaybeUninit<T>; N] =
436
0
                unsafe { MaybeUninit::uninit().assume_init() };
437
            // The following line coerces the pointer to the array to a pointer
438
            // to the first array element which is equivalent.
439
0
            for i in 0..N {
440
0
                match T::decode_static(buffer) {
441
0
                    Err(e) => {
442
0
                        for item in uninit.iter_mut().take(i) {
443
                            // SAFETY: all elements up to index i (excluded have been
444
                            // initialised)
445
0
                            unsafe {
446
0
                                item.assume_init_drop();
447
0
                            }
448
                        }
449
0
                        return Err(e)
450
                    }
451
0
                    Ok(decoded) => {
452
0
                        // SAFETY: `uninit[i]` is a MaybeUninit which can be
453
0
                        // safely overwritten.
454
0
                        uninit[i].write(decoded);
455
0
456
0
                        // SAFETY: Point to the next element after every iteration.
457
0
                        //     We do this N times therefore this is safe.
458
0
                    }
459
                }
460
            }
461
462
            // SAFETY: All array elements have been initialized above.
463
0
            let init = uninit.map(|v| unsafe { v.assume_init() });
464
0
            Ok(init)
465
        }
466
51.8k
    }
Unexecuted instantiation: _RINvXs5_NtCsklA9joyWMfk_10fuel_types9canonicalAyj40_NtB6_11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXs5_NtCsklA9joyWMfk_10fuel_types9canonicalAhj20_NtB6_11Deserialize13decode_staticRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXs5_NtCsklA9joyWMfk_10fuel_types9canonicalAhj14_NtB6_11Deserialize13decode_staticRShEB8_
Unexecuted instantiation: _RINvXs5_NtCsklA9joyWMfk_10fuel_types9canonicalAhj20_NtB6_11Deserialize13decode_staticRShEB8_
Unexecuted instantiation: _RINvXs5_NtCsklA9joyWMfk_10fuel_types9canonicalAhj40_NtB6_11Deserialize13decode_staticRShEB8_
Unexecuted instantiation: _RINvXs5_NtCsklA9joyWMfk_10fuel_types9canonicalAhj4_NtB6_11Deserialize13decode_staticRShEB8_
Unexecuted instantiation: _RINvXs5_NtCsklA9joyWMfk_10fuel_types9canonicalAhj8_NtB6_11Deserialize13decode_staticRShEB8_
467
468
51.8k
    fn decode_dynamic<I: Input + ?Sized>(&mut self, buffer: &mut I) -> Result<(), Error> {
469
1.65M
        for e in self.iter_mut() {
470
1.65M
            e.decode_dynamic(buffer)?;
471
        }
472
51.8k
        Ok(())
473
51.8k
    }
_RINvXs5_NtCsklA9joyWMfk_10fuel_types9canonicalAhj20_NtB6_11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
468
51.8k
    fn decode_dynamic<I: Input + ?Sized>(&mut self, buffer: &mut I) -> Result<(), Error> {
469
1.65M
        for e in self.iter_mut() {
470
1.65M
            e.decode_dynamic(buffer)?;
471
        }
472
51.8k
        Ok(())
473
51.8k
    }
Unexecuted instantiation: _RINvXs5_NtCsklA9joyWMfk_10fuel_types9canonicalAyj40_NtB6_11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXs5_NtCsklA9joyWMfk_10fuel_types9canonicalAhj20_NtB6_11Deserialize14decode_dynamicRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXs5_NtCsklA9joyWMfk_10fuel_types9canonicalAhj14_NtB6_11Deserialize14decode_dynamicRShEB8_
Unexecuted instantiation: _RINvXs5_NtCsklA9joyWMfk_10fuel_types9canonicalAhj20_NtB6_11Deserialize14decode_dynamicRShEB8_
Unexecuted instantiation: _RINvXs5_NtCsklA9joyWMfk_10fuel_types9canonicalAhj40_NtB6_11Deserialize14decode_dynamicRShEB8_
Unexecuted instantiation: _RINvXs5_NtCsklA9joyWMfk_10fuel_types9canonicalAhj4_NtB6_11Deserialize14decode_dynamicRShEB8_
Unexecuted instantiation: _RINvXs5_NtCsklA9joyWMfk_10fuel_types9canonicalAhj8_NtB6_11Deserialize14decode_dynamicRShEB8_
474
}
475
476
#[cfg(feature = "alloc")]
477
impl Output for Vec<u8> {
478
9.75M
    fn write(&mut self, bytes: &[u8]) -> Result<(), Error> {
479
9.75M
        self.extend_from_slice(bytes);
480
9.75M
        Ok(())
481
9.75M
    }
482
}
483
484
impl<'a> Output for &'a mut [u8] {
485
37.2k
    fn write(&mut self, from: &[u8]) -> Result<(), Error> {
486
37.2k
        if from.len() > self.len() {
487
0
            return Err(Error::BufferIsTooShort)
488
37.2k
        }
489
37.2k
        let len = from.len();
490
37.2k
        self[..len].copy_from_slice(from);
491
37.2k
        // We need to reduce the inner slice by `len`, because we already filled them.
492
37.2k
        let reduced = &mut self[len..];
493
37.2k
494
37.2k
        // Compiler is not clever enough to allow it.
495
37.2k
        // https://stackoverflow.com/questions/25730586/how-can-i-create-my-own-data-structure-with-an-iterator-that-returns-mutable-ref
496
37.2k
        *self = unsafe { &mut *(reduced as *mut [u8]) };
497
37.2k
        Ok(())
498
37.2k
    }
499
}
500
501
impl<'a> Input for &'a [u8] {
502
0
    fn remaining(&mut self) -> usize {
503
0
        self.len()
504
0
    }
505
506
4.38k
    fn peek(&self, into: &mut [u8]) -> Result<(), Error> {
507
4.38k
        if into.len() > self.len() {
508
0
            return Err(Error::BufferIsTooShort)
509
4.38k
        }
510
4.38k
511
4.38k
        let len = into.len();
512
4.38k
        into.copy_from_slice(&self[..len]);
513
4.38k
        Ok(())
514
4.38k
    }
515
516
2.17M
    fn read(&mut self, into: &mut [u8]) -> Result<(), Error> {
517
2.17M
        if into.len() > self.len() {
518
0
            return Err(Error::BufferIsTooShort)
519
2.17M
        }
520
2.17M
521
2.17M
        let len = into.len();
522
2.17M
        into.copy_from_slice(&self[..len]);
523
2.17M
        *self = &self[len..];
524
2.17M
        Ok(())
525
2.17M
    }
526
527
197k
    fn skip(&mut self, n: usize) -> Result<(), Error> {
528
197k
        if n > self.len() {
529
0
            return Err(Error::BufferIsTooShort)
530
197k
        }
531
197k
532
197k
        *self = &self[n..];
533
197k
        Ok(())
534
197k
    }
535
}
536
537
#[cfg(test)]
538
mod tests {
539
    use super::*;
540
541
    fn validate<T: Serialize + Deserialize + Eq + core::fmt::Debug>(t: T) {
542
        let bytes = t.to_bytes();
543
        let t2 = T::from_bytes(&bytes).expect("Roundtrip failed");
544
        assert_eq!(t, t2);
545
        assert_eq!(t.to_bytes(), t2.to_bytes());
546
547
        let mut vec = Vec::new();
548
        t.encode_static(&mut vec).expect("Encode failed");
549
        assert_eq!(vec.len(), t.size_static());
550
    }
551
552
    fn validate_enum<T: Serialize + Deserialize + Eq + fmt::Debug>(t: T) {
553
        let bytes = t.to_bytes();
554
        let t2 = T::from_bytes(&bytes).expect("Roundtrip failed");
555
        assert_eq!(t, t2);
556
        assert_eq!(t.to_bytes(), t2.to_bytes());
557
558
        let mut vec = Vec::new();
559
        t.encode_static(&mut vec).expect("Encode failed");
560
        assert_eq!(vec.len(), t.size_static());
561
        t.encode_dynamic(&mut vec).expect("Encode failed");
562
        assert_eq!(vec.len(), t.size());
563
564
        let mut vec2 = Vec::new();
565
        t.encode_dynamic(&mut vec2).expect("Encode failed");
566
        assert_eq!(vec2.len(), t.size_dynamic());
567
    }
568
569
    #[test]
570
    fn test_canonical_encode_decode() {
571
        validate(());
572
        validate(123u8);
573
        validate(u8::MAX);
574
        validate(123u16);
575
        validate(u16::MAX);
576
        validate(123u32);
577
        validate(u32::MAX);
578
        validate(123u64);
579
        validate(u64::MAX);
580
        validate(123u128);
581
        validate(u128::MAX);
582
        validate(Vec::<u8>::new());
583
        validate(Vec::<u16>::new());
584
        validate(Vec::<u32>::new());
585
        validate(Vec::<u64>::new());
586
        validate(Vec::<u128>::new());
587
        validate(vec![1u8]);
588
        validate(vec![1u16]);
589
        validate(vec![1u32]);
590
        validate(vec![1u64]);
591
        validate(vec![1u128]);
592
        validate(vec![1u8, 2u8]);
593
        validate(vec![1u16, 2u16]);
594
        validate(vec![1u32, 2u32]);
595
        validate(vec![1u64, 2u64]);
596
        validate(vec![1u128, 2u128]);
597
598
        #[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
599
        struct TestStruct1 {
600
            a: u8,
601
            b: u16,
602
        }
603
604
        let t = TestStruct1 { a: 123, b: 456 };
605
        assert_eq!(t.size_static(), 16);
606
        assert_eq!(t.size(), 16);
607
        validate(t);
608
609
        #[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
610
        struct TestStruct2 {
611
            a: u8,
612
            v: Vec<u8>,
613
            b: u16,
614
            arr0: [u8; 0],
615
            arr1: [u8; 2],
616
            arr2: [u16; 3],
617
            arr3: [u64; 4],
618
        }
619
620
        validate(TestStruct2 {
621
            a: 123,
622
            v: vec![1, 2, 3],
623
            b: 456,
624
            arr0: [],
625
            arr1: [1, 2],
626
            arr2: [1, 2, u16::MAX],
627
            arr3: [0, 3, 1111, u64::MAX],
628
        });
629
630
        #[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
631
        #[repr(transparent)]
632
        struct TestStruct3([u8; 64]);
633
634
        let t = TestStruct3([1; 64]);
635
        assert_eq!(t.size_static(), 64);
636
        assert_eq!(t.size(), 64);
637
        validate(t);
638
639
        #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
640
        #[canonical(prefix = 1u64)]
641
        struct Prefixed1 {
642
            a: [u8; 3],
643
            b: Vec<u8>,
644
        }
645
        validate(Prefixed1 {
646
            a: [1, 2, 3],
647
            b: vec![4, 5, 6],
648
        });
649
650
        #[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
651
        #[repr(u8)]
652
        enum TestEnum1 {
653
            A,
654
            B,
655
            C = 0x13,
656
            D,
657
        }
658
659
        validate(TestEnum1::A);
660
        validate(TestEnum1::B);
661
        validate(TestEnum1::C);
662
        validate(TestEnum1::D);
663
664
        #[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
665
        enum TestEnum2 {
666
            A(u8),
667
            B([u8; 3]),
668
            C(Vec<u8>),
669
        }
670
671
        validate_enum(TestEnum2::A(2));
672
        validate_enum(TestEnum2::B([1, 2, 3]));
673
        validate_enum(TestEnum2::C(vec![1, 2, 3]));
674
675
        #[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)]
676
        #[canonical(prefix = 2u64)]
677
        struct Prefixed2(u16);
678
        validate(Prefixed2(u16::MAX));
679
680
        assert_eq!(
681
            &Prefixed1 {
682
                a: [1, 2, 3],
683
                b: vec![4, 5]
684
            }
685
            .to_bytes()[..8],
686
            &[0u8, 0, 0, 0, 0, 0, 0, 1]
687
        );
688
        assert_eq!(
689
            Prefixed2(u16::MAX).to_bytes(),
690
            [0u8, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0xff, 0xff]
691
        );
692
    }
693
}
/home/marten/fuel/fuel-vm/fuel-types/src/bytes.rs
Line
Count
Source
1
use crate::Word;
2
3
/// Size of a word, in bytes
4
pub const WORD_SIZE: usize = core::mem::size_of::<Word>();
5
6
/// Return the word-padded length of the buffer.
7
/// Returns None if the length is too large to be represented as usize.
8
59.2k
pub const fn padded_len(bytes: &[u8]) -> Option<usize> {
9
59.2k
    padded_len_usize(bytes.len())
10
59.2k
}
11
12
/// Return the word-padded length of an arbitrary length.
13
/// Returns None if the length is too large to be represented as usize.
14
#[allow(clippy::arithmetic_side_effects)] // Safety: (a % b) < b
15
92.7k
pub const fn padded_len_usize(len: usize) -> Option<usize> {
16
92.7k
    let modulo = len % WORD_SIZE;
17
92.7k
    if modulo == 0 {
18
52.8k
        Some(len)
19
    } else {
20
39.8k
        let padding = WORD_SIZE - modulo;
21
39.8k
        len.checked_add(padding)
22
    }
23
92.7k
}
24
25
/// Return the word-padded length of an arbitrary length.
26
/// Returns None if the length is too large to be represented as `Word`.
27
#[allow(clippy::arithmetic_side_effects)] // Safety: (a % b) < b
28
432k
pub const fn padded_len_word(len: Word) -> Option<Word> {
29
432k
    let modulo = len % WORD_SIZE as Word;
30
432k
    if modulo == 0 {
31
376k
        Some(len)
32
    } else {
33
55.7k
        let padding = WORD_SIZE as Word - modulo;
34
55.7k
        len.checked_add(padding)
35
    }
36
432k
}
37
38
#[cfg(feature = "unsafe")]
39
#[allow(unsafe_code)]
40
/// Add a conversion from arbitrary slices into arrays
41
///
42
/// # Safety
43
///
44
/// This function will not panic if the length of the slice is smaller than `N`. Instead,
45
/// it will cause undefined behavior and read random disowned bytes.
46
pub unsafe fn from_slice_unchecked<const N: usize>(buf: &[u8]) -> [u8; N] {
47
    let ptr = buf.as_ptr() as *const [u8; N];
48
49
    // Static assertions are not applicable to runtime length check (e.g. slices).
50
    // This is safe if the size of `bytes` is consistent to `N`
51
    *ptr
52
}
53
54
#[test]
55
#[allow(clippy::erasing_op)]
56
#[allow(clippy::identity_op)]
57
fn padded_len_returns_multiple_of_word_len() {
58
    assert_eq!(Some(WORD_SIZE * 0), padded_len(&[]));
59
    assert_eq!(Some(WORD_SIZE * 1), padded_len(&[0]));
60
    assert_eq!(Some(WORD_SIZE * 1), padded_len(&[0; WORD_SIZE]));
61
    assert_eq!(Some(WORD_SIZE * 2), padded_len(&[0; WORD_SIZE + 1]));
62
    assert_eq!(Some(WORD_SIZE * 2), padded_len(&[0; WORD_SIZE * 2]));
63
}
64
65
#[test]
66
fn padded_len_usize_returns_multiple_of_word_len() {
67
    assert_eq!(padded_len_usize(0), Some(0));
68
    assert_eq!(padded_len_usize(1), Some(8));
69
    assert_eq!(padded_len_usize(2), Some(8));
70
    assert_eq!(padded_len_usize(7), Some(8));
71
    assert_eq!(padded_len_usize(8), Some(8));
72
    assert_eq!(padded_len_usize(9), Some(16));
73
}
74
75
#[test]
76
fn padded_len_usize_handles_overflow() {
77
    for i in 0..7 {
78
        assert_eq!(padded_len_usize(usize::MAX - i), None);
79
    }
80
    assert_eq!(padded_len_usize(usize::MAX - 7), Some(usize::MAX - 7));
81
}
/home/marten/fuel/fuel-vm/fuel-types/src/fmt.rs
Line
Count
Source
1
use alloc::vec::Vec;
2
use core::{
3
    fmt,
4
    fmt::Formatter,
5
};
6
7
/// Formatting utility to truncate a vector of bytes to a hex string of max length `N`
8
0
pub fn fmt_truncated_hex<const N: usize>(data: &[u8], f: &mut Formatter) -> fmt::Result {
9
0
    let formatted = if data.len() > N {
10
0
        let mut s = hex::encode(&data[0..N.saturating_sub(3)]);
11
0
        s.push_str("...");
12
0
        s
13
    } else {
14
0
        hex::encode(data)
15
    };
16
0
    f.write_str(formatted.as_str())
17
0
}
Unexecuted instantiation: _RINvNtCsklA9joyWMfk_10fuel_types3fmt17fmt_truncated_hexKj10_ECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvNtCsklA9joyWMfk_10fuel_types3fmt17fmt_truncated_hexKj10_ECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvNtCsklA9joyWMfk_10fuel_types3fmt17fmt_truncated_hexKpEB4_
18
19
/// Formatting utility to truncate a optional vector of bytes to a hex string of max
20
/// length `N`
21
0
pub fn fmt_option_truncated_hex<const N: usize>(
22
0
    data: &Option<Vec<u8>>,
23
0
    f: &mut Formatter,
24
0
) -> fmt::Result {
25
0
    if let Some(data) = data {
26
0
        let formatted = if data.len() > N {
27
0
            let mut s = hex::encode(&data[0..N.saturating_sub(3)]);
28
0
            s.push_str("...");
29
0
            s
30
        } else {
31
0
            hex::encode(data)
32
        };
33
0
        f.write_str("Some(")?;
34
0
        f.write_str(formatted.as_str())?;
35
0
        f.write_str(")")
36
    } else {
37
0
        f.write_str("None")
38
    }
39
0
}
Unexecuted instantiation: _RINvNtCsklA9joyWMfk_10fuel_types3fmt24fmt_option_truncated_hexKj10_ECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvNtCsklA9joyWMfk_10fuel_types3fmt24fmt_option_truncated_hexKpEB4_
/home/marten/fuel/fuel-vm/fuel-types/src/numeric_types.rs
Line
Count
Source
1
use core::{
2
    array::TryFromSliceError,
3
    borrow::{
4
        Borrow,
5
        BorrowMut,
6
    },
7
    convert::TryFrom,
8
    fmt,
9
    ops::{
10
        Deref,
11
        DerefMut,
12
    },
13
    str,
14
};
15
16
#[cfg(feature = "random")]
17
use rand::{
18
    distributions::{
19
        Distribution,
20
        Standard,
21
    },
22
    Rng,
23
};
24
25
#[cfg(all(feature = "alloc", feature = "typescript"))]
26
use alloc::vec::Vec;
27
28
macro_rules! key {
29
    ($i:ident, $t:ty) => {
30
        #[derive(Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
31
        /// FuelVM atomic numeric type.
32
        #[repr(transparent)]
33
0
        #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
Unexecuted instantiation: _RNCINvXNvNtCsklA9joyWMfk_10fuel_types13numeric_typess4_1__NtB7_7ChainIdNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeQINtNtNtCs1b0Bw0OchLA_8postcard2de12deserializer12DeserializerNtNtB24_7flavors5SliceEE0CseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNCINvXNvNtCsklA9joyWMfk_10fuel_types13numeric_typess_1__NtB7_11BlockHeightNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializepE0B9_
Unexecuted instantiation: _RNCINvXNvNtCsklA9joyWMfk_10fuel_types13numeric_typess4_1__NtB7_7ChainIdNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializepE0B9_
34
        #[cfg_attr(feature = "serde", serde(transparent))]
35
        #[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
36
        #[derive(
37
52.6k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types13numeric_typess0_1__NtB5_11BlockHeightNtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
13.1k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types13numeric_typess0_1__NtB5_11BlockHeightNtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
13.1k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RNvXNvNtCsklA9joyWMfk_10fuel_types13numeric_typess0_1__NtB4_11BlockHeightNtNtB6_9canonical9Serialize11size_static
Line
Count
Source
37
243k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RNvXNvNtCsklA9joyWMfk_10fuel_types13numeric_typess0_1__NtB4_11BlockHeightNtNtB6_9canonical9Serialize12size_dynamic
Line
Count
Source
37
243k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types13numeric_typess0_1__NtB5_11BlockHeightNtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
37
13.1k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types13numeric_typess0_1__NtB5_11BlockHeightNtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
37
13.1k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types13numeric_typess0_1__NtB5_11BlockHeightNtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types13numeric_typess0_1__NtB5_11BlockHeightNtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RNvXNvNtCsklA9joyWMfk_10fuel_types13numeric_typess5_1__NtB4_7ChainIdNtNtB6_9canonical9Serialize11size_static
Unexecuted instantiation: _RNvXNvNtCsklA9joyWMfk_10fuel_types13numeric_typess5_1__NtB4_7ChainIdNtNtB6_9canonical9Serialize12size_dynamic
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types13numeric_typess5_1__NtB5_7ChainIdNtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types13numeric_typess5_1__NtB5_7ChainIdNtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
_RINvXNvNtCsklA9joyWMfk_10fuel_types13numeric_typess1_1__NtB5_11BlockHeightNtNtB7_9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
6.57k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types13numeric_typess1_1__NtB5_11BlockHeightNtNtB7_9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
6.57k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types13numeric_typess1_1__NtB5_11BlockHeightNtNtB7_9canonical11Deserialize13decode_staticRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types13numeric_typess1_1__NtB5_11BlockHeightNtNtB7_9canonical11Deserialize14decode_dynamicRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types13numeric_typess1_1__NtB5_11BlockHeightNtNtB7_9canonical11Deserialize13decode_staticRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types13numeric_typess1_1__NtB5_11BlockHeightNtNtB7_9canonical11Deserialize14decode_dynamicRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types13numeric_typess6_1__NtB5_7ChainIdNtNtB7_9canonical11Deserialize13decode_staticRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types13numeric_typess6_1__NtB5_7ChainIdNtNtB7_9canonical11Deserialize14decode_dynamicRShEB7_
38
        )]
39
        pub struct $i($t);
40
41
        key_methods!($i, $t);
42
43
        #[cfg(feature = "random")]
44
        impl Distribution<$i> for Standard {
45
2.19k
            fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> $i {
46
2.19k
                $i(rng.gen())
47
2.19k
            }
_RINvXs_NtCsklA9joyWMfk_10fuel_types13numeric_typesNtNtCsaiZOB2jUGOZ_4rand13distributions8StandardINtNtBO_12distribution12DistributionNtB5_11BlockHeightE6sampleNtNtNtBQ_4rngs3std6StdRngECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
45
2.19k
            fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> $i {
46
2.19k
                $i(rng.gen())
47
2.19k
            }
Unexecuted instantiation: _RINvXs_NtCsklA9joyWMfk_10fuel_types13numeric_typesNtNtCsaiZOB2jUGOZ_4rand13distributions8StandardINtNtBO_12distribution12DistributionNtB5_11BlockHeightE6samplepEB7_
Unexecuted instantiation: _RINvXs9_NtCsklA9joyWMfk_10fuel_types13numeric_typesNtNtCsaiZOB2jUGOZ_4rand13distributions8StandardINtNtBP_12distribution12DistributionNtB6_7ChainIdE6samplepEB8_
48
        }
49
    };
50
}
51
52
macro_rules! key_methods {
53
    ($i:ident, $t:ty) => {
54
        const _: () = {
55
            const SIZE: usize = core::mem::size_of::<$t>();
56
57
            impl $i {
58
                /// Number constructor.
59
0
                pub const fn new(number: $t) -> Self {
60
0
                    Self(number)
61
0
                }
Unexecuted instantiation: _RNvMNvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtB4_11BlockHeight3newB6_
Unexecuted instantiation: _RNvMNvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__NtB4_7ChainId3newB6_
62
63
                /// Convert to array of big endian bytes.
64
0
                pub fn to_bytes(self) -> [u8; SIZE] {
65
0
                    self.0.to_be_bytes()
66
0
                }
Unexecuted instantiation: _RNvMNvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtB4_11BlockHeight8to_bytes
Unexecuted instantiation: _RNvMNvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__NtB4_7ChainId8to_bytes
67
            }
68
69
            #[cfg(feature = "typescript")]
70
            #[wasm_bindgen::prelude::wasm_bindgen]
71
            impl $i {
72
                #[wasm_bindgen::prelude::wasm_bindgen(constructor)]
73
                /// Number constructor.
74
                pub fn from_number(number: $t) -> Self {
75
                    Self(number)
76
                }
77
78
                /// Convert to array of big endian bytes.
79
                #[wasm_bindgen(js_name = to_bytes)]
80
                pub fn to_bytes_typescript(self) -> Vec<u8> {
81
                    self.to_bytes().to_vec()
82
                }
83
84
                /// Convert to usize.
85
                #[wasm_bindgen(js_name = as_usize)]
86
                pub fn as_usize_typescript(&self) -> usize {
87
                    usize::try_from(self.0).expect("Cannot convert to usize")
88
                }
89
            }
90
91
            #[cfg(feature = "random")]
92
            impl rand::Fill for $i {
93
0
                fn try_fill<R: rand::Rng + ?Sized>(
94
0
                    &mut self,
95
0
                    rng: &mut R,
96
0
                ) -> Result<(), rand::Error> {
97
0
                    let number = rng.gen();
98
0
                    *self = $i(number);
99
0
100
0
                    Ok(())
101
0
                }
Unexecuted instantiation: _RINvXs_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtB7_11BlockHeightNtNtCsaiZOB2jUGOZ_4rand3rng4Fill8try_fillpEB9_
Unexecuted instantiation: _RINvXs_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__NtB7_7ChainIdNtNtCsaiZOB2jUGOZ_4rand3rng4Fill8try_fillpEB9_
102
            }
103
104
            impl Deref for $i {
105
                type Target = $t;
106
107
593k
                fn deref(&self) -> &$t {
108
593k
                    &self.0
109
593k
                }
_RNvXs0_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__NtB7_7ChainIdNtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
107
4.38k
                fn deref(&self) -> &$t {
108
4.38k
                    &self.0
109
4.38k
                }
_RNvXs0_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtB7_11BlockHeightNtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
107
576k
                fn deref(&self) -> &$t {
108
576k
                    &self.0
109
576k
                }
_RNvXs0_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__NtB7_7ChainIdNtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
107
8.77k
                fn deref(&self) -> &$t {
108
8.77k
                    &self.0
109
8.77k
                }
_RNvXs0_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtB7_11BlockHeightNtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
107
4.38k
                fn deref(&self) -> &$t {
108
4.38k
                    &self.0
109
4.38k
                }
Unexecuted instantiation: _RNvXs0_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtB7_11BlockHeightNtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB9_
Unexecuted instantiation: _RNvXs0_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__NtB7_7ChainIdNtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB9_
110
            }
111
112
            impl Borrow<$t> for $i {
113
0
                fn borrow(&self) -> &$t {
114
0
                    &self.0
115
0
                }
Unexecuted instantiation: _RNvXs1_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtB7_11BlockHeightINtNtCsd3UI3IJrzMw_4core6borrow6BorrowmE6borrowB9_
Unexecuted instantiation: _RNvXs1_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__NtB7_7ChainIdINtNtCsd3UI3IJrzMw_4core6borrow6BorrowyE6borrowB9_
116
            }
117
118
            impl BorrowMut<$t> for $i {
119
0
                fn borrow_mut(&mut self) -> &mut $t {
120
0
                    &mut self.0
121
0
                }
Unexecuted instantiation: _RNvXs2_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtB7_11BlockHeightINtNtCsd3UI3IJrzMw_4core6borrow9BorrowMutmE10borrow_mutB9_
Unexecuted instantiation: _RNvXs2_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__NtB7_7ChainIdINtNtCsd3UI3IJrzMw_4core6borrow9BorrowMutyE10borrow_mutB9_
122
            }
123
124
            impl DerefMut for $i {
125
0
                fn deref_mut(&mut self) -> &mut $t {
126
0
                    &mut self.0
127
0
                }
Unexecuted instantiation: _RNvXs3_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtB7_11BlockHeightNtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB9_
Unexecuted instantiation: _RNvXs3_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__NtB7_7ChainIdNtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB9_
128
            }
129
130
            impl From<[u8; SIZE]> for $i {
131
0
                fn from(bytes: [u8; SIZE]) -> Self {
132
0
                    Self(<$t>::from_be_bytes(bytes))
133
0
                }
Unexecuted instantiation: _RNvXs4_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtB7_11BlockHeightINtNtCsd3UI3IJrzMw_4core7convert4FromAhj4_E4from
Unexecuted instantiation: _RNvXs4_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__NtB7_7ChainIdINtNtCsd3UI3IJrzMw_4core7convert4FromAhj8_E4from
134
            }
135
136
            impl From<$t> for $i {
137
408k
                fn from(value: $t) -> Self {
138
408k
                    Self(value)
139
408k
                }
_RNvXs5_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtB7_11BlockHeightINtNtCsd3UI3IJrzMw_4core7convert4FrommE4fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
137
408k
                fn from(value: $t) -> Self {
138
408k
                    Self(value)
139
408k
                }
Unexecuted instantiation: _RNvXs5_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtB7_11BlockHeightINtNtCsd3UI3IJrzMw_4core7convert4FrommE4fromCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvXs5_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtB7_11BlockHeightINtNtCsd3UI3IJrzMw_4core7convert4FrommE4fromB9_
Unexecuted instantiation: _RNvXs5_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__NtB7_7ChainIdINtNtCsd3UI3IJrzMw_4core7convert4FromyE4fromB9_
140
            }
141
142
            impl From<$i> for [u8; SIZE] {
143
0
                fn from(salt: $i) -> [u8; SIZE] {
144
0
                    salt.0.to_be_bytes()
145
0
                }
Unexecuted instantiation: _RNvXs6_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__Ahj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB7_11BlockHeightE4from
Unexecuted instantiation: _RNvXs6_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__Ahj8_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB7_7ChainIdE4from
146
            }
147
148
            impl From<$i> for $t {
149
833k
                fn from(salt: $i) -> $t {
150
833k
                    salt.0
151
833k
                }
_RNvXs7_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__yINtNtCsd3UI3IJrzMw_4core7convert4FromNtB7_7ChainIdE4fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
149
833k
                fn from(salt: $i) -> $t {
150
833k
                    salt.0
151
833k
                }
Unexecuted instantiation: _RNvXs7_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__mINtNtCsd3UI3IJrzMw_4core7convert4FromNtB7_11BlockHeightE4fromB9_
Unexecuted instantiation: _RNvXs7_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__yINtNtCsd3UI3IJrzMw_4core7convert4FromNtB7_7ChainIdE4fromB9_
152
            }
153
154
            impl TryFrom<&[u8]> for $i {
155
                type Error = TryFromSliceError;
156
157
0
                fn try_from(bytes: &[u8]) -> Result<$i, TryFromSliceError> {
158
0
                    <[u8; SIZE]>::try_from(bytes).map(|b| b.into())
Unexecuted instantiation: _RNCNvXs8_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtB9_11BlockHeightINtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_from0Bb_
Unexecuted instantiation: _RNCNvXs8_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__NtB9_7ChainIdINtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_from0Bb_
159
0
                }
Unexecuted instantiation: _RNvXs8_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtB7_11BlockHeightINtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_from
Unexecuted instantiation: _RNvXs8_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__NtB7_7ChainIdINtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_from
160
            }
161
162
            impl fmt::LowerHex for $i {
163
0
                fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
164
0
                    if f.alternate() {
165
0
                        write!(f, "0x")?
166
0
                    }
167
168
0
                    let bytes = self.0.to_be_bytes();
169
0
                    match f.width() {
170
0
                        Some(w) if w > 0 => {
171
0
                            bytes.chunks(2 * bytes.len() / w).try_for_each(|c| {
172
0
                                write!(f, "{:02x}", c.iter().fold(0u8, |acc, x| acc ^ x))
Unexecuted instantiation: _RNCNCNvXs9_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtBb_11BlockHeightNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt00Bd_
Unexecuted instantiation: _RNCNCNvXs9_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__NtBb_7ChainIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt00Bd_
173
0
                            })
Unexecuted instantiation: _RNCNvXs9_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtB9_11BlockHeightNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt0Bb_
Unexecuted instantiation: _RNCNvXs9_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__NtB9_7ChainIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt0Bb_
174
                        }
175
176
0
                        _ => bytes.iter().try_for_each(|b| write!(f, "{:02x}", &b)),
Unexecuted instantiation: _RNCNvXs9_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtB9_11BlockHeightNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_0Bb_
Unexecuted instantiation: _RNCNvXs9_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__NtB9_7ChainIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_0Bb_
177
                    }
178
0
                }
Unexecuted instantiation: _RNvXs9_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtB7_11BlockHeightNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt
Unexecuted instantiation: _RNvXs9_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__NtB7_7ChainIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt
179
            }
180
181
            impl fmt::UpperHex for $i {
182
0
                fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
183
0
                    if f.alternate() {
184
0
                        write!(f, "0x")?
185
0
                    }
186
187
0
                    let bytes = self.0.to_be_bytes();
188
0
                    match f.width() {
189
0
                        Some(w) if w > 0 => {
190
0
                            bytes.chunks(2 * bytes.len() / w).try_for_each(|c| {
191
0
                                write!(f, "{:02X}", c.iter().fold(0u8, |acc, x| acc ^ x))
Unexecuted instantiation: _RNCNCNvXsa_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtBb_11BlockHeightNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt00Bd_
Unexecuted instantiation: _RNCNCNvXsa_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__NtBb_7ChainIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt00Bd_
192
0
                            })
Unexecuted instantiation: _RNCNvXsa_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtB9_11BlockHeightNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt0Bb_
Unexecuted instantiation: _RNCNvXsa_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__NtB9_7ChainIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt0Bb_
193
                        }
194
195
0
                        _ => bytes.iter().try_for_each(|b| write!(f, "{:02X}", &b)),
Unexecuted instantiation: _RNCNvXsa_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtB9_11BlockHeightNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_0Bb_
Unexecuted instantiation: _RNCNvXsa_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__NtB9_7ChainIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_0Bb_
196
                    }
197
0
                }
Unexecuted instantiation: _RNvXsa_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtB7_11BlockHeightNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt
Unexecuted instantiation: _RNvXsa_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__NtB7_7ChainIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt
198
            }
199
200
            impl fmt::Debug for $i {
201
0
                fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
202
0
                    <Self as fmt::LowerHex>::fmt(&self, f)
203
0
                }
Unexecuted instantiation: _RNvXsb_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtB7_11BlockHeightNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsb_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__NtB7_7ChainIdNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
204
            }
205
206
            impl fmt::Display for $i {
207
0
                fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
208
0
                    <Self as fmt::LowerHex>::fmt(&self, f)
209
0
                }
Unexecuted instantiation: _RNvXsc_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtB7_11BlockHeightNtNtCsd3UI3IJrzMw_4core3fmt7Display3fmt
Unexecuted instantiation: _RNvXsc_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__NtB7_7ChainIdNtNtCsd3UI3IJrzMw_4core3fmt7Display3fmt
210
            }
211
212
            impl str::FromStr for $i {
213
                type Err = &'static str;
214
215
0
                fn from_str(s: &str) -> Result<Self, Self::Err> {
216
                    const ERR: &str = concat!("Invalid encoded byte in ", stringify!($i));
217
0
                    let mut ret = <[u8; SIZE]>::default();
218
0
                    let s = s.strip_prefix("0x").unwrap_or(s);
219
0
                    hex::decode_to_slice(&s, &mut ret).map_err(|_| ERR)?;
Unexecuted instantiation: _RNCNvXsd_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtB9_11BlockHeightNtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str0Bb_
Unexecuted instantiation: _RNCNvXsd_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__NtB9_7ChainIdNtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str0Bb_
220
0
                    Ok(ret.into())
221
0
                }
Unexecuted instantiation: _RNvXsd_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess2_1__NtB7_11BlockHeightNtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str
Unexecuted instantiation: _RNvXsd_NvNtCsklA9joyWMfk_10fuel_types13numeric_typess7_1__NtB7_7ChainIdNtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str
222
            }
223
        };
224
    };
225
}
226
227
key!(BlockHeight, u32);
228
key!(ChainId, u64);
229
230
impl BlockHeight {
231
    /// Successor, i.e. next block after this
232
0
    pub fn succ(self) -> Option<BlockHeight> {
233
0
        Some(Self(self.0.checked_add(1)?))
234
0
    }
235
236
    /// Predecessor, i.e. previous block before this
237
0
    pub fn pred(self) -> Option<BlockHeight> {
238
0
        Some(Self(self.0.checked_sub(1)?))
239
0
    }
240
}
/home/marten/fuel/fuel-vm/fuel-types/src/array_types.rs
Line
Count
Source
1
// serde-big-array doesn't allow documentation of its generated structure
2
#![allow(missing_docs)]
3
use core::{
4
    array::TryFromSliceError,
5
    borrow::{
6
        Borrow,
7
        BorrowMut,
8
    },
9
    convert::TryFrom,
10
    fmt,
11
    ops::{
12
        Deref,
13
        DerefMut,
14
    },
15
    str,
16
};
17
18
#[cfg(feature = "random")]
19
use rand::{
20
    distributions::{
21
        Distribution,
22
        Standard,
23
    },
24
    Rng,
25
};
26
27
#[cfg(all(feature = "alloc", feature = "typescript"))]
28
use alloc::format;
29
30
macro_rules! key {
31
    ($i:ident, $s:expr) => {
32
        /// FuelVM atomic array type.
33
        #[derive(Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
34
        #[repr(transparent)]
35
        #[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
36
        #[derive(
37
3.19M
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess4_1__NtB5_10ContractIdNtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
37
2.19k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess4_1__NtB5_10ContractIdNtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
37
2.19k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RNvXNvNtCsklA9joyWMfk_10fuel_types11array_typess4_1__NtB4_10ContractIdNtNtB6_9canonical9Serialize11size_static
Line
Count
Source
37
1.01M
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RNvXNvNtCsklA9joyWMfk_10fuel_types11array_typess4_1__NtB4_10ContractIdNtNtB6_9canonical9Serialize12size_dynamic
Line
Count
Source
37
1.01M
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess4_1__NtB5_10ContractIdNtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
867k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess0_1__NtB5_7AssetIdNtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
37.9k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typesse_1__NtB5_7Bytes32NtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
316k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_types1__NtB5_7AddressNtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
190k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessg_1__NtB5_5NonceNtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
88.9k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess4_1__NtB5_10ContractIdNtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
867k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess0_1__NtB5_7AssetIdNtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
37.9k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typesse_1__NtB5_7Bytes32NtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
316k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_types1__NtB5_7AddressNtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
190k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessg_1__NtB5_5NonceNtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
88.9k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess2_1__NtB5_6BlobIdNtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess2_1__NtB5_6BlobIdNtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessk_1__NtB5_4SaltNtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
4.38k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessk_1__NtB5_4SaltNtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
4.38k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_types1__NtB5_7AddressNtNtB7_9canonical9Serialize13encode_staticQShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
2.19k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess0_1__NtB5_7AssetIdNtNtB7_9canonical9Serialize13encode_staticQShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
2.19k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess4_1__NtB5_10ContractIdNtNtB7_9canonical9Serialize13encode_staticQShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
2.19k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typesse_1__NtB5_7Bytes32NtNtB7_9canonical9Serialize13encode_staticQShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
6.57k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_types1__NtB5_7AddressNtNtB7_9canonical9Serialize14encode_dynamicQShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
2.19k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess0_1__NtB5_7AssetIdNtNtB7_9canonical9Serialize14encode_dynamicQShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
2.19k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess4_1__NtB5_10ContractIdNtNtB7_9canonical9Serialize14encode_dynamicQShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
2.19k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typesse_1__NtB5_7Bytes32NtNtB7_9canonical9Serialize14encode_dynamicQShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
6.57k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RNvXNvNtCsklA9joyWMfk_10fuel_types11array_typess0_1__NtB4_7AssetIdNtNtB6_9canonical9Serialize11size_static
Line
Count
Source
37
261k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RNvXNvNtCsklA9joyWMfk_10fuel_types11array_typesse_1__NtB4_7Bytes32NtNtB6_9canonical9Serialize11size_static
Line
Count
Source
37
965k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RNvXNvNtCsklA9joyWMfk_10fuel_types11array_types1__NtB4_7AddressNtNtB6_9canonical9Serialize11size_static
Line
Count
Source
37
414k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RNvXNvNtCsklA9joyWMfk_10fuel_types11array_typessg_1__NtB4_5NonceNtNtB6_9canonical9Serialize11size_static
Line
Count
Source
37
88.9k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RNvXNvNtCsklA9joyWMfk_10fuel_types11array_typess0_1__NtB4_7AssetIdNtNtB6_9canonical9Serialize12size_dynamic
Line
Count
Source
37
261k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RNvXNvNtCsklA9joyWMfk_10fuel_types11array_typesse_1__NtB4_7Bytes32NtNtB6_9canonical9Serialize12size_dynamic
Line
Count
Source
37
965k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RNvXNvNtCsklA9joyWMfk_10fuel_types11array_types1__NtB4_7AddressNtNtB6_9canonical9Serialize12size_dynamic
Line
Count
Source
37
414k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RNvXNvNtCsklA9joyWMfk_10fuel_types11array_typessg_1__NtB4_5NonceNtNtB6_9canonical9Serialize12size_dynamic
Line
Count
Source
37
88.9k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
Unexecuted instantiation: _RNvXNvNtCsklA9joyWMfk_10fuel_types11array_typess2_1__NtB4_6BlobIdNtNtB6_9canonical9Serialize11size_static
Unexecuted instantiation: _RNvXNvNtCsklA9joyWMfk_10fuel_types11array_typess2_1__NtB4_6BlobIdNtNtB6_9canonical9Serialize12size_dynamic
_RNvXNvNtCsklA9joyWMfk_10fuel_types11array_typessk_1__NtB4_4SaltNtNtB6_9canonical9Serialize11size_static
Line
Count
Source
37
59.2k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RNvXNvNtCsklA9joyWMfk_10fuel_types11array_typessk_1__NtB4_4SaltNtNtB6_9canonical9Serialize12size_dynamic
Line
Count
Source
37
59.2k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typesse_1__NtB5_7Bytes32NtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
37
39.4k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typesse_1__NtB5_7Bytes32NtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
37
39.4k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess4_1__NtB5_10ContractIdNtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
37
8.77k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess0_1__NtB5_7AssetIdNtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
37
13.1k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_types1__NtB5_7AddressNtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
37
13.1k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessg_1__NtB5_5NonceNtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess4_1__NtB5_10ContractIdNtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
37
8.77k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess0_1__NtB5_7AssetIdNtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
37
13.1k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_types1__NtB5_7AddressNtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
37
13.1k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessg_1__NtB5_5NonceNtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess2_1__NtB5_6BlobIdNtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess2_1__NtB5_6BlobIdNtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessk_1__NtB5_4SaltNtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
37
4.38k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessk_1__NtB5_4SaltNtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEECseSMGV7FMBK4_7fuel_tx
Line
Count
Source
37
4.38k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_types1__NtB5_7AddressNtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_types1__NtB5_7AddressNtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess0_1__NtB5_7AssetIdNtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess0_1__NtB5_7AssetIdNtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess2_1__NtB5_6BlobIdNtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess2_1__NtB5_6BlobIdNtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess4_1__NtB5_10ContractIdNtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess4_1__NtB5_10ContractIdNtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RNvXNvNtCsklA9joyWMfk_10fuel_types11array_typess6_1__NtB4_4TxIdNtNtB6_9canonical9Serialize11size_static
Unexecuted instantiation: _RNvXNvNtCsklA9joyWMfk_10fuel_types11array_typess6_1__NtB4_4TxIdNtNtB6_9canonical9Serialize12size_dynamic
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess6_1__NtB5_4TxIdNtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess6_1__NtB5_4TxIdNtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RNvXNvNtCsklA9joyWMfk_10fuel_types11array_typess8_1__NtB4_6Bytes4NtNtB6_9canonical9Serialize11size_static
Unexecuted instantiation: _RNvXNvNtCsklA9joyWMfk_10fuel_types11array_typess8_1__NtB4_6Bytes4NtNtB6_9canonical9Serialize12size_dynamic
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess8_1__NtB5_6Bytes4NtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess8_1__NtB5_6Bytes4NtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RNvXNvNtCsklA9joyWMfk_10fuel_types11array_typessa_1__NtB4_6Bytes8NtNtB6_9canonical9Serialize11size_static
Unexecuted instantiation: _RNvXNvNtCsklA9joyWMfk_10fuel_types11array_typessa_1__NtB4_6Bytes8NtNtB6_9canonical9Serialize12size_dynamic
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessa_1__NtB5_6Bytes8NtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessa_1__NtB5_6Bytes8NtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RNvXNvNtCsklA9joyWMfk_10fuel_types11array_typessc_1__NtB4_7Bytes20NtNtB6_9canonical9Serialize11size_static
Unexecuted instantiation: _RNvXNvNtCsklA9joyWMfk_10fuel_types11array_typessc_1__NtB4_7Bytes20NtNtB6_9canonical9Serialize12size_dynamic
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessc_1__NtB5_7Bytes20NtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessc_1__NtB5_7Bytes20NtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typesse_1__NtB5_7Bytes32NtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typesse_1__NtB5_7Bytes32NtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessg_1__NtB5_5NonceNtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessg_1__NtB5_5NonceNtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RNvXNvNtCsklA9joyWMfk_10fuel_types11array_typessi_1__NtB4_9MessageIdNtNtB6_9canonical9Serialize11size_static
Unexecuted instantiation: _RNvXNvNtCsklA9joyWMfk_10fuel_types11array_typessi_1__NtB4_9MessageIdNtNtB6_9canonical9Serialize12size_dynamic
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessi_1__NtB5_9MessageIdNtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessi_1__NtB5_9MessageIdNtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessk_1__NtB5_4SaltNtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessk_1__NtB5_4SaltNtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess1_1__NtB5_7AssetIdNtNtB7_9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
6.57k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess3_1__NtB5_6BlobIdNtNtB7_9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess5_1__NtB5_10ContractIdNtNtB7_9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
16.7k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess_1__NtB5_7AddressNtNtB7_9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
6.57k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessf_1__NtB5_7Bytes32NtNtB7_9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
19.7k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessf_1__NtB5_7Bytes32NtNtB7_9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
19.7k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessh_1__NtB5_5NonceNtNtB7_9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessl_1__NtB5_4SaltNtNtB7_9canonical11Deserialize13decode_staticRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
2.19k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess3_1__NtB5_6BlobIdNtNtB7_9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess1_1__NtB5_7AssetIdNtNtB7_9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
6.57k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessl_1__NtB5_4SaltNtNtB7_9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
2.19k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess_1__NtB5_7AddressNtNtB7_9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
6.57k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
_RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess5_1__NtB5_10ContractIdNtNtB7_9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
37
16.7k
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessh_1__NtB5_5NonceNtNtB7_9canonical11Deserialize14decode_dynamicRShECsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess1_1__NtB5_7AssetIdNtNtB7_9canonical11Deserialize13decode_staticRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess3_1__NtB5_6BlobIdNtNtB7_9canonical11Deserialize13decode_staticRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess5_1__NtB5_10ContractIdNtNtB7_9canonical11Deserialize13decode_staticRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess_1__NtB5_7AddressNtNtB7_9canonical11Deserialize13decode_staticRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessf_1__NtB5_7Bytes32NtNtB7_9canonical11Deserialize13decode_staticRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessf_1__NtB5_7Bytes32NtNtB7_9canonical11Deserialize14decode_dynamicRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessh_1__NtB5_5NonceNtNtB7_9canonical11Deserialize13decode_staticRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessl_1__NtB5_4SaltNtNtB7_9canonical11Deserialize13decode_staticRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess5_1__NtB5_10ContractIdNtNtB7_9canonical11Deserialize14decode_dynamicRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess1_1__NtB5_7AssetIdNtNtB7_9canonical11Deserialize14decode_dynamicRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess_1__NtB5_7AddressNtNtB7_9canonical11Deserialize14decode_dynamicRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessh_1__NtB5_5NonceNtNtB7_9canonical11Deserialize14decode_dynamicRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess3_1__NtB5_6BlobIdNtNtB7_9canonical11Deserialize14decode_dynamicRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessl_1__NtB5_4SaltNtNtB7_9canonical11Deserialize14decode_dynamicRShECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess_1__NtB5_7AddressNtNtB7_9canonical11Deserialize13decode_staticRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess_1__NtB5_7AddressNtNtB7_9canonical11Deserialize14decode_dynamicRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess1_1__NtB5_7AssetIdNtNtB7_9canonical11Deserialize13decode_staticRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess1_1__NtB5_7AssetIdNtNtB7_9canonical11Deserialize14decode_dynamicRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess3_1__NtB5_6BlobIdNtNtB7_9canonical11Deserialize13decode_staticRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess3_1__NtB5_6BlobIdNtNtB7_9canonical11Deserialize14decode_dynamicRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess5_1__NtB5_10ContractIdNtNtB7_9canonical11Deserialize13decode_staticRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess5_1__NtB5_10ContractIdNtNtB7_9canonical11Deserialize14decode_dynamicRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess7_1__NtB5_4TxIdNtNtB7_9canonical11Deserialize13decode_staticRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess7_1__NtB5_4TxIdNtNtB7_9canonical11Deserialize14decode_dynamicRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess9_1__NtB5_6Bytes4NtNtB7_9canonical11Deserialize13decode_staticRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typess9_1__NtB5_6Bytes4NtNtB7_9canonical11Deserialize14decode_dynamicRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessb_1__NtB5_6Bytes8NtNtB7_9canonical11Deserialize13decode_staticRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessb_1__NtB5_6Bytes8NtNtB7_9canonical11Deserialize14decode_dynamicRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessd_1__NtB5_7Bytes20NtNtB7_9canonical11Deserialize13decode_staticRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessd_1__NtB5_7Bytes20NtNtB7_9canonical11Deserialize14decode_dynamicRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessf_1__NtB5_7Bytes32NtNtB7_9canonical11Deserialize13decode_staticRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessf_1__NtB5_7Bytes32NtNtB7_9canonical11Deserialize14decode_dynamicRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessh_1__NtB5_5NonceNtNtB7_9canonical11Deserialize13decode_staticRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessh_1__NtB5_5NonceNtNtB7_9canonical11Deserialize14decode_dynamicRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessj_1__NtB5_9MessageIdNtNtB7_9canonical11Deserialize13decode_staticRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessj_1__NtB5_9MessageIdNtNtB7_9canonical11Deserialize14decode_dynamicRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessl_1__NtB5_4SaltNtNtB7_9canonical11Deserialize13decode_staticRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessl_1__NtB5_4SaltNtNtB7_9canonical11Deserialize14decode_dynamicRShEB7_
38
        )]
39
        pub struct $i([u8; $s]);
40
41
        key_methods!($i, $s);
42
43
        #[cfg(feature = "random")]
44
        impl Distribution<$i> for Standard {
45
13.1k
            fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> $i {
46
13.1k
                $i(rng.gen())
47
13.1k
            }
_RINvXs2_NtCsklA9joyWMfk_10fuel_types11array_typesNtNtCsaiZOB2jUGOZ_4rand13distributions8StandardINtNtBN_12distribution12DistributionNtB6_7AddressE6sampleNtNtNtBP_4rngs3std6StdRngECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
45
2.19k
            fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> $i {
46
2.19k
                $i(rng.gen())
47
2.19k
            }
_RINvXs3E_NtCsklA9joyWMfk_10fuel_types11array_typesNtNtCsaiZOB2jUGOZ_4rand13distributions8StandardINtNtBO_12distribution12DistributionNtB7_7Bytes32E6sampleNtNtNtBQ_4rngs3std6StdRngECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
45
8.77k
            fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> $i {
46
8.77k
                $i(rng.gen())
47
8.77k
            }
_RINvXs50_NtCsklA9joyWMfk_10fuel_types11array_typesNtNtCsaiZOB2jUGOZ_4rand13distributions8StandardINtNtBO_12distribution12DistributionNtB7_4SaltE6sampleNtNtNtBQ_4rngs3std6StdRngECsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
45
2.19k
            fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> $i {
46
2.19k
                $i(rng.gen())
47
2.19k
            }
Unexecuted instantiation: _RINvXs2_NtCsklA9joyWMfk_10fuel_types11array_typesNtNtCsaiZOB2jUGOZ_4rand13distributions8StandardINtNtBN_12distribution12DistributionNtB6_7AddressE6samplepEB8_
Unexecuted instantiation: _RINvXsu_NtCsklA9joyWMfk_10fuel_types11array_typesNtNtCsaiZOB2jUGOZ_4rand13distributions8StandardINtNtBN_12distribution12DistributionNtB6_7AssetIdE6samplepEB8_
Unexecuted instantiation: _RINvXsW_NtCsklA9joyWMfk_10fuel_types11array_typesNtNtCsaiZOB2jUGOZ_4rand13distributions8StandardINtNtBN_12distribution12DistributionNtB6_6BlobIdE6samplepEB8_
Unexecuted instantiation: _RINvXs1o_NtCsklA9joyWMfk_10fuel_types11array_typesNtNtCsaiZOB2jUGOZ_4rand13distributions8StandardINtNtBO_12distribution12DistributionNtB7_10ContractIdE6samplepEB9_
Unexecuted instantiation: _RINvXs1Q_NtCsklA9joyWMfk_10fuel_types11array_typesNtNtCsaiZOB2jUGOZ_4rand13distributions8StandardINtNtBO_12distribution12DistributionNtB7_4TxIdE6samplepEB9_
Unexecuted instantiation: _RINvXs2i_NtCsklA9joyWMfk_10fuel_types11array_typesNtNtCsaiZOB2jUGOZ_4rand13distributions8StandardINtNtBO_12distribution12DistributionNtB7_6Bytes4E6samplepEB9_
Unexecuted instantiation: _RINvXs2K_NtCsklA9joyWMfk_10fuel_types11array_typesNtNtCsaiZOB2jUGOZ_4rand13distributions8StandardINtNtBO_12distribution12DistributionNtB7_6Bytes8E6samplepEB9_
Unexecuted instantiation: _RINvXs3c_NtCsklA9joyWMfk_10fuel_types11array_typesNtNtCsaiZOB2jUGOZ_4rand13distributions8StandardINtNtBO_12distribution12DistributionNtB7_7Bytes20E6samplepEB9_
Unexecuted instantiation: _RINvXs3E_NtCsklA9joyWMfk_10fuel_types11array_typesNtNtCsaiZOB2jUGOZ_4rand13distributions8StandardINtNtBO_12distribution12DistributionNtB7_7Bytes32E6samplepEB9_
Unexecuted instantiation: _RINvXs46_NtCsklA9joyWMfk_10fuel_types11array_typesNtNtCsaiZOB2jUGOZ_4rand13distributions8StandardINtNtBO_12distribution12DistributionNtB7_5NonceE6samplepEB9_
Unexecuted instantiation: _RINvXs4y_NtCsklA9joyWMfk_10fuel_types11array_typesNtNtCsaiZOB2jUGOZ_4rand13distributions8StandardINtNtBO_12distribution12DistributionNtB7_9MessageIdE6samplepEB9_
Unexecuted instantiation: _RINvXs50_NtCsklA9joyWMfk_10fuel_types11array_typesNtNtCsaiZOB2jUGOZ_4rand13distributions8StandardINtNtBO_12distribution12DistributionNtB7_4SaltE6samplepEB9_
48
        }
49
    };
50
}
51
52
macro_rules! key_with_big_array {
53
    ($i:ident, $s:expr) => {
54
        /// FuelVM atomic type.
55
        #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
56
        #[repr(transparent)]
57
        #[cfg_attr(feature = "typescript", wasm_bindgen::prelude::wasm_bindgen)]
58
        #[derive(
59
0
            fuel_types::canonical::Serialize, fuel_types::canonical::Deserialize,
Unexecuted instantiation: _RNvXNvNtCsklA9joyWMfk_10fuel_types11array_typessm_1__NtB4_7Bytes64NtNtB6_9canonical9Serialize11size_static
Unexecuted instantiation: _RNvXNvNtCsklA9joyWMfk_10fuel_types11array_typessm_1__NtB4_7Bytes64NtNtB6_9canonical9Serialize12size_dynamic
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessm_1__NtB5_7Bytes64NtNtB7_9canonical9Serialize13encode_staticINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessm_1__NtB5_7Bytes64NtNtB7_9canonical9Serialize14encode_dynamicINtNtCs5vansr6XbJU_5alloc3vec3VechEEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessn_1__NtB5_7Bytes64NtNtB7_9canonical11Deserialize13decode_staticRShEB7_
Unexecuted instantiation: _RINvXNvNtCsklA9joyWMfk_10fuel_types11array_typessn_1__NtB5_7Bytes64NtNtB7_9canonical11Deserialize14decode_dynamicRShEB7_
60
        )]
61
        pub struct $i([u8; $s]);
62
63
        key_methods!($i, $s);
64
65
        impl Default for $i {
66
0
            fn default() -> $i {
67
0
                $i([0u8; $s])
68
0
            }
Unexecuted instantiation: _RNvXs5s_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64NtNtCsd3UI3IJrzMw_4core7default7Default7defaultCslMVbBbY0Npy_11fuel_crypto
Unexecuted instantiation: _RNvXs5s_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64NtNtCsd3UI3IJrzMw_4core7default7Default7defaultB8_
69
        }
70
71
        #[cfg(feature = "random")]
72
        impl Distribution<$i> for Standard {
73
0
            fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> $i {
74
0
                let mut bytes = $i::default();
75
0
76
0
                rng.fill_bytes(bytes.as_mut());
77
0
78
0
                bytes
79
0
            }
80
        }
81
    };
82
}
83
84
macro_rules! key_methods {
85
    ($i:ident, $s:expr) => {
86
        impl $i {
87
            /// Memory length of the type
88
            pub const LEN: usize = $s;
89
90
            /// Bytes constructor.
91
324k
            pub const fn new(bytes: [u8; $s]) -> Self {
92
324k
                Self(bytes)
93
324k
            }
_RNvMsE_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetId3newCs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
91
2.19k
            pub const fn new(bytes: [u8; $s]) -> Self {
92
2.19k
                Self(bytes)
93
2.19k
            }
_RNvMs3O_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes323newCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
91
102k
            pub const fn new(bytes: [u8; $s]) -> Self {
92
102k
                Self(bytes)
93
102k
            }
_RNvMs1y_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractId3newCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
91
30.1k
            pub const fn new(bytes: [u8; $s]) -> Self {
92
30.1k
                Self(bytes)
93
30.1k
            }
_RNvMsc_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7Address3newCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
91
177k
            pub const fn new(bytes: [u8; $s]) -> Self {
92
177k
                Self(bytes)
93
177k
            }
_RNvMsE_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetId3newCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
91
12.3k
            pub const fn new(bytes: [u8; $s]) -> Self {
92
12.3k
                Self(bytes)
93
12.3k
            }
Unexecuted instantiation: _RNvMs16_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6BlobId3newCseSMGV7FMBK4_7fuel_tx
_RNvMsE_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetId3newCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
91
157
            pub const fn new(bytes: [u8; $s]) -> Self {
92
157
                Self(bytes)
93
157
            }
Unexecuted instantiation: _RNvMsc_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7Address3newB7_
Unexecuted instantiation: _RNvMsE_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetId3newB7_
Unexecuted instantiation: _RNvMs16_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6BlobId3newB8_
Unexecuted instantiation: _RNvMs1y_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractId3newB8_
Unexecuted instantiation: _RNvMs20_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4TxId3newB8_
Unexecuted instantiation: _RNvMs2s_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes43newB8_
Unexecuted instantiation: _RNvMs2U_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes83newB8_
Unexecuted instantiation: _RNvMs3m_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes203newB8_
Unexecuted instantiation: _RNvMs3O_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes323newB8_
Unexecuted instantiation: _RNvMs4g_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_5Nonce3newB8_
Unexecuted instantiation: _RNvMs4I_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_9MessageId3newB8_
Unexecuted instantiation: _RNvMs5a_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4Salt3newB8_
Unexecuted instantiation: _RNvMs5C_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes643newB8_
94
95
            /// Zeroes bytes constructor.
96
47.4k
            pub const fn zeroed() -> $i {
97
47.4k
                $i([0; $s])
98
47.4k
            }
_RNvMs1y_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractId6zeroedCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
96
46
            pub const fn zeroed() -> $i {
97
46
                $i([0; $s])
98
46
            }
_RNvMs3O_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes326zeroedCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
96
24.0k
            pub const fn zeroed() -> $i {
97
24.0k
                $i([0; $s])
98
24.0k
            }
Unexecuted instantiation: _RNvMsc_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7Address6zeroedCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvMs1y_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractId6zeroedCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvMs3O_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes326zeroedCseSMGV7FMBK4_7fuel_tx
_RNvMs5C_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes646zeroedCslMVbBbY0Npy_11fuel_crypto
Line
Count
Source
96
23.3k
            pub const fn zeroed() -> $i {
97
23.3k
                $i([0; $s])
98
23.3k
            }
Unexecuted instantiation: _RNvMsc_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7Address6zeroedB7_
Unexecuted instantiation: _RNvMsE_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetId6zeroedB7_
Unexecuted instantiation: _RNvMs16_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6BlobId6zeroedB8_
Unexecuted instantiation: _RNvMs1y_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractId6zeroedB8_
Unexecuted instantiation: _RNvMs20_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4TxId6zeroedB8_
Unexecuted instantiation: _RNvMs2s_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes46zeroedB8_
Unexecuted instantiation: _RNvMs2U_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes86zeroedB8_
Unexecuted instantiation: _RNvMs3m_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes206zeroedB8_
Unexecuted instantiation: _RNvMs3O_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes326zeroedB8_
Unexecuted instantiation: _RNvMs4g_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_5Nonce6zeroedB8_
Unexecuted instantiation: _RNvMs4I_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_9MessageId6zeroedB8_
Unexecuted instantiation: _RNvMs5a_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4Salt6zeroedB8_
Unexecuted instantiation: _RNvMs5C_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes646zeroedB8_
99
100
            #[cfg(feature = "unsafe")]
101
            #[allow(unsafe_code)]
102
            /// Add a conversion from arbitrary slices into owned
103
            ///
104
            /// # Safety
105
            ///
106
            /// This function will not panic if the length of the slice is smaller than
107
            /// `Self::LEN`. Instead, it will cause undefined behavior and read random
108
            /// disowned bytes
109
            pub unsafe fn from_slice_unchecked(bytes: &[u8]) -> Self {
110
                $i($crate::bytes::from_slice_unchecked(bytes))
111
            }
112
113
            /// Copy-free reference cast
114
            /// # Safety
115
            /// Assumes the type is `repr[transparent]`.
116
0
            pub fn from_bytes_ref_checked(bytes: &[u8]) -> Option<&Self> {
117
0
                let bytes: &[u8; $s] = bytes.get(..$s)?.try_into().ok()?;
118
0
                Some(Self::from_bytes_ref(bytes))
119
0
            }
Unexecuted instantiation: _RNvMsc_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7Address22from_bytes_ref_checkedB7_
Unexecuted instantiation: _RNvMsE_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetId22from_bytes_ref_checkedB7_
Unexecuted instantiation: _RNvMs16_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6BlobId22from_bytes_ref_checkedB8_
Unexecuted instantiation: _RNvMs1y_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractId22from_bytes_ref_checkedB8_
Unexecuted instantiation: _RNvMs20_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4TxId22from_bytes_ref_checkedB8_
Unexecuted instantiation: _RNvMs2s_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes422from_bytes_ref_checkedB8_
Unexecuted instantiation: _RNvMs2U_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes822from_bytes_ref_checkedB8_
Unexecuted instantiation: _RNvMs3m_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes2022from_bytes_ref_checkedB8_
Unexecuted instantiation: _RNvMs3O_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes3222from_bytes_ref_checkedB8_
Unexecuted instantiation: _RNvMs4g_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_5Nonce22from_bytes_ref_checkedB8_
Unexecuted instantiation: _RNvMs4I_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_9MessageId22from_bytes_ref_checkedB8_
Unexecuted instantiation: _RNvMs5a_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4Salt22from_bytes_ref_checkedB8_
Unexecuted instantiation: _RNvMs5C_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes6422from_bytes_ref_checkedB8_
120
121
            /// Copy-free reference cast
122
            /// # Safety
123
            /// Assumes the type is `repr[transparent]`.
124
6.29k
            pub fn from_bytes_ref(bytes: &[u8; $s]) -> &Self {
125
6.29k
                // The interpreter will frequently make references to keys and values
126
6.29k
                // using logically checked slices.
127
6.29k
                //
128
6.29k
                // This function will save unnecessary copy to owned slices for the
129
6.29k
                // interpreter access
130
6.29k
                #[allow(unsafe_code)]
131
6.29k
                unsafe {
132
6.29k
                    &*(bytes.as_ptr() as *const Self)
133
6.29k
                }
134
6.29k
            }
_RNvMs1y_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractId14from_bytes_refCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
124
3.14k
            pub fn from_bytes_ref(bytes: &[u8; $s]) -> &Self {
125
3.14k
                // The interpreter will frequently make references to keys and values
126
3.14k
                // using logically checked slices.
127
3.14k
                //
128
3.14k
                // This function will save unnecessary copy to owned slices for the
129
3.14k
                // interpreter access
130
3.14k
                #[allow(unsafe_code)]
131
3.14k
                unsafe {
132
3.14k
                    &*(bytes.as_ptr() as *const Self)
133
3.14k
                }
134
3.14k
            }
Unexecuted instantiation: _RNvMsE_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetId14from_bytes_refCsg6P9hFxt0iW_7fuel_vm
_RNvMs3O_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes3214from_bytes_refCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
124
3.14k
            pub fn from_bytes_ref(bytes: &[u8; $s]) -> &Self {
125
3.14k
                // The interpreter will frequently make references to keys and values
126
3.14k
                // using logically checked slices.
127
3.14k
                //
128
3.14k
                // This function will save unnecessary copy to owned slices for the
129
3.14k
                // interpreter access
130
3.14k
                #[allow(unsafe_code)]
131
3.14k
                unsafe {
132
3.14k
                    &*(bytes.as_ptr() as *const Self)
133
3.14k
                }
134
3.14k
            }
Unexecuted instantiation: _RNvMsc_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7Address14from_bytes_refB7_
Unexecuted instantiation: _RNvMsE_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetId14from_bytes_refB7_
Unexecuted instantiation: _RNvMs16_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6BlobId14from_bytes_refB8_
Unexecuted instantiation: _RNvMs1y_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractId14from_bytes_refB8_
Unexecuted instantiation: _RNvMs20_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4TxId14from_bytes_refB8_
Unexecuted instantiation: _RNvMs2s_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes414from_bytes_refB8_
Unexecuted instantiation: _RNvMs2U_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes814from_bytes_refB8_
Unexecuted instantiation: _RNvMs3m_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes2014from_bytes_refB8_
Unexecuted instantiation: _RNvMs3O_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes3214from_bytes_refB8_
Unexecuted instantiation: _RNvMs4g_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_5Nonce14from_bytes_refB8_
Unexecuted instantiation: _RNvMs4I_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_9MessageId14from_bytes_refB8_
Unexecuted instantiation: _RNvMs5a_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4Salt14from_bytes_refB8_
Unexecuted instantiation: _RNvMs5C_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes6414from_bytes_refB8_
135
136
            /// The memory size of the type by the method.
137
0
            pub const fn size(&self) -> usize {
138
0
                Self::LEN
139
0
            }
Unexecuted instantiation: _RNvMsc_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7Address4sizeB7_
Unexecuted instantiation: _RNvMsE_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetId4sizeB7_
Unexecuted instantiation: _RNvMs16_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6BlobId4sizeB8_
Unexecuted instantiation: _RNvMs1y_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractId4sizeB8_
Unexecuted instantiation: _RNvMs20_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4TxId4sizeB8_
Unexecuted instantiation: _RNvMs2s_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes44sizeB8_
Unexecuted instantiation: _RNvMs2U_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes84sizeB8_
Unexecuted instantiation: _RNvMs3m_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes204sizeB8_
Unexecuted instantiation: _RNvMs3O_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes324sizeB8_
Unexecuted instantiation: _RNvMs4g_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_5Nonce4sizeB8_
Unexecuted instantiation: _RNvMs4I_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_9MessageId4sizeB8_
Unexecuted instantiation: _RNvMs5a_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4Salt4sizeB8_
Unexecuted instantiation: _RNvMs5C_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes644sizeB8_
140
        }
141
142
        #[cfg(feature = "typescript")]
143
        #[wasm_bindgen::prelude::wasm_bindgen]
144
        impl $i {
145
            /// Bytes constructor.
146
            ///
147
            /// # Panics
148
            ///
149
            /// This function will panic if the length of `buf` is smaller than
150
            /// `Self::LEN`.
151
            #[wasm_bindgen(js_name = from_bytes)]
152
            pub fn from_bytes_typescript(bytes: &[u8]) -> Self {
153
                Self(bytes.try_into().expect(
154
                    format!("The size of the arrays it not {} size", $s).as_str(),
155
                ))
156
            }
157
158
            /// Zeroes bytes constructor.
159
            #[wasm_bindgen(js_name = zeroed)]
160
            pub fn zeroed_typescript() -> $i {
161
                Self::zeroed()
162
            }
163
164
            /// The memory size of the type by the method.
165
            #[wasm_bindgen(js_name = size)]
166
            pub fn size_typescript(&self) -> usize {
167
                self.size()
168
            }
169
        }
170
171
        #[cfg(feature = "random")]
172
        impl rand::Fill for $i {
173
0
            fn try_fill<R: rand::Rng + ?Sized>(
174
0
                &mut self,
175
0
                rng: &mut R,
176
0
            ) -> Result<(), rand::Error> {
177
0
                rng.fill_bytes(self.as_mut());
178
0
179
0
                Ok(())
180
0
            }
Unexecuted instantiation: _RINvXsd_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7AddressNtNtCsaiZOB2jUGOZ_4rand3rng4Fill8try_fillpEB8_
Unexecuted instantiation: _RINvXsF_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7AssetIdNtNtCsaiZOB2jUGOZ_4rand3rng4Fill8try_fillpEB8_
Unexecuted instantiation: _RINvXs17_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_6BlobIdNtNtCsaiZOB2jUGOZ_4rand3rng4Fill8try_fillpEB9_
Unexecuted instantiation: _RINvXs1z_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_10ContractIdNtNtCsaiZOB2jUGOZ_4rand3rng4Fill8try_fillpEB9_
Unexecuted instantiation: _RINvXs21_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_4TxIdNtNtCsaiZOB2jUGOZ_4rand3rng4Fill8try_fillpEB9_
Unexecuted instantiation: _RINvXs2t_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_6Bytes4NtNtCsaiZOB2jUGOZ_4rand3rng4Fill8try_fillpEB9_
Unexecuted instantiation: _RINvXs2V_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_6Bytes8NtNtCsaiZOB2jUGOZ_4rand3rng4Fill8try_fillpEB9_
Unexecuted instantiation: _RINvXs3n_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_7Bytes20NtNtCsaiZOB2jUGOZ_4rand3rng4Fill8try_fillpEB9_
Unexecuted instantiation: _RINvXs3P_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_7Bytes32NtNtCsaiZOB2jUGOZ_4rand3rng4Fill8try_fillpEB9_
Unexecuted instantiation: _RINvXs4h_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_5NonceNtNtCsaiZOB2jUGOZ_4rand3rng4Fill8try_fillpEB9_
Unexecuted instantiation: _RINvXs4J_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_9MessageIdNtNtCsaiZOB2jUGOZ_4rand3rng4Fill8try_fillpEB9_
Unexecuted instantiation: _RINvXs5b_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_4SaltNtNtCsaiZOB2jUGOZ_4rand3rng4Fill8try_fillpEB9_
Unexecuted instantiation: _RINvXs5D_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_7Bytes64NtNtCsaiZOB2jUGOZ_4rand3rng4Fill8try_fillpEB9_
181
        }
182
183
        impl Deref for $i {
184
            type Target = [u8; $s];
185
186
691k
            fn deref(&self) -> &[u8; $s] {
187
691k
                &self.0
188
691k
            }
_RNvXs3Q_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32NtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
186
259k
            fn deref(&self) -> &[u8; $s] {
187
259k
                &self.0
188
259k
            }
_RNvXsG_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetIdNtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
186
10.9k
            fn deref(&self) -> &[u8; $s] {
187
10.9k
                &self.0
188
10.9k
            }
_RNvXs1A_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractIdNtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
186
231k
            fn deref(&self) -> &[u8; $s] {
187
231k
                &self.0
188
231k
            }
_RNvXs5E_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64NtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
186
21.4k
            fn deref(&self) -> &[u8; $s] {
187
21.4k
                &self.0
188
21.4k
            }
_RNvXs3Q_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32NtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
186
102k
            fn deref(&self) -> &[u8; $s] {
187
102k
                &self.0
188
102k
            }
Unexecuted instantiation: _RNvXs5E_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64NtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefCseSMGV7FMBK4_7fuel_tx
_RNvXs1A_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractIdNtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
186
157
            fn deref(&self) -> &[u8; $s] {
187
157
                &self.0
188
157
            }
_RNvXs3Q_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32NtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefCslMVbBbY0Npy_11fuel_crypto
Line
Count
Source
186
33.3k
            fn deref(&self) -> &[u8; $s] {
187
33.3k
                &self.0
188
33.3k
            }
_RNvXs5E_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64NtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefCslMVbBbY0Npy_11fuel_crypto
Line
Count
Source
186
31.9k
            fn deref(&self) -> &[u8; $s] {
187
31.9k
                &self.0
188
31.9k
            }
Unexecuted instantiation: _RNvXse_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AddressNtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB7_
Unexecuted instantiation: _RNvXsG_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetIdNtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB7_
Unexecuted instantiation: _RNvXs18_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6BlobIdNtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB8_
Unexecuted instantiation: _RNvXs1A_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractIdNtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB8_
Unexecuted instantiation: _RNvXs22_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4TxIdNtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB8_
Unexecuted instantiation: _RNvXs2u_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes4NtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB8_
Unexecuted instantiation: _RNvXs2W_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes8NtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB8_
Unexecuted instantiation: _RNvXs3o_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes20NtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB8_
Unexecuted instantiation: _RNvXs3Q_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32NtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB8_
Unexecuted instantiation: _RNvXs4i_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_5NonceNtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB8_
Unexecuted instantiation: _RNvXs4K_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_9MessageIdNtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB8_
Unexecuted instantiation: _RNvXs5c_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4SaltNtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB8_
Unexecuted instantiation: _RNvXs5E_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64NtNtNtCsd3UI3IJrzMw_4core3ops5deref5Deref5derefB8_
189
        }
190
191
        impl Borrow<[u8; $s]> for $i {
192
0
            fn borrow(&self) -> &[u8; $s] {
193
0
                &self.0
194
0
            }
Unexecuted instantiation: _RNvXsf_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AddressINtNtCsd3UI3IJrzMw_4core6borrow6BorrowAhj20_E6borrowB7_
Unexecuted instantiation: _RNvXsH_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetIdINtNtCsd3UI3IJrzMw_4core6borrow6BorrowAhj20_E6borrowB7_
Unexecuted instantiation: _RNvXs19_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6BlobIdINtNtCsd3UI3IJrzMw_4core6borrow6BorrowAhj20_E6borrowB8_
Unexecuted instantiation: _RNvXs1B_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractIdINtNtCsd3UI3IJrzMw_4core6borrow6BorrowAhj20_E6borrowB8_
Unexecuted instantiation: _RNvXs23_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4TxIdINtNtCsd3UI3IJrzMw_4core6borrow6BorrowAhj20_E6borrowB8_
Unexecuted instantiation: _RNvXs2v_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes4INtNtCsd3UI3IJrzMw_4core6borrow6BorrowAhj4_E6borrowB8_
Unexecuted instantiation: _RNvXs2X_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes8INtNtCsd3UI3IJrzMw_4core6borrow6BorrowAhj8_E6borrowB8_
Unexecuted instantiation: _RNvXs3p_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes20INtNtCsd3UI3IJrzMw_4core6borrow6BorrowAhj14_E6borrowB8_
Unexecuted instantiation: _RNvXs3R_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32INtNtCsd3UI3IJrzMw_4core6borrow6BorrowAhj20_E6borrowB8_
Unexecuted instantiation: _RNvXs4j_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_5NonceINtNtCsd3UI3IJrzMw_4core6borrow6BorrowAhj20_E6borrowB8_
Unexecuted instantiation: _RNvXs4L_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_9MessageIdINtNtCsd3UI3IJrzMw_4core6borrow6BorrowAhj20_E6borrowB8_
Unexecuted instantiation: _RNvXs5d_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4SaltINtNtCsd3UI3IJrzMw_4core6borrow6BorrowAhj20_E6borrowB8_
Unexecuted instantiation: _RNvXs5F_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64INtNtCsd3UI3IJrzMw_4core6borrow6BorrowAhj40_E6borrowB8_
195
        }
196
197
        impl BorrowMut<[u8; $s]> for $i {
198
0
            fn borrow_mut(&mut self) -> &mut [u8; $s] {
199
0
                &mut self.0
200
0
            }
Unexecuted instantiation: _RNvXsg_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AddressINtNtCsd3UI3IJrzMw_4core6borrow9BorrowMutAhj20_E10borrow_mutB7_
Unexecuted instantiation: _RNvXsI_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetIdINtNtCsd3UI3IJrzMw_4core6borrow9BorrowMutAhj20_E10borrow_mutB7_
Unexecuted instantiation: _RNvXs1a_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6BlobIdINtNtCsd3UI3IJrzMw_4core6borrow9BorrowMutAhj20_E10borrow_mutB8_
Unexecuted instantiation: _RNvXs1C_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractIdINtNtCsd3UI3IJrzMw_4core6borrow9BorrowMutAhj20_E10borrow_mutB8_
Unexecuted instantiation: _RNvXs24_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4TxIdINtNtCsd3UI3IJrzMw_4core6borrow9BorrowMutAhj20_E10borrow_mutB8_
Unexecuted instantiation: _RNvXs2w_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes4INtNtCsd3UI3IJrzMw_4core6borrow9BorrowMutAhj4_E10borrow_mutB8_
Unexecuted instantiation: _RNvXs2Y_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes8INtNtCsd3UI3IJrzMw_4core6borrow9BorrowMutAhj8_E10borrow_mutB8_
Unexecuted instantiation: _RNvXs3q_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes20INtNtCsd3UI3IJrzMw_4core6borrow9BorrowMutAhj14_E10borrow_mutB8_
Unexecuted instantiation: _RNvXs3S_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32INtNtCsd3UI3IJrzMw_4core6borrow9BorrowMutAhj20_E10borrow_mutB8_
Unexecuted instantiation: _RNvXs4k_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_5NonceINtNtCsd3UI3IJrzMw_4core6borrow9BorrowMutAhj20_E10borrow_mutB8_
Unexecuted instantiation: _RNvXs4M_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_9MessageIdINtNtCsd3UI3IJrzMw_4core6borrow9BorrowMutAhj20_E10borrow_mutB8_
Unexecuted instantiation: _RNvXs5e_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4SaltINtNtCsd3UI3IJrzMw_4core6borrow9BorrowMutAhj20_E10borrow_mutB8_
Unexecuted instantiation: _RNvXs5G_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64INtNtCsd3UI3IJrzMw_4core6borrow9BorrowMutAhj40_E10borrow_mutB8_
201
        }
202
203
        impl DerefMut for $i {
204
24.3k
            fn deref_mut(&mut self) -> &mut [u8; $s] {
205
24.3k
                &mut self.0
206
24.3k
            }
_RNvXs5H_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64NtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutCslMVbBbY0Npy_11fuel_crypto
Line
Count
Source
204
24.3k
            fn deref_mut(&mut self) -> &mut [u8; $s] {
205
24.3k
                &mut self.0
206
24.3k
            }
Unexecuted instantiation: _RNvXs3T_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32NtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutCslMVbBbY0Npy_11fuel_crypto
Unexecuted instantiation: _RNvXsh_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AddressNtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB7_
Unexecuted instantiation: _RNvXsJ_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetIdNtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB7_
Unexecuted instantiation: _RNvXs1b_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6BlobIdNtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB8_
Unexecuted instantiation: _RNvXs1D_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractIdNtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB8_
Unexecuted instantiation: _RNvXs25_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4TxIdNtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB8_
Unexecuted instantiation: _RNvXs2x_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes4NtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB8_
Unexecuted instantiation: _RNvXs2Z_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes8NtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB8_
Unexecuted instantiation: _RNvXs3r_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes20NtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB8_
Unexecuted instantiation: _RNvXs3T_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32NtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB8_
Unexecuted instantiation: _RNvXs4l_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_5NonceNtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB8_
Unexecuted instantiation: _RNvXs4N_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_9MessageIdNtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB8_
Unexecuted instantiation: _RNvXs5f_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4SaltNtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB8_
Unexecuted instantiation: _RNvXs5H_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64NtNtNtCsd3UI3IJrzMw_4core3ops5deref8DerefMut9deref_mutB8_
207
        }
208
209
        impl AsRef<[u8]> for $i {
210
237k
            fn as_ref(&self) -> &[u8] {
211
237k
                &self.0
212
237k
            }
_RNvXsK_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetIdINtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refCs9ElU2YR0Zcw_12fuel_vm_fuzz
Line
Count
Source
210
2.19k
            fn as_ref(&self) -> &[u8] {
211
2.19k
                &self.0
212
2.19k
            }
_RNvXs3U_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32INtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
210
29.6k
            fn as_ref(&self) -> &[u8] {
211
29.6k
                &self.0
212
29.6k
            }
_RNvXs5I_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64INtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
210
4.38k
            fn as_ref(&self) -> &[u8] {
211
4.38k
                &self.0
212
4.38k
            }
_RNvXsK_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetIdINtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
210
27.1k
            fn as_ref(&self) -> &[u8] {
211
27.1k
                &self.0
212
27.1k
            }
_RNvXs1E_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractIdINtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
210
32.8k
            fn as_ref(&self) -> &[u8] {
211
32.8k
                &self.0
212
32.8k
            }
_RNvXs3U_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32INtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
210
106k
            fn as_ref(&self) -> &[u8] {
211
106k
                &self.0
212
106k
            }
Unexecuted instantiation: _RNvXs4m_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_5NonceINtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refCseSMGV7FMBK4_7fuel_tx
_RNvXs5g_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4SaltINtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
210
8.77k
            fn as_ref(&self) -> &[u8] {
211
8.77k
                &self.0
212
8.77k
            }
Unexecuted instantiation: _RNvXsi_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AddressINtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvXs5I_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64INtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refCseSMGV7FMBK4_7fuel_tx
_RNvXs3U_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32INtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refCslMVbBbY0Npy_11fuel_crypto
Line
Count
Source
210
13.1k
            fn as_ref(&self) -> &[u8] {
211
13.1k
                &self.0
212
13.1k
            }
_RNvXs5I_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64INtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refCslMVbBbY0Npy_11fuel_crypto
Line
Count
Source
210
13.1k
            fn as_ref(&self) -> &[u8] {
211
13.1k
                &self.0
212
13.1k
            }
Unexecuted instantiation: _RNvXsi_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AddressINtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refB7_
Unexecuted instantiation: _RNvXsK_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetIdINtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refB7_
Unexecuted instantiation: _RNvXs1c_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6BlobIdINtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refB8_
Unexecuted instantiation: _RNvXs1E_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractIdINtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refB8_
Unexecuted instantiation: _RNvXs26_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4TxIdINtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refB8_
Unexecuted instantiation: _RNvXs2y_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes4INtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refB8_
Unexecuted instantiation: _RNvXs30_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes8INtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refB8_
Unexecuted instantiation: _RNvXs3s_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes20INtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refB8_
Unexecuted instantiation: _RNvXs3U_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32INtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refB8_
Unexecuted instantiation: _RNvXs4m_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_5NonceINtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refB8_
Unexecuted instantiation: _RNvXs4O_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_9MessageIdINtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refB8_
Unexecuted instantiation: _RNvXs5g_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4SaltINtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refB8_
Unexecuted instantiation: _RNvXs5I_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64INtNtCsd3UI3IJrzMw_4core7convert5AsRefShE6as_refB8_
213
        }
214
215
        impl AsMut<[u8]> for $i {
216
6.92k
            fn as_mut(&mut self) -> &mut [u8] {
217
6.92k
                &mut self.0
218
6.92k
            }
_RNvXs3V_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32INtNtCsd3UI3IJrzMw_4core7convert5AsMutShE6as_mutCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
216
6.92k
            fn as_mut(&mut self) -> &mut [u8] {
217
6.92k
                &mut self.0
218
6.92k
            }
Unexecuted instantiation: _RNvXs3V_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32INtNtCsd3UI3IJrzMw_4core7convert5AsMutShE6as_mutCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvXs5J_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64INtNtCsd3UI3IJrzMw_4core7convert5AsMutShE6as_mutCslMVbBbY0Npy_11fuel_crypto
Unexecuted instantiation: _RNvXsj_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AddressINtNtCsd3UI3IJrzMw_4core7convert5AsMutShE6as_mutB7_
Unexecuted instantiation: _RNvXsL_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetIdINtNtCsd3UI3IJrzMw_4core7convert5AsMutShE6as_mutB7_
Unexecuted instantiation: _RNvXs1d_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6BlobIdINtNtCsd3UI3IJrzMw_4core7convert5AsMutShE6as_mutB8_
Unexecuted instantiation: _RNvXs1F_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractIdINtNtCsd3UI3IJrzMw_4core7convert5AsMutShE6as_mutB8_
Unexecuted instantiation: _RNvXs27_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4TxIdINtNtCsd3UI3IJrzMw_4core7convert5AsMutShE6as_mutB8_
Unexecuted instantiation: _RNvXs2z_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes4INtNtCsd3UI3IJrzMw_4core7convert5AsMutShE6as_mutB8_
Unexecuted instantiation: _RNvXs31_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes8INtNtCsd3UI3IJrzMw_4core7convert5AsMutShE6as_mutB8_
Unexecuted instantiation: _RNvXs3t_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes20INtNtCsd3UI3IJrzMw_4core7convert5AsMutShE6as_mutB8_
Unexecuted instantiation: _RNvXs3V_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32INtNtCsd3UI3IJrzMw_4core7convert5AsMutShE6as_mutB8_
Unexecuted instantiation: _RNvXs4n_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_5NonceINtNtCsd3UI3IJrzMw_4core7convert5AsMutShE6as_mutB8_
Unexecuted instantiation: _RNvXs4P_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_9MessageIdINtNtCsd3UI3IJrzMw_4core7convert5AsMutShE6as_mutB8_
Unexecuted instantiation: _RNvXs5h_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4SaltINtNtCsd3UI3IJrzMw_4core7convert5AsMutShE6as_mutB8_
Unexecuted instantiation: _RNvXs5J_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64INtNtCsd3UI3IJrzMw_4core7convert5AsMutShE6as_mutB8_
219
        }
220
221
        impl From<[u8; $s]> for $i {
222
1.19M
            fn from(bytes: [u8; $s]) -> Self {
223
1.19M
                Self(bytes)
224
1.19M
            }
_RNvXs3W_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32INtNtCsd3UI3IJrzMw_4core7convert4FromAhj20_E4fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
222
257k
            fn from(bytes: [u8; $s]) -> Self {
223
257k
                Self(bytes)
224
257k
            }
_RNvXsk_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AddressINtNtCsd3UI3IJrzMw_4core7convert4FromAhj20_E4fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
222
10
            fn from(bytes: [u8; $s]) -> Self {
223
10
                Self(bytes)
224
10
            }
_RNvXs1e_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6BlobIdINtNtCsd3UI3IJrzMw_4core7convert4FromAhj20_E4fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
222
6
            fn from(bytes: [u8; $s]) -> Self {
223
6
                Self(bytes)
224
6
            }
_RNvXs1G_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractIdINtNtCsd3UI3IJrzMw_4core7convert4FromAhj20_E4fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
222
370k
            fn from(bytes: [u8; $s]) -> Self {
223
370k
                Self(bytes)
224
370k
            }
_RNvXsM_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetIdINtNtCsd3UI3IJrzMw_4core7convert4FromAhj20_E4fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
222
12
            fn from(bytes: [u8; $s]) -> Self {
223
12
                Self(bytes)
224
12
            }
_RNvXs5K_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64INtNtCsd3UI3IJrzMw_4core7convert4FromAhj40_E4fromCsg6P9hFxt0iW_7fuel_vm
Line
Count
Source
222
27.6k
            fn from(bytes: [u8; $s]) -> Self {
223
27.6k
                Self(bytes)
224
27.6k
            }
_RNvXs3W_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32INtNtCsd3UI3IJrzMw_4core7convert4FromAhj20_E4fromCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
222
291k
            fn from(bytes: [u8; $s]) -> Self {
223
291k
                Self(bytes)
224
291k
            }
_RNvXs1G_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractIdINtNtCsd3UI3IJrzMw_4core7convert4FromAhj20_E4fromCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
222
8.77k
            fn from(bytes: [u8; $s]) -> Self {
223
8.77k
                Self(bytes)
224
8.77k
            }
Unexecuted instantiation: _RNvXs4Q_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_9MessageIdINtNtCsd3UI3IJrzMw_4core7convert4FromAhj20_E4fromCseSMGV7FMBK4_7fuel_tx
_RNvXsk_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AddressINtNtCsd3UI3IJrzMw_4core7convert4FromAhj20_E4fromCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
222
13.1k
            fn from(bytes: [u8; $s]) -> Self {
223
13.1k
                Self(bytes)
224
13.1k
            }
_RNvXs4o_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_5NonceINtNtCsd3UI3IJrzMw_4core7convert4FromAhj20_E4fromCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
222
88.9k
            fn from(bytes: [u8; $s]) -> Self {
223
88.9k
                Self(bytes)
224
88.9k
            }
_RNvXs5K_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64INtNtCsd3UI3IJrzMw_4core7convert4FromAhj40_E4fromCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
222
4.38k
            fn from(bytes: [u8; $s]) -> Self {
223
4.38k
                Self(bytes)
224
4.38k
            }
_RNvXs3W_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32INtNtCsd3UI3IJrzMw_4core7convert4FromAhj20_E4fromCslMVbBbY0Npy_11fuel_crypto
Line
Count
Source
222
128k
            fn from(bytes: [u8; $s]) -> Self {
223
128k
                Self(bytes)
224
128k
            }
_RNvXs5K_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64INtNtCsd3UI3IJrzMw_4core7convert4FromAhj40_E4fromCslMVbBbY0Npy_11fuel_crypto
Line
Count
Source
222
4.38k
            fn from(bytes: [u8; $s]) -> Self {
223
4.38k
                Self(bytes)
224
4.38k
            }
Unexecuted instantiation: _RNvXs4o_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_5NonceINtNtCsd3UI3IJrzMw_4core7convert4FromAhj20_E4fromB8_
Unexecuted instantiation: _RNvXsk_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AddressINtNtCsd3UI3IJrzMw_4core7convert4FromAhj20_E4fromB7_
Unexecuted instantiation: _RNvXsM_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetIdINtNtCsd3UI3IJrzMw_4core7convert4FromAhj20_E4fromB7_
Unexecuted instantiation: _RNvXs1e_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6BlobIdINtNtCsd3UI3IJrzMw_4core7convert4FromAhj20_E4fromB8_
Unexecuted instantiation: _RNvXs1G_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractIdINtNtCsd3UI3IJrzMw_4core7convert4FromAhj20_E4fromB8_
Unexecuted instantiation: _RNvXs28_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4TxIdINtNtCsd3UI3IJrzMw_4core7convert4FromAhj20_E4fromB8_
Unexecuted instantiation: _RNvXs2A_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes4INtNtCsd3UI3IJrzMw_4core7convert4FromAhj4_E4fromB8_
Unexecuted instantiation: _RNvXs32_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes8INtNtCsd3UI3IJrzMw_4core7convert4FromAhj8_E4fromB8_
Unexecuted instantiation: _RNvXs3u_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes20INtNtCsd3UI3IJrzMw_4core7convert4FromAhj14_E4fromB8_
Unexecuted instantiation: _RNvXs3W_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32INtNtCsd3UI3IJrzMw_4core7convert4FromAhj20_E4fromB8_
Unexecuted instantiation: _RNvXs4Q_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_9MessageIdINtNtCsd3UI3IJrzMw_4core7convert4FromAhj20_E4fromB8_
Unexecuted instantiation: _RNvXs5i_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4SaltINtNtCsd3UI3IJrzMw_4core7convert4FromAhj20_E4fromB8_
Unexecuted instantiation: _RNvXs5K_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64INtNtCsd3UI3IJrzMw_4core7convert4FromAhj40_E4fromB8_
225
        }
226
227
        impl From<$i> for [u8; $s] {
228
13.1k
            fn from(salt: $i) -> [u8; $s] {
229
13.1k
                salt.0
230
13.1k
            }
_RNvXs3X_NtCsklA9joyWMfk_10fuel_types11array_typesAhj20_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_7Bytes32E4fromCseSMGV7FMBK4_7fuel_tx
Line
Count
Source
228
13.1k
            fn from(salt: $i) -> [u8; $s] {
229
13.1k
                salt.0
230
13.1k
            }
Unexecuted instantiation: _RNvXs3X_NtCsklA9joyWMfk_10fuel_types11array_typesAhj20_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_7Bytes32E4fromCslMVbBbY0Npy_11fuel_crypto
Unexecuted instantiation: _RNvXs5L_NtCsklA9joyWMfk_10fuel_types11array_typesAhj40_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_7Bytes64E4fromCslMVbBbY0Npy_11fuel_crypto
Unexecuted instantiation: _RNvXsl_NtCsklA9joyWMfk_10fuel_types11array_typesAhj20_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_7AddressE4fromB7_
Unexecuted instantiation: _RNvXsN_NtCsklA9joyWMfk_10fuel_types11array_typesAhj20_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB5_7AssetIdE4fromB7_
Unexecuted instantiation: _RNvXs1f_NtCsklA9joyWMfk_10fuel_types11array_typesAhj20_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_6BlobIdE4fromB8_
Unexecuted instantiation: _RNvXs1H_NtCsklA9joyWMfk_10fuel_types11array_typesAhj20_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_10ContractIdE4fromB8_
Unexecuted instantiation: _RNvXs29_NtCsklA9joyWMfk_10fuel_types11array_typesAhj20_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4TxIdE4fromB8_
Unexecuted instantiation: _RNvXs2B_NtCsklA9joyWMfk_10fuel_types11array_typesAhj4_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_6Bytes4E4fromB8_
Unexecuted instantiation: _RNvXs33_NtCsklA9joyWMfk_10fuel_types11array_typesAhj8_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_6Bytes8E4fromB8_
Unexecuted instantiation: _RNvXs3v_NtCsklA9joyWMfk_10fuel_types11array_typesAhj14_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_7Bytes20E4fromB8_
Unexecuted instantiation: _RNvXs3X_NtCsklA9joyWMfk_10fuel_types11array_typesAhj20_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_7Bytes32E4fromB8_
Unexecuted instantiation: _RNvXs4p_NtCsklA9joyWMfk_10fuel_types11array_typesAhj20_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_5NonceE4fromB8_
Unexecuted instantiation: _RNvXs4R_NtCsklA9joyWMfk_10fuel_types11array_typesAhj20_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_9MessageIdE4fromB8_
Unexecuted instantiation: _RNvXs5j_NtCsklA9joyWMfk_10fuel_types11array_typesAhj20_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_4SaltE4fromB8_
Unexecuted instantiation: _RNvXs5L_NtCsklA9joyWMfk_10fuel_types11array_typesAhj40_INtNtCsd3UI3IJrzMw_4core7convert4FromNtB6_7Bytes64E4fromB8_
231
        }
232
233
        impl TryFrom<&[u8]> for $i {
234
            type Error = TryFromSliceError;
235
236
0
            fn try_from(bytes: &[u8]) -> Result<$i, TryFromSliceError> {
237
0
                <[u8; $s]>::try_from(bytes).map(|b| b.into())
Unexecuted instantiation: _RNCNvXs1I_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_10ContractIdINtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_from0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXsO_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_7AssetIdINtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_from0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs3Y_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes32INtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_from0Csg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNCNvXs5M_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes64INtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_from0CslMVbBbY0Npy_11fuel_crypto
Unexecuted instantiation: _RNCNvXs3Y_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes32INtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_from0CslMVbBbY0Npy_11fuel_crypto
Unexecuted instantiation: _RNCNvXsm_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_7AddressINtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_from0B9_
Unexecuted instantiation: _RNCNvXsO_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_7AssetIdINtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_from0B9_
Unexecuted instantiation: _RNCNvXs1g_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_6BlobIdINtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_from0Ba_
Unexecuted instantiation: _RNCNvXs1I_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_10ContractIdINtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_from0Ba_
Unexecuted instantiation: _RNCNvXs2a_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_4TxIdINtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_from0Ba_
Unexecuted instantiation: _RNCNvXs2C_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_6Bytes4INtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_from0Ba_
Unexecuted instantiation: _RNCNvXs34_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_6Bytes8INtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_from0Ba_
Unexecuted instantiation: _RNCNvXs3w_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes20INtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_from0Ba_
Unexecuted instantiation: _RNCNvXs3Y_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes32INtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_from0Ba_
Unexecuted instantiation: _RNCNvXs4q_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_5NonceINtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_from0Ba_
Unexecuted instantiation: _RNCNvXs4S_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_9MessageIdINtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_from0Ba_
Unexecuted instantiation: _RNCNvXs5k_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_4SaltINtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_from0Ba_
Unexecuted instantiation: _RNCNvXs5M_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes64INtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_from0Ba_
238
0
            }
Unexecuted instantiation: _RNvXs1I_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractIdINtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_fromCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXsO_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetIdINtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_fromCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs3Y_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32INtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_fromCsg6P9hFxt0iW_7fuel_vm
Unexecuted instantiation: _RNvXs5M_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64INtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_fromCslMVbBbY0Npy_11fuel_crypto
Unexecuted instantiation: _RNvXs3Y_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32INtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_fromCslMVbBbY0Npy_11fuel_crypto
Unexecuted instantiation: _RNvXsm_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AddressINtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_fromB7_
Unexecuted instantiation: _RNvXsO_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetIdINtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_fromB7_
Unexecuted instantiation: _RNvXs1g_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6BlobIdINtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_fromB8_
Unexecuted instantiation: _RNvXs1I_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractIdINtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_fromB8_
Unexecuted instantiation: _RNvXs2a_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4TxIdINtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_fromB8_
Unexecuted instantiation: _RNvXs2C_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes4INtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_fromB8_
Unexecuted instantiation: _RNvXs34_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes8INtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_fromB8_
Unexecuted instantiation: _RNvXs3w_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes20INtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_fromB8_
Unexecuted instantiation: _RNvXs3Y_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32INtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_fromB8_
Unexecuted instantiation: _RNvXs4q_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_5NonceINtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_fromB8_
Unexecuted instantiation: _RNvXs4S_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_9MessageIdINtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_fromB8_
Unexecuted instantiation: _RNvXs5k_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4SaltINtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_fromB8_
Unexecuted instantiation: _RNvXs5M_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64INtNtCsd3UI3IJrzMw_4core7convert7TryFromRShE8try_fromB8_
239
        }
240
241
        impl fmt::LowerHex for $i {
242
0
            fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
243
0
                if f.alternate() {
244
0
                    write!(f, "0x")?
245
0
                }
246
247
0
                if let Some(w) = f
248
0
                    .width()
249
0
                    .and_then(|w| Self::LEN.saturating_mul(2).checked_div(w))
Unexecuted instantiation: _RNCNvXsn_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_7AddressNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt0B9_
Unexecuted instantiation: _RNCNvXsP_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_7AssetIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt0B9_
Unexecuted instantiation: _RNCNvXs1h_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_6BlobIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt0Ba_
Unexecuted instantiation: _RNCNvXs1J_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_10ContractIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt0Ba_
Unexecuted instantiation: _RNCNvXs2b_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_4TxIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt0Ba_
Unexecuted instantiation: _RNCNvXs2D_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_6Bytes4NtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt0Ba_
Unexecuted instantiation: _RNCNvXs35_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_6Bytes8NtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt0Ba_
Unexecuted instantiation: _RNCNvXs3x_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes20NtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt0Ba_
Unexecuted instantiation: _RNCNvXs3Z_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes32NtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt0Ba_
Unexecuted instantiation: _RNCNvXs4r_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_5NonceNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt0Ba_
Unexecuted instantiation: _RNCNvXs4T_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_9MessageIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt0Ba_
Unexecuted instantiation: _RNCNvXs5l_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_4SaltNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt0Ba_
Unexecuted instantiation: _RNCNvXs5N_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes64NtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt0Ba_
250
                {
251
0
                    self.0.chunks(w).try_for_each(|c| {
252
0
                        write!(f, "{:02x}", c.iter().fold(0u8, |acc, x| acc ^ x))
Unexecuted instantiation: _RNCNCNvXsn_NtCsklA9joyWMfk_10fuel_types11array_typesNtB9_7AddressNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_00Bb_
Unexecuted instantiation: _RNCNCNvXsP_NtCsklA9joyWMfk_10fuel_types11array_typesNtB9_7AssetIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_00Bb_
Unexecuted instantiation: _RNCNCNvXs1h_NtCsklA9joyWMfk_10fuel_types11array_typesNtBa_6BlobIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_00Bc_
Unexecuted instantiation: _RNCNCNvXs1J_NtCsklA9joyWMfk_10fuel_types11array_typesNtBa_10ContractIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_00Bc_
Unexecuted instantiation: _RNCNCNvXs2b_NtCsklA9joyWMfk_10fuel_types11array_typesNtBa_4TxIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_00Bc_
Unexecuted instantiation: _RNCNCNvXs2D_NtCsklA9joyWMfk_10fuel_types11array_typesNtBa_6Bytes4NtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_00Bc_
Unexecuted instantiation: _RNCNCNvXs35_NtCsklA9joyWMfk_10fuel_types11array_typesNtBa_6Bytes8NtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_00Bc_
Unexecuted instantiation: _RNCNCNvXs3x_NtCsklA9joyWMfk_10fuel_types11array_typesNtBa_7Bytes20NtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_00Bc_
Unexecuted instantiation: _RNCNCNvXs3Z_NtCsklA9joyWMfk_10fuel_types11array_typesNtBa_7Bytes32NtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_00Bc_
Unexecuted instantiation: _RNCNCNvXs4r_NtCsklA9joyWMfk_10fuel_types11array_typesNtBa_5NonceNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_00Bc_
Unexecuted instantiation: _RNCNCNvXs4T_NtCsklA9joyWMfk_10fuel_types11array_typesNtBa_9MessageIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_00Bc_
Unexecuted instantiation: _RNCNCNvXs5l_NtCsklA9joyWMfk_10fuel_types11array_typesNtBa_4SaltNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_00Bc_
Unexecuted instantiation: _RNCNCNvXs5N_NtCsklA9joyWMfk_10fuel_types11array_typesNtBa_7Bytes64NtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_00Bc_
253
0
                    })
Unexecuted instantiation: _RNCNvXsn_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_7AddressNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_0B9_
Unexecuted instantiation: _RNCNvXsP_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_7AssetIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_0B9_
Unexecuted instantiation: _RNCNvXs1h_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_6BlobIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_0Ba_
Unexecuted instantiation: _RNCNvXs1J_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_10ContractIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_0Ba_
Unexecuted instantiation: _RNCNvXs2b_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_4TxIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_0Ba_
Unexecuted instantiation: _RNCNvXs2D_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_6Bytes4NtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_0Ba_
Unexecuted instantiation: _RNCNvXs35_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_6Bytes8NtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_0Ba_
Unexecuted instantiation: _RNCNvXs3x_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes20NtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_0Ba_
Unexecuted instantiation: _RNCNvXs3Z_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes32NtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_0Ba_
Unexecuted instantiation: _RNCNvXs4r_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_5NonceNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_0Ba_
Unexecuted instantiation: _RNCNvXs4T_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_9MessageIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_0Ba_
Unexecuted instantiation: _RNCNvXs5l_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_4SaltNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_0Ba_
Unexecuted instantiation: _RNCNvXs5N_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes64NtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts_0Ba_
254
                } else {
255
0
                    self.0.iter().try_for_each(|b| write!(f, "{:02x}", &b))
Unexecuted instantiation: _RNCNvXsn_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_7AddressNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts0_0B9_
Unexecuted instantiation: _RNCNvXsP_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_7AssetIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts0_0B9_
Unexecuted instantiation: _RNCNvXs1h_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_6BlobIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts0_0Ba_
Unexecuted instantiation: _RNCNvXs1J_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_10ContractIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts0_0Ba_
Unexecuted instantiation: _RNCNvXs2b_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_4TxIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts0_0Ba_
Unexecuted instantiation: _RNCNvXs2D_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_6Bytes4NtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts0_0Ba_
Unexecuted instantiation: _RNCNvXs35_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_6Bytes8NtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts0_0Ba_
Unexecuted instantiation: _RNCNvXs3x_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes20NtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts0_0Ba_
Unexecuted instantiation: _RNCNvXs3Z_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes32NtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts0_0Ba_
Unexecuted instantiation: _RNCNvXs4r_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_5NonceNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts0_0Ba_
Unexecuted instantiation: _RNCNvXs4T_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_9MessageIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts0_0Ba_
Unexecuted instantiation: _RNCNvXs5l_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_4SaltNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts0_0Ba_
Unexecuted instantiation: _RNCNvXs5N_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes64NtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmts0_0Ba_
256
                }
257
0
            }
Unexecuted instantiation: _RNvXsn_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AddressNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt
Unexecuted instantiation: _RNvXsP_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt
Unexecuted instantiation: _RNvXs1h_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6BlobIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt
Unexecuted instantiation: _RNvXs1J_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt
Unexecuted instantiation: _RNvXs2b_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4TxIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt
Unexecuted instantiation: _RNvXs2D_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes4NtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt
Unexecuted instantiation: _RNvXs35_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes8NtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt
Unexecuted instantiation: _RNvXs3x_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes20NtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt
Unexecuted instantiation: _RNvXs3Z_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32NtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt
Unexecuted instantiation: _RNvXs4r_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_5NonceNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt
Unexecuted instantiation: _RNvXs4T_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_9MessageIdNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt
Unexecuted instantiation: _RNvXs5l_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4SaltNtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt
Unexecuted instantiation: _RNvXs5N_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64NtNtCsd3UI3IJrzMw_4core3fmt8LowerHex3fmt
258
        }
259
260
        impl fmt::UpperHex for $i {
261
0
            fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
262
0
                if f.alternate() {
263
0
                    write!(f, "0x")?
264
0
                }
265
266
0
                if let Some(w) = f
267
0
                    .width()
268
0
                    .and_then(|w| Self::LEN.saturating_mul(2).checked_div(w))
Unexecuted instantiation: _RNCNvXso_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_7AddressNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt0B9_
Unexecuted instantiation: _RNCNvXsQ_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_7AssetIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt0B9_
Unexecuted instantiation: _RNCNvXs1i_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_6BlobIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt0Ba_
Unexecuted instantiation: _RNCNvXs1K_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_10ContractIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt0Ba_
Unexecuted instantiation: _RNCNvXs2c_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_4TxIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt0Ba_
Unexecuted instantiation: _RNCNvXs2E_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_6Bytes4NtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt0Ba_
Unexecuted instantiation: _RNCNvXs36_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_6Bytes8NtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt0Ba_
Unexecuted instantiation: _RNCNvXs3y_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes20NtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt0Ba_
Unexecuted instantiation: _RNCNvXs40_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes32NtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt0Ba_
Unexecuted instantiation: _RNCNvXs4s_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_5NonceNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt0Ba_
Unexecuted instantiation: _RNCNvXs4U_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_9MessageIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt0Ba_
Unexecuted instantiation: _RNCNvXs5m_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_4SaltNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt0Ba_
Unexecuted instantiation: _RNCNvXs5O_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes64NtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt0Ba_
269
                {
270
0
                    self.0.chunks(w).try_for_each(|c| {
271
0
                        write!(f, "{:02X}", c.iter().fold(0u8, |acc, x| acc ^ x))
Unexecuted instantiation: _RNCNCNvXso_NtCsklA9joyWMfk_10fuel_types11array_typesNtB9_7AddressNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_00Bb_
Unexecuted instantiation: _RNCNCNvXsQ_NtCsklA9joyWMfk_10fuel_types11array_typesNtB9_7AssetIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_00Bb_
Unexecuted instantiation: _RNCNCNvXs1i_NtCsklA9joyWMfk_10fuel_types11array_typesNtBa_6BlobIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_00Bc_
Unexecuted instantiation: _RNCNCNvXs1K_NtCsklA9joyWMfk_10fuel_types11array_typesNtBa_10ContractIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_00Bc_
Unexecuted instantiation: _RNCNCNvXs2c_NtCsklA9joyWMfk_10fuel_types11array_typesNtBa_4TxIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_00Bc_
Unexecuted instantiation: _RNCNCNvXs2E_NtCsklA9joyWMfk_10fuel_types11array_typesNtBa_6Bytes4NtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_00Bc_
Unexecuted instantiation: _RNCNCNvXs36_NtCsklA9joyWMfk_10fuel_types11array_typesNtBa_6Bytes8NtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_00Bc_
Unexecuted instantiation: _RNCNCNvXs3y_NtCsklA9joyWMfk_10fuel_types11array_typesNtBa_7Bytes20NtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_00Bc_
Unexecuted instantiation: _RNCNCNvXs40_NtCsklA9joyWMfk_10fuel_types11array_typesNtBa_7Bytes32NtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_00Bc_
Unexecuted instantiation: _RNCNCNvXs4s_NtCsklA9joyWMfk_10fuel_types11array_typesNtBa_5NonceNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_00Bc_
Unexecuted instantiation: _RNCNCNvXs4U_NtCsklA9joyWMfk_10fuel_types11array_typesNtBa_9MessageIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_00Bc_
Unexecuted instantiation: _RNCNCNvXs5m_NtCsklA9joyWMfk_10fuel_types11array_typesNtBa_4SaltNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_00Bc_
Unexecuted instantiation: _RNCNCNvXs5O_NtCsklA9joyWMfk_10fuel_types11array_typesNtBa_7Bytes64NtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_00Bc_
272
0
                    })
Unexecuted instantiation: _RNCNvXso_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_7AddressNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_0B9_
Unexecuted instantiation: _RNCNvXsQ_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_7AssetIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_0B9_
Unexecuted instantiation: _RNCNvXs1i_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_6BlobIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_0Ba_
Unexecuted instantiation: _RNCNvXs1K_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_10ContractIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_0Ba_
Unexecuted instantiation: _RNCNvXs2c_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_4TxIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_0Ba_
Unexecuted instantiation: _RNCNvXs2E_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_6Bytes4NtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_0Ba_
Unexecuted instantiation: _RNCNvXs36_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_6Bytes8NtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_0Ba_
Unexecuted instantiation: _RNCNvXs3y_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes20NtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_0Ba_
Unexecuted instantiation: _RNCNvXs40_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes32NtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_0Ba_
Unexecuted instantiation: _RNCNvXs4s_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_5NonceNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_0Ba_
Unexecuted instantiation: _RNCNvXs4U_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_9MessageIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_0Ba_
Unexecuted instantiation: _RNCNvXs5m_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_4SaltNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_0Ba_
Unexecuted instantiation: _RNCNvXs5O_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes64NtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts_0Ba_
273
                } else {
274
0
                    self.0.iter().try_for_each(|b| write!(f, "{:02X}", &b))
Unexecuted instantiation: _RNCNvXso_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_7AddressNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts0_0B9_
Unexecuted instantiation: _RNCNvXsQ_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_7AssetIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts0_0B9_
Unexecuted instantiation: _RNCNvXs1i_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_6BlobIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts0_0Ba_
Unexecuted instantiation: _RNCNvXs1K_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_10ContractIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts0_0Ba_
Unexecuted instantiation: _RNCNvXs2c_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_4TxIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts0_0Ba_
Unexecuted instantiation: _RNCNvXs2E_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_6Bytes4NtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts0_0Ba_
Unexecuted instantiation: _RNCNvXs36_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_6Bytes8NtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts0_0Ba_
Unexecuted instantiation: _RNCNvXs3y_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes20NtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts0_0Ba_
Unexecuted instantiation: _RNCNvXs40_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes32NtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts0_0Ba_
Unexecuted instantiation: _RNCNvXs4s_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_5NonceNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts0_0Ba_
Unexecuted instantiation: _RNCNvXs4U_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_9MessageIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts0_0Ba_
Unexecuted instantiation: _RNCNvXs5m_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_4SaltNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts0_0Ba_
Unexecuted instantiation: _RNCNvXs5O_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes64NtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmts0_0Ba_
275
                }
276
0
            }
Unexecuted instantiation: _RNvXso_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AddressNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt
Unexecuted instantiation: _RNvXsQ_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt
Unexecuted instantiation: _RNvXs1i_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6BlobIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt
Unexecuted instantiation: _RNvXs1K_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt
Unexecuted instantiation: _RNvXs2c_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4TxIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt
Unexecuted instantiation: _RNvXs2E_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes4NtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt
Unexecuted instantiation: _RNvXs36_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes8NtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt
Unexecuted instantiation: _RNvXs3y_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes20NtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt
Unexecuted instantiation: _RNvXs40_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32NtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt
Unexecuted instantiation: _RNvXs4s_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_5NonceNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt
Unexecuted instantiation: _RNvXs4U_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_9MessageIdNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt
Unexecuted instantiation: _RNvXs5m_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4SaltNtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt
Unexecuted instantiation: _RNvXs5O_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64NtNtCsd3UI3IJrzMw_4core3fmt8UpperHex3fmt
277
        }
278
279
        impl fmt::Debug for $i {
280
0
            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
281
0
                <Self as fmt::LowerHex>::fmt(&self, f)
282
0
            }
Unexecuted instantiation: _RNvXsp_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AddressNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXsR_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetIdNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXs1j_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6BlobIdNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXs1L_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractIdNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXs2d_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4TxIdNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXs2F_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes4NtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXs37_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes8NtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXs3z_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes20NtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXs41_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32NtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXs4t_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_5NonceNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXs4V_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_9MessageIdNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXs5n_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4SaltNtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
Unexecuted instantiation: _RNvXs5P_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64NtNtCsd3UI3IJrzMw_4core3fmt5Debug3fmt
283
        }
284
285
        impl fmt::Display for $i {
286
0
            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
287
0
                <Self as fmt::LowerHex>::fmt(&self, f)
288
0
            }
Unexecuted instantiation: _RNvXsq_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AddressNtNtCsd3UI3IJrzMw_4core3fmt7Display3fmt
Unexecuted instantiation: _RNvXsS_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetIdNtNtCsd3UI3IJrzMw_4core3fmt7Display3fmt
Unexecuted instantiation: _RNvXs1k_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6BlobIdNtNtCsd3UI3IJrzMw_4core3fmt7Display3fmt
Unexecuted instantiation: _RNvXs1M_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractIdNtNtCsd3UI3IJrzMw_4core3fmt7Display3fmt
Unexecuted instantiation: _RNvXs2e_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4TxIdNtNtCsd3UI3IJrzMw_4core3fmt7Display3fmt
Unexecuted instantiation: _RNvXs2G_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes4NtNtCsd3UI3IJrzMw_4core3fmt7Display3fmt
Unexecuted instantiation: _RNvXs38_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes8NtNtCsd3UI3IJrzMw_4core3fmt7Display3fmt
Unexecuted instantiation: _RNvXs3A_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes20NtNtCsd3UI3IJrzMw_4core3fmt7Display3fmt
Unexecuted instantiation: _RNvXs42_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32NtNtCsd3UI3IJrzMw_4core3fmt7Display3fmt
Unexecuted instantiation: _RNvXs4u_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_5NonceNtNtCsd3UI3IJrzMw_4core3fmt7Display3fmt
Unexecuted instantiation: _RNvXs4W_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_9MessageIdNtNtCsd3UI3IJrzMw_4core3fmt7Display3fmt
Unexecuted instantiation: _RNvXs5o_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4SaltNtNtCsd3UI3IJrzMw_4core3fmt7Display3fmt
Unexecuted instantiation: _RNvXs5Q_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64NtNtCsd3UI3IJrzMw_4core3fmt7Display3fmt
289
        }
290
291
        impl str::FromStr for $i {
292
            type Err = &'static str;
293
294
0
            fn from_str(s: &str) -> Result<Self, Self::Err> {
295
                const ERR: &str = concat!("Invalid encoded byte in ", stringify!($i));
296
0
                let mut ret = $i::zeroed();
297
0
                let s = s.strip_prefix("0x").unwrap_or(s);
298
0
                hex::decode_to_slice(&s, &mut ret.0).map_err(|_| ERR)?;
Unexecuted instantiation: _RNCNvXsr_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_7AddressNtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str0B9_
Unexecuted instantiation: _RNCNvXsT_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_7AssetIdNtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str0B9_
Unexecuted instantiation: _RNCNvXs1l_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_6BlobIdNtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str0Ba_
Unexecuted instantiation: _RNCNvXs1N_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_10ContractIdNtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str0Ba_
Unexecuted instantiation: _RNCNvXs2f_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_4TxIdNtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str0Ba_
Unexecuted instantiation: _RNCNvXs2H_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_6Bytes4NtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str0Ba_
Unexecuted instantiation: _RNCNvXs39_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_6Bytes8NtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str0Ba_
Unexecuted instantiation: _RNCNvXs3B_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes20NtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str0Ba_
Unexecuted instantiation: _RNCNvXs43_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes32NtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str0Ba_
Unexecuted instantiation: _RNCNvXs4v_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_5NonceNtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str0Ba_
Unexecuted instantiation: _RNCNvXs4X_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_9MessageIdNtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str0Ba_
Unexecuted instantiation: _RNCNvXs5p_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_4SaltNtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str0Ba_
Unexecuted instantiation: _RNCNvXs5R_NtCsklA9joyWMfk_10fuel_types11array_typesNtB8_7Bytes64NtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str0Ba_
299
0
                Ok(ret)
300
0
            }
Unexecuted instantiation: _RNvXsr_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AddressNtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str
Unexecuted instantiation: _RNvXsT_NtCsklA9joyWMfk_10fuel_types11array_typesNtB5_7AssetIdNtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str
Unexecuted instantiation: _RNvXs1l_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6BlobIdNtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str
Unexecuted instantiation: _RNvXs1N_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_10ContractIdNtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str
Unexecuted instantiation: _RNvXs2f_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4TxIdNtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str
Unexecuted instantiation: _RNvXs2H_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes4NtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str
Unexecuted instantiation: _RNvXs39_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_6Bytes8NtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str
Unexecuted instantiation: _RNvXs3B_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes20NtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str
Unexecuted instantiation: _RNvXs43_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes32NtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str
Unexecuted instantiation: _RNvXs4v_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_5NonceNtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str
Unexecuted instantiation: _RNvXs4X_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_9MessageIdNtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str
Unexecuted instantiation: _RNvXs5p_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_4SaltNtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str
Unexecuted instantiation: _RNvXs5R_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7Bytes64NtNtNtCsd3UI3IJrzMw_4core3str6traits7FromStr8from_str
301
        }
302
303
        #[cfg(feature = "serde")]
304
        impl serde::Serialize for $i {
305
            #[inline(always)]
306
0
            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
307
0
            where
308
0
                S: serde::Serializer,
309
0
            {
310
                use alloc::format;
311
                use serde::ser::SerializeTuple;
312
0
                if serializer.is_human_readable() {
313
0
                    serializer.serialize_str(&format!("{:x}", &self))
314
                } else {
315
                    // Fixed-size arrays are tuples in serde data model
316
0
                    let mut arr = serializer.serialize_tuple($s)?;
317
0
                    for elem in &self.0 {
318
0
                        arr.serialize_element(elem)?;
319
                    }
320
0
                    arr.end()
321
                }
322
0
            }
Unexecuted instantiation: _RINvXsU_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7AssetIdNtNtCsfRih0igPiTu_5serde3ser9Serialize9serializeQINtNtNtCs1b0Bw0OchLA_8postcard3ser10serializer10SerializerNtNtNtB1Q_7flavors9alloc_vec8AllocVecEECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXss_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7AddressNtNtCsfRih0igPiTu_5serde3ser9Serialize9serializeQINtNtNtCs1b0Bw0OchLA_8postcard3ser10serializer10SerializerNtNtNtB1Q_7flavors9alloc_vec8AllocVecEECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXss_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7AddressNtNtCsfRih0igPiTu_5serde3ser9Serialize9serializepEB8_
Unexecuted instantiation: _RINvXsU_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7AssetIdNtNtCsfRih0igPiTu_5serde3ser9Serialize9serializepEB8_
Unexecuted instantiation: _RINvXs1m_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_6BlobIdNtNtCsfRih0igPiTu_5serde3ser9Serialize9serializepEB9_
Unexecuted instantiation: _RINvXs1O_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_10ContractIdNtNtCsfRih0igPiTu_5serde3ser9Serialize9serializepEB9_
Unexecuted instantiation: _RINvXs2g_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_4TxIdNtNtCsfRih0igPiTu_5serde3ser9Serialize9serializepEB9_
Unexecuted instantiation: _RINvXs2I_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_6Bytes4NtNtCsfRih0igPiTu_5serde3ser9Serialize9serializepEB9_
Unexecuted instantiation: _RINvXs3a_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_6Bytes8NtNtCsfRih0igPiTu_5serde3ser9Serialize9serializepEB9_
Unexecuted instantiation: _RINvXs3C_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_7Bytes20NtNtCsfRih0igPiTu_5serde3ser9Serialize9serializepEB9_
Unexecuted instantiation: _RINvXs44_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_7Bytes32NtNtCsfRih0igPiTu_5serde3ser9Serialize9serializepEB9_
Unexecuted instantiation: _RINvXs4w_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_5NonceNtNtCsfRih0igPiTu_5serde3ser9Serialize9serializepEB9_
Unexecuted instantiation: _RINvXs4Y_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_9MessageIdNtNtCsfRih0igPiTu_5serde3ser9Serialize9serializepEB9_
Unexecuted instantiation: _RINvXs5q_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_4SaltNtNtCsfRih0igPiTu_5serde3ser9Serialize9serializepEB9_
Unexecuted instantiation: _RINvXs5S_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_7Bytes64NtNtCsfRih0igPiTu_5serde3ser9Serialize9serializepEB9_
323
        }
324
325
        #[cfg(feature = "serde")]
326
        impl<'de> serde::Deserialize<'de> for $i {
327
            #[inline(always)]
328
0
            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
329
0
            where
330
0
                D: serde::Deserializer<'de>,
331
0
            {
332
                use serde::de::Error;
333
0
                if deserializer.is_human_readable() {
334
0
                    let s: alloc::string::String =
335
0
                        serde::Deserialize::deserialize(deserializer)?;
336
0
                    s.parse().map_err(D::Error::custom)
337
                } else {
338
0
                    deserializer.deserialize_tuple($s, ArrayVisitor).map(Self)
339
                }
340
0
            }
Unexecuted instantiation: _RINvXsV_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7AssetIdNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeQINtNtNtCs1b0Bw0OchLA_8postcard2de12deserializer12DeserializerNtNtB1V_7flavors5SliceEECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXst_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7AddressNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializeQINtNtNtCs1b0Bw0OchLA_8postcard2de12deserializer12DeserializerNtNtB1V_7flavors5SliceEECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXst_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7AddressNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializepEB8_
Unexecuted instantiation: _RINvXsV_NtCsklA9joyWMfk_10fuel_types11array_typesNtB6_7AssetIdNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializepEB8_
Unexecuted instantiation: _RINvXs1n_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_6BlobIdNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializepEB9_
Unexecuted instantiation: _RINvXs1P_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_10ContractIdNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializepEB9_
Unexecuted instantiation: _RINvXs2h_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_4TxIdNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializepEB9_
Unexecuted instantiation: _RINvXs2J_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_6Bytes4NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializepEB9_
Unexecuted instantiation: _RINvXs3b_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_6Bytes8NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializepEB9_
Unexecuted instantiation: _RINvXs3D_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_7Bytes20NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializepEB9_
Unexecuted instantiation: _RINvXs45_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_7Bytes32NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializepEB9_
Unexecuted instantiation: _RINvXs4x_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_5NonceNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializepEB9_
Unexecuted instantiation: _RINvXs4Z_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_9MessageIdNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializepEB9_
Unexecuted instantiation: _RINvXs5r_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_4SaltNtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializepEB9_
Unexecuted instantiation: _RINvXs5T_NtCsklA9joyWMfk_10fuel_types11array_typesNtB7_7Bytes64NtNtCsfRih0igPiTu_5serde2de11Deserialize11deserializepEB9_
341
        }
342
    };
343
}
344
345
key!(Address, 32);
346
key!(AssetId, 32);
347
key!(BlobId, 32);
348
key!(ContractId, 32);
349
key!(TxId, 32);
350
key!(Bytes4, 4);
351
key!(Bytes8, 8);
352
key!(Bytes20, 20);
353
key!(Bytes32, 32);
354
key!(Nonce, 32);
355
key!(MessageId, 32);
356
key!(Salt, 32);
357
358
key_with_big_array!(Bytes64, 64);
359
360
impl ContractId {
361
    /// Seed for the calculation of the contract id from its code.
362
    ///
363
    /// <https://github.com/FuelLabs/fuel-specs/blob/master/src/identifiers/contract-id.md>
364
    pub const SEED: [u8; 4] = 0x4655454C_u32.to_be_bytes();
365
}
366
367
impl AssetId {
368
    pub const BASE: AssetId = AssetId::zeroed();
369
}
370
371
impl From<u64> for Nonce {
372
0
    fn from(value: u64) -> Self {
373
0
        let mut default = [0u8; 32];
374
0
        default[..8].copy_from_slice(&value.to_be_bytes());
375
0
        default.into()
376
0
    }
377
}
378
379
/// A visitor for deserializing a fixed-size byte array.
380
#[cfg(feature = "serde")]
381
struct ArrayVisitor<const S: usize>;
382
383
#[cfg(feature = "serde")]
384
impl<'de, const S: usize> serde::de::Visitor<'de> for ArrayVisitor<S> {
385
    type Value = [u8; S];
386
387
0
    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
388
0
        write!(formatter, "an array of {S} bytes")
389
0
    }
Unexecuted instantiation: _RNvXs1_NtCsklA9joyWMfk_10fuel_types11array_typesINtB5_12ArrayVisitorKj20_ENtNtCsfRih0igPiTu_5serde2de7Visitor9expectingCseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNvXININtCsklA9joyWMfk_10fuel_types11array_typess1_0KpEINtB5_12ArrayVisitorKpENtNtCsfRih0igPiTu_5serde2de7Visitor9expectingB7_
390
391
    #[inline(always)]
392
0
    fn visit_borrowed_bytes<E>(self, items: &'de [u8]) -> Result<Self::Value, E> {
393
0
        let mut result = [0u8; S];
394
0
        result.copy_from_slice(items);
395
0
        Ok(result)
396
0
    }
397
398
    #[cfg(feature = "alloc")]
399
    #[inline(always)]
400
0
    fn visit_byte_buf<E>(self, v: alloc::vec::Vec<u8>) -> Result<Self::Value, E>
401
0
    where
402
0
        E: serde::de::Error,
403
0
    {
404
0
        self.visit_borrowed_bytes(v.as_slice())
405
0
    }
406
407
    #[inline(always)]
408
0
    fn visit_seq<A>(self, mut value: A) -> Result<Self::Value, A::Error>
409
0
    where
410
0
        A: serde::de::SeqAccess<'de>,
411
0
    {
412
0
        let mut arr = [0u8; S];
413
0
        for (i, elem) in arr.iter_mut().enumerate() {
414
0
            *elem = value
415
0
                .next_element()?
416
0
                .ok_or_else(|| serde::de::Error::invalid_length(i, &self))?;
Unexecuted instantiation: _RNCINvXs1_NtCsklA9joyWMfk_10fuel_types11array_typesINtB8_12ArrayVisitorKj20_ENtNtCsfRih0igPiTu_5serde2de7Visitor9visit_seqINtNtNtCs1b0Bw0OchLA_8postcard2de12deserializer9SeqAccessNtNtB21_7flavors5SliceEE0CseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RNCINvXININtCsklA9joyWMfk_10fuel_types11array_typess1_0KpEINtB8_12ArrayVisitorKpENtNtCsfRih0igPiTu_5serde2de7Visitor9visit_seqpE0Ba_
417
        }
418
0
        Ok(arr)
419
0
    }
Unexecuted instantiation: _RINvXs1_NtCsklA9joyWMfk_10fuel_types11array_typesINtB6_12ArrayVisitorKj20_ENtNtCsfRih0igPiTu_5serde2de7Visitor9visit_seqINtNtNtCs1b0Bw0OchLA_8postcard2de12deserializer9SeqAccessNtNtB1Z_7flavors5SliceEECseSMGV7FMBK4_7fuel_tx
Unexecuted instantiation: _RINvXININtCsklA9joyWMfk_10fuel_types11array_typess1_0KpEINtB6_12ArrayVisitorKpENtNtCsfRih0igPiTu_5serde2de7Visitor9visit_seqpEB8_
420
}
421
422
/// Roundtrip serde encode/decode tests
423
#[cfg(all(test, feature = "serde"))]
424
mod tests_serde {
425
    use rand::{
426
        rngs::StdRng,
427
        SeedableRng,
428
    };
429
430
    use super::*;
431
432
    /// serde_json uses human-readable serialization by default
433
    #[test]
434
    fn test_human_readable() {
435
        let rng = &mut StdRng::seed_from_u64(8586);
436
        let original: Address = rng.gen();
437
        let serialized = serde_json::to_string(&original).expect("Serialization failed");
438
        assert_eq!(
439
            serialized,
440
            "\"7bbd8a4ea06e94461b959ab18d35802bbac3cf47e2bf29195f7db2ce41630cd7\""
441
        );
442
        let recreated: Address =
443
            serde_json::from_str(&serialized).expect("Deserialization failed");
444
        assert_eq!(original, recreated);
445
    }
446
447
    /// postcard uses non-human-readable serialization
448
    #[test]
449
    fn test_not_human_readable() {
450
        let rng = &mut StdRng::seed_from_u64(8586);
451
        let original: Address = rng.gen();
452
        let serialized = postcard::to_stdvec(&original).expect("Serialization failed");
453
        let expected_vec = original.0.to_vec();
454
        assert_eq!(&serialized, &expected_vec);
455
        let recreated: Address =
456
            postcard::from_bytes(&serialized).expect("Deserialization failed");
457
        assert_eq!(original, recreated);
458
    }
459
460
    /// postcard uses non-human-readable serialization
461
    #[test]
462
    fn test_not_human_readable_incorrect_deser() {
463
        let rng = &mut StdRng::seed_from_u64(8586);
464
        let original: Address = rng.gen();
465
        let mut serialized =
466
            postcard::to_stdvec(&original).expect("Serialization failed");
467
        serialized.pop();
468
        let res: Result<Address, _> = postcard::from_bytes(&serialized);
469
        res.expect_err("Deserialization should have failed");
470
    }
471
472
    /// bincode uses non-human-readable serialization
473
    #[test]
474
    fn test_bincode() {
475
        let rng = &mut StdRng::seed_from_u64(8586);
476
        let original: Address = rng.gen();
477
        let serialized = bincode::serialize(&original).expect("Serialization failed");
478
        let recreated: Address =
479
            bincode::deserialize(&serialized).expect("Deserialization failed");
480
        assert_eq!(original, recreated);
481
    }
482
}