Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ on:

env:
RUST_BACKTRACE: full
MSRV: 1.84.0
MSRV: 1.86.0

jobs:
tests:
Expand Down
17 changes: 9 additions & 8 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -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 <hello@aurora.dev>"]
# 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"
Expand All @@ -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"
cargo-near-build = { version = "0.11", features = ["build_internal"] }
2 changes: 1 addition & 1 deletion near-plugins-derive/src/access_control_role.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
19 changes: 15 additions & 4 deletions near-plugins-derive/src/access_controllable.rs
Original file line number Diff line number Diff line change
@@ -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};
Expand All @@ -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());
Expand Down Expand Up @@ -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) {
Expand All @@ -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! {
Expand Down
2 changes: 1 addition & 1 deletion near-plugins-derive/src/ownable.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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))]
Expand Down
23 changes: 17 additions & 6 deletions near-plugins-derive/src/pausable.rs
Original file line number Diff line number Diff line change
@@ -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))]
Expand Down Expand Up @@ -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"
);

Expand Down Expand Up @@ -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());
Expand Down Expand Up @@ -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;
Expand All @@ -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!();
}

Expand Down
2 changes: 1 addition & 1 deletion near-plugins-derive/src/upgradable.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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))]
Expand Down
15 changes: 9 additions & 6 deletions near-plugins-derive/src/utils.rs
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
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].
/// TODO: How to make this 100% safe. Discuss with near-sdk team
///
/// [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
})
}

Expand Down
2 changes: 1 addition & 1 deletion near-plugins-derive/tests/common/upgradable_contract.rs
Original file line number Diff line number Diff line change
@@ -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};

Expand Down
2 changes: 1 addition & 1 deletion near-plugins-derive/tests/common/utils.rs
Original file line number Diff line number Diff line change
@@ -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};
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[toolchain]
channel = "1.84.0"
channel = "1.86.0"
components = ["clippy", "rustfmt"]
targets = [ "wasm32-unknown-unknown" ]
4 changes: 2 additions & 2 deletions near-plugins-derive/tests/contracts/ownable/Cargo.toml
Original file line number Diff line number Diff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion near-plugins-derive/tests/contracts/ownable/rust-toolchain
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[toolchain]
channel = "1.84.0"
channel = "1.86.0"
components = ["clippy", "rustfmt"]
targets = [ "wasm32-unknown-unknown" ]
4 changes: 2 additions & 2 deletions near-plugins-derive/tests/contracts/pausable/Cargo.toml
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[toolchain]
channel = "1.84.0"
channel = "1.86.0"
components = ["clippy", "rustfmt"]
targets = [ "wasm32-unknown-unknown" ]
4 changes: 2 additions & 2 deletions near-plugins-derive/tests/contracts/pausable_new/Cargo.toml
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[toolchain]
channel = "1.84.0"
channel = "1.86.0"
components = ["clippy", "rustfmt"]
targets = [ "wasm32-unknown-unknown" ]
4 changes: 2 additions & 2 deletions near-plugins-derive/tests/contracts/pausable_old/Cargo.toml
Original file line number Diff line number Diff line change
@@ -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
Expand Down
4 changes: 2 additions & 2 deletions near-plugins-derive/tests/contracts/upgradable/Cargo.toml
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[toolchain]
channel = "1.84.0"
channel = "1.86.0"
components = ["clippy", "rustfmt"]
targets = [ "wasm32-unknown-unknown" ]
4 changes: 2 additions & 2 deletions near-plugins-derive/tests/contracts/upgradable_2/Cargo.toml
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[toolchain]
channel = "1.84.0"
channel = "1.86.0"
components = ["clippy", "rustfmt"]
targets = [ "wasm32-unknown-unknown" ]
Loading
Loading