@@ -206,7 +206,6 @@ fn run_analysis_free<C: ClarityStorage>(
206
206
save_contract : bool ,
207
207
clarity_version : ClarityVersion ,
208
208
) -> Result < ContractAnalysis , Box < ( CheckError , LimitedCostTracker ) > > {
209
- let clarity_version = ClarityVersion :: default_for_epoch ( DEFAULT_CLI_EPOCH ) ;
210
209
analysis:: run_analysis (
211
210
contract_identifier,
212
211
expressions,
@@ -229,7 +228,6 @@ fn run_analysis<C: ClarityStorage>(
229
228
clarity_version : ClarityVersion ,
230
229
) -> Result < ContractAnalysis , Box < ( CheckError , LimitedCostTracker ) > > {
231
230
let mainnet = header_db. is_mainnet ( ) ;
232
- let clarity_version = ClarityVersion :: Clarity3 ;
233
231
let cost_track = LimitedCostTracker :: new (
234
232
mainnet,
235
233
default_chain_id ( mainnet) ,
@@ -994,6 +992,22 @@ pub fn add_serialized_output(result: &mut serde_json::Value, value: Value) {
994
992
result[ "output_serialized" ] = serde_json:: to_value ( result_raw. as_str ( ) ) . unwrap ( ) ;
995
993
}
996
994
995
+ /// Parse --clarity_version flag. Defaults to version for DEFAULT_CLI_EPOCH.
996
+ fn parse_clarity_version_flag ( argv : & mut Vec < String > ) -> ClarityVersion {
997
+ if let Ok ( optarg) = consume_arg ( argv, & [ "--clarity_version" ] , true ) {
998
+ if let Some ( s) = optarg {
999
+ friendly_expect (
1000
+ s. parse :: < ClarityVersion > ( ) ,
1001
+ & format ! ( "Invalid clarity version: {}" , s) ,
1002
+ )
1003
+ } else {
1004
+ ClarityVersion :: default_for_epoch ( DEFAULT_CLI_EPOCH )
1005
+ }
1006
+ } else {
1007
+ ClarityVersion :: default_for_epoch ( DEFAULT_CLI_EPOCH )
1008
+ }
1009
+ }
1010
+
997
1011
/// Returns (process-exit-code, Option<json-output>)
998
1012
pub fn invoke_command ( invoked_by : & str , args : & [ String ] ) -> ( i32 , Option < serde_json:: Value > ) {
999
1013
if args. is_empty ( ) {
@@ -1118,13 +1132,14 @@ pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option<serde_j
1118
1132
"check" => {
1119
1133
if args. len ( ) < 2 {
1120
1134
eprintln ! (
1121
- "Usage: {} {} [program-file.clar] [--contract_id CONTRACT_ID] [--output_analysis] [--costs] [--testnet] (vm-state.db)" ,
1135
+ "Usage: {} {} [program-file.clar] [--contract_id CONTRACT_ID] [--output_analysis] [--costs] [--testnet] [--clarity_version N] (vm-state.db)" ,
1122
1136
invoked_by, args[ 0 ]
1123
1137
) ;
1124
1138
panic_test ! ( ) ;
1125
1139
}
1126
1140
1127
1141
let mut argv = args. to_vec ( ) ;
1142
+ let clarity_version = parse_clarity_version_flag ( & mut argv) ;
1128
1143
let contract_id = if let Ok ( optarg) = consume_arg ( & mut argv, & [ "--contract_id" ] , true ) {
1129
1144
optarg
1130
1145
. map ( |optarg_str| {
@@ -1172,9 +1187,8 @@ pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option<serde_j
1172
1187
)
1173
1188
} ;
1174
1189
1175
- // TODO: Add --clarity_version as command line argument
1176
1190
let mut ast = friendly_expect (
1177
- parse ( & contract_id, & content, ClarityVersion :: Clarity3 ) ,
1191
+ parse ( & contract_id, & content, clarity_version ) ,
1178
1192
"Failed to parse program" ,
1179
1193
) ;
1180
1194
@@ -1195,7 +1209,7 @@ pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option<serde_j
1195
1209
1196
1210
let result = at_chaintip ( & argv[ 2 ] , marf_kv, |mut marf| {
1197
1211
let result =
1198
- run_analysis ( & contract_id, & mut ast, & header_db, & mut marf, false ) ;
1212
+ run_analysis ( & contract_id, & mut ast, & header_db, & mut marf, false , clarity_version ) ;
1199
1213
( marf, result)
1200
1214
} ) ;
1201
1215
result
@@ -1210,6 +1224,7 @@ pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option<serde_j
1210
1224
& header_db,
1211
1225
& mut analysis_marf,
1212
1226
false ,
1227
+ clarity_version,
1213
1228
)
1214
1229
}
1215
1230
} ;
@@ -1248,6 +1263,7 @@ pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option<serde_j
1248
1263
}
1249
1264
"repl" => {
1250
1265
let mut argv = args. to_vec ( ) ;
1266
+ let clarity_version = parse_clarity_version_flag ( & mut argv) ;
1251
1267
let mainnet = !matches ! ( consume_arg( & mut argv, & [ "--testnet" ] , false ) , Ok ( Some ( _) ) ) ;
1252
1268
let mut marf = MemoryBackingStore :: new ( ) ;
1253
1269
let mut vm_env = OwnedEnvironment :: new_free (
@@ -1258,7 +1274,7 @@ pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option<serde_j
1258
1274
) ;
1259
1275
let placeholder_context = ContractContext :: new (
1260
1276
QualifiedContractIdentifier :: transient ( ) ,
1261
- ClarityVersion :: Clarity2 ,
1277
+ clarity_version
1262
1278
) ;
1263
1279
let mut exec_env = vm_env. get_exec_environment ( None , None , & placeholder_context) ;
1264
1280
let mut analysis_marf = MemoryBackingStore :: new ( ) ;
@@ -1285,7 +1301,7 @@ pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option<serde_j
1285
1301
}
1286
1302
} ;
1287
1303
1288
- let mut ast = match parse ( & contract_id, & content, ClarityVersion :: Clarity3 ) {
1304
+ let mut ast = match parse ( & contract_id, & content, clarity_version ) {
1289
1305
Ok ( val) => val,
1290
1306
Err ( error) => {
1291
1307
println ! ( "Parse error:\n {error}" ) ;
@@ -1298,7 +1314,7 @@ pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option<serde_j
1298
1314
& mut ast,
1299
1315
& mut analysis_marf,
1300
1316
true ,
1301
- ClarityVersion :: Clarity3 ,
1317
+ clarity_version ,
1302
1318
) {
1303
1319
Ok ( _) => ( ) ,
1304
1320
Err ( boxed) => {
@@ -1320,6 +1336,8 @@ pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option<serde_j
1320
1336
}
1321
1337
}
1322
1338
"eval_raw" => {
1339
+ let mut argv = args. to_vec ( ) ;
1340
+ let clarity_version = parse_clarity_version_flag ( & mut argv) ;
1323
1341
let content: String = {
1324
1342
let mut buffer = String :: new ( ) ;
1325
1343
friendly_expect (
@@ -1341,19 +1359,19 @@ pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option<serde_j
1341
1359
let contract_id = QualifiedContractIdentifier :: transient ( ) ;
1342
1360
let placeholder_context = ContractContext :: new (
1343
1361
QualifiedContractIdentifier :: transient ( ) ,
1344
- ClarityVersion :: Clarity3 ,
1362
+ clarity_version
1345
1363
) ;
1346
1364
1347
1365
let mut ast = friendly_expect (
1348
- parse ( & contract_id, & content, ClarityVersion :: Clarity3 ) ,
1366
+ parse ( & contract_id, & content, clarity_version ) ,
1349
1367
"Failed to parse program." ,
1350
1368
) ;
1351
1369
match run_analysis_free (
1352
1370
& contract_id,
1353
1371
& mut ast,
1354
1372
& mut analysis_marf,
1355
1373
true ,
1356
- ClarityVersion :: Clarity3 ,
1374
+ clarity_version ,
1357
1375
) {
1358
1376
Ok ( _) => {
1359
1377
let result = vm_env
@@ -1391,6 +1409,7 @@ pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option<serde_j
1391
1409
}
1392
1410
"eval" => {
1393
1411
let mut argv = args. to_vec ( ) ;
1412
+ let clarity_version = parse_clarity_version_flag ( & mut argv) ;
1394
1413
1395
1414
let costs = matches ! ( consume_arg( & mut argv, & [ "--costs" ] , false ) , Ok ( Some ( _) ) ) ;
1396
1415
@@ -1405,7 +1424,7 @@ pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option<serde_j
1405
1424
let mainnet = header_db. is_mainnet ( ) ;
1406
1425
let placeholder_context = ContractContext :: new (
1407
1426
QualifiedContractIdentifier :: transient ( ) ,
1408
- ClarityVersion :: Clarity3 ,
1427
+ clarity_version
1409
1428
) ;
1410
1429
1411
1430
let ( _, _, result_and_cost) = in_block ( header_db, marf_kv, |header_db, mut marf| {
@@ -1446,12 +1465,17 @@ pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option<serde_j
1446
1465
}
1447
1466
"eval_at_chaintip" => {
1448
1467
let mut argv = args. to_vec ( ) ;
1468
+ let clarity_version = parse_clarity_version_flag ( & mut argv) ;
1449
1469
1450
1470
let costs = matches ! ( consume_arg( & mut argv, & [ "--costs" ] , false ) , Ok ( Some ( _) ) ) ;
1451
1471
let coverage_folder = consume_arg ( & mut argv, & [ "--c" ] , true ) . unwrap_or ( None ) ;
1452
1472
1453
1473
let evalInput = get_eval_input ( invoked_by, & argv) ;
1454
- let vm_filename = if argv. len ( ) == 3 { & argv[ 2 ] } else { & argv[ 3 ] } ;
1474
+ let vm_filename = if argv. len ( ) == 3 {
1475
+ & argv[ 2 ] . clone ( )
1476
+ } else {
1477
+ & argv[ 3 ] . clone ( )
1478
+ } ;
1455
1479
let header_db =
1456
1480
friendly_expect ( CLIHeadersDB :: resume ( vm_filename) , "Failed to open CLI DB" ) ;
1457
1481
let marf_kv = friendly_expect (
@@ -1462,7 +1486,7 @@ pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option<serde_j
1462
1486
let mainnet = header_db. is_mainnet ( ) ;
1463
1487
let placeholder_context = ContractContext :: new (
1464
1488
QualifiedContractIdentifier :: transient ( ) ,
1465
- ClarityVersion :: Clarity3 ,
1489
+ clarity_version
1466
1490
) ;
1467
1491
let mut coverage = if coverage_folder. is_some ( ) {
1468
1492
Some ( CoverageReporter :: new ( ) )
@@ -1516,17 +1540,18 @@ pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option<serde_j
1516
1540
}
1517
1541
"eval_at_block" => {
1518
1542
let mut argv = args. to_vec ( ) ;
1543
+ let clarity_version = parse_clarity_version_flag ( & mut argv) ;
1519
1544
1520
1545
let costs = matches ! ( consume_arg( & mut argv, & [ "--costs" ] , false ) , Ok ( Some ( _) ) ) ;
1521
1546
1522
1547
if argv. len ( ) != 4 {
1523
1548
eprintln ! (
1524
- "Usage: {} {} [--costs] [index-block-hash] [contract-identifier] [vm/clarity dir]" ,
1549
+ "Usage: {} {} [--costs] [index-block-hash] [contract-identifier] [--clarity_version N] [ vm/clarity dir]" ,
1525
1550
invoked_by, & argv[ 0 ]
1526
1551
) ;
1527
1552
panic_test ! ( ) ;
1528
1553
}
1529
- let chain_tip = & argv[ 1 ] ;
1554
+ let chain_tip = & argv[ 1 ] . clone ( ) ;
1530
1555
let contract_identifier = friendly_expect (
1531
1556
QualifiedContractIdentifier :: parse ( & argv[ 2 ] ) ,
1532
1557
"Failed to parse contract identifier." ,
@@ -1550,7 +1575,7 @@ pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option<serde_j
1550
1575
let mainnet = header_db. is_mainnet ( ) ;
1551
1576
let placeholder_context = ContractContext :: new (
1552
1577
QualifiedContractIdentifier :: transient ( ) ,
1553
- ClarityVersion :: Clarity3 ,
1578
+ clarity_version
1554
1579
) ;
1555
1580
let result_and_cost = at_block ( chain_tip, marf_kv, |mut marf| {
1556
1581
let result_and_cost =
@@ -1590,6 +1615,7 @@ pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option<serde_j
1590
1615
}
1591
1616
"launch" => {
1592
1617
let mut argv = args. to_vec ( ) ;
1618
+ let clarity_version = parse_clarity_version_flag ( & mut argv) ;
1593
1619
let coverage_folder = consume_arg ( & mut argv, & [ "--c" ] , true ) . unwrap_or ( None ) ;
1594
1620
1595
1621
let costs = matches ! ( consume_arg( & mut argv, & [ "--costs" ] , false ) , Ok ( Some ( _) ) ) ;
@@ -1601,13 +1627,13 @@ pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option<serde_j
1601
1627
1602
1628
if argv. len ( ) < 4 {
1603
1629
eprintln ! (
1604
- "Usage: {} {} [--costs] [--assets] [--output_analysis] [contract-identifier] [contract-definition.clar] [vm-state.db]" ,
1630
+ "Usage: {} {} [--costs] [--assets] [--output_analysis] [contract-identifier] [contract-definition.clar] [--clarity_version N] [ vm-state.db]" ,
1605
1631
invoked_by, argv[ 0 ]
1606
1632
) ;
1607
1633
panic_test ! ( ) ;
1608
1634
}
1609
1635
1610
- let vm_filename = & argv[ 3 ] ;
1636
+ let vm_filename = & argv[ 3 ] . clone ( ) ;
1611
1637
let contract_src_file = & args[ 2 ] ;
1612
1638
let contract_identifier = friendly_expect (
1613
1639
QualifiedContractIdentifier :: parse ( & argv[ 1 ] ) ,
@@ -1619,12 +1645,11 @@ pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option<serde_j
1619
1645
& format ! ( "Error reading file: {}" , contract_src_file) ,
1620
1646
) ;
1621
1647
1622
- // TODO: Add --clarity_version as command line argument
1623
1648
let mut ast = friendly_expect (
1624
1649
parse (
1625
1650
& contract_identifier,
1626
1651
& contract_content,
1627
- ClarityVersion :: Clarity3 ,
1652
+ clarity_version
1628
1653
) ,
1629
1654
"Failed to parse program." ,
1630
1655
) ;
@@ -1660,7 +1685,7 @@ pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option<serde_j
1660
1685
let ( _, _, analysis_result_and_cost) =
1661
1686
in_block ( header_db, marf_kv, |header_db, mut marf| {
1662
1687
let analysis_result =
1663
- run_analysis ( & contract_identifier, & mut ast, & header_db, & mut marf, true ) ;
1688
+ run_analysis ( & contract_identifier, & mut ast, & header_db, & mut marf, true , clarity_version ) ;
1664
1689
match analysis_result {
1665
1690
Err ( e) => ( header_db, marf, Err ( e) ) ,
1666
1691
Ok ( analysis) => {
@@ -1672,7 +1697,7 @@ pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option<serde_j
1672
1697
|vm_env| {
1673
1698
vm_env. initialize_versioned_contract (
1674
1699
contract_identifier,
1675
- ClarityVersion :: Clarity3 ,
1700
+ clarity_version ,
1676
1701
& contract_content,
1677
1702
None ,
1678
1703
)
@@ -1733,13 +1758,14 @@ pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option<serde_j
1733
1758
}
1734
1759
"execute" => {
1735
1760
let mut argv = args. to_vec ( ) ;
1761
+ let clarity_version = parse_clarity_version_flag ( & mut argv) ;
1736
1762
let coverage_folder = consume_arg ( & mut argv, & [ "--c" ] , true ) . unwrap_or ( None ) ;
1737
1763
1738
1764
let costs = matches ! ( consume_arg( & mut argv, & [ "--costs" ] , false ) , Ok ( Some ( _) ) ) ;
1739
1765
let assets = matches ! ( consume_arg( & mut argv, & [ "--assets" ] , false ) , Ok ( Some ( _) ) ) ;
1740
1766
1741
1767
if argv. len ( ) < 5 {
1742
- eprintln ! ( "Usage: {} {} [--costs] [--assets] [vm-state.db] [contract-identifier] [public-function-name] [sender-address] [args...]" , invoked_by, argv[ 0 ] ) ;
1768
+ eprintln ! ( "Usage: {} {} [--costs] [--assets] [--clarity_version N] [ vm-state.db] [contract-identifier] [public-function-name] [sender-address] [args...]" , invoked_by, argv[ 0 ] ) ;
1743
1769
panic_test ! ( ) ;
1744
1770
}
1745
1771
@@ -1771,7 +1797,6 @@ pub fn invoke_command(invoked_by: &str, args: &[String]) -> (i32, Option<serde_j
1771
1797
let arguments: Vec < _ > = argv[ 5 ..]
1772
1798
. iter ( )
1773
1799
. map ( |argument| {
1774
- let clarity_version = ClarityVersion :: Clarity3 ;
1775
1800
let argument_parsed = friendly_expect (
1776
1801
vm_execute ( argument, clarity_version) ,
1777
1802
& format ! ( "Error parsing argument \" {}\" " , argument) ,
0 commit comments