This is my last local snapshot of the original OpenBrush repo before its maintainers decided to ragequit. Some links below might be dead.
OpenBrush is a library for smart contract development on ink!.
Why use this library?
- To make contracts interoperable to do safe cross-contracts calls (by having the same functions signature among every contracts)
- To ensure the usage of Polkadot Standards Proposals
- To ensure the usage of the latest & most secure implementation
- Useful contracts that provide custom logic to be implemented in contracts
- To save time by not writing boilerplate code
- Useful features which can simplify development
- All contracts are upgradeable by default
Which Standard tokens & useful contracts does it provide?
- PSP22 - Fungible Token (ERC20 equivalent) with extensions
- PSP34 - Non-Fungible Token (ERC721 equivalent) with extensions
- PSP37 - ERC1155 equivalent with extensions
- Ownable Restrict access to action for non-owners
- Access Control Define set of roles and restrict access to action by roles
- Reentrancy guard Prevent reentrant calls to a function
- Pausable Pause/Unpause the contract to disable/enable some operations
- Timelock Controller Execute transactions with some delay
- Payment Splitter Split amount of native tokens between participants
You can provide a default implementation in the traits method and have internal functions.
You can use the ink! trait as a native rust trait with several restrictions regarding
external functions(functions marked #[ink(message)]
).
#[openbrush::trait_definition]
pub trait Governance: AccessControl {
#[ink(message)]
fn execute(&mut self, transaction: Transaction) -> Result<(), GovernanceError> {
self.internal_execute(transaction)
}
fn internal_execute(&mut self, transaction: Transaction) -> Result<(), GovernanceError> {
...
}
}
Solidity smart contracts provides modifiers to restrain function call to certain pre-defined parameters. OpenBrush provides attribute macros to use standardised modifiers. You can use our useful contracts to use as modifiers, or define your own modifiers.
// Before execution of `mint` method, `only_owner` should verify that caller is the owner.
#[ink(message)]
#[modifiers(only_owner)]
fn mint(&mut self, ids_amounts: Vec<(Id, Balance)>) -> Result<(), PSP37Error> {
self._mint_to(Self::env().caller(), ids_amounts)
}
You are enough to have a trait definition (you don't need directly a contract that implements that trait) to call methods of that trait from some contract in the network (do a cross contract call).
// Somewhere defined trait
#[openbrush::trait_definition]
pub trait Trait1 {
#[ink(message)]
fn foo(&mut self) -> bool;
}
// You can create wrapper in the place where you defined the trait
// Or if you import **everything** from the file where you define trait
#[openbrush::wrapper]
type Trait1Ref = dyn Trait1;
{
// It should be `AccountId` of contract in the network that implements `Trait1` trait
let callee: openbrush::traits::AccountId = [1; 32].into();
// This code will execute a cross contract call to `callee` contract
let result_of_foo: bool = Trait1Ref::foo(&callee);
}
Note: The trait should be defined with
openbrush::trait_definition
. The callee contract should implement that trait.
- You can use
test_utils
to simplify unit testing of you code. - You can use
traits
that provides some additional functionality for your code. - Read our documentation in doc.
- Go through our examples in examples to check hot to use the library and ink!.
- Check the example of project struct and according documentation.
Not sure where to start? Use the interactive generator to bootstrap your contract and learn about the components offered in OpenBrush.
Events are not supported currently due to how ink! currently handles them.
The identifiers of events must be based on the name of the trait. At the moment, ink! doesn't support it,
but it must be fixed with this issue.
Current OpenBrush Roadmap includes: XD
To work with project you need to install ink! toolchain and NodeJS's dependencies.
- So, you need an actual installer rustup.
- ink! toolchain
- NodeJS deps you can install via
yarn
command
$ yarn build
If you want to build in release mode, you can use this command
$ yarn build:release
You can run unit tests by RUSTFLAGS="-D warnings" cargo test --workspace --features test-all -- --test-threads=10
command from the root of the directory.
To run integration test you need to start the node with contract-pallet.
After you can run tests by npm run test
command. It will build all contracts required for integration tests and run them.
Contracts in this repository have not yet been audited and contain several vulnerabilities due to the specific of the ink!. Since ink! is audited now, OpenBrush is going to be audited after major breaking changes regarding switching to stable toolchain and adapting to latest ink! will be released.
OpenBrush is released under the MIT License.