Skip to content

Commit

Permalink
Mint token
Browse files Browse the repository at this point in the history
  • Loading branch information
Dr-Electron authored Feb 20, 2024
1 parent e42e22c commit 935673c
Show file tree
Hide file tree
Showing 5 changed files with 159 additions and 3 deletions.
7 changes: 7 additions & 0 deletions docs/build/isc/v1.0.0-rc.6/docs/_admonitions/_ownership.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
:::info Ownership

You might want to look into making the function ownable with, for example,
[OpenZeppelin](https://docs.openzeppelin.com/contracts/5.x/access-control#ownership-and-ownable)
so only owners of the contract can call certain functionalities of your contract.

:::
10 changes: 10 additions & 0 deletions docs/build/isc/v1.0.0-rc.6/docs/_admonitions/_payable.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
:::info Payable

Instead of making the function payable, you could let the contract pay for the storage deposit.
If so, you will need to change the `require` statement to check if the contract's balance has enough funds:

```solidity
require(address(this).balance > _storageDeposit);
```

:::
75 changes: 75 additions & 0 deletions docs/build/isc/v1.0.0-rc.6/docs/how-tos/token/create-foundry.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
---
description: How to create a L1 foundry
image: /img/logo/WASP_logo_dark.png
tags:
- foundry
- EVM
- how-to
---

import Ownership from '../../_admonitions/_ownership.md';
import Payable from '../../_admonitions/_payable.md';

# Create a Foundry
## About Foundries

The Stardust update allows you to create your own native tokens. Native tokens are minted by a [Foundry](/tips/tips/TIP-0018/#foundry-output).
The Foundry allows you to specify your native token's maximum supply **once** and change the circulating supply.
This guide will show you how to create an L1 foundry using a L2 smart contract.

## Example Code

<Ownership/>

1. Check if the amount paid to the contract is the same as the required [storage deposit](/learn/protocols/stardust/core-concepts/storage-deposit) and set the allowance.

```solidity
require(msg.value == _storageDeposit*(10**12), "Please send exact funds to pay for storage deposit");
ISCAssets memory allowance;
allowance.baseTokens = _storageDeposit;
```

<Payable/>

2. Define the `NativeTokenScheme`:

```solidity
NativeTokenScheme memory nativeTokenScheme = NativeTokenScheme({
mintedTokens: _mintedTokens,
meltedTokens: _meltedTokens,
maximumSupply: _maximumSupply
});
```

3. Create the foundry by calling the `ISC.accounts.foundryCreateNew(nativeTokenScheme, allowance)` function:

```solidity
uint32 foundrySN = ISC.accounts.foundryCreateNew(nativeTokenScheme, allowance);
```

### Full Example Code

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@iota/iscmagic/ISC.sol";
contract CreateFoundry {
event CreatedFoundry(uint32 foundrySN);
function createFoundry(uint _mintedTokens, uint _meltedTokens, uint _maximumSupply, uint64 _storageDeposit) public payable {
require(msg.value == _storageDeposit*(10**12), "Please send exact funds to pay for storage deposit");
ISCAssets memory allowance;
allowance.baseTokens = _storageDeposit;
NativeTokenScheme memory nativeTokenScheme = NativeTokenScheme({
mintedTokens: _mintedTokens,
meltedTokens: _meltedTokens,
maximumSupply: _maximumSupply
});
uint32 foundrySN = ISC.accounts.foundryCreateNew(nativeTokenScheme, allowance);
emit CreatedFoundry(foundrySN);
}
}
```
53 changes: 53 additions & 0 deletions docs/build/isc/v1.0.0-rc.6/docs/how-tos/token/mint-token.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
---
description: How to mint native token on an L1 foundry.
image: /img/logo/WASP_logo_dark.png
tags:
- foundry
- EVM
- how-to
- native tokens
- mint
---

import Ownership from '../../_admonitions/_ownership.md';
import Payable from '../../_admonitions/_payable.md';

# Mint Native Tokens

To mint tokens from a [foundry](/tips/tips/TIP-0018/#foundry-output), you first need to be aware that only the foundry owner can mint token,
so you should execute the `ISC.accounts.mintNativeTokens` function in the same contract that [created the foundry](./create-foundry.md).

## Example Code

<Ownership/>

1. Check if the amount paid to the contract is the same as the required [storage deposit](/learn/protocols/stardust/core-concepts/storage-deposit)
and set the allowance.

```solidity
require(msg.value == _storageDeposit*(10**12), "Please send exact funds to pay for storage deposit");
ISCAssets memory allowance;
allowance.baseTokens = _storageDeposit;
```

<Payable/>

2. Mint the native token specifying the foundry serial number, the amount to mint and the allowance.

```solidity
ISC.accounts.mintNativeTokens(_foundrySN, _amount, allowance);
```

## Full Example Code

```solidity
event MintedNativeTokens(uint32 foundrySN, uint amount);
function mintNativeTokens(uint32 _foundrySN, uint _amount, uint64 _storageDeposit) public payable {
require(msg.value == _storageDeposit*(10**12), "Please send exact funds to pay for storage deposit");
ISCAssets memory allowance;
allowance.baseTokens = _storageDeposit;
ISC.accounts.mintNativeTokens(_foundrySN, _amount, allowance);
emit MintedNativeTokens(_foundrySN, _amount);
}
```
17 changes: 14 additions & 3 deletions docs/build/isc/v1.0.0-rc.6/sidebars.js
Original file line number Diff line number Diff line change
Expand Up @@ -162,9 +162,20 @@ module.exports = {
id: 'how-tos/send-tokens-to-l1',
},
{
type: 'doc',
label: 'Create Foundry',
id: 'how-tos/create-foundry',
type: 'category',
label: 'Tokens',
items: [
{
type: 'doc',
label: 'Create a Foundry',
id: 'how-tos/token/create-foundry',
},
{
type: 'doc',
label: 'Mint a Native Token',
id: 'how-tos/token/mint-token',
},
],
},
],
},
Expand Down

0 comments on commit 935673c

Please sign in to comment.