Skip to content

Commit 98c611c

Browse files
pbukvaMissingNO57
andauthored
feat: Adding Tokenfactory module (#430)
Co-authored-by: Jiri <jiri.vestfal@fetch.ai>
1 parent 056f938 commit 98c611c

6 files changed

Lines changed: 450 additions & 299 deletions

File tree

Dockerfile

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
FROM golang:1.24.3-bookworm as builder
1+
FROM golang:1.25.7-bookworm AS builder
22

33
# Set up dependencies
4-
ENV PACKAGES jq curl wget jq file make git
4+
ENV PACKAGES="jq curl wget jq file make git"
55

66
RUN apt-get update && \
77
apt-get install -y $PACKAGES
@@ -21,7 +21,7 @@ RUN ARCH=`uname -m` && ln -s $GOPATH/pkg/mod/github.com/\!cosm\!wasm/wasmvm/v*/i
2121
FROM debian:bookworm-slim AS hub
2222

2323
# Set up dependencies
24-
ENV PACKAGES jq curl
24+
ENV PACKAGES="jq curl"
2525

2626
RUN apt-get update && \
2727
apt-get install -y $PACKAGES
@@ -43,22 +43,22 @@ STOPSIGNAL SIGTERM
4343

4444
# ##################################
4545

46-
FROM hub as gcr
46+
FROM hub AS gcr
4747

4848
COPY ./entrypoints/run-node.sh /usr/bin/run-node.sh
4949
COPY ./entrypoints/run-tx-server.sh /usr/bin/run-tx-server.sh
5050

5151
# ##################################
5252

53-
FROM hub as localnet
53+
FROM hub AS localnet
5454

5555
COPY ./entrypoints/run-localnet.sh /usr/bin/run-localnet.sh
5656

5757
ENTRYPOINT [ "/usr/bin/run-localnet.sh" ]
5858

5959
# ##################################
6060

61-
FROM hub as localnet-setup
61+
FROM hub AS localnet-setup
6262

6363
RUN apt-get update && apt-get install -y python3
6464

app/app.go

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import (
2828
"github.com/cosmos/cosmos-sdk/x/group"
2929
groupmodule "github.com/cosmos/cosmos-sdk/x/group/module"
3030
"github.com/cosmos/cosmos-sdk/x/protocolpool"
31-
"github.com/cosmos/gaia/v25/x/liquid"
31+
"github.com/cosmos/gaia/v27/x/liquid"
3232
"github.com/cosmos/gogoproto/proto"
3333
icacontroller "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/controller"
3434
ibccallbacks "github.com/cosmos/ibc-go/v10/modules/apps/callbacks"
@@ -51,6 +51,10 @@ import (
5151
transferv2 "github.com/cosmos/ibc-go/v10/modules/apps/transfer/v2"
5252
"github.com/gorilla/mux"
5353
"github.com/rakyll/statik/fs"
54+
"github.com/strangelove-ventures/tokenfactory/x/tokenfactory"
55+
"github.com/strangelove-ventures/tokenfactory/x/tokenfactory/bindings"
56+
tokenfactorykeeper "github.com/strangelove-ventures/tokenfactory/x/tokenfactory/keeper"
57+
tokenfactorytypes "github.com/strangelove-ventures/tokenfactory/x/tokenfactory/types"
5458

5559
autocliv1 "cosmossdk.io/api/cosmos/autocli/v1"
5660
reflectionv1 "cosmossdk.io/api/cosmos/reflection/v1"
@@ -122,8 +126,8 @@ import (
122126
"github.com/cosmos/cosmos-sdk/x/staking"
123127
stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper"
124128
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
125-
liquidkeeper "github.com/cosmos/gaia/v25/x/liquid/keeper"
126-
liquidtypes "github.com/cosmos/gaia/v25/x/liquid/types"
129+
liquidkeeper "github.com/cosmos/gaia/v27/x/liquid/keeper"
130+
liquidtypes "github.com/cosmos/gaia/v27/x/liquid/types"
127131
ica "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts"
128132
icacontrollerkeeper "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/controller/keeper"
129133
icacontrollertypes "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/controller/types"
@@ -160,6 +164,16 @@ var (
160164
// of "EnableAllProposals" (takes precedence over ProposalsEnabled)
161165
// https://github.com/CosmWasm/wasmd/blob/02a54d33ff2c064f3539ae12d75d027d9c665f05/x/wasm/internal/types/proposal.go#L28-L34
162166
EnableSpecificProposals = ""
167+
168+
tokenFactoryCapabilities = []string{
169+
tokenfactorytypes.EnableSudoMint,
170+
tokenfactorytypes.EnableBurnOwn,
171+
//tokenfactorytypes.EnableBurnOwnUnregistered,
172+
//tokenfactorytypes.EnableBurnFrom,
173+
//tokenfactorytypes.EnableForceTransfer,
174+
tokenfactorytypes.EnableSetMetadata,
175+
tokenfactorytypes.EnableCommunityPoolFeeFunding,
176+
}
163177
)
164178

165179
func ConvertToProposals(keys []string) ([]wasmtypes.ProposalType, error) {
@@ -212,9 +226,10 @@ var (
212226
protocolpooltypes.ModuleName: nil,
213227
protocolpooltypes.ProtocolPoolEscrowAccount: nil,
214228
// non sdk modules
215-
ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner},
216-
icatypes.ModuleName: nil,
217-
wasmtypes.ModuleName: {authtypes.Burner},
229+
ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner},
230+
icatypes.ModuleName: nil,
231+
wasmtypes.ModuleName: {authtypes.Burner},
232+
tokenfactorytypes.ModuleName: {authtypes.Minter, authtypes.Burner},
218233
}
219234
)
220235

@@ -278,6 +293,7 @@ type App struct {
278293
ICAHostKeeper icahostkeeper.Keeper
279294
TransferKeeper ibctransferkeeper.Keeper
280295
WasmKeeper wasmkeeper.Keeper
296+
TokenFactoryKeeper tokenfactorykeeper.Keeper
281297

282298
// the module manager
283299
mm *module.Manager
@@ -347,6 +363,7 @@ func New(
347363
ibcexported.StoreKey, ibctransfertypes.StoreKey,
348364
wasmtypes.StoreKey, icahosttypes.StoreKey,
349365
icacontrollertypes.StoreKey,
366+
tokenfactorytypes.StoreKey,
350367
paramstypes.StoreKey,
351368
CapabilityStoreKey,
352369
liquidtypes.StoreKey,
@@ -407,6 +424,7 @@ func New(
407424
slashingSS := app.ParamsKeeper.Subspace(slashingtypes.ModuleName).WithKeyTable(slashingtypes.ParamKeyTable())
408425

409426
govSS := app.ParamsKeeper.Subspace(govtypes.ModuleName).WithKeyTable(govv1.ParamKeyTable())
427+
tokenFactorySS := app.ParamsKeeper.Subspace(tokenfactorytypes.ModuleName)
410428

411429
// Combine legacy IBC ParamSets so all migrators (client, connection, channel)
412430
// can read their old params from x/params during the upgrade.
@@ -583,7 +601,7 @@ func New(
583601

584602
app.GovKeeper = *govKeeper.SetHooks(
585603
govtypes.NewMultiGovHooks(
586-
// register the governance hooks
604+
// register the governance hooks
587605
),
588606
)
589607

@@ -606,14 +624,27 @@ func New(
606624
// If evidence needs to be handled for the app, set routes in router here and seal
607625
app.EvidenceKeeper = *evidenceKeeper
608626

627+
// Create the TokenFactory Keeper
628+
app.TokenFactoryKeeper = tokenfactorykeeper.NewKeeper(
629+
appCodec,
630+
app.keys[tokenfactorytypes.StoreKey],
631+
maccPerms,
632+
app.AccountKeeper,
633+
app.BankKeeper,
634+
app.DistrKeeper,
635+
tokenFactoryCapabilities,
636+
authtypes.NewModuleAddress(govtypes.ModuleName).String(),
637+
)
638+
wasmOpts = append(wasmOpts, bindings.RegisterCustomPlugins(app.BankKeeper, &app.TokenFactoryKeeper)...)
639+
609640
app.EpochsKeeper = epochskeeper.NewKeeper(
610641
runtime.NewKVStoreService(keys[epochstypes.StoreKey]),
611642
appCodec,
612643
)
613644

614645
app.EpochsKeeper.SetHooks(
615646
epochstypes.NewMultiEpochHooks(
616-
// insert epoch hooks receivers here
647+
// insert epoch hooks receivers here
617648
),
618649
)
619650

@@ -763,6 +794,7 @@ func New(
763794
transfer.NewAppModule(app.TransferKeeper),
764795
ica.NewAppModule(&app.ICAControllerKeeper, &app.ICAHostKeeper),
765796
ibctm.NewAppModule(tmLightClientModule),
797+
tokenfactory.NewAppModule(app.TokenFactoryKeeper, app.AccountKeeper, app.BankKeeper, tokenFactorySS),
766798
liquid.NewAppModule(appCodec, app.LiquidKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper),
767799
)
768800

@@ -806,6 +838,7 @@ func New(
806838
icatypes.ModuleName,
807839
liquidtypes.ModuleName,
808840
wasmtypes.ModuleName,
841+
tokenfactorytypes.ModuleName,
809842
)
810843

811844
app.mm.SetOrderEndBlockers(
@@ -820,6 +853,7 @@ func New(
820853
ibcexported.ModuleName,
821854
icatypes.ModuleName,
822855
wasmtypes.ModuleName,
856+
tokenfactorytypes.ModuleName,
823857
)
824858

825859
// NOTE: The genutils module must occur after staking so that pools are
@@ -857,6 +891,7 @@ func New(
857891
icatypes.ModuleName,
858892
// wasm after ibc transfer
859893
wasmtypes.ModuleName,
894+
tokenfactorytypes.ModuleName,
860895
liquidtypes.ModuleName,
861896
}
862897

@@ -886,6 +921,7 @@ func New(
886921
icatypes.ModuleName,
887922
// wasm after ibc transfer
888923
wasmtypes.ModuleName,
924+
tokenfactorytypes.ModuleName,
889925
liquidtypes.ModuleName,
890926
}
891927

app/upgrades.go

Lines changed: 115 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,27 +16,32 @@ import (
1616
"github.com/CosmWasm/wasmd/app/upgrades"
1717
"github.com/CosmWasm/wasmd/app/upgrades/noop"
1818
v060 "github.com/CosmWasm/wasmd/app/upgrades/v060"
19+
wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper"
20+
wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types"
1921
tmproto "github.com/cometbft/cometbft/proto/tendermint/types"
2022
sdk "github.com/cosmos/cosmos-sdk/types"
2123
"github.com/cosmos/cosmos-sdk/types/module"
2224
consensusparamtypes "github.com/cosmos/cosmos-sdk/x/consensus/types"
2325
epochstypes "github.com/cosmos/cosmos-sdk/x/epochs/types"
2426
"github.com/cosmos/cosmos-sdk/x/group"
27+
"github.com/strangelove-ventures/tokenfactory/x/tokenfactory/keeper"
28+
2529
//minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
2630
paramstypes "github.com/cosmos/cosmos-sdk/x/params/types"
2731
protocolpooltypes "github.com/cosmos/cosmos-sdk/x/protocolpool/types"
2832
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
29-
liquidtypes "github.com/cosmos/gaia/v25/x/liquid/types"
33+
liquidtypes "github.com/cosmos/gaia/v27/x/liquid/types"
3034
icacontrollertypes "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/controller/types"
3135
icatypes "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/types"
3236
ibctransfertypes "github.com/cosmos/ibc-go/v10/modules/apps/transfer/types"
3337
ibcexported "github.com/cosmos/ibc-go/v10/modules/core/exported"
3438
"github.com/fetchai/fetchd/app/ica_migration"
3539
"github.com/fetchai/fetchd/app/traces"
40+
tokenfactorytypes "github.com/strangelove-ventures/tokenfactory/x/tokenfactory/types"
3641
)
3742

3843
// ---- Match this to the plan name that is already stored on disk and halted the chain.
39-
const UpgradeNameV053 = "v0.15.0-rc1-gemini"
44+
const UpgradeNameV053 = "v0.15.0-rc3"
4045

4146
// List ALL new/renamed/deleted KV stores at this upgrade height.
4247
var v053StoreUpgrades = storetypes.StoreUpgrades{
@@ -48,6 +53,7 @@ var v053StoreUpgrades = storetypes.StoreUpgrades{
4853
group.StoreKey,
4954
icacontrollertypes.StoreKey,
5055
nft.StoreKey,
56+
tokenfactorytypes.StoreKey,
5157
liquidtypes.StoreKey,
5258
},
5359
Renamed: []storetypes.StoreRename{
@@ -104,23 +110,16 @@ func (app *App) RegisterUpgradeHandlers(cfg module.Configurator) {
104110
return nil, err
105111
}
106112

107-
/*
108-
// Pre-seed legacy x/params for mint
109-
if ss, ok := app.ParamsKeeper.GetSubspace(minttypes.ModuleName); ok {
110-
if !ss.Has(sdkCtx, minttypes.KeyInflationRateChange) {
111-
p := minttypes.DefaultParams()
112-
p.MintDenom = "afet"
113-
// TODO: if your chain had custom values, set them here:
114-
ss.SetParamSet(sdkCtx, &p)
115-
}
116-
}
117-
*/
118-
119113
err = migrateConsensusParamsFromParamsStore(app, sdkCtx)
120114
if err != nil {
121115
return nil, err
122116
}
123117

118+
res, err := app.mm.RunMigrations(ctx, cfg, fromVM)
119+
if err != nil {
120+
return res, err
121+
}
122+
124123
// Bootstrap liquid staking
125124
err = app.StakingKeeper.IterateValidators(ctx, func(_ int64, v stakingtypes.ValidatorI) (stop bool) {
126125
lv := liquidtypes.LiquidValidator{
@@ -137,8 +136,108 @@ func (app *App) RegisterUpgradeHandlers(cfg module.Configurator) {
137136
return nil, err
138137
}
139138

140-
// If you must pin any module "from" versions, adjust fromVM here.
141-
return app.mm.RunMigrations(ctx, cfg, fromVM)
139+
bondDenom, err := app.StakingKeeper.BondDenom(sdkCtx)
140+
if err != nil {
141+
return nil, err
142+
}
143+
144+
type DenomAdmin struct {
145+
Denom string
146+
Address string
147+
}
148+
149+
type ChainConfig struct {
150+
Admins []DenomAdmin
151+
Params tokenfactorytypes.Params
152+
}
153+
154+
defaultDenomCreationGasConsume := uint64(2000000)
155+
defaultDenomCreationFee := sdk.NewCoins(sdk.NewCoin(bondDenom, math.NewIntWithDecimal(1, 18)))
156+
157+
defaultParams := tokenfactorytypes.Params{
158+
DenomCreationFee: defaultDenomCreationFee,
159+
DenomCreationGasConsume: defaultDenomCreationGasConsume,
160+
}
161+
162+
var chainConfig ChainConfig
163+
164+
switch sdkCtx.ChainID() {
165+
case "fetchhub-4":
166+
chainConfig = ChainConfig{
167+
Admins: []DenomAdmin{
168+
// Mainnet bridge contract
169+
{Denom: bondDenom, Address: "fetch1qxxlalvsdjd07p07y3rc5fu6ll8k4tmetpha8n"},
170+
},
171+
Params: defaultParams,
172+
}
173+
case "dorado-1":
174+
// Dorado testnet bridge contract
175+
doradoBridgeContractAddress := "fetch182q50y030ctp39dkjhv4pn95h9vxg29s67djtr0560fuwprtks0sfrtyz0"
176+
177+
chainConfig = ChainConfig{
178+
Admins: []DenomAdmin{
179+
{Denom: bondDenom, Address: doradoBridgeContractAddress},
180+
},
181+
Params: defaultParams,
182+
}
183+
184+
msgServer := wasmkeeper.NewMsgServerImpl(&app.WasmKeeper)
185+
186+
_, err := msgServer.UpdateContractLabel(ctx, &wasmtypes.MsgUpdateContractLabel{
187+
Sender: tokenfactorytypes.ModuleAddress(),
188+
Contract: doradoBridgeContractAddress,
189+
NewLabel: "token-bridge-contract",
190+
})
191+
if err != nil {
192+
return nil, err
193+
}
194+
195+
default:
196+
feeAmount := math.NewIntWithDecimal(1, 9)
197+
198+
if metadata, ok := app.BankKeeper.GetDenomMetaData(ctx, bondDenom); ok {
199+
var maxExp uint32
200+
var found bool
201+
202+
for _, du := range metadata.DenomUnits {
203+
if !found || du.Exponent > maxExp {
204+
maxExp = du.Exponent
205+
found = true
206+
}
207+
}
208+
209+
if found {
210+
feeAmount = math.NewIntWithDecimal(1, int(maxExp))
211+
}
212+
}
213+
214+
blockMaxGas := sdkCtx.ConsensusParams().Block.MaxGas
215+
216+
denomCreationGasConsume := uint64(0)
217+
// sanity check
218+
if blockMaxGas > 0 {
219+
denomCreationGasConsume = uint64(blockMaxGas) / 3
220+
}
221+
222+
chainConfig = ChainConfig{
223+
Params: tokenfactorytypes.Params{
224+
DenomCreationFee: sdk.NewCoins(sdk.NewCoin(bondDenom, feeAmount)),
225+
DenomCreationGasConsume: denomCreationGasConsume,
226+
},
227+
}
228+
}
229+
230+
app.TokenFactoryKeeper.SetParams(sdkCtx, chainConfig.Params)
231+
232+
udc := keeper.NewUnboundDenomCreator(app.TokenFactoryKeeper)
233+
for _, denomAdmin := range chainConfig.Admins {
234+
err = udc.CreateDenom(sdkCtx, denomAdmin.Address, denomAdmin.Denom)
235+
if err != nil {
236+
return nil, err
237+
}
238+
}
239+
240+
return res, err
142241
},
143242
)
144243

ci.Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM golang:1.24.3-bookworm
1+
FROM golang:1.25.7-bookworm
22

33
WORKDIR /src
44

0 commit comments

Comments
 (0)