From 87f7e6d1c620633dca2286f2136dc4c4c855164d Mon Sep 17 00:00:00 2001 From: riley-stride <104941670+riley-stride@users.noreply.github.com> Date: Wed, 7 Dec 2022 12:48:32 -0500 Subject: [PATCH] autodeploy the repo's markdown files onto docs.stride.zone using GH actions (#428) --- .github/workflows/rdme-docs.yml | 24 +++++++++ readme-docs/gather-docs.sh | 8 +++ readme-docs/md/01_concepts.md | 21 ++++++++ readme-docs/md/02_state.md | 51 +++++++++++++++++++ readme-docs/md/03_end_epoch.md | 38 ++++++++++++++ readme-docs/md/03_events.md | 20 ++++++++ readme-docs/md/04_keeper.md | 30 +++++++++++ readme-docs/md/04_params.md | 37 ++++++++++++++ readme-docs/md/05_events.md | 22 +++++++++ readme-docs/md/05_react_hooks.md | 18 +++++++ readme-docs/md/06_queries.md | 48 ++++++++++++++++++ readme-docs/md/07_params.md | 39 +++++++++++++++ readme-docs/md/README.md | 85 ++++++++++++++++++++++++++++++++ x/README.md | 5 ++ x/claim/spec/01_concepts.md | 7 +++ x/claim/spec/02_state.md | 6 +++ x/claim/spec/03_events.md | 5 ++ x/claim/spec/04_keeper.md | 6 +++ x/claim/spec/05_react_hooks.md | 6 +++ x/claim/spec/06_queries.md | 6 +++ x/claim/spec/07_params.md | 8 ++- x/claim/spec/README.md | 6 +++ x/epochs/README.md | 5 ++ x/interchainquery/README.md | 6 +++ x/mint/spec/01_concepts.md | 6 +++ x/mint/spec/02_state.md | 7 +++ x/mint/spec/03_end_epoch.md | 6 +++ x/mint/spec/04_params.md | 6 +++ x/mint/spec/05_events.md | 7 +++ x/mint/spec/README.md | 6 +++ 30 files changed, 544 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/rdme-docs.yml create mode 100644 readme-docs/gather-docs.sh create mode 100644 readme-docs/md/01_concepts.md create mode 100644 readme-docs/md/02_state.md create mode 100644 readme-docs/md/03_end_epoch.md create mode 100644 readme-docs/md/03_events.md create mode 100644 readme-docs/md/04_keeper.md create mode 100644 readme-docs/md/04_params.md create mode 100644 readme-docs/md/05_events.md create mode 100644 readme-docs/md/05_react_hooks.md create mode 100644 readme-docs/md/06_queries.md create mode 100644 readme-docs/md/07_params.md create mode 100644 readme-docs/md/README.md diff --git a/.github/workflows/rdme-docs.yml b/.github/workflows/rdme-docs.yml new file mode 100644 index 0000000000..8bf64d7bec --- /dev/null +++ b/.github/workflows/rdme-docs.yml @@ -0,0 +1,24 @@ +# This GitHub Actions workflow was auto-generated by the `rdme` cli on 2022-11-30T20:42:35.570Z +# You can view our full documentation here: https://docs.readme.com/docs/rdme +name: ReadMe GitHub Action 🦉 + +on: + push: + branches: + # This workflow will run every time you push code to the following branch + # Check out GitHub's docs for more info on configuring this: + # https://docs.github.com/actions/using-workflows/events-that-trigger-workflows + - main + +jobs: + rdme-docs: + runs-on: ubuntu-latest + steps: + - name: Check out repo 📚 + uses: actions/checkout@v3 + - name: Copy repo's markdown docs to single flat folder + run: bash readme-docs/gather-docs.sh + - name: Run `docs` command 🚀 + uses: readmeio/rdme@v8 + with: + rdme: docs ./readme-docs/md --key=${{ secrets.README_API_KEY }} --version=1.0 diff --git a/readme-docs/gather-docs.sh b/readme-docs/gather-docs.sh new file mode 100644 index 0000000000..e15469cfd7 --- /dev/null +++ b/readme-docs/gather-docs.sh @@ -0,0 +1,8 @@ +for f in $(find "./x" -type f -name "*.md" \ # -not -path "deps/*" + -not -path "scripts/*" \ + -not -path "readme-docs/*" + ) +do + echo $f + cp $f readme-docs/md +done \ No newline at end of file diff --git a/readme-docs/md/01_concepts.md b/readme-docs/md/01_concepts.md new file mode 100644 index 0000000000..dcc05c86ae --- /dev/null +++ b/readme-docs/md/01_concepts.md @@ -0,0 +1,21 @@ +--- +title: "Claim Module: Overview" +excerpt: "" +category: 62c5c5ff03a5bf069004def2 +--- + + + + +# Concepts + +In Stride, users are required to claim their airdrop by participating in core network activities. An Airdrop recipient is given 20% of the airdrop amount which is not in vesting, and then they have to perform the following activities to get the rest: + +* 20% vesting over 3 months by staking +* 60% vesting over 3 months by liquid staking + +At initial, module stores all airdrop users with amounts from genesis inside KVStore. + +Airdrop users are eligible to claim their vesting or free amount only once in the initial period of 3 months and after the initial period, users can claim tokens monthly not in vesting format. diff --git a/readme-docs/md/02_state.md b/readme-docs/md/02_state.md new file mode 100644 index 0000000000..df0e6a3364 --- /dev/null +++ b/readme-docs/md/02_state.md @@ -0,0 +1,51 @@ +--- +title: "Claim Module: State" +excerpt: "" +category: 62c5c5ff03a5bf069004def2 +--- + + + +# State + +### Claim Records + +```protobuf +// A Claim Records is the metadata of claim data per address +message ClaimRecord { + // address of claim user + string address = 1 [ (gogoproto.moretags) = "yaml:\"address\"" ]; + + // weight that represent the portion from total allocations + double weight = 2; + + // true if action is completed + // index of bool in array refers to action enum # + repeated bool action_completed = 3 [ + (gogoproto.moretags) = "yaml:\"action_completed\"" + ]; +} +``` +When a user get airdrop for his/her action, claim record is created to prevent duplicated actions on future actions. + +### State + +```protobuf +message GenesisState { + // params defines all the parameters of the module. + Params params = 2 [ + (gogoproto.moretags) = "yaml:\"params\"", + (gogoproto.nullable) = false + ]; + + // list of claim records, one for every airdrop recipient + repeated ClaimRecord claim_records = 3 [ + (gogoproto.moretags) = "yaml:\"claim_records\"", + (gogoproto.nullable) = false + ]; +} +``` + +Claim module's state consists of `params`, and `claim_records`. diff --git a/readme-docs/md/03_end_epoch.md b/readme-docs/md/03_end_epoch.md new file mode 100644 index 0000000000..5a9cf541d7 --- /dev/null +++ b/readme-docs/md/03_end_epoch.md @@ -0,0 +1,38 @@ +--- +title: "Mint Module: End Epoch" +excerpt: "" +category: 62c5c5ff03a5bf069004def2 +--- + + + +# Begin-Epoch + +Minting parameters are recalculated and inflation +paid at the beginning of each epoch. An epoch is signalled by x/epochs + +## NextEpochProvisions + +The target epoch provision is recalculated on each reduction period (default 3 years). +At the time of reduction, the current provision is multiplied by reduction factor (default `2/3`), +to calculate the provisions for the next epoch. Consequently, the rewards of the next period +will be lowered by `1 - reduction factor`. + +```go +func (m Minter) NextEpochProvisions(params Params) sdk.Dec { + return m.EpochProvisions.Mul(params.ReductionFactor) +} +``` + +## EpochProvision + +Calculate the provisions generated for each epoch based on current epoch provisions. The provisions are then minted by the `mint` module's `ModuleMinterAccount`. These rewards are transferred to a `FeeCollector`, which handles distributing the rewards per the chains needs. (See TODO.md for details) This fee collector is specified as the `auth` module's `FeeCollector` `ModuleAccount`. + +```go +func (m Minter) EpochProvision(params Params) sdk.Coin { + provisionAmt := m.EpochProvisions.QuoInt(sdk.NewInt(int64(params.EpochsPerYear))) + return sdk.NewCoin(params.MintDenom, provisionAmt.TruncateInt()) +} +``` diff --git a/readme-docs/md/03_events.md b/readme-docs/md/03_events.md new file mode 100644 index 0000000000..6f4c86f2ae --- /dev/null +++ b/readme-docs/md/03_events.md @@ -0,0 +1,20 @@ +--- +title: "Claim Module: Events" +excerpt: "" +category: 62c5c5ff03a5bf069004def2 +--- + + +# Events + +## External module hooks + +`claim` module emits the following events at the time of hooks: + +| Type | Attribute Key | Attribute Value | +| ----- | ------------- | --------------- | +| claim | sender | {receiver} | +| claim | amount | {claim_amount} | + diff --git a/readme-docs/md/04_keeper.md b/readme-docs/md/04_keeper.md new file mode 100644 index 0000000000..e27cb057a5 --- /dev/null +++ b/readme-docs/md/04_keeper.md @@ -0,0 +1,30 @@ +--- +title: "Claim Module: Keeper" +excerpt: "" +category: 62c5c5ff03a5bf069004def2 +--- + + + +# Keepers + +## Keeper functions + +Claim keeper module provides utility functions to manage epochs. + +```go + GetModuleAccountAddress(ctx sdk.Context) sdk.AccAddress + GetDistributorAccountBalance(ctx sdk.Context) sdk.Coin + EndAirdrop(ctx sdk.Context) error + GetClaimRecord(ctx sdk.Context, addr sdk.AccAddress) (types.ClaimRecord, error) + GetClaimRecords(ctx sdk.Context) []types.ClaimRecord + SetClaimRecord(ctx sdk.Context, claimRecord types.ClaimRecord) error + SetClaimRecords(ctx sdk.Context, claimRecords []types.ClaimRecord) error + GetClaimableAmountForAction(ctx sdk.Context, addr sdk.AccAddress, action types.Action, includeClaimed bool) (sdk.Coins, error) + GetUserTotalClaimable(ctx sdk.Context, addr sdk.AccAddress) (sdk.Coins, error) + ClaimCoinsForAction(ctx sdk.Context, addr sdk.AccAddress, action types.Action) (sdk.Coins, error) + clearInitialClaimables(ctx sdk.Context) + fundRemainingsToCommunity(ctx sdk.Context) error +``` diff --git a/readme-docs/md/04_params.md b/readme-docs/md/04_params.md new file mode 100644 index 0000000000..31a8e43bb0 --- /dev/null +++ b/readme-docs/md/04_params.md @@ -0,0 +1,37 @@ +--- +title: "Mint Module: Params" +excerpt: "" +category: 62c5c5ff03a5bf069004def2 +--- + + + +# Parameters + +The minting module contains the following parameters: + +| Key | Type | Example | +| ------------------------------------------ | ------------ | -------------------------------------- | +| mint_denom | string | "uosmo" | +| genesis_epoch_provisions | string (dec) | "500000000" | +| epoch_identifier | string | "weekly" | +| reduction_period_in_epochs | int64 | 156 | +| reduction_factor | string (dec) | "0.6666666666666" | +| distribution_proportions.staking | string (dec) | "0.4" | +| distribution_proportions.pool_incentives | string (dec) | "0.3" | +| distribution_proportions.developer_rewards | string (dec) | "0.2" | +| distribution_proportions.community_pool | string (dec) | "0.1" | +| weighted_developer_rewards_receivers | array | [{"address": "osmoxx", "weight": "1"}] | +| minting_rewards_distribution_start_epoch | int64 | 10 | + +**Notes** +1. `mint_denom` defines denom for minting token - uosmo +2. `genesis_epoch_provisions` provides minting tokens per epoch at genesis. +3. `epoch_identifier` defines the epoch identifier to be used for mint module e.g. "weekly" +4. `reduction_period_in_epochs` defines the number of epochs to pass to reduce mint amount +5. `reduction_factor` defines the reduction factor of tokens at every `reduction_period_in_epochs` +6. `distribution_proportions` defines distribution rules for minted tokens, when developer rewards address is empty, it distribute tokens to community pool. +7. `weighted_developer_rewards_receivers` provides the addresses that receives developer rewards by weight +8. `minting_rewards_distribution_start_epoch` defines the start epoch of minting to make sure minting start after initial pools are set diff --git a/readme-docs/md/05_events.md b/readme-docs/md/05_events.md new file mode 100644 index 0000000000..65dbdc5a93 --- /dev/null +++ b/readme-docs/md/05_events.md @@ -0,0 +1,22 @@ +--- +title: "Mint Module: Events" +excerpt: "" +category: 62c5c5ff03a5bf069004def2 +--- + + + + +# Events + +The minting module emits the following events: + +## End of Epoch + +| Type | Attribute Key | Attribute Value | +| ---- | ---------------- | ----------------- | +| mint | epoch_number | {epochNumber} | +| mint | epoch_provisions | {epochProvisions} | +| mint | amount | {amount} | diff --git a/readme-docs/md/05_react_hooks.md b/readme-docs/md/05_react_hooks.md new file mode 100644 index 0000000000..bdc9ec7cfd --- /dev/null +++ b/readme-docs/md/05_react_hooks.md @@ -0,0 +1,18 @@ +--- +title: "Claim Module: React Hooks" +excerpt: "" +category: 62c5c5ff03a5bf069004def2 +--- + + + +# React Hooks + +Claim module react on following hooks of external modules. + +20% of airdrop is sent to a vesting account when `staking.AfterDelegationModified` hook is triggered. +20% of airdrop is sent to a vesting account when `stakeibc.AfterLiquidStake` hook is triggered. + +When airdrop is claimed for specific hook type, it can't be claimed double. diff --git a/readme-docs/md/06_queries.md b/readme-docs/md/06_queries.md new file mode 100644 index 0000000000..b32d518e12 --- /dev/null +++ b/readme-docs/md/06_queries.md @@ -0,0 +1,48 @@ +--- +title: "Claim Module: Queries" +excerpt: "" +category: 62c5c5ff03a5bf069004def2 +--- + + + +# Queries + +## GRPC queries + +Claim module provides below GRPC queries to query claim status + +```protobuf +service Query { + rpc DistributorAccountBalance(QueryDistributorAccountBalanceRequest) returns (QueryDistributorAccountBalanceResponse) {} + rpc Params(QueryParamsRequest) returns (QueryParamsResponse) {} + rpc ClaimRecord(QueryClaimRecordRequest) returns (QueryClaimRecordResponse) {} + rpc ClaimableForAction(QueryClaimableForActionRequest) returns (QueryClaimableForActionResponse) {} + rpc TotalClaimable(QueryTotalClaimableRequest) returns (QueryTotalClaimableResponse) {} +} +``` + +## CLI commands + +For the following commands, you can change `$(strided keys show -a {your key name})` with the address directly. + +Query the claim record for a given address + +```sh +strided query claim claim-record $(strided keys show -a {your key name}) +``` + +Query the claimable amount that would be earned if a specific action is completed right now. + +```sh + +strided query claim claimable-for-action $(strided keys show -a {your key name}) ActionAddLiquidity +``` + +Query the total claimable amount that would be earned if all remaining actions were completed right now. + +```sh +strided query claim total-claimable $(strided keys show -a {your key name}) ActionAddLiquidity +``` diff --git a/readme-docs/md/07_params.md b/readme-docs/md/07_params.md new file mode 100644 index 0000000000..3082b14cf4 --- /dev/null +++ b/readme-docs/md/07_params.md @@ -0,0 +1,39 @@ +--- +title: "Claim Module: Params" +excerpt: "" +category: 62c5c5ff03a5bf069004def2 +--- + + + +# Params + +Claim module provides below params + +```protobuf +// Params defines the claim module's parameters. +message Params { + google.protobuf.Timestamp airdrop_start_time = 1 [ + (gogoproto.stdtime) = true, + (gogoproto.nullable) = false, + (gogoproto.moretags) = "yaml:\"airdrop_start_time\"" + ]; + google.protobuf.Timestamp airdrop_duration = 2 [ + (gogoproto.nullable) = false, + (gogoproto.stdduration) = true, + (gogoproto.jsontag) = "airdrop_duration,omitempty", + (gogoproto.moretags) = "yaml:\"airdrop_duration\"" + ]; + // denom of claimable asset + string claim_denom = 3; + // airdrop distribution account + string distributor_address = 4; +} +``` + +1. `airdrop_start_time` refers to the time when user can start to claim airdrop. +2. `airdrop_duration` refers to the duration from start time to end time. +3. `claim_denom` refers to the denomination of claiming tokens. As a default, it's `ustrd`. +4. `distributor_address` refers to the address of distribution account. \ No newline at end of file diff --git a/readme-docs/md/README.md b/readme-docs/md/README.md new file mode 100644 index 0000000000..9a859bb99d --- /dev/null +++ b/readme-docs/md/README.md @@ -0,0 +1,85 @@ +--- +title: "Claim Module" +excerpt: "" +category: 62c5c5ff03a5bf069004def2 +--- + +# Claims module + +## Abstract + +The Stride claims module has users claim higher percentages as they perform certain tasks on-chain. +Furthermore, these claimable assets 'expire' if not claimed. +Users have three months (`AirdropDuration`) to claim their full airdrop amount +After three months from launch, all unclaimed tokens get sent to the community pool. + +## Contents + +1. **[Concept](01_concepts.md)** +2. **[State](02_state.md)** +3. **[Events](03_events.md)** +4. **[Keeper](04_keeper.md)** +5. **[React Hooks](05_react_hooks.md)** +6. **[Queries](06_queries.md)** +7. **[Params](07_params.md)** + +## Genesis State + +## Actions + +There are 2 types of actions, each of which release another 50% of the airdrop allocation. +The 2 actions are as follows: + +```golang +ActionLiquidStake Action = 0 +ActionDelegateStake Action = 1 +``` + +These actions are monitored by registring claim **hooks** to the stakeibc, and staking modules. +This means that when you perform an action, the claims module will immediately unlock those coins if they are applicable. +These actions can be performed in any order. + +The code is structured by separating out a segment of the tokens as "claimable", indexed by each action type. +So if Alice delegates tokens, the claims module will move the 50% of the claimables associated with staking to her liquid balance. +If she delegates again, there will not be additional tokens given, as the relevant action has already been performed. +Every action must be performed to claim the full amount. + +## ClaimRecords + +A claim record is a struct that contains data about the claims process of each airdrop recipient. + +It contains an address, the initial claimable airdrop amount, and an array of bools representing +whether each action has been completed. The position in the array refers to enum number of the action. + +So for example, `[true, true]` means that `ActionLiquidStake` and `ActionDelegateStake` are completed. + +```golang +type ClaimRecord struct { + // address of claim user + Address string + // weight that represent the portion from total allocation + Weight sdk.Dec + // true if action is completed + // index of bool in array refers to action enum # + ActionCompleted []bool +} + +``` + + +## Params + +The airdrop logic has 4 parameters: + +```golang +type Params struct { + // Time that marks the beginning of the airdrop disbursal, + // should be set to chain launch time. + AirdropStartTime time.Time + AirdropDuration time.Duration + // denom of claimable asset + ClaimDenom string + // address of distributor account + DistributorAddress string +} +``` diff --git a/x/README.md b/x/README.md index 1deefcd495..a3a9bb6a8d 100644 --- a/x/README.md +++ b/x/README.md @@ -1,3 +1,8 @@ +--- +title: "Stride Modules" +excerpt: "" +category: 62c5c5ff03a5bf069004def2 +--- # Stride modules Stride implements the following custom modules: diff --git a/x/claim/spec/01_concepts.md b/x/claim/spec/01_concepts.md index 1bbd9bb4f7..dcc05c86ae 100644 --- a/x/claim/spec/01_concepts.md +++ b/x/claim/spec/01_concepts.md @@ -1,3 +1,10 @@ +--- +title: "Claim Module: Overview" +excerpt: "" +category: 62c5c5ff03a5bf069004def2 +--- + + diff --git a/x/claim/spec/02_state.md b/x/claim/spec/02_state.md index 51a1a0df02..df0e6a3364 100644 --- a/x/claim/spec/02_state.md +++ b/x/claim/spec/02_state.md @@ -1,3 +1,9 @@ +--- +title: "Claim Module: State" +excerpt: "" +category: 62c5c5ff03a5bf069004def2 +--- + diff --git a/x/claim/spec/03_events.md b/x/claim/spec/03_events.md index 6c50792493..6f4c86f2ae 100644 --- a/x/claim/spec/03_events.md +++ b/x/claim/spec/03_events.md @@ -1,3 +1,8 @@ +--- +title: "Claim Module: Events" +excerpt: "" +category: 62c5c5ff03a5bf069004def2 +--- diff --git a/x/claim/spec/04_keeper.md b/x/claim/spec/04_keeper.md index 5ae284f623..e27cb057a5 100644 --- a/x/claim/spec/04_keeper.md +++ b/x/claim/spec/04_keeper.md @@ -1,3 +1,9 @@ +--- +title: "Claim Module: Keeper" +excerpt: "" +category: 62c5c5ff03a5bf069004def2 +--- + diff --git a/x/claim/spec/05_react_hooks.md b/x/claim/spec/05_react_hooks.md index 4613696c86..bdc9ec7cfd 100644 --- a/x/claim/spec/05_react_hooks.md +++ b/x/claim/spec/05_react_hooks.md @@ -1,3 +1,9 @@ +--- +title: "Claim Module: React Hooks" +excerpt: "" +category: 62c5c5ff03a5bf069004def2 +--- + diff --git a/x/claim/spec/06_queries.md b/x/claim/spec/06_queries.md index bceef87300..b32d518e12 100644 --- a/x/claim/spec/06_queries.md +++ b/x/claim/spec/06_queries.md @@ -1,3 +1,9 @@ +--- +title: "Claim Module: Queries" +excerpt: "" +category: 62c5c5ff03a5bf069004def2 +--- + diff --git a/x/claim/spec/07_params.md b/x/claim/spec/07_params.md index 17caa888c9..757a4cbf3d 100644 --- a/x/claim/spec/07_params.md +++ b/x/claim/spec/07_params.md @@ -1,8 +1,14 @@ +--- +title: "Claim Module: Params" +excerpt: "" +category: 62c5c5ff03a5bf069004def2 +--- + -# Params +# Params :) Claim module provides below params diff --git a/x/claim/spec/README.md b/x/claim/spec/README.md index 17baa63adb..9a859bb99d 100644 --- a/x/claim/spec/README.md +++ b/x/claim/spec/README.md @@ -1,3 +1,9 @@ +--- +title: "Claim Module" +excerpt: "" +category: 62c5c5ff03a5bf069004def2 +--- + # Claims module ## Abstract diff --git a/x/epochs/README.md b/x/epochs/README.md index dfb5be170c..67a6f70f86 100644 --- a/x/epochs/README.md +++ b/x/epochs/README.md @@ -1,3 +1,8 @@ +--- +title: "Epochs Module" +excerpt: "" +category: 62c5c5ff03a5bf069004def2 +--- diff --git a/x/mint/spec/02_state.md b/x/mint/spec/02_state.md index a8ea239a08..b6afbd7c44 100644 --- a/x/mint/spec/02_state.md +++ b/x/mint/spec/02_state.md @@ -1,3 +1,10 @@ +--- +# docs: https://docs.readme.com/main/docs/preview-and-publish-pages#markdown-directory-format +title: "Mint Module: State" # +excerpt: "" +category: 62c5c5ff03a5bf069004def2 +--- + diff --git a/x/mint/spec/03_end_epoch.md b/x/mint/spec/03_end_epoch.md index ede4ce63a3..5a9cf541d7 100644 --- a/x/mint/spec/03_end_epoch.md +++ b/x/mint/spec/03_end_epoch.md @@ -1,3 +1,9 @@ +--- +title: "Mint Module: End Epoch" +excerpt: "" +category: 62c5c5ff03a5bf069004def2 +--- + diff --git a/x/mint/spec/04_params.md b/x/mint/spec/04_params.md index 5c2bec1003..31a8e43bb0 100644 --- a/x/mint/spec/04_params.md +++ b/x/mint/spec/04_params.md @@ -1,3 +1,9 @@ +--- +title: "Mint Module: Params" +excerpt: "" +category: 62c5c5ff03a5bf069004def2 +--- + diff --git a/x/mint/spec/05_events.md b/x/mint/spec/05_events.md index 32c797a2fd..65dbdc5a93 100644 --- a/x/mint/spec/05_events.md +++ b/x/mint/spec/05_events.md @@ -1,3 +1,10 @@ +--- +title: "Mint Module: Events" +excerpt: "" +category: 62c5c5ff03a5bf069004def2 +--- + + diff --git a/x/mint/spec/README.md b/x/mint/spec/README.md index ceec010ad8..e005cc25ad 100644 --- a/x/mint/spec/README.md +++ b/x/mint/spec/README.md @@ -1,3 +1,9 @@ +--- +title: "Mint Module" +excerpt: "" +category: 62c5c5ff03a5bf069004def2 +--- +