Primitive token mint
Get started with the simple things as a basis to learn more.
info
This is a beginner recipe intended for novice Substrate developers looking to explore ways to create tokens in Substrate. This approach is not recommended best practice. Use this guide to learn how to improve upon your runtime logic's capabilities and code quality. See the Examples section for a practical implementations of this guide.
#
GoalCreate a simple token mint pallet.
#
Use cases- Give any account the ability to create a token supply.
- Create a currency that's native to your application.
#
OverviewThis guide will step you through an effective way to mint a token by leveraging the primitive capabilities that
StorageMap gives us. To achieve this, this "primitive" approach uses the blake2_128_concat hasher
to map balances to account IDs, similar to how the Balances pallet makes use of it to keep track of account balances in storage.
#
StepsConfig
trait#
1. Setup your pallet's Using the Node Template as a starting point, specify the types your pallet depends on as well as the Events
it will emit:
StorageMap
#
2. Declare your storage item This pallet only keeps track of a balance-to-account mapping. Call it BalanceToAccount
:
#
3. Create your pallet’s functionsWe can now bring our attention to creating the intended capabilities of our pallet by creating the following functions:
(i) mint()
: to issue a token supply from any origin.
(ii) transfer()
: to allow the minting account to transfer a given balance to another account.
#
Define transfer variablesStart with writing out the variables, using get_balance
to access the StorageMap
of balances previously
declared in storage:
#
Verify and add error handlingWhen performing balance updates, use checked_sub
and checked_add
to handle potential errors with overflow:
#
Write to storageOnce the new balances are calculated, write their values to storage and deposit the event to the current block:
If checked_sub()
returns None
, the operation caused an overflow and throws an error.
#
4. Include your pallet in your runtimeRefer to this guide if you’re not yet familiar with this procedure.
Further learning 💡
- Safety. The
mint
function takes in an amount to mint which is not good practice because it implies that users have unlimited access to writing to storage. Safer approaches include: using configuringGenesisConfig
or fixing a predetermined maximum value in runtime.- Weights. All the weights were set to 10_000 in the above code snippets. Learn more about weight configuration in this basic guide on weights.
- Origins. One assumption this guide makes is that the origin will always be the sudo user. Origins are a powerful capability in Substrate. Learn more on how to customize an origin in this guide.