sui_adapter_latest/static_programmable_transactions/metering/
pre_translation.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use crate::static_programmable_transactions::metering::translation_meter::TranslationMeter;
5use sui_types::{
6    error::ExecutionError,
7    transaction::{CallArg, Command, ProgrammableTransaction},
8};
9
10/// Before loading and type checking, we do a first pass over the transaction to charge for basic
11/// properties:
12/// - number of inputs and pure input bytes
13/// - number of commands and their arguments
14/// - for Move calls, count arguments to the function (both value and type arguments) as the
15///   "arguments" to charge for for the command.
16pub 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}