Skip to content

Commit 09a95ab

Browse files
committed
feat: Support custom denom for storage deposit and unlock
1 parent 66f0386 commit 09a95ab

File tree

1 file changed

+16
-15
lines changed

1 file changed

+16
-15
lines changed

gno.land/pkg/sdk/vm/keeper.go

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import (
1919
"sync"
2020
"time"
2121

22-
"github.com/gnolang/gno/gno.land/pkg/gnoland/ugnot"
2322
"github.com/gnolang/gno/gnovm/pkg/doc"
2423
"github.com/gnolang/gno/gnovm/pkg/gnoenv"
2524
gno "github.com/gnolang/gno/gnovm/pkg/gnolang"
@@ -1118,9 +1117,11 @@ func (vm *VMKeeper) QueryStorage(ctx sdk.Context, pkgPath string) (string, error
11181117

11191118
func (vm *VMKeeper) processStorageDeposit(ctx sdk.Context, caller crypto.Address, deposit std.Coins, gnostore gno.Store, params Params) error {
11201119
realmDiffs := gnostore.RealmStorageDiffs()
1121-
depositAmt := deposit.AmountOf(ugnot.Denom)
1120+
defaultDepositCoin := std.MustParseCoin(params.DefaultDeposit)
1121+
defaultDenom := defaultDepositCoin.Denom
1122+
depositAmt := deposit.AmountOf(defaultDenom)
11221123
if depositAmt == 0 {
1123-
depositAmt = std.MustParseCoin(params.DefaultDeposit).Amount
1124+
depositAmt = defaultDepositCoin.Amount
11241125
}
11251126
price := std.MustParseCoin(params.StoragePrice)
11261127

@@ -1143,11 +1144,11 @@ func (vm *VMKeeper) processStorageDeposit(ctx sdk.Context, caller crypto.Address
11431144
requiredDeposit := overflow.Mulp(diff, price.Amount)
11441145
if depositAmt < requiredDeposit {
11451146
allErrs = goerrors.Join(allErrs, fmt.Errorf(
1146-
"not enough deposit to cover the storage usage: requires %d%s for %d bytes",
1147-
requiredDeposit, ugnot.Denom, diff))
1147+
"not enough deposit to cover the storage usage: requires %d%s for %d bytes but got %d%s",
1148+
requiredDeposit, defaultDenom, diff, depositAmt, defaultDenom))
11481149
continue
11491150
}
1150-
err := vm.lockStorageDeposit(ctx, caller, rlm, requiredDeposit, diff)
1151+
err := vm.lockStorageDeposit(ctx, caller, rlm, requiredDeposit, defaultDenom, diff)
11511152
if err != nil {
11521153
allErrs = goerrors.Join(allErrs, fmt.Errorf(
11531154
"lockStorageDeposit failed for realm %s: %w",
@@ -1156,7 +1157,7 @@ func (vm *VMKeeper) processStorageDeposit(ctx sdk.Context, caller crypto.Address
11561157
}
11571158
depositAmt -= requiredDeposit
11581159
// Emit event for storage deposit lock
1159-
d := std.Coin{Denom: ugnot.Denom, Amount: requiredDeposit}
1160+
d := std.Coin{Denom: defaultDenom, Amount: requiredDeposit}
11601161
evt := chain.StorageDepositEvent{
11611162
BytesDelta: diff,
11621163
FeeDelta: d,
@@ -1175,22 +1176,22 @@ func (vm *VMKeeper) processStorageDeposit(ctx sdk.Context, caller crypto.Address
11751176
if rlm.Deposit < uint64(depositUnlocked) {
11761177
panic(fmt.Sprintf(
11771178
"not enough deposit to be unlocked for realm %s, realm deposit %d%s; required to unlock: %d%s",
1178-
rlmPath, rlm.Deposit, ugnot.Denom, depositUnlocked, ugnot.Denom))
1179+
rlmPath, rlm.Deposit, defaultDenom, depositUnlocked, defaultDenom))
11791180
}
11801181

1181-
isRestricted := slices.Contains(vm.bank.RestrictedDenoms(ctx), ugnot.Denom)
1182+
isRestricted := slices.Contains(vm.bank.RestrictedDenoms(ctx), defaultDenom)
11821183
receiver := caller
11831184
if isRestricted {
11841185
// If gnot tokens are locked, sent them to the storageFeeCollector address
11851186
// If unlocked, sent them to memory releaser
11861187
receiver = params.StorageFeeCollector
11871188
}
11881189

1189-
err := vm.refundStorageDeposit(ctx, receiver, rlm, depositUnlocked, released)
1190+
err := vm.refundStorageDeposit(ctx, receiver, rlm, depositUnlocked, defaultDenom, released)
11901191
if err != nil {
11911192
return err
11921193
}
1193-
d := std.Coin{Denom: ugnot.Denom, Amount: depositUnlocked}
1194+
d := std.Coin{Denom: defaultDenom, Amount: depositUnlocked}
11941195
evt := chain.StorageUnlockEvent{
11951196
// For unlock, BytesDelta is negative
11961197
BytesDelta: diff,
@@ -1208,10 +1209,10 @@ func (vm *VMKeeper) processStorageDeposit(ctx sdk.Context, caller crypto.Address
12081209
return nil
12091210
}
12101211

1211-
func (vm *VMKeeper) lockStorageDeposit(ctx sdk.Context, caller crypto.Address, rlm *gno.Realm, requiredDeposit int64, diff int64) error {
1212+
func (vm *VMKeeper) lockStorageDeposit(ctx sdk.Context, caller crypto.Address, rlm *gno.Realm, requiredDeposit int64, depositDenom string, diff int64) error {
12121213
storageDepositAddr := gno.DeriveStorageDepositCryptoAddr(rlm.Path)
12131214

1214-
d := std.Coins{std.Coin{Denom: ugnot.Denom, Amount: requiredDeposit}}
1215+
d := std.Coins{std.Coin{Denom: depositDenom, Amount: requiredDeposit}}
12151216
err := vm.bank.SendCoinsUnrestricted(ctx, caller, storageDepositAddr, d)
12161217
if err != nil {
12171218
return fmt.Errorf("unable to transfer deposit %s, %w", rlm.Path, err)
@@ -1223,9 +1224,9 @@ func (vm *VMKeeper) lockStorageDeposit(ctx sdk.Context, caller crypto.Address, r
12231224
return nil
12241225
}
12251226

1226-
func (vm *VMKeeper) refundStorageDeposit(ctx sdk.Context, refundReceiver crypto.Address, rlm *gno.Realm, depositUnlocked int64, released int64) error {
1227+
func (vm *VMKeeper) refundStorageDeposit(ctx sdk.Context, refundReceiver crypto.Address, rlm *gno.Realm, depositUnlocked int64, depositDenom string, released int64) error {
12271228
storageDepositAddr := gno.DeriveStorageDepositCryptoAddr(rlm.Path)
1228-
d := std.Coins{std.Coin{Denom: ugnot.Denom, Amount: depositUnlocked}}
1229+
d := std.Coins{std.Coin{Denom: depositDenom, Amount: depositUnlocked}}
12291230

12301231
err := vm.bank.SendCoinsUnrestricted(ctx, storageDepositAddr, refundReceiver, d)
12311232
if err != nil {

0 commit comments

Comments
 (0)