stablecoin.test.ts.md•32.3 kB
# Snapshot report for `src/stablecoin.test.ts`
The actual snapshot is saved in `stablecoin.test.ts.snap`.
Generated by [AVA](https://avajs.dev).
## basic stablecoin
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Stellar Soroban Contracts ^0.4.1␊
#![no_std]␊
␊
use soroban_sdk::{contract, contractimpl, Env, String};␊
use stellar_macros::default_impl;␊
use stellar_tokens::fungible::{Base, FungibleToken};␊
␊
#[contract]␊
pub struct MyStablecoin;␊
␊
#[contractimpl]␊
impl MyStablecoin {␊
pub fn __constructor(e: &Env) {␊
Base::set_metadata(e, 18, String::from_str(e, "MyStablecoin"), String::from_str(e, "MST"));␊
}␊
}␊
␊
#[default_impl]␊
#[contractimpl]␊
impl FungibleToken for MyStablecoin {␊
type ContractType = Base;␊
␊
}␊
`
## stablecoin burnable
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Stellar Soroban Contracts ^0.4.1␊
#![no_std]␊
␊
use soroban_sdk::{Address, contract, contractimpl, Env, String};␊
use stellar_macros::default_impl;␊
use stellar_tokens::fungible::{Base, burnable::FungibleBurnable, FungibleToken};␊
␊
#[contract]␊
pub struct MyStablecoin;␊
␊
#[contractimpl]␊
impl MyStablecoin {␊
pub fn __constructor(e: &Env) {␊
Base::set_metadata(e, 18, String::from_str(e, "MyStablecoin"), String::from_str(e, "MST"));␊
}␊
}␊
␊
#[default_impl]␊
#[contractimpl]␊
impl FungibleToken for MyStablecoin {␊
type ContractType = Base;␊
␊
}␊
␊
//␊
// Extensions␊
//␊
␊
#[default_impl]␊
#[contractimpl]␊
impl FungibleBurnable for MyStablecoin {}␊
`
## stablecoin pausable
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Stellar Soroban Contracts ^0.4.1␊
#![no_std]␊
␊
use soroban_sdk::{Address, contract, contractimpl, Env, String};␊
use stellar_access::ownable::{self as ownable, Ownable};␊
use stellar_contract_utils::pausable::{self as pausable, Pausable};␊
use stellar_macros::{default_impl, only_owner, when_not_paused};␊
use stellar_tokens::fungible::{Base, FungibleToken};␊
␊
#[contract]␊
pub struct MyStablecoin;␊
␊
#[contractimpl]␊
impl MyStablecoin {␊
pub fn __constructor(e: &Env, owner: Address) {␊
Base::set_metadata(e, 18, String::from_str(e, "MyStablecoin"), String::from_str(e, "MST"));␊
ownable::set_owner(e, &owner);␊
}␊
}␊
␊
#[default_impl]␊
#[contractimpl]␊
impl FungibleToken for MyStablecoin {␊
type ContractType = Base;␊
␊
#[when_not_paused]␊
fn transfer(e: &Env, from: Address, to: Address, amount: i128) {␊
Self::ContractType::transfer(e, &from, &to, amount);␊
}␊
␊
#[when_not_paused]␊
fn transfer_from(e: &Env, spender: Address, from: Address, to: Address, amount: i128) {␊
Self::ContractType::transfer_from(e, &spender, &from, &to, amount);␊
}␊
}␊
␊
//␊
// Utils␊
//␊
␊
#[contractimpl]␊
impl Pausable for MyStablecoin {␊
fn paused(e: &Env) -> bool {␊
pausable::paused(e)␊
}␊
␊
#[only_owner]␊
fn pause(e: &Env, caller: Address) {␊
pausable::pause(e);␊
}␊
␊
#[only_owner]␊
fn unpause(e: &Env, caller: Address) {␊
pausable::unpause(e);␊
}␊
}␊
␊
#[default_impl]␊
#[contractimpl]␊
impl Ownable for MyStablecoin {}␊
`
## stablecoin burnable pausable
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Stellar Soroban Contracts ^0.4.1␊
#![no_std]␊
␊
use soroban_sdk::{Address, contract, contractimpl, Env, String};␊
use stellar_access::ownable::{self as ownable, Ownable};␊
use stellar_contract_utils::pausable::{self as pausable, Pausable};␊
use stellar_macros::{default_impl, only_owner, when_not_paused};␊
use stellar_tokens::fungible::{Base, burnable::FungibleBurnable, FungibleToken};␊
␊
#[contract]␊
pub struct MyStablecoin;␊
␊
#[contractimpl]␊
impl MyStablecoin {␊
pub fn __constructor(e: &Env, owner: Address) {␊
Base::set_metadata(e, 18, String::from_str(e, "MyStablecoin"), String::from_str(e, "MST"));␊
ownable::set_owner(e, &owner);␊
}␊
}␊
␊
#[default_impl]␊
#[contractimpl]␊
impl FungibleToken for MyStablecoin {␊
type ContractType = Base;␊
␊
#[when_not_paused]␊
fn transfer(e: &Env, from: Address, to: Address, amount: i128) {␊
Self::ContractType::transfer(e, &from, &to, amount);␊
}␊
␊
#[when_not_paused]␊
fn transfer_from(e: &Env, spender: Address, from: Address, to: Address, amount: i128) {␊
Self::ContractType::transfer_from(e, &spender, &from, &to, amount);␊
}␊
}␊
␊
//␊
// Extensions␊
//␊
␊
#[contractimpl]␊
impl FungibleBurnable for MyStablecoin {␊
#[when_not_paused]␊
fn burn(e: &Env, from: Address, amount: i128) {␊
Base::burn(e, &from, amount);␊
}␊
␊
#[when_not_paused]␊
fn burn_from(e: &Env, spender: Address, from: Address, amount: i128) {␊
Base::burn_from(e, &spender, &from, amount);␊
}␊
}␊
␊
//␊
// Utils␊
//␊
␊
#[contractimpl]␊
impl Pausable for MyStablecoin {␊
fn paused(e: &Env) -> bool {␊
pausable::paused(e)␊
}␊
␊
#[only_owner]␊
fn pause(e: &Env, caller: Address) {␊
pausable::pause(e);␊
}␊
␊
#[only_owner]␊
fn unpause(e: &Env, caller: Address) {␊
pausable::unpause(e);␊
}␊
}␊
␊
#[default_impl]␊
#[contractimpl]␊
impl Ownable for MyStablecoin {}␊
`
## stablecoin preminted
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Stellar Soroban Contracts ^0.4.1␊
#![no_std]␊
␊
use soroban_sdk::{Address, contract, contractimpl, Env, String};␊
use stellar_macros::default_impl;␊
use stellar_tokens::fungible::{Base, FungibleToken};␊
␊
#[contract]␊
pub struct MyStablecoin;␊
␊
#[contractimpl]␊
impl MyStablecoin {␊
pub fn __constructor(e: &Env, recipient: Address) {␊
Base::set_metadata(e, 18, String::from_str(e, "MyStablecoin"), String::from_str(e, "MST"));␊
Base::mint(e, &recipient, 1000000000000000000000);␊
}␊
}␊
␊
#[default_impl]␊
#[contractimpl]␊
impl FungibleToken for MyStablecoin {␊
type ContractType = Base;␊
␊
}␊
`
## stablecoin premint of 0
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Stellar Soroban Contracts ^0.4.1␊
#![no_std]␊
␊
use soroban_sdk::{contract, contractimpl, Env, String};␊
use stellar_macros::default_impl;␊
use stellar_tokens::fungible::{Base, FungibleToken};␊
␊
#[contract]␊
pub struct MyStablecoin;␊
␊
#[contractimpl]␊
impl MyStablecoin {␊
pub fn __constructor(e: &Env) {␊
Base::set_metadata(e, 18, String::from_str(e, "MyStablecoin"), String::from_str(e, "MST"));␊
}␊
}␊
␊
#[default_impl]␊
#[contractimpl]␊
impl FungibleToken for MyStablecoin {␊
type ContractType = Base;␊
␊
}␊
`
## stablecoin mintable
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Stellar Soroban Contracts ^0.4.1␊
#![no_std]␊
␊
use soroban_sdk::{Address, contract, contractimpl, Env, String};␊
use stellar_macros::default_impl;␊
use stellar_tokens::fungible::{Base, FungibleToken};␊
␊
#[contract]␊
pub struct MyStablecoin;␊
␊
#[contractimpl]␊
impl MyStablecoin {␊
pub fn __constructor(e: &Env) {␊
Base::set_metadata(e, 18, String::from_str(e, "MyStablecoin"), String::from_str(e, "MST"));␊
}␊
}␊
␊
#[default_impl]␊
#[contractimpl]␊
impl FungibleToken for MyStablecoin {␊
type ContractType = Base;␊
␊
}␊
`
## stablecoin ownable
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Stellar Soroban Contracts ^0.4.1␊
#![no_std]␊
␊
use soroban_sdk::{Address, contract, contractimpl, Env, String};␊
use stellar_access::ownable::{self as ownable, Ownable};␊
use stellar_macros::default_impl;␊
use stellar_tokens::fungible::{Base, FungibleToken};␊
␊
#[contract]␊
pub struct MyStablecoin;␊
␊
#[contractimpl]␊
impl MyStablecoin {␊
pub fn __constructor(e: &Env, owner: Address) {␊
Base::set_metadata(e, 18, String::from_str(e, "MyStablecoin"), String::from_str(e, "MST"));␊
ownable::set_owner(e, &owner);␊
}␊
}␊
␊
#[default_impl]␊
#[contractimpl]␊
impl FungibleToken for MyStablecoin {␊
type ContractType = Base;␊
␊
}␊
␊
//␊
// Utils␊
//␊
␊
#[default_impl]␊
#[contractimpl]␊
impl Ownable for MyStablecoin {}␊
`
## stablecoin roles
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Stellar Soroban Contracts ^0.4.1␊
#![no_std]␊
␊
use soroban_sdk::{Address, contract, contractimpl, Env, String};␊
use stellar_access::access_control::{self as access_control, AccessControl};␊
use stellar_macros::default_impl;␊
use stellar_tokens::fungible::{Base, FungibleToken};␊
␊
#[contract]␊
pub struct MyStablecoin;␊
␊
#[contractimpl]␊
impl MyStablecoin {␊
pub fn __constructor(e: &Env, admin: Address) {␊
Base::set_metadata(e, 18, String::from_str(e, "MyStablecoin"), String::from_str(e, "MST"));␊
access_control::set_admin(e, &admin);␊
}␊
}␊
␊
#[default_impl]␊
#[contractimpl]␊
impl FungibleToken for MyStablecoin {␊
type ContractType = Base;␊
␊
}␊
␊
//␊
// Utils␊
//␊
␊
#[default_impl]␊
#[contractimpl]␊
impl AccessControl for MyStablecoin {}␊
`
## stablecoin allowlist
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Stellar Soroban Contracts ^0.4.1␊
#![no_std]␊
␊
use soroban_sdk::{Address, contract, contractimpl, Env, String};␊
use stellar_access::ownable::{self as ownable, Ownable};␊
use stellar_macros::{default_impl, only_owner};␊
use stellar_tokens::fungible::{␊
allowlist::{AllowList, FungibleAllowList}, Base, FungibleToken␊
};␊
␊
#[contract]␊
pub struct MyStablecoin;␊
␊
#[contractimpl]␊
impl MyStablecoin {␊
pub fn __constructor(e: &Env, owner: Address) {␊
Base::set_metadata(e, 18, String::from_str(e, "MyStablecoin"), String::from_str(e, "MST"));␊
ownable::set_owner(e, &owner);␊
}␊
}␊
␊
#[default_impl]␊
#[contractimpl]␊
impl FungibleToken for MyStablecoin {␊
type ContractType = AllowList;␊
␊
}␊
␊
//␊
// Extensions␊
//␊
␊
#[contractimpl]␊
impl FungibleAllowList for MyStablecoin {␊
fn allowed(e: &Env, account: Address) -> bool {␊
AllowList::allowed(e, &account)␊
}␊
␊
#[only_owner]␊
fn allow_user(e: &Env, user: Address, operator: Address) {␊
AllowList::allow_user(e, &user);␊
}␊
␊
#[only_owner]␊
fn disallow_user(e: &Env, user: Address, operator: Address) {␊
AllowList::disallow_user(e, &user);␊
}␊
}␊
␊
//␊
// Utils␊
//␊
␊
#[default_impl]␊
#[contractimpl]␊
impl Ownable for MyStablecoin {}␊
`
## stablecoin blocklist
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Stellar Soroban Contracts ^0.4.1␊
#![no_std]␊
␊
use soroban_sdk::{Address, contract, contractimpl, Env, String};␊
use stellar_access::ownable::{self as ownable, Ownable};␊
use stellar_macros::{default_impl, only_owner};␊
use stellar_tokens::fungible::{␊
Base, blocklist::{BlockList, FungibleBlockList}, FungibleToken␊
};␊
␊
#[contract]␊
pub struct MyStablecoin;␊
␊
#[contractimpl]␊
impl MyStablecoin {␊
pub fn __constructor(e: &Env, owner: Address) {␊
Base::set_metadata(e, 18, String::from_str(e, "MyStablecoin"), String::from_str(e, "MST"));␊
ownable::set_owner(e, &owner);␊
}␊
}␊
␊
#[default_impl]␊
#[contractimpl]␊
impl FungibleToken for MyStablecoin {␊
type ContractType = BlockList;␊
␊
}␊
␊
//␊
// Extensions␊
//␊
␊
#[contractimpl]␊
impl FungibleBlockList for MyStablecoin {␊
fn blocked(e: &Env, account: Address) -> bool {␊
BlockList::blocked(e, &account)␊
}␊
␊
#[only_owner]␊
fn block_user(e: &Env, user: Address, operator: Address) {␊
BlockList::block_user(e, &user);␊
}␊
␊
#[only_owner]␊
fn unblock_user(e: &Env, user: Address, operator: Address) {␊
BlockList::unblock_user(e, &user);␊
}␊
}␊
␊
//␊
// Utils␊
//␊
␊
#[default_impl]␊
#[contractimpl]␊
impl Ownable for MyStablecoin {}␊
`
## stablecoin full - ownable, allowlist
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Stellar Soroban Contracts ^0.4.1␊
#![no_std]␊
␊
use soroban_sdk::{Address, contract, contractimpl, Env, String};␊
use stellar_access::ownable::{self as ownable, Ownable};␊
use stellar_contract_utils::pausable::{self as pausable, Pausable};␊
use stellar_macros::{default_impl, only_owner, when_not_paused};␊
use stellar_tokens::fungible::{␊
allowlist::{AllowList, FungibleAllowList}, Base, burnable::FungibleBurnable, FungibleToken␊
};␊
␊
#[contract]␊
pub struct MyStablecoin;␊
␊
#[contractimpl]␊
impl MyStablecoin {␊
pub fn __constructor(e: &Env, recipient: Address, owner: Address) {␊
Base::set_metadata(e, 18, String::from_str(e, "MyStablecoin"), String::from_str(e, "MST"));␊
Base::mint(e, &recipient, 2000000000000000000000);␊
ownable::set_owner(e, &owner);␊
}␊
␊
#[only_owner]␊
#[when_not_paused]␊
pub fn mint(e: &Env, account: Address, amount: i128) {␊
Base::mint(e, &account, amount);␊
}␊
}␊
␊
#[default_impl]␊
#[contractimpl]␊
impl FungibleToken for MyStablecoin {␊
type ContractType = AllowList;␊
␊
#[when_not_paused]␊
fn transfer(e: &Env, from: Address, to: Address, amount: i128) {␊
Self::ContractType::transfer(e, &from, &to, amount);␊
}␊
␊
#[when_not_paused]␊
fn transfer_from(e: &Env, spender: Address, from: Address, to: Address, amount: i128) {␊
Self::ContractType::transfer_from(e, &spender, &from, &to, amount);␊
}␊
}␊
␊
//␊
// Extensions␊
//␊
␊
#[contractimpl]␊
impl FungibleAllowList for MyStablecoin {␊
fn allowed(e: &Env, account: Address) -> bool {␊
AllowList::allowed(e, &account)␊
}␊
␊
#[only_owner]␊
fn allow_user(e: &Env, user: Address, operator: Address) {␊
AllowList::allow_user(e, &user);␊
}␊
␊
#[only_owner]␊
fn disallow_user(e: &Env, user: Address, operator: Address) {␊
AllowList::disallow_user(e, &user);␊
}␊
}␊
␊
#[contractimpl]␊
impl FungibleBurnable for MyStablecoin {␊
#[when_not_paused]␊
fn burn(e: &Env, from: Address, amount: i128) {␊
Base::burn(e, &from, amount);␊
}␊
␊
#[when_not_paused]␊
fn burn_from(e: &Env, spender: Address, from: Address, amount: i128) {␊
Base::burn_from(e, &spender, &from, amount);␊
}␊
}␊
␊
//␊
// Utils␊
//␊
␊
#[contractimpl]␊
impl Pausable for MyStablecoin {␊
fn paused(e: &Env) -> bool {␊
pausable::paused(e)␊
}␊
␊
#[only_owner]␊
fn pause(e: &Env, _caller: Address) {␊
pausable::pause(e);␊
}␊
␊
#[only_owner]␊
fn unpause(e: &Env, _caller: Address) {␊
pausable::unpause(e);␊
}␊
}␊
␊
#[default_impl]␊
#[contractimpl]␊
impl Ownable for MyStablecoin {}␊
`
## stablecoin full - ownable, blocklist
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Stellar Soroban Contracts ^0.4.1␊
#![no_std]␊
␊
use soroban_sdk::{Address, contract, contractimpl, Env, String};␊
use stellar_access::ownable::{self as ownable, Ownable};␊
use stellar_contract_utils::pausable::{self as pausable, Pausable};␊
use stellar_macros::{default_impl, only_owner, when_not_paused};␊
use stellar_tokens::fungible::{␊
Base, blocklist::{BlockList, FungibleBlockList}, burnable::FungibleBurnable, FungibleToken␊
};␊
␊
#[contract]␊
pub struct MyStablecoin;␊
␊
#[contractimpl]␊
impl MyStablecoin {␊
pub fn __constructor(e: &Env, recipient: Address, owner: Address) {␊
Base::set_metadata(e, 18, String::from_str(e, "MyStablecoin"), String::from_str(e, "MST"));␊
Base::mint(e, &recipient, 2000000000000000000000);␊
ownable::set_owner(e, &owner);␊
}␊
␊
#[only_owner]␊
#[when_not_paused]␊
pub fn mint(e: &Env, account: Address, amount: i128) {␊
Base::mint(e, &account, amount);␊
}␊
}␊
␊
#[default_impl]␊
#[contractimpl]␊
impl FungibleToken for MyStablecoin {␊
type ContractType = BlockList;␊
␊
#[when_not_paused]␊
fn transfer(e: &Env, from: Address, to: Address, amount: i128) {␊
Self::ContractType::transfer(e, &from, &to, amount);␊
}␊
␊
#[when_not_paused]␊
fn transfer_from(e: &Env, spender: Address, from: Address, to: Address, amount: i128) {␊
Self::ContractType::transfer_from(e, &spender, &from, &to, amount);␊
}␊
}␊
␊
//␊
// Extensions␊
//␊
␊
#[contractimpl]␊
impl FungibleBlockList for MyStablecoin {␊
fn blocked(e: &Env, account: Address) -> bool {␊
BlockList::blocked(e, &account)␊
}␊
␊
#[only_owner]␊
fn block_user(e: &Env, user: Address, operator: Address) {␊
BlockList::block_user(e, &user);␊
}␊
␊
#[only_owner]␊
fn unblock_user(e: &Env, user: Address, operator: Address) {␊
BlockList::unblock_user(e, &user);␊
}␊
}␊
␊
#[contractimpl]␊
impl FungibleBurnable for MyStablecoin {␊
#[when_not_paused]␊
fn burn(e: &Env, from: Address, amount: i128) {␊
Base::burn(e, &from, amount);␊
}␊
␊
#[when_not_paused]␊
fn burn_from(e: &Env, spender: Address, from: Address, amount: i128) {␊
Base::burn_from(e, &spender, &from, amount);␊
}␊
}␊
␊
//␊
// Utils␊
//␊
␊
#[contractimpl]␊
impl Pausable for MyStablecoin {␊
fn paused(e: &Env) -> bool {␊
pausable::paused(e)␊
}␊
␊
#[only_owner]␊
fn pause(e: &Env, _caller: Address) {␊
pausable::pause(e);␊
}␊
␊
#[only_owner]␊
fn unpause(e: &Env, _caller: Address) {␊
pausable::unpause(e);␊
}␊
}␊
␊
#[default_impl]␊
#[contractimpl]␊
impl Ownable for MyStablecoin {}␊
`
## stablecoin full - roles, allowlist
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Stellar Soroban Contracts ^0.4.1␊
#![no_std]␊
␊
use soroban_sdk::{Address, contract, contractimpl, Env, String, Symbol};␊
use stellar_access::access_control::{self as access_control, AccessControl};␊
use stellar_contract_utils::pausable::{self as pausable, Pausable};␊
use stellar_macros::{default_impl, only_role, when_not_paused};␊
use stellar_tokens::fungible::{␊
allowlist::{AllowList, FungibleAllowList}, Base, burnable::FungibleBurnable, FungibleToken␊
};␊
␊
#[contract]␊
pub struct MyStablecoin;␊
␊
#[contractimpl]␊
impl MyStablecoin {␊
pub fn __constructor(␊
e: &Env,␊
recipient: Address,␊
admin: Address,␊
pauser: Address,␊
minter: Address,␊
manager: Address,␊
) {␊
Base::set_metadata(e, 18, String::from_str(e, "MyStablecoin"), String::from_str(e, "MST"));␊
Base::mint(e, &recipient, 2000000000000000000000);␊
access_control::set_admin(e, &admin);␊
access_control::grant_role_no_auth(e, &admin, &pauser, &Symbol::new(e, "pauser"));␊
access_control::grant_role_no_auth(e, &admin, &minter, &Symbol::new(e, "minter"));␊
access_control::grant_role_no_auth(e, &admin, &manager, &Symbol::new(e, "manager"));␊
}␊
␊
#[only_role(caller, "minter")]␊
#[when_not_paused]␊
pub fn mint(e: &Env, account: Address, amount: i128, caller: Address) {␊
Base::mint(e, &account, amount);␊
}␊
}␊
␊
#[default_impl]␊
#[contractimpl]␊
impl FungibleToken for MyStablecoin {␊
type ContractType = AllowList;␊
␊
#[when_not_paused]␊
fn transfer(e: &Env, from: Address, to: Address, amount: i128) {␊
Self::ContractType::transfer(e, &from, &to, amount);␊
}␊
␊
#[when_not_paused]␊
fn transfer_from(e: &Env, spender: Address, from: Address, to: Address, amount: i128) {␊
Self::ContractType::transfer_from(e, &spender, &from, &to, amount);␊
}␊
}␊
␊
//␊
// Extensions␊
//␊
␊
#[contractimpl]␊
impl FungibleAllowList for MyStablecoin {␊
fn allowed(e: &Env, account: Address) -> bool {␊
AllowList::allowed(e, &account)␊
}␊
␊
#[only_role(operator, "manager")]␊
fn allow_user(e: &Env, user: Address, operator: Address) {␊
AllowList::allow_user(e, &user);␊
}␊
␊
#[only_role(operator, "manager")]␊
fn disallow_user(e: &Env, user: Address, operator: Address) {␊
AllowList::disallow_user(e, &user);␊
}␊
}␊
␊
#[contractimpl]␊
impl FungibleBurnable for MyStablecoin {␊
#[when_not_paused]␊
fn burn(e: &Env, from: Address, amount: i128) {␊
Base::burn(e, &from, amount);␊
}␊
␊
#[when_not_paused]␊
fn burn_from(e: &Env, spender: Address, from: Address, amount: i128) {␊
Base::burn_from(e, &spender, &from, amount);␊
}␊
}␊
␊
//␊
// Utils␊
//␊
␊
#[contractimpl]␊
impl Pausable for MyStablecoin {␊
fn paused(e: &Env) -> bool {␊
pausable::paused(e)␊
}␊
␊
#[only_role(caller, "pauser")]␊
fn pause(e: &Env, caller: Address) {␊
pausable::pause(e);␊
}␊
␊
#[only_role(caller, "pauser")]␊
fn unpause(e: &Env, caller: Address) {␊
pausable::unpause(e);␊
}␊
}␊
␊
#[default_impl]␊
#[contractimpl]␊
impl AccessControl for MyStablecoin {}␊
`
## stablecoin full - roles, blocklist
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Stellar Soroban Contracts ^0.4.1␊
#![no_std]␊
␊
use soroban_sdk::{Address, contract, contractimpl, Env, String, Symbol};␊
use stellar_access::access_control::{self as access_control, AccessControl};␊
use stellar_contract_utils::pausable::{self as pausable, Pausable};␊
use stellar_macros::{default_impl, only_role, when_not_paused};␊
use stellar_tokens::fungible::{␊
Base, blocklist::{BlockList, FungibleBlockList}, burnable::FungibleBurnable, FungibleToken␊
};␊
␊
#[contract]␊
pub struct MyStablecoin;␊
␊
#[contractimpl]␊
impl MyStablecoin {␊
pub fn __constructor(␊
e: &Env,␊
recipient: Address,␊
admin: Address,␊
pauser: Address,␊
minter: Address,␊
manager: Address,␊
) {␊
Base::set_metadata(e, 18, String::from_str(e, "MyStablecoin"), String::from_str(e, "MST"));␊
Base::mint(e, &recipient, 2000000000000000000000);␊
access_control::set_admin(e, &admin);␊
access_control::grant_role_no_auth(e, &admin, &pauser, &Symbol::new(e, "pauser"));␊
access_control::grant_role_no_auth(e, &admin, &minter, &Symbol::new(e, "minter"));␊
access_control::grant_role_no_auth(e, &admin, &manager, &Symbol::new(e, "manager"));␊
}␊
␊
#[only_role(caller, "minter")]␊
#[when_not_paused]␊
pub fn mint(e: &Env, account: Address, amount: i128, caller: Address) {␊
Base::mint(e, &account, amount);␊
}␊
}␊
␊
#[default_impl]␊
#[contractimpl]␊
impl FungibleToken for MyStablecoin {␊
type ContractType = BlockList;␊
␊
#[when_not_paused]␊
fn transfer(e: &Env, from: Address, to: Address, amount: i128) {␊
Self::ContractType::transfer(e, &from, &to, amount);␊
}␊
␊
#[when_not_paused]␊
fn transfer_from(e: &Env, spender: Address, from: Address, to: Address, amount: i128) {␊
Self::ContractType::transfer_from(e, &spender, &from, &to, amount);␊
}␊
}␊
␊
//␊
// Extensions␊
//␊
␊
#[contractimpl]␊
impl FungibleBlockList for MyStablecoin {␊
fn blocked(e: &Env, account: Address) -> bool {␊
BlockList::blocked(e, &account)␊
}␊
␊
#[only_role(operator, "manager")]␊
fn block_user(e: &Env, user: Address, operator: Address) {␊
BlockList::block_user(e, &user);␊
}␊
␊
#[only_role(operator, "manager")]␊
fn unblock_user(e: &Env, user: Address, operator: Address) {␊
BlockList::unblock_user(e, &user);␊
}␊
}␊
␊
#[contractimpl]␊
impl FungibleBurnable for MyStablecoin {␊
#[when_not_paused]␊
fn burn(e: &Env, from: Address, amount: i128) {␊
Base::burn(e, &from, amount);␊
}␊
␊
#[when_not_paused]␊
fn burn_from(e: &Env, spender: Address, from: Address, amount: i128) {␊
Base::burn_from(e, &spender, &from, amount);␊
}␊
}␊
␊
//␊
// Utils␊
//␊
␊
#[contractimpl]␊
impl Pausable for MyStablecoin {␊
fn paused(e: &Env) -> bool {␊
pausable::paused(e)␊
}␊
␊
#[only_role(caller, "pauser")]␊
fn pause(e: &Env, caller: Address) {␊
pausable::pause(e);␊
}␊
␊
#[only_role(caller, "pauser")]␊
fn unpause(e: &Env, caller: Address) {␊
pausable::unpause(e);␊
}␊
}␊
␊
#[default_impl]␊
#[contractimpl]␊
impl AccessControl for MyStablecoin {}␊
`
## stablecoin full - complex name
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Stellar Soroban Contracts ^0.4.1␊
#![no_std]␊
␊
use soroban_sdk::{Address, contract, contractimpl, Env, String};␊
use stellar_access::ownable::{self as ownable, Ownable};␊
use stellar_contract_utils::pausable::{self as pausable, Pausable};␊
use stellar_macros::{default_impl, only_owner, when_not_paused};␊
use stellar_tokens::fungible::{Base, burnable::FungibleBurnable, FungibleToken};␊
␊
#[contract]␊
pub struct CustomToken;␊
␊
#[contractimpl]␊
impl CustomToken {␊
pub fn __constructor(e: &Env, recipient: Address, owner: Address) {␊
Base::set_metadata(e, 18, String::from_str(e, "Custom $ Token"), String::from_str(e, "MST"));␊
Base::mint(e, &recipient, 2000000000000000000000);␊
ownable::set_owner(e, &owner);␊
}␊
␊
#[only_owner]␊
#[when_not_paused]␊
pub fn mint(e: &Env, account: Address, amount: i128) {␊
Base::mint(e, &account, amount);␊
}␊
}␊
␊
#[default_impl]␊
#[contractimpl]␊
impl FungibleToken for CustomToken {␊
type ContractType = Base;␊
␊
#[when_not_paused]␊
fn transfer(e: &Env, from: Address, to: Address, amount: i128) {␊
Self::ContractType::transfer(e, &from, &to, amount);␊
}␊
␊
#[when_not_paused]␊
fn transfer_from(e: &Env, spender: Address, from: Address, to: Address, amount: i128) {␊
Self::ContractType::transfer_from(e, &spender, &from, &to, amount);␊
}␊
}␊
␊
//␊
// Extensions␊
//␊
␊
#[contractimpl]␊
impl FungibleBurnable for CustomToken {␊
#[when_not_paused]␊
fn burn(e: &Env, from: Address, amount: i128) {␊
Base::burn(e, &from, amount);␊
}␊
␊
#[when_not_paused]␊
fn burn_from(e: &Env, spender: Address, from: Address, amount: i128) {␊
Base::burn_from(e, &spender, &from, amount);␊
}␊
}␊
␊
//␊
// Utils␊
//␊
␊
#[contractimpl]␊
impl Pausable for CustomToken {␊
fn paused(e: &Env) -> bool {␊
pausable::paused(e)␊
}␊
␊
#[only_owner]␊
fn pause(e: &Env, _caller: Address) {␊
pausable::pause(e);␊
}␊
␊
#[only_owner]␊
fn unpause(e: &Env, _caller: Address) {␊
pausable::unpause(e);␊
}␊
}␊
␊
#[default_impl]␊
#[contractimpl]␊
impl Ownable for CustomToken {}␊
`