Skip to content

Commit 383c36e

Browse files
committed
workspace: move forge to edition 2024 and bump published Dusk deps
1 parent cf87806 commit 383c36e

19 files changed

Lines changed: 89 additions & 104 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1616
### Changed
1717

1818
- Make local forge path overrides opt-in for release builds and harden CLI template/path handling across platforms.
19+
- Move the forge workspace and template project to Rust edition 2024 and bump published Dusk dependencies to their latest released versions.
1920

2021
## [0.2.2] - 2026-02-02
2122

Cargo.toml

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
name = "dusk-forge"
33
version = "0.2.2"
4-
edition = "2021"
4+
edition = "2024"
55
description = "A smart contract development framework for Dusk"
66
license = "MPL-2.0"
77
repository = "https://github.com/dusk-network/forge"
@@ -24,13 +24,13 @@ members = ["contract-macro", "tests/types", "tests/test-bridge", "cli"]
2424
exclude = ["contract-template"]
2525

2626
[workspace.package]
27-
edition = "2021"
27+
edition = "2024"
2828

2929
[workspace.dependencies]
3030
# Workspace internal dependencies
3131
dusk-forge-contract = { version = "0.1.1", path = "./contract-macro/" }
3232

33-
dusk-core = "1.4"
33+
dusk-core = "1.4.1"
3434
bytecheck = { version = "0.6.12", default-features = false }
3535
dusk-bytes = "0.1.7"
3636
rkyv = { version = "0.7", default-features = false, features = [
@@ -50,20 +50,15 @@ cargo_metadata = "0.19"
5050
clap = { version = "4", features = ["derive"] }
5151
clap_complete = "4"
5252
colored = "3"
53+
blake3 = "=1.5.4"
5354
predicates = "3"
5455
tempfile = "=3.10.1"
5556
thiserror = "2"
5657
toml = "0.8"
5758
wasmtime = "25"
5859

59-
# Pin to match L1Contracts versions
60-
dusk-vm = { version = "=1.4.0", default-features = false }
61-
# Pin to avoid edition2024 issues
62-
blake2b_simd = "=1.0.2"
63-
blake3 = "=1.5.4"
64-
constant_time_eq = "=0.3.1"
65-
time-core = "=0.1.6"
66-
uuid = "=1.20.0"
60+
# Pin to match the latest published Dusk runtime crates used by generated contracts.
61+
dusk-vm = { version = "=1.4.3", default-features = false }
6762

6863
# Enable overflow checks in release builds for contract safety
6964
[profile.release]

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -258,13 +258,13 @@ All runtime dependencies go in the WASM-only section because contracts are gated
258258

259259
```toml
260260
[target.'cfg(target_family = "wasm")'.dependencies]
261-
dusk-core = "1.4"
262-
dusk-data-driver = { version = "0.3", optional = true } # Only for data-driver
263-
dusk-forge = "0.1"
261+
dusk-core = "1.4.1"
262+
dusk-data-driver = { version = "0.3.1", optional = true } # Only for data-driver
263+
dusk-forge = "0.2.2"
264264

265265
[dev-dependencies]
266-
dusk-core = "1.4" # Same types, but for host-side tests
267-
dusk-vm = "0.1" # To run contract in tests
266+
dusk-core = "1.4.1" # Same types, but for host-side tests
267+
dusk-vm = "1.4.3" # To run contract in tests
268268
```
269269

270270
### Features

cli/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
name = "dusk-forge-cli"
33
version = "0.1.0"
4-
edition = "2021"
4+
edition = "2024"
55
description = "CLI for scaffolding and building Dusk Forge contracts"
66
license = "MPL-2.0"
77
repository = "https://github.com/dusk-network/forge"

cli/src/template/engine.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::error::{CliError, Result};
22

3-
use super::embedded::{files, TemplateKind};
3+
use super::embedded::{TemplateKind, files};
44

55
#[derive(Debug, Clone, PartialEq, Eq)]
66
pub struct ContractName {

cli/tests/new_command.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ fn new_scaffolds_counter_template() {
3838
assert!(test.contains("release/my_test.wasm"));
3939
assert!(!test.contains("YOUR_CONTRACT_NAME"));
4040
assert!(!test.contains("TODO"));
41-
assert!(rust_toolchain.contains("channel = \"nightly-2024-07-30\""));
41+
assert!(rust_toolchain.contains("channel = \"nightly-2026-02-27\""));
4242
}
4343

4444
#[test]

contract-macro/src/data_driver.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ fn generate_decode_event_arms(events: &[EventInfo], type_map: &TypeMap) -> Vec<T
293293
// Skip variable references (single lowercase identifier)
294294
if topic_path.segments.len() == 1 {
295295
let name = topic_path.segments[0].ident.to_string();
296-
if name.chars().next().map_or(false, char::is_lowercase) {
296+
if name.chars().next().is_some_and(char::is_lowercase) {
297297
return None;
298298
}
299299
}

contract-macro/src/extract.rs

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ use syn::{
1414
};
1515

1616
use crate::{
17-
extract_doc_comment, extract_feeds_attribute, extract_receiver, get_feed_exprs,
18-
has_custom_attribute, has_empty_body, parse, validate, validate_feed_type_match, ContractData,
19-
CustomDataDriverHandler, DataDriverRole, EmitVisitor, EventInfo, FunctionInfo, ImportInfo,
20-
ParameterInfo, TraitImplInfo,
17+
ContractData, CustomDataDriverHandler, DataDriverRole, EmitVisitor, EventInfo, FunctionInfo,
18+
ImportInfo, ParameterInfo, TraitImplInfo, extract_doc_comment, extract_feeds_attribute,
19+
extract_receiver, get_feed_exprs, has_custom_attribute, has_empty_body, parse, validate,
20+
validate_feed_type_match,
2121
};
2222

2323
/// Validate feed-related attributes for a method.
@@ -31,7 +31,7 @@ use crate::{
3131
fn validate_feeds(
3232
method: &ImplItemFn,
3333
name: &Ident,
34-
feed_type: &Option<TokenStream2>,
34+
feed_type: Option<&TokenStream2>,
3535
) -> Result<(), syn::Error> {
3636
let feed_exprs = get_feed_exprs(method);
3737

@@ -52,7 +52,7 @@ fn validate_feeds(
5252
));
5353
}
5454

55-
if let Some(ref ft) = feed_type {
55+
if let Some(ft) = feed_type {
5656
// Has feeds attribute - validate it matches the expressions
5757
if let Some(mismatch_msg) = validate_feed_type_match(&ft.to_string(), &feed_exprs) {
5858
return Err(syn::Error::new_spanned(&method.sig, mismatch_msg));
@@ -156,7 +156,7 @@ pub(crate) fn trait_methods(trait_impl: &TraitImplInfo) -> Result<Vec<FunctionIn
156156
// Validate feed-related attributes
157157
// (only check non-empty bodies since empty bodies delegate to trait defaults)
158158
if !is_default_impl {
159-
validate_feeds(method, &name, &feed_type)?;
159+
validate_feeds(method, &name, feed_type.as_ref())?;
160160
}
161161

162162
// Extract parameters (name and type)
@@ -236,7 +236,7 @@ pub(crate) fn public_methods(impl_block: &ItemImpl) -> Result<Vec<FunctionInfo>,
236236
let receiver = extract_receiver(method);
237237

238238
// Validate feed-related attributes
239-
validate_feeds(method, &name, &feed_type)?;
239+
validate_feeds(method, &name, feed_type.as_ref())?;
240240

241241
// Extract parameters (name and type)
242242
let params = parameters(method);
@@ -884,7 +884,7 @@ mod tests {
884884
}
885885
};
886886
let name = format_ident!("stream_data");
887-
let result = validate_feeds(&method, &name, &None);
887+
let result = validate_feeds(&method, &name, None);
888888

889889
let Err(err) = result else {
890890
panic!("expected error for missing feeds attribute");
@@ -911,7 +911,7 @@ mod tests {
911911
};
912912
let name = format_ident!("stream_multiple");
913913
let feed_type: TokenStream2 = quote! { u64 };
914-
let result = validate_feeds(&method, &name, &Some(feed_type));
914+
let result = validate_feeds(&method, &name, Some(&feed_type));
915915

916916
let Err(err) = result else {
917917
panic!("expected error for multiple feed calls");
@@ -936,7 +936,7 @@ mod tests {
936936
};
937937
let name = format_ident!("stream_mismatch");
938938
let feed_type: TokenStream2 = quote! { (u64, u64) };
939-
let result = validate_feeds(&method, &name, &Some(feed_type));
939+
let result = validate_feeds(&method, &name, Some(&feed_type));
940940

941941
let Err(err) = result else {
942942
panic!("expected error for tuple mismatch");
@@ -958,7 +958,7 @@ mod tests {
958958
};
959959
let name = format_ident!("stream_valid");
960960
let feed_type: TokenStream2 = quote! { u64 };
961-
let result = validate_feeds(&method, &name, &Some(feed_type));
961+
let result = validate_feeds(&method, &name, Some(&feed_type));
962962

963963
assert!(result.is_ok(), "valid feeds usage should not error");
964964
}
@@ -971,7 +971,7 @@ mod tests {
971971
}
972972
};
973973
let name = format_ident!("regular_method");
974-
let result = validate_feeds(&method, &name, &None);
974+
let result = validate_feeds(&method, &name, None);
975975

976976
assert!(
977977
result.is_ok(),
@@ -991,7 +991,7 @@ mod tests {
991991
};
992992
let name = format_ident!("stream_in_loop");
993993
let feed_type: TokenStream2 = quote! { u64 };
994-
let result = validate_feeds(&method, &name, &Some(feed_type));
994+
let result = validate_feeds(&method, &name, Some(&feed_type));
995995

996996
// A single feed call inside a loop is valid
997997
assert!(result.is_ok(), "single feed call in loop should be valid");
@@ -1010,7 +1010,7 @@ mod tests {
10101010
};
10111011
let name = format_ident!("stream_multiple_in_loop");
10121012
let feed_type: TokenStream2 = quote! { u64 };
1013-
let result = validate_feeds(&method, &name, &Some(feed_type));
1013+
let result = validate_feeds(&method, &name, Some(&feed_type));
10141014

10151015
let Err(err) = result else {
10161016
panic!("expected error for multiple feed calls in loop");
@@ -1034,7 +1034,7 @@ mod tests {
10341034
};
10351035
let name = format_ident!("stream_conditional");
10361036
let feed_type: TokenStream2 = quote! { u64 };
1037-
let result = validate_feeds(&method, &name, &Some(feed_type));
1037+
let result = validate_feeds(&method, &name, Some(&feed_type));
10381038

10391039
assert!(
10401040
result.is_ok(),
@@ -1056,7 +1056,7 @@ mod tests {
10561056
};
10571057
let name = format_ident!("stream_branches");
10581058
let feed_type: TokenStream2 = quote! { u64 };
1059-
let result = validate_feeds(&method, &name, &Some(feed_type));
1059+
let result = validate_feeds(&method, &name, Some(&feed_type));
10601060

10611061
let Err(err) = result else {
10621062
panic!("expected error for feed calls in multiple branches");
@@ -1078,7 +1078,7 @@ mod tests {
10781078
};
10791079
let name = format_ident!("stream_wants_tuple");
10801080
let feed_type: TokenStream2 = quote! { (u64, String) };
1081-
let result = validate_feeds(&method, &name, &Some(feed_type));
1081+
let result = validate_feeds(&method, &name, Some(&feed_type));
10821082

10831083
let Err(err) = result else {
10841084
panic!("expected error for tuple mismatch");
@@ -1097,7 +1097,7 @@ mod tests {
10971097
};
10981098
let name = format_ident!("stream_sends_tuple");
10991099
let feed_type: TokenStream2 = quote! { u64 };
1100-
let result = validate_feeds(&method, &name, &Some(feed_type));
1100+
let result = validate_feeds(&method, &name, Some(&feed_type));
11011101

11021102
let Err(err) = result else {
11031103
panic!("expected error for tuple mismatch");

contract-macro/src/generate.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use proc_macro2::{Ident, TokenStream as TokenStream2};
1010
use quote::{format_ident, quote};
1111
use syn::{ImplItem, ItemImpl};
1212

13-
use crate::{generate_arg_expr, EventInfo, FunctionInfo, ImportInfo, Receiver};
13+
use crate::{EventInfo, FunctionInfo, ImportInfo, Receiver, generate_arg_expr};
1414

1515
/// Generate the schema constant.
1616
pub(crate) fn schema(

contract-macro/src/lib.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
//
55
// Copyright (c) DUSK NETWORK. All rights reserved.
66

7-
#![feature(let_chains)]
8-
97
//! Procedural macro for the `#[contract]` attribute.
108
//!
119
//! This macro is applied to a module containing a contract struct and its
@@ -50,8 +48,8 @@ use proc_macro::TokenStream;
5048
use proc_macro2::{Ident, TokenStream as TokenStream2};
5149
use quote::quote;
5250
use syn::{
53-
parse_macro_input, visit::Visit, Attribute, Expr, ExprCall, ExprLit, ExprPath, FnArg,
54-
ImplItemFn, Item, ItemImpl, ItemMod, Lit, Type,
51+
Attribute, Expr, ExprCall, ExprLit, ExprPath, FnArg, ImplItemFn, Item, ItemImpl, ItemMod, Lit,
52+
Type, parse_macro_input, visit::Visit,
5553
};
5654

5755
// ============================================================================

0 commit comments

Comments
 (0)