sui_adapter_latest/static_programmable_transactions/metering/
pre_translation.rs1use crate::static_programmable_transactions::metering::translation_meter::TranslationMeter;
5use sui_types::{
6 error::ExecutionError,
7 transaction::{CallArg, Command, ProgrammableTransaction},
8};
9
10pub fn meter(
17 meter: &mut TranslationMeter,
18 transaction: &ProgrammableTransaction,
19) -> Result<(), ExecutionError> {
20 meter.charge_base_inputs(transaction.inputs.len())?;
21
22 for input in &transaction.inputs {
23 match input {
24 CallArg::Pure(bytes) => {
25 meter.charge_pure_input_bytes(bytes.len())?;
26 }
27 CallArg::FundsWithdrawal(_) | CallArg::Object(_) => (),
28 }
29 }
30
31 for command in &transaction.commands {
32 meter.charge_base_command(arguments_len(command))?;
33 }
34
35 Ok(())
36}
37
38fn arguments_len(cmd: &Command) -> usize {
39 match cmd {
40 Command::MoveCall(call) => call
41 .type_arguments
42 .len()
43 .saturating_add(call.arguments.len()),
44 Command::TransferObjects(args, _)
45 | Command::SplitCoins(_, args)
46 | Command::MergeCoins(_, args) => args.len().saturating_add(1),
47 Command::Publish(modules, deps) => modules.len().saturating_add(deps.len()),
48 Command::MakeMoveVec(_, args) => args.len().saturating_add(1),
49 Command::Upgrade(modules, deps, _, _) => {
50 modules.len().saturating_add(deps.len()).saturating_add(2)
51 }
52 }
53}