Macros for Stellar contracts.
The #[contractimpl(contracttrait)] macro generates missing default implementations for traits provided by this library.
use soroban_sdk::{contract, contractimpl, Address, Env};
use stellar_tokens::fungible::{Base, FungibleToken};
#[contract]
pub struct MyContract;
#[contractimpl(contracttrait)]
impl FungibleToken for MyContract {
type ContractType = Base;
// Only provide overrides here, default implementations are auto-generated
}FungibleTokenFungibleBurnableNonFungibleTokenNonFungibleBurnableNonFungibleEnumerableAccessControlOwnable
Macros for role-based and ownership-based access control.
use soroban_sdk::{contract, contractimpl, Address, Env};
use stellar_macros::{only_admin, only_role, has_role, only_owner};
#[contract]
pub struct MyContract;
#[contractimpl]
impl MyContract {
#[only_admin]
pub fn admin_function(e: &Env) {
// Only admin can call this
}
#[only_role(caller, "minter")]
pub fn mint(e: &Env, amount: i128, caller: Address) {
// Only accounts with "minter" role can call this
// Includes both role check AND authorization
}
#[has_role(caller, "minter")]
pub fn mint_with_auth(e: &Env, amount: i128, caller: Address) {
caller.require_auth(); // Manual authorization required
// Only role check, no automatic authorization
}
#[only_owner]
pub fn owner_function(e: &Env) {
// Only contract owner can call this
}
}#[only_admin]: Restricts access to admin only#[only_role(account, "role")]: Role check with authorization#[has_role(account, "role")]: Role check without authorization#[has_any_role(account, ["role1", "role2"])]: Multiple role check without authorization#[only_any_role(account, ["role1", "role2"])]: Multiple role check with authorization#[only_owner]: Restricts access to owner only
Important: Some macros perform role checking without authorization, while others include both:
- Role Check Only (
#[has_role],#[has_any_role]): Verify role membership but don't callrequire_auth() - Role Check + Auth (
#[only_role],#[only_any_role]): Verify role membership AND callrequire_auth()
Use role-only macros when your function already contains require_auth() calls to avoid duplicate authorization panics.
Macros for implementing pausable functionality in contracts.
use soroban_sdk::{contract, contractimpl, Env};
use stellar_macros::{when_not_paused, when_paused};
#[contract]
pub struct MyContract;
#[contractimpl]
impl MyContract {
#[when_not_paused]
pub fn normal_operation(e: &Env) {
// This function only works when contract is not paused
}
#[when_paused]
pub fn emergency_function(e: &Env) {
// This function only works when contract is paused
}
}#[when_not_paused]: Function executes only when contract is not paused#[when_paused]: Function executes only when contract is paused
Add this to your Cargo.toml:
[dependencies]
# We recommend pinning to a specific version, because rapid iterations are expected as the library is in an active development phase.
stellar-macros = "=0.6.0"See the following examples in the repository:
examples/fungible-pausable/- Pausable macros usageexamples/nft-access-control/- Access control macros
This package is part of the Stellar Contracts library and follows the same licensing terms.