diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 22c0473..4d9ea74 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,7 +8,7 @@ on: env: RUST_BACKTRACE: full - MSRV: 1.84.0 + MSRV: 1.86.0 jobs: tests: diff --git a/Cargo.toml b/Cargo.toml index 27ec3cc..bca8548 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,19 +1,19 @@ [workspace] members = ["near-plugins", "near-plugins-derive"] exclude = ["target", "examples"] -resolver = "2" +resolver = "3" [workspace.metadata.workspaces] version = "0.15.0" [workspace.package] version = "0.5.0" -edition = "2021" +edition = "2024" authors = ["Aurora Labs "] # An update of the MSRV requires updating: # - `rust-toolchain` files in `near-plugins-derive/tests/contracts/**` # - the toolchain installed in CI via the `toolchain` parameter of `actions-rs/toolchain@v1` -rust-version = "1.84.0" +rust-version = "1.86.0" description = "Ergonomic plugin system to extend NEAR contracts." license = "CC0-1.0" readme = "README.md" @@ -23,17 +23,18 @@ keywords = ["near", "smart contract", "plugin"] [workspace.dependencies] bitflags = "1.3" -near-sdk = ">=5.2" +near-sdk = "5.25" near-plugins = { path = "near-plugins" } near-plugins-derive = { path = "near-plugins-derive" } serde = "1" anyhow = "1.0" tokio = { version = "1", features = ["full"] } -near-workspaces = "0.14" +near-workspaces = "0.22" toml = "0.8" -darling = "0.13.1" +# XXX: Darling 0.21 uses rustc 1.87, which is not supported by the sdk before wasmtime rollout +darling = ">=0.20, <0.21" proc-macro2 = "1.0" quote = "1.0.9" -syn = { version = "1.0.69", features = ["full"] } +syn = { version = "2", features = ["full"] } proc-macro-crate = "0.1.5" -cargo-near-build = "0.4.4" \ No newline at end of file +cargo-near-build = { version = "0.11", features = ["build_internal"] } diff --git a/near-plugins-derive/src/access_control_role.rs b/near-plugins-derive/src/access_control_role.rs index 7b98479..1965074 100644 --- a/near-plugins-derive/src/access_control_role.rs +++ b/near-plugins-derive/src/access_control_role.rs @@ -44,7 +44,7 @@ use proc_macro::TokenStream; use proc_macro2::{Ident, Span}; use quote::quote; use std::convert::TryFrom; -use syn::{parse_macro_input, ItemEnum}; +use syn::{ItemEnum, parse_macro_input}; /// Roles as are represented by enum variants which are, in turn, represented by /// `u128` bitflags. Each variant requires two flags, one for the role itself diff --git a/near-plugins-derive/src/access_controllable.rs b/near-plugins-derive/src/access_controllable.rs index 0569250..29dae54 100644 --- a/near-plugins-derive/src/access_controllable.rs +++ b/near-plugins-derive/src/access_controllable.rs @@ -1,8 +1,9 @@ use darling::FromMeta; +use darling::ast::NestedMeta; use proc_macro::TokenStream; use proc_macro2::Span; use quote::quote; -use syn::{parse_macro_input, AttributeArgs, ItemFn, ItemStruct}; +use syn::{ItemFn, ItemStruct, parse_macro_input}; use crate::access_control_role::new_bitflags_type_ident; use crate::utils::{self, cratename, is_near_bindgen_wrapped_or_marshall}; @@ -24,7 +25,12 @@ const ERR_PARSE_ROLE: &str = "Value does not correspond to a role"; /// Generates the token stream that implements `AccessControllable`. pub fn access_controllable(attrs: TokenStream, item: TokenStream) -> TokenStream { let cratename = cratename(); - let attr_args = parse_macro_input!(attrs as AttributeArgs); + let attr_args = match NestedMeta::parse_meta_list(attrs.into()) { + Ok(parsed_args) => parsed_args, + Err(e) => { + return TokenStream::from(e.into_compile_error()); + } + }; let input: ItemStruct = parse_macro_input!(item); let acl_type = syn::Ident::new(DEFAULT_ACL_TYPE_NAME, Span::call_site()); let bitflags_type = new_bitflags_type_ident(Span::call_site()); @@ -705,7 +711,12 @@ pub struct MacroArgsAny { /// Generates the token stream for the `access_control_any` macro. pub fn access_control_any(attrs: TokenStream, item: TokenStream) -> TokenStream { - let attr_args = parse_macro_input!(attrs as AttributeArgs); + let attr_args = match NestedMeta::parse_meta_list(attrs.into()) { + Ok(parsed_args) => parsed_args, + Err(e) => { + return TokenStream::from(e.into_compile_error()); + } + }; let cloned_item = item.clone(); let input: ItemFn = parse_macro_input!(cloned_item); if is_near_bindgen_wrapped_or_marshall(&input) { @@ -721,7 +732,7 @@ pub fn access_control_any(attrs: TokenStream, item: TokenStream) -> TokenStream } }; let roles = macro_args.roles; - assert!(roles.len() > 0, "Specify at least one role"); + assert!(!roles.is_empty(), "Specify at least one role"); // TODO optimize case `roles.len() == 1` (speed up expected common case) let acl_check = quote! { diff --git a/near-plugins-derive/src/ownable.rs b/near-plugins-derive/src/ownable.rs index 0404646..0c5cb60 100644 --- a/near-plugins-derive/src/ownable.rs +++ b/near-plugins-derive/src/ownable.rs @@ -3,7 +3,7 @@ use crate::utils::{cratename, is_near_bindgen_wrapped_or_marshall}; use darling::FromDeriveInput; use proc_macro::{self, TokenStream}; use quote::quote; -use syn::{parse, parse_macro_input, DeriveInput, ItemFn}; +use syn::{DeriveInput, ItemFn, parse, parse_macro_input}; #[derive(FromDeriveInput, Default)] #[darling(default, attributes(ownable), forward_attrs(allow, doc, cfg))] diff --git a/near-plugins-derive/src/pausable.rs b/near-plugins-derive/src/pausable.rs index 00164ab..52009cd 100644 --- a/near-plugins-derive/src/pausable.rs +++ b/near-plugins-derive/src/pausable.rs @@ -1,10 +1,11 @@ use crate::utils; use crate::utils::{cratename, is_near_bindgen_wrapped_or_marshall}; +use darling::ast::NestedMeta; use darling::util::PathList; use darling::{FromDeriveInput, FromMeta}; use proc_macro::{self, TokenStream}; use quote::quote; -use syn::{parse, parse_macro_input, AttributeArgs, DeriveInput, ItemFn}; +use syn::{DeriveInput, ItemFn, parse, parse_macro_input}; #[derive(FromDeriveInput, Default)] #[darling(default, attributes(pausable), forward_attrs(allow, doc, cfg))] @@ -32,11 +33,11 @@ pub fn derive_pausable(input: TokenStream) -> TokenStream { let pause_roles = opts.pause_roles; let unpause_roles = opts.unpause_roles; assert!( - pause_roles.len() > 0, + !pause_roles.is_empty(), "Specify at least one role for pause_roles" ); assert!( - unpause_roles.len() > 0, + !unpause_roles.is_empty(), "Specify at least one role for unpause_roles" ); @@ -148,7 +149,12 @@ pub fn pause(attrs: TokenStream, item: TokenStream) -> TokenStream { return item; } - let attr_args = parse_macro_input!(attrs as AttributeArgs); + let attr_args = match NestedMeta::parse_meta_list(attrs.into()) { + Ok(parsed_args) => parsed_args, + Err(e) => { + return TokenStream::from(e.into_compile_error()); + } + }; let args = PauseArgs::from_list(&attr_args).expect("Invalid arguments"); let fn_name = args.name.unwrap_or_else(|| input.sig.ident.to_string()); @@ -182,7 +188,12 @@ pub fn if_paused(attrs: TokenStream, item: TokenStream) -> TokenStream { return item; } - let attr_args = parse_macro_input!(attrs as AttributeArgs); + let attr_args = match NestedMeta::parse_meta_list(attrs.into()) { + Ok(parsed_args) => parsed_args, + Err(e) => { + return TokenStream::from(e.into_compile_error()); + } + }; let args = IfPausedArgs::from_list(&attr_args).expect("Invalid arguments"); let fn_name = args.name; @@ -208,7 +219,7 @@ pub fn if_paused(attrs: TokenStream, item: TokenStream) -> TokenStream { } fn get_bypass_condition(args: &ExceptSubArgs) -> proc_macro2::TokenStream { - if args.roles.len() == 0 { + if args.roles.is_empty() { return quote!(); } diff --git a/near-plugins-derive/src/upgradable.rs b/near-plugins-derive/src/upgradable.rs index e53015b..dbaef25 100644 --- a/near-plugins-derive/src/upgradable.rs +++ b/near-plugins-derive/src/upgradable.rs @@ -3,7 +3,7 @@ use darling::util::PathList; use darling::{FromDeriveInput, FromMeta}; use proc_macro::{self, TokenStream}; use quote::quote; -use syn::{parse_macro_input, DeriveInput}; +use syn::{DeriveInput, parse_macro_input}; #[derive(FromDeriveInput, Default)] #[darling(default, attributes(upgradable), forward_attrs(allow, doc, cfg))] diff --git a/near-plugins-derive/src/utils.rs b/near-plugins-derive/src/utils.rs index b9f14cc..eb283fd 100644 --- a/near-plugins-derive/src/utils.rs +++ b/near-plugins-derive/src/utils.rs @@ -1,6 +1,6 @@ -use proc_macro2::Span; use proc_macro_crate::crate_name; -use syn::{Ident, ItemFn}; +use proc_macro2::Span; +use syn::{Ident, ItemFn, Meta}; /// Determines if this block of code was [generated by near_bindgen]. /// Heuristic used is to check for #[no_mangle]. @@ -8,11 +8,14 @@ use syn::{Ident, ItemFn}; /// /// [generated by near_bindgen]: https://github.com/near/near-sdk-rs/issues/722 pub(crate) fn is_near_bindgen_wrapped_or_marshall(item: &ItemFn) -> bool { - let pattern1 = "(target_arch = \"wasm32\")"; - let pattern2 = "(not(target_arch = \"wasm32\"))"; + let pattern1 = "target_arch = \"wasm32\""; + let pattern2 = "not(target_arch = \"wasm32\")"; item.attrs.iter().any(|attr| { - let seq = attr.tokens.to_string(); - seq == pattern1 || seq == pattern2 + if let Meta::List(meta_list) = &attr.meta { + let seq = meta_list.tokens.to_string(); + return seq == pattern1 || seq == pattern2; + } + false }) } diff --git a/near-plugins-derive/tests/common/upgradable_contract.rs b/near-plugins-derive/tests/common/upgradable_contract.rs index e18ae65..b9efe20 100644 --- a/near-plugins-derive/tests/common/upgradable_contract.rs +++ b/near-plugins-derive/tests/common/upgradable_contract.rs @@ -1,7 +1,7 @@ use near_plugins::upgradable::{FunctionCallArgs, UpgradableDurationStatus}; -use near_sdk::serde_json::json; use near_sdk::Duration; +use near_sdk::serde_json::json; use near_workspaces::result::ExecutionFinalResult; use near_workspaces::{Account, Contract}; diff --git a/near-plugins-derive/tests/common/utils.rs b/near-plugins-derive/tests/common/utils.rs index bbacb85..23c0cbc 100644 --- a/near-plugins-derive/tests/common/utils.rs +++ b/near-plugins-derive/tests/common/utils.rs @@ -1,5 +1,5 @@ -use near_sdk::serde::de::DeserializeOwned; use near_sdk::Duration; +use near_sdk::serde::de::DeserializeOwned; use near_workspaces::network::Sandbox; use near_workspaces::result::{ExecutionFinalResult, ExecutionOutcome}; use near_workspaces::{AccountId, Block, Worker}; diff --git a/near-plugins-derive/tests/contracts/access_controllable/Cargo.toml b/near-plugins-derive/tests/contracts/access_controllable/Cargo.toml index ac57551..0a0018d 100644 --- a/near-plugins-derive/tests/contracts/access_controllable/Cargo.toml +++ b/near-plugins-derive/tests/contracts/access_controllable/Cargo.toml @@ -1,14 +1,14 @@ [package] name = "access_controllable" version = "0.0.0" -edition = "2021" +edition = "2024" [lib] crate-type = ["cdylib", "rlib"] [dependencies] near-plugins = { path = "../../../../near-plugins" } -near-sdk = "5.2" +near-sdk = "5.25" [profile.release] codegen-units = 1 diff --git a/near-plugins-derive/tests/contracts/access_controllable/rust-toolchain b/near-plugins-derive/tests/contracts/access_controllable/rust-toolchain index d6d7b98..fd0bf26 100644 --- a/near-plugins-derive/tests/contracts/access_controllable/rust-toolchain +++ b/near-plugins-derive/tests/contracts/access_controllable/rust-toolchain @@ -1,4 +1,4 @@ [toolchain] -channel = "1.84.0" +channel = "1.86.0" components = ["clippy", "rustfmt"] targets = [ "wasm32-unknown-unknown" ] diff --git a/near-plugins-derive/tests/contracts/ownable/Cargo.toml b/near-plugins-derive/tests/contracts/ownable/Cargo.toml index deb2cce..14d6c7e 100644 --- a/near-plugins-derive/tests/contracts/ownable/Cargo.toml +++ b/near-plugins-derive/tests/contracts/ownable/Cargo.toml @@ -1,14 +1,14 @@ [package] name = "ownable" version = "0.0.0" -edition = "2021" +edition = "2024" [lib] crate-type = ["cdylib", "rlib"] [dependencies] near-plugins = { path = "../../../../near-plugins" } -near-sdk = "5.2" +near-sdk = "5.25" [profile.release] codegen-units = 1 diff --git a/near-plugins-derive/tests/contracts/ownable/rust-toolchain b/near-plugins-derive/tests/contracts/ownable/rust-toolchain index d6d7b98..fd0bf26 100644 --- a/near-plugins-derive/tests/contracts/ownable/rust-toolchain +++ b/near-plugins-derive/tests/contracts/ownable/rust-toolchain @@ -1,4 +1,4 @@ [toolchain] -channel = "1.84.0" +channel = "1.86.0" components = ["clippy", "rustfmt"] targets = [ "wasm32-unknown-unknown" ] diff --git a/near-plugins-derive/tests/contracts/pausable/Cargo.toml b/near-plugins-derive/tests/contracts/pausable/Cargo.toml index 3b417ed..7eec2d5 100644 --- a/near-plugins-derive/tests/contracts/pausable/Cargo.toml +++ b/near-plugins-derive/tests/contracts/pausable/Cargo.toml @@ -1,14 +1,14 @@ [package] name = "pausable" version = "0.0.0" -edition = "2021" +edition = "2024" [lib] crate-type = ["cdylib", "rlib"] [dependencies] near-plugins = { path = "../../../../near-plugins" } -near-sdk = "5.2" +near-sdk = "5.25" [profile.release] codegen-units = 1 diff --git a/near-plugins-derive/tests/contracts/pausable/rust-toolchain b/near-plugins-derive/tests/contracts/pausable/rust-toolchain index d6d7b98..fd0bf26 100644 --- a/near-plugins-derive/tests/contracts/pausable/rust-toolchain +++ b/near-plugins-derive/tests/contracts/pausable/rust-toolchain @@ -1,4 +1,4 @@ [toolchain] -channel = "1.84.0" +channel = "1.86.0" components = ["clippy", "rustfmt"] targets = [ "wasm32-unknown-unknown" ] diff --git a/near-plugins-derive/tests/contracts/pausable_new/Cargo.toml b/near-plugins-derive/tests/contracts/pausable_new/Cargo.toml index 45baf15..0fd7111 100644 --- a/near-plugins-derive/tests/contracts/pausable_new/Cargo.toml +++ b/near-plugins-derive/tests/contracts/pausable_new/Cargo.toml @@ -1,14 +1,14 @@ [package] name = "pausable_new" version = "0.0.0" -edition = "2021" +edition = "2024" [lib] crate-type = ["cdylib", "rlib"] [dependencies] near-plugins = { path = "../../../../near-plugins" } -near-sdk = "5.2" +near-sdk = "5.25" [profile.release] codegen-units = 1 diff --git a/near-plugins-derive/tests/contracts/pausable_new/rust-toolchain b/near-plugins-derive/tests/contracts/pausable_new/rust-toolchain index d6d7b98..fd0bf26 100644 --- a/near-plugins-derive/tests/contracts/pausable_new/rust-toolchain +++ b/near-plugins-derive/tests/contracts/pausable_new/rust-toolchain @@ -1,4 +1,4 @@ [toolchain] -channel = "1.84.0" +channel = "1.86.0" components = ["clippy", "rustfmt"] targets = [ "wasm32-unknown-unknown" ] diff --git a/near-plugins-derive/tests/contracts/pausable_old/Cargo.toml b/near-plugins-derive/tests/contracts/pausable_old/Cargo.toml index a041eb4..e3b35ef 100644 --- a/near-plugins-derive/tests/contracts/pausable_old/Cargo.toml +++ b/near-plugins-derive/tests/contracts/pausable_old/Cargo.toml @@ -1,14 +1,14 @@ [package] name = "pausable_old" version = "0.0.0" -edition = "2021" +edition = "2024" [lib] crate-type = ["cdylib", "rlib"] [dependencies] near-plugins = { path = "../../../../near-plugins" } -near-sdk = "5.2" +near-sdk = "5.25" [profile.release] codegen-units = 1 diff --git a/near-plugins-derive/tests/contracts/upgradable/Cargo.toml b/near-plugins-derive/tests/contracts/upgradable/Cargo.toml index 39b051d..9cff55c 100644 --- a/near-plugins-derive/tests/contracts/upgradable/Cargo.toml +++ b/near-plugins-derive/tests/contracts/upgradable/Cargo.toml @@ -1,14 +1,14 @@ [package] name = "upgradable" version = "0.0.0" -edition = "2021" +edition = "2024" [lib] crate-type = ["cdylib", "rlib"] [dependencies] near-plugins = { path = "../../../../near-plugins" } -near-sdk = "5.2" +near-sdk = "5.25" [profile.release] codegen-units = 1 diff --git a/near-plugins-derive/tests/contracts/upgradable/rust-toolchain b/near-plugins-derive/tests/contracts/upgradable/rust-toolchain index d6d7b98..fd0bf26 100644 --- a/near-plugins-derive/tests/contracts/upgradable/rust-toolchain +++ b/near-plugins-derive/tests/contracts/upgradable/rust-toolchain @@ -1,4 +1,4 @@ [toolchain] -channel = "1.84.0" +channel = "1.86.0" components = ["clippy", "rustfmt"] targets = [ "wasm32-unknown-unknown" ] diff --git a/near-plugins-derive/tests/contracts/upgradable_2/Cargo.toml b/near-plugins-derive/tests/contracts/upgradable_2/Cargo.toml index d35a907..04df3fb 100644 --- a/near-plugins-derive/tests/contracts/upgradable_2/Cargo.toml +++ b/near-plugins-derive/tests/contracts/upgradable_2/Cargo.toml @@ -1,14 +1,14 @@ [package] name = "upgradable_2" version = "0.0.0" -edition = "2021" +edition = "2024" [lib] crate-type = ["cdylib", "rlib"] [dependencies] near-plugins = { path = "../../../../near-plugins" } -near-sdk = "5.2" +near-sdk = "5.25" [profile.release] codegen-units = 1 diff --git a/near-plugins-derive/tests/contracts/upgradable_2/rust-toolchain b/near-plugins-derive/tests/contracts/upgradable_2/rust-toolchain index d6d7b98..fd0bf26 100644 --- a/near-plugins-derive/tests/contracts/upgradable_2/rust-toolchain +++ b/near-plugins-derive/tests/contracts/upgradable_2/rust-toolchain @@ -1,4 +1,4 @@ [toolchain] -channel = "1.84.0" +channel = "1.86.0" components = ["clippy", "rustfmt"] targets = [ "wasm32-unknown-unknown" ] diff --git a/near-plugins-derive/tests/contracts/upgradable_state_migration/Cargo.toml b/near-plugins-derive/tests/contracts/upgradable_state_migration/Cargo.toml index 0fd04d9..1bcdedf 100644 --- a/near-plugins-derive/tests/contracts/upgradable_state_migration/Cargo.toml +++ b/near-plugins-derive/tests/contracts/upgradable_state_migration/Cargo.toml @@ -1,14 +1,14 @@ [package] name = "upgradable_state_migration" version = "0.0.0" -edition = "2021" +edition = "2024" [lib] crate-type = ["cdylib", "rlib"] [dependencies] near-plugins = { path = "../../../../near-plugins" } -near-sdk = "5.2" +near-sdk = "5.25" [profile.release] codegen-units = 1 diff --git a/near-plugins-derive/tests/contracts/upgradable_state_migration/rust-toolchain b/near-plugins-derive/tests/contracts/upgradable_state_migration/rust-toolchain index d6d7b98..fd0bf26 100644 --- a/near-plugins-derive/tests/contracts/upgradable_state_migration/rust-toolchain +++ b/near-plugins-derive/tests/contracts/upgradable_state_migration/rust-toolchain @@ -1,4 +1,4 @@ [toolchain] -channel = "1.84.0" +channel = "1.86.0" components = ["clippy", "rustfmt"] targets = [ "wasm32-unknown-unknown" ] diff --git a/near-plugins/src/access_controllable.rs b/near-plugins/src/access_controllable.rs index 74a6d84..da93968 100644 --- a/near-plugins/src/access_controllable.rs +++ b/near-plugins/src/access_controllable.rs @@ -35,7 +35,7 @@ //! Inspired by OpenZeppelin's //! [AccessControl](https://docs.openzeppelin.com/contracts/3.x/api/access#AccessControl) module. -use near_sdk::{near, AccountId}; +use near_sdk::{AccountId, near}; use std::collections::HashMap; /// # Representation of roles @@ -423,8 +423,8 @@ pub struct PermissionedAccountsPerRole { pub mod events { use crate::events::{AsEvent, EventMetadata}; - use near_sdk::serde::Serialize; use near_sdk::AccountId; + use near_sdk::serde::Serialize; const STANDARD: &str = "AccessControllable"; const VERSION: &str = "1.0.0"; diff --git a/near-plugins/src/lib.rs b/near-plugins/src/lib.rs index 0f3b808..6989104 100644 --- a/near-plugins/src/lib.rs +++ b/near-plugins/src/lib.rs @@ -8,8 +8,8 @@ pub mod upgradable; pub use access_control_role::AccessControlRole; pub use access_controllable::AccessControllable; pub use near_plugins_derive::{ - access_control, access_control_any, if_paused, only, pause, AccessControlRole, Ownable, - Pausable, Upgradable, + AccessControlRole, Ownable, Pausable, Upgradable, access_control, access_control_any, + if_paused, only, pause, }; pub use ownable::Ownable; pub use pausable::Pausable; diff --git a/near-plugins/src/upgradable.rs b/near-plugins/src/upgradable.rs index e03a807..e205aa8 100644 --- a/near-plugins/src/upgradable.rs +++ b/near-plugins/src/upgradable.rs @@ -60,7 +60,7 @@ //! [batch transaction]: https://docs.near.org/concepts/basics/transactions/overview //! [time between scheduling and execution]: https://docs.near.org/sdk/rust/promises/intro use crate::events::{AsEvent, EventMetadata}; -use near_sdk::{near, serde::Serialize, AccountId, CryptoHash, Gas, NearToken, Promise}; +use near_sdk::{AccountId, CryptoHash, Gas, NearToken, Promise, near, serde::Serialize}; /// Trait describing the functionality of the _Upgradable_ plugin. pub trait Upgradable {