11use crate :: { SysFuncIdx , FUEL_DENOM_RATE } ;
2- use rwasm:: { instruction_set, InstructionSet , TrapCode } ;
2+ use rwasm:: { instruction_set, InstructionSet , TrapCode , Value } ;
33
44/// The maximum allowed value for the `x` parameter used in linear gas cost calculation
55/// of builtins.
@@ -189,3 +189,73 @@ pub(crate) fn emit_fuel_procedure(sys_func_idx: SysFuncIdx) -> InstructionSet {
189189 _ => no_fuel ! ( ) ,
190190 }
191191}
192+
193+ pub ( crate ) fn calculate_syscall_fuel ( sys_func_idx : SysFuncIdx , params : & [ Value ] ) -> u32 {
194+ use SysFuncIdx :: * ;
195+ let linear_fuel = |param : u32 , base_cost : u32 , word_cost : u32 | -> u32 {
196+ base_cost + word_cost * ( param + 31 ) / 32
197+ } ;
198+
199+ match sys_func_idx {
200+ // input/output & state control (0x00)
201+ EXIT => 0 ,
202+ STATE => LOW_FUEL_COST ,
203+ READ_INPUT => linear_fuel ( params. get ( 1 ) . and_then ( |p| p. i32 ( ) ) . unwrap_or_default ( ) as u32 , COPY_BASE_FUEL_COST , COPY_WORD_FUEL_COST ) ,
204+ INPUT_SIZE => LOW_FUEL_COST ,
205+ WRITE_OUTPUT => linear_fuel ( params. get ( 1 ) . and_then ( |p| p. i32 ( ) ) . unwrap_or_default ( ) as u32 , COPY_BASE_FUEL_COST , COPY_WORD_FUEL_COST ) ,
206+ OUTPUT_SIZE => LOW_FUEL_COST ,
207+ READ_OUTPUT => linear_fuel ( params. get ( 1 ) . and_then ( |p| p. i32 ( ) ) . unwrap_or_default ( ) as u32 , COPY_BASE_FUEL_COST , COPY_WORD_FUEL_COST ) ,
208+ EXEC => 0 ,
209+ RESUME => 0 ,
210+ FORWARD_OUTPUT => linear_fuel ( params. get ( 1 ) . and_then ( |p| p. i32 ( ) ) . unwrap_or_default ( ) as u32 , COPY_BASE_FUEL_COST , COPY_WORD_FUEL_COST ) ,
211+ CHARGE_FUEL_MANUALLY => 0 ,
212+ FUEL => LOW_FUEL_COST ,
213+ DEBUG_LOG => linear_fuel ( params. get ( 1 ) . and_then ( |p| p. i32 ( ) ) . unwrap_or_default ( ) as u32 , DEBUG_LOG_BASE_FUEL_COST , DEBUG_LOG_WORD_FUEL_COST ) ,
214+ CHARGE_FUEL => CHARGE_FUEL_BASE_COST ,
215+
216+ // hashing functions (0x01)
217+ KECCAK256 => linear_fuel ( params. get ( 2 ) . and_then ( |p| p. i32 ( ) ) . unwrap_or_default ( ) as u32 , KECCAK_BASE_FUEL_COST , KECCAK_WORD_FUEL_COST ) ,
218+ KECCAK256_PERMUTE => KECCAK_BASE_FUEL_COST ,
219+ POSEIDON => linear_fuel ( params. get ( 2 ) . and_then ( |p| p. i32 ( ) ) . unwrap_or_default ( ) as u32 , 100 , 20 ) ,
220+ SHA256_EXTEND => SHA256_BASE_FUEL_COST ,
221+ SHA256_COMPRESS => SHA256_BASE_FUEL_COST ,
222+ SHA256 => linear_fuel ( params. get ( 2 ) . and_then ( |p| p. i32 ( ) ) . unwrap_or_default ( ) as u32 , SHA256_BASE_FUEL_COST , SHA256_WORD_FUEL_COST ) ,
223+ BLAKE3 => linear_fuel ( params. get ( 2 ) . and_then ( |p| p. i32 ( ) ) . unwrap_or_default ( ) as u32 , BLAKE3_BASE_FUEL_COST , BLAKE3_WORD_FUEL_COST ) ,
224+
225+ // ed25519 (0x02)
226+ ED25519_DECOMPRESS => ED25519_DECOMPRESS_COST ,
227+ ED25519_ADD => ED25519_ADD_COST ,
228+
229+ // fp1/fp2 tower field (0x03)
230+ TOWER_FP1_BN254_ADD | TOWER_FP1_BN254_SUB => FP1_ADD_COST ,
231+ TOWER_FP1_BN254_MUL => FP1_MUL_COST ,
232+ TOWER_FP1_BLS12381_ADD | TOWER_FP1_BLS12381_SUB => FP1_BLS_ADD_COST ,
233+ TOWER_FP1_BLS12381_MUL => FP1_BLS_MUL_COST ,
234+ TOWER_FP2_BN254_ADD | TOWER_FP2_BN254_SUB => FP2_ADD_COST ,
235+ TOWER_FP2_BN254_MUL => FP2_MUL_COST ,
236+ TOWER_FP2_BLS12381_ADD | TOWER_FP2_BLS12381_SUB => FP2_BLS_ADD_COST ,
237+ TOWER_FP2_BLS12381_MUL => FP2_BLS_MUL_COST ,
238+
239+ // secp256k1 (0x04)
240+ SECP256K1_ADD => SECP256K1_ADD_COST ,
241+ SECP256K1_DECOMPRESS => SECP256K1_DECOMPRESS_COST ,
242+ SECP256K1_DOUBLE => SECP256K1_DOUBLE_COST ,
243+
244+ // bls12381 (0x06)
245+ BLS12381_ADD => BLS_G1_ADD_COST ,
246+ // BLS12381_G2_ADD => BLS_G2_ADD_COST,
247+ // BLS12381_PAIRING => BLS_PAIRING_COST,
248+ // BLS12381_MAP_G1 => BLS_MAP_G1_COST,
249+ // BLS12381_MAP_G2 => BLS_MAP_G2_COST,
250+
251+ // bn254 (0x07)
252+ BN254_ADD => BN254_ADD_COST ,
253+ BN254_DOUBLE => BN254_DOUBLE_COST ,
254+
255+ // uint256 (0x08)
256+ UINT256_MUL_MOD => UINT256_MUL_MOD_COST ,
257+ UINT256_X2048_MUL => UINT256_X2048_MUL_COST ,
258+
259+ _ => 0 ,
260+ }
261+ }
0 commit comments