Skip to content
This repository was archived by the owner on Jun 11, 2026. It is now read-only.

Commit cd906e5

Browse files
feat: add builtin cost model B
Signed-off-by: Jonathan Lim <jonathan.lim.222@gmail.com>
1 parent 8dbdd6b commit cd906e5

1 file changed

Lines changed: 378 additions & 0 deletions

File tree

crates/uplc/src/machine/cost_model/builtin_costs.rs

Lines changed: 378 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1087,6 +1087,384 @@ impl BuiltinCosts {
10871087
}
10881088
}
10891089

1090+
pub fn v2() -> Self {
1091+
Self {
1092+
add_integer: TwoArgumentsCosting::new(
1093+
TwoArgumentsCosting::max_size(1, 1),
1094+
TwoArgumentsCosting::max_size(100788, 420),
1095+
),
1096+
subtract_integer: TwoArgumentsCosting::new(
1097+
TwoArgumentsCosting::max_size(1, 1),
1098+
TwoArgumentsCosting::max_size(100788, 420),
1099+
),
1100+
multiply_integer: TwoArgumentsCosting::new(
1101+
TwoArgumentsCosting::added_sizes(0, 1),
1102+
TwoArgumentsCosting::multiplied_sizes(90434, 519),
1103+
),
1104+
divide_integer: TwoArgumentsCosting::new(
1105+
TwoArgumentsCosting::subtracted_sizes(0, 1, 1),
1106+
TwoArgumentsCosting::const_above_diagonal_into_multiplied_sizes(85848, 228465, 122),
1107+
),
1108+
quotient_integer: TwoArgumentsCosting::new(
1109+
TwoArgumentsCosting::subtracted_sizes(0, 1, 1),
1110+
TwoArgumentsCosting::const_above_diagonal_into_multiplied_sizes(
1111+
85848, 228465, 122
1112+
),
1113+
),
1114+
remainder_integer: TwoArgumentsCosting::new(
1115+
TwoArgumentsCosting::subtracted_sizes(0, 1, 1),
1116+
TwoArgumentsCosting::const_above_diagonal_into_multiplied_sizes(
1117+
85848, 228465, 122,
1118+
),
1119+
),
1120+
mod_integer: TwoArgumentsCosting::new(
1121+
TwoArgumentsCosting::subtracted_sizes(0, 1, 1),
1122+
TwoArgumentsCosting::const_above_diagonal_into_multiplied_sizes(85848, 228465, 122),
1123+
),
1124+
equals_integer: TwoArgumentsCosting::new(
1125+
TwoArgumentsCosting::constant_cost(1),
1126+
TwoArgumentsCosting::min_size(51775, 558),
1127+
),
1128+
less_than_integer: TwoArgumentsCosting::new(
1129+
TwoArgumentsCosting::constant_cost(1),
1130+
TwoArgumentsCosting::min_size(44749, 541),
1131+
),
1132+
less_than_equals_integer: TwoArgumentsCosting::new(
1133+
TwoArgumentsCosting::constant_cost(1),
1134+
TwoArgumentsCosting::min_size(43285, 552),
1135+
),
1136+
append_byte_string: TwoArgumentsCosting::new(
1137+
TwoArgumentsCosting::added_sizes(0, 1),
1138+
TwoArgumentsCosting::added_sizes(1000, 173),
1139+
),
1140+
cons_byte_string: TwoArgumentsCosting::new(
1141+
TwoArgumentsCosting::added_sizes(0, 1),
1142+
TwoArgumentsCosting::linear_in_y(72010, 178),
1143+
),
1144+
slice_byte_string: ThreeArgumentsCosting::new(
1145+
ThreeArgumentsCosting::linear_in_z(4, 0),
1146+
ThreeArgumentsCosting::linear_in_z(20467, 1),
1147+
),
1148+
length_of_byte_string: OneArgumentCosting::new(
1149+
OneArgumentCosting::constant_cost(10),
1150+
OneArgumentCosting::constant_cost(22100),
1151+
),
1152+
index_byte_string: TwoArgumentsCosting::new(
1153+
TwoArgumentsCosting::constant_cost(4),
1154+
TwoArgumentsCosting::constant_cost(13169),
1155+
),
1156+
equals_byte_string: TwoArgumentsCosting::new(
1157+
TwoArgumentsCosting::constant_cost(1),
1158+
TwoArgumentsCosting::linear_on_diagonal(24548, 29498, 38),
1159+
),
1160+
less_than_byte_string: TwoArgumentsCosting::new(
1161+
TwoArgumentsCosting::constant_cost(1),
1162+
TwoArgumentsCosting::min_size(28999, 74),
1163+
),
1164+
less_than_equals_byte_string: TwoArgumentsCosting::new(
1165+
TwoArgumentsCosting::constant_cost(1),
1166+
TwoArgumentsCosting::min_size(28999, 74),
1167+
),
1168+
sha2_256: OneArgumentCosting::new(
1169+
OneArgumentCosting::constant_cost(4),
1170+
OneArgumentCosting::linear_cost(270652, 22588),
1171+
),
1172+
sha3_256: OneArgumentCosting::new(
1173+
OneArgumentCosting::constant_cost(4),
1174+
OneArgumentCosting::linear_cost(1457325, 64566),
1175+
),
1176+
blake2b_256: OneArgumentCosting::new(
1177+
OneArgumentCosting::constant_cost(4),
1178+
OneArgumentCosting::linear_cost(201305, 8356),
1179+
),
1180+
verify_ed25519_signature: ThreeArgumentsCosting::new(
1181+
ThreeArgumentsCosting::constant_cost(10),
1182+
ThreeArgumentsCosting::linear_in_y(53384111, 14333),
1183+
),
1184+
verify_ecdsa_secp256k1_signature: ThreeArgumentsCosting::new(
1185+
ThreeArgumentsCosting::constant_cost(10),
1186+
ThreeArgumentsCosting::constant_cost(43053543),
1187+
),
1188+
verify_schnorr_secp256k1_signature: ThreeArgumentsCosting::new(
1189+
ThreeArgumentsCosting::constant_cost(10),
1190+
ThreeArgumentsCosting::linear_in_y(43574283, 26308),
1191+
),
1192+
append_string: TwoArgumentsCosting::new(
1193+
TwoArgumentsCosting::added_sizes(4, 1),
1194+
TwoArgumentsCosting::added_sizes(1000, 59957),
1195+
),
1196+
equals_string: TwoArgumentsCosting::new(
1197+
TwoArgumentsCosting::constant_cost(1),
1198+
TwoArgumentsCosting::linear_on_diagonal(39184, 1000, 60594),
1199+
),
1200+
encode_utf8: OneArgumentCosting::new(
1201+
OneArgumentCosting::linear_cost(4, 2),
1202+
OneArgumentCosting::linear_cost(1000, 42921),
1203+
),
1204+
decode_utf8: OneArgumentCosting::new(
1205+
OneArgumentCosting::linear_cost(4, 2),
1206+
OneArgumentCosting::linear_cost(91189, 769),
1207+
),
1208+
if_then_else: ThreeArgumentsCosting::new(
1209+
ThreeArgumentsCosting::constant_cost(1),
1210+
ThreeArgumentsCosting::constant_cost(76049),
1211+
),
1212+
choose_unit: TwoArgumentsCosting::new(
1213+
TwoArgumentsCosting::constant_cost(4),
1214+
TwoArgumentsCosting::constant_cost(61462),
1215+
),
1216+
trace: TwoArgumentsCosting::new(
1217+
TwoArgumentsCosting::constant_cost(32),
1218+
TwoArgumentsCosting::constant_cost(59498),
1219+
),
1220+
fst_pair: OneArgumentCosting::new(
1221+
OneArgumentCosting::constant_cost(32),
1222+
OneArgumentCosting::constant_cost(141895),
1223+
),
1224+
snd_pair: OneArgumentCosting::new(
1225+
OneArgumentCosting::constant_cost(32),
1226+
OneArgumentCosting::constant_cost(141992),
1227+
),
1228+
choose_list: ThreeArgumentsCosting::new(
1229+
ThreeArgumentsCosting::constant_cost(32),
1230+
ThreeArgumentsCosting::constant_cost(132994),
1231+
),
1232+
mk_cons: TwoArgumentsCosting::new(
1233+
TwoArgumentsCosting::constant_cost(32),
1234+
TwoArgumentsCosting::constant_cost(72362),
1235+
),
1236+
head_list: OneArgumentCosting::new(
1237+
OneArgumentCosting::constant_cost(32),
1238+
OneArgumentCosting::constant_cost(83150),
1239+
),
1240+
tail_list: OneArgumentCosting::new(
1241+
OneArgumentCosting::constant_cost(32),
1242+
OneArgumentCosting::constant_cost(81663),
1243+
),
1244+
null_list: OneArgumentCosting::new(
1245+
OneArgumentCosting::constant_cost(32),
1246+
OneArgumentCosting::constant_cost(74433),
1247+
),
1248+
choose_data: SixArgumentsCosting::new(
1249+
SixArgumentsCosting::constant_cost(32),
1250+
SixArgumentsCosting::constant_cost(94375),
1251+
),
1252+
constr_data: TwoArgumentsCosting::new(
1253+
TwoArgumentsCosting::constant_cost(32),
1254+
TwoArgumentsCosting::constant_cost(22151),
1255+
),
1256+
map_data: OneArgumentCosting::new(
1257+
OneArgumentCosting::constant_cost(32),
1258+
OneArgumentCosting::constant_cost(68246),
1259+
),
1260+
list_data: OneArgumentCosting::new(
1261+
OneArgumentCosting::constant_cost(32),
1262+
OneArgumentCosting::constant_cost(33852),
1263+
),
1264+
i_data: OneArgumentCosting::new(
1265+
OneArgumentCosting::constant_cost(32),
1266+
OneArgumentCosting::constant_cost(15299),
1267+
),
1268+
b_data: OneArgumentCosting::new(
1269+
OneArgumentCosting::constant_cost(32),
1270+
OneArgumentCosting::constant_cost(11183),
1271+
),
1272+
un_constr_data: OneArgumentCosting::new(
1273+
OneArgumentCosting::constant_cost(32),
1274+
OneArgumentCosting::constant_cost(24588),
1275+
),
1276+
un_map_data: OneArgumentCosting::new(
1277+
OneArgumentCosting::constant_cost(32),
1278+
OneArgumentCosting::constant_cost(24623),
1279+
),
1280+
un_list_data: OneArgumentCosting::new(
1281+
OneArgumentCosting::constant_cost(32),
1282+
OneArgumentCosting::constant_cost(25933),
1283+
),
1284+
un_i_data: OneArgumentCosting::new(
1285+
OneArgumentCosting::constant_cost(32),
1286+
OneArgumentCosting::constant_cost(20744),
1287+
),
1288+
un_b_data: OneArgumentCosting::new(
1289+
OneArgumentCosting::constant_cost(32),
1290+
OneArgumentCosting::constant_cost(20142),
1291+
),
1292+
equals_data: TwoArgumentsCosting::new(
1293+
TwoArgumentsCosting::constant_cost(1),
1294+
TwoArgumentsCosting::min_size(898148, 27279),
1295+
),
1296+
mk_pair_data: TwoArgumentsCosting::new(
1297+
TwoArgumentsCosting::constant_cost(32),
1298+
TwoArgumentsCosting::constant_cost(11546),
1299+
),
1300+
mk_nil_data: OneArgumentCosting::new(
1301+
OneArgumentCosting::constant_cost(32),
1302+
OneArgumentCosting::constant_cost(7243),
1303+
),
1304+
mk_nil_pair_data: OneArgumentCosting::new(
1305+
OneArgumentCosting::constant_cost(32),
1306+
OneArgumentCosting::constant_cost(7391),
1307+
),
1308+
1309+
serialise_data: OneArgumentCosting::new(
1310+
OneArgumentCosting::linear_cost(0, 2),
1311+
OneArgumentCosting::linear_cost(955506, 213312),
1312+
),
1313+
blake2b_224: OneArgumentCosting::new(
1314+
OneArgumentCosting::constant_cost(4),
1315+
OneArgumentCosting::linear_cost(207616, 8310),
1316+
),
1317+
keccak_256: OneArgumentCosting::new(
1318+
OneArgumentCosting::constant_cost(4),
1319+
OneArgumentCosting::linear_cost(2261318, 64571),
1320+
),
1321+
bls12_381_g1_add: TwoArgumentsCosting::new(
1322+
TwoArgumentsCosting::constant_cost(18),
1323+
TwoArgumentsCosting::constant_cost(962335),
1324+
),
1325+
bls12_381_g1_neg: OneArgumentCosting::new(
1326+
OneArgumentCosting::constant_cost(18),
1327+
OneArgumentCosting::constant_cost(267929),
1328+
),
1329+
bls12_381_g1_scalar_mul: TwoArgumentsCosting::new(
1330+
TwoArgumentsCosting::constant_cost(18),
1331+
TwoArgumentsCosting::linear_in_x(76433006, 8868),
1332+
),
1333+
bls12_381_g1_equal: TwoArgumentsCosting::new(
1334+
TwoArgumentsCosting::constant_cost(1),
1335+
TwoArgumentsCosting::constant_cost(442008),
1336+
),
1337+
bls12_381_g1_compress: OneArgumentCosting::new(
1338+
OneArgumentCosting::constant_cost(6),
1339+
OneArgumentCosting::constant_cost(2780678),
1340+
),
1341+
bls12_381_g1_uncompress: OneArgumentCosting::new(
1342+
OneArgumentCosting::constant_cost(18),
1343+
OneArgumentCosting::constant_cost(52948122),
1344+
),
1345+
bls12_381_g1_hash_to_group: TwoArgumentsCosting::new(
1346+
TwoArgumentsCosting::constant_cost(18),
1347+
TwoArgumentsCosting::linear_in_x(52538055, 3756),
1348+
),
1349+
bls12_381_g2_add: TwoArgumentsCosting::new(
1350+
TwoArgumentsCosting::constant_cost(36),
1351+
TwoArgumentsCosting::constant_cost(1995836),
1352+
),
1353+
bls12_381_g2_neg: OneArgumentCosting::new(
1354+
OneArgumentCosting::constant_cost(36),
1355+
OneArgumentCosting::constant_cost(284546),
1356+
),
1357+
bls12_381_g2_scalar_mul: TwoArgumentsCosting::new(
1358+
TwoArgumentsCosting::constant_cost(36),
1359+
TwoArgumentsCosting::linear_in_x(158_221_314, 26_549),
1360+
),
1361+
bls12_381_g2_equal: TwoArgumentsCosting::new(
1362+
TwoArgumentsCosting::constant_cost(1),
1363+
TwoArgumentsCosting::constant_cost(901_022),
1364+
),
1365+
bls12_381_g2_compress: OneArgumentCosting::new(
1366+
OneArgumentCosting::constant_cost(12),
1367+
OneArgumentCosting::constant_cost(3_227_919),
1368+
),
1369+
bls12_381_g2_uncompress: OneArgumentCosting::new(
1370+
OneArgumentCosting::constant_cost(36),
1371+
OneArgumentCosting::constant_cost(74_698_472),
1372+
),
1373+
bls12_381_g2_hash_to_group: TwoArgumentsCosting::new(
1374+
TwoArgumentsCosting::constant_cost(36),
1375+
TwoArgumentsCosting::linear_in_x(166_917_843, 4_307),
1376+
),
1377+
bls12_381_miller_loop: TwoArgumentsCosting::new(
1378+
TwoArgumentsCosting::constant_cost(72),
1379+
TwoArgumentsCosting::constant_cost(254006273),
1380+
),
1381+
bls12_381_mul_ml_result: TwoArgumentsCosting::new(
1382+
TwoArgumentsCosting::constant_cost(72),
1383+
TwoArgumentsCosting::constant_cost(2174038),
1384+
),
1385+
bls12_381_final_verify: TwoArgumentsCosting::new(
1386+
TwoArgumentsCosting::constant_cost(1),
1387+
TwoArgumentsCosting::constant_cost(333849714),
1388+
),
1389+
integer_to_byte_string: ThreeArgumentsCosting::new(
1390+
ThreeArgumentsCosting::literal_in_y_or_linear_in_z(0, 1),
1391+
ThreeArgumentsCosting::quadratic_in_z(1293828, 28716, 63),
1392+
),
1393+
byte_string_to_integer: TwoArgumentsCosting::new(
1394+
TwoArgumentsCosting::linear_in_y(0, 1),
1395+
TwoArgumentsCosting::quadratic_in_y(1006041, 43623, 251),
1396+
),
1397+
and_byte_string: ThreeArgumentsCosting::new(
1398+
ThreeArgumentsCosting::linear_in_max_y_z(0, 1),
1399+
ThreeArgumentsCosting::linear_in_y_and_z(100181, 726, 719),
1400+
),
1401+
or_byte_string: ThreeArgumentsCosting::new(
1402+
ThreeArgumentsCosting::linear_in_max_y_z(0, 1),
1403+
ThreeArgumentsCosting::linear_in_y_and_z(100181, 726, 719),
1404+
),
1405+
xor_byte_string: ThreeArgumentsCosting::new(
1406+
ThreeArgumentsCosting::linear_in_max_y_z(0, 1),
1407+
ThreeArgumentsCosting::linear_in_y_and_z(100181, 726, 719),
1408+
),
1409+
complement_byte_string: OneArgumentCosting::new(
1410+
OneArgumentCosting::linear_cost(0, 1),
1411+
OneArgumentCosting::linear_cost(107878, 680),
1412+
),
1413+
read_bit: TwoArgumentsCosting::new(
1414+
TwoArgumentsCosting::constant_cost(1),
1415+
TwoArgumentsCosting::constant_cost(95336),
1416+
),
1417+
write_bits: ThreeArgumentsCosting::new(
1418+
ThreeArgumentsCosting::linear_in_x(0, 1),
1419+
ThreeArgumentsCosting::linear_in_y(281145, 18848),
1420+
),
1421+
replicate_byte: TwoArgumentsCosting::new(
1422+
TwoArgumentsCosting::linear_in_x(1, 1),
1423+
TwoArgumentsCosting::linear_in_x(180194, 159),
1424+
),
1425+
shift_byte_string: TwoArgumentsCosting::new(
1426+
TwoArgumentsCosting::linear_in_x(0, 1),
1427+
TwoArgumentsCosting::linear_in_x(158519, 8942),
1428+
),
1429+
rotate_byte_string: TwoArgumentsCosting::new(
1430+
TwoArgumentsCosting::linear_in_x(0, 1),
1431+
TwoArgumentsCosting::linear_in_x(159378, 8813),
1432+
),
1433+
count_set_bits: OneArgumentCosting::new(
1434+
OneArgumentCosting::constant_cost(1),
1435+
OneArgumentCosting::linear_cost(107490, 3298),
1436+
),
1437+
find_first_set_bit: OneArgumentCosting::new(
1438+
OneArgumentCosting::constant_cost(1),
1439+
OneArgumentCosting::linear_cost(106057, 655),
1440+
),
1441+
ripemd_160: OneArgumentCosting::new(
1442+
OneArgumentCosting::constant_cost(3),
1443+
OneArgumentCosting::linear_cost(1964219, 24520),
1444+
),
1445+
exp_mod_integer: ThreeArgumentsCosting::new(
1446+
ThreeArgumentsCosting::linear_in_z(0, 1),
1447+
ThreeArgumentsCosting::exp_mod_cost(607153, 231697, 53144),
1448+
),
1449+
drop_list: TwoArgumentsCosting::new(
1450+
TwoArgumentsCosting::constant_cost(4),
1451+
TwoArgumentsCosting::linear_in_x(116711, 1957),
1452+
),
1453+
length_of_array: OneArgumentCosting::new(
1454+
OneArgumentCosting::constant_cost(10),
1455+
OneArgumentCosting::constant_cost(198994),
1456+
),
1457+
list_to_array: TwoArgumentsCosting::new(
1458+
TwoArgumentsCosting::linear_in_x(7, 1),
1459+
TwoArgumentsCosting::linear_in_x(307802, 8496),
1460+
),
1461+
index_array: TwoArgumentsCosting::new(
1462+
TwoArgumentsCosting::constant_cost(32),
1463+
TwoArgumentsCosting::constant_cost(194922),
1464+
),
1465+
}
1466+
}
1467+
10901468
pub fn v3() -> Self {
10911469
Self {
10921470
add_integer: TwoArgumentsCosting::new(

0 commit comments

Comments
 (0)