Skip to content

Commit

Permalink
fix(balances): logic, tests and metadata
Browse files Browse the repository at this point in the history
  • Loading branch information
failfmi committed Jun 11, 2024
1 parent a668792 commit d012a6a
Show file tree
Hide file tree
Showing 49 changed files with 616 additions and 257 deletions.
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -164,8 +164,8 @@ start-network-babe:
cd ../../../..; \
WASMTIME_BACKTRACE_DETAILS=1 RUST_LOG=runtime=trace ./target/release/substrate-node --dev --execution=wasm

start-network-aura:
cp $(BUILD_PATH) polkadot-sdk/substrate/bin/node-template/runtime.wasm; \
start-network:
cp build/runtime.wasm polkadot-sdk/substrate/bin/node-template/runtime.wasm; \
cd polkadot-sdk/substrate/bin/node-template/node; \
cargo build --release; \
cd ../../../..; \
Expand Down
8 changes: 8 additions & 0 deletions api/metadata/module.go
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,14 @@ func (m Module) basicTypes() sc.Sequence[primitives.MetadataType] {
primitives.NewMetadataTypeDefinitionComposite(sc.Sequence[primitives.MetadataTypeDefinitionField]{
primitives.NewMetadataTypeDefinitionField(metadata.TypesFixedSequence32U8)})),

primitives.NewMetadataType(
metadata.TypesCompactU128,
"compact U128",
primitives.NewMetadataTypeDefinitionCompact(
sc.ToCompact(metadata.PrimitiveTypesU128),
),
),

primitives.NewMetadataTypeWithPath(metadata.TypesAddress32, "Address32", sc.Sequence[sc.Str]{"sp_core", "crypto", "AccountId32"}, primitives.NewMetadataTypeDefinitionComposite(
sc.Sequence[primitives.MetadataTypeDefinitionField]{primitives.NewMetadataTypeDefinitionFieldWithName(metadata.TypesFixedSequence32U8, "[u8; 32]")},
)),
Expand Down
Binary file modified build/runtime.wasm
Binary file not shown.
3 changes: 1 addition & 2 deletions frame/balances/call_force_adjust_total_issuance.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,7 @@ func (c callForceAdjustTotalIssuance) FunctionIndex() sc.U8 { return c.Callable.
func (c callForceAdjustTotalIssuance) Args() sc.VaryingData { return c.Callable.Args() }

func (c callForceAdjustTotalIssuance) BaseWeight() primitives.Weight {
// TODO: weight
return primitives.WeightZero()
return callForceAdjustTotalIssuanceWeight()
}

func (_ callForceAdjustTotalIssuance) WeighData(baseWeight primitives.Weight) primitives.Weight {
Expand Down
7 changes: 7 additions & 0 deletions frame/balances/call_force_adjust_total_issuance_weight.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package balances

import primitives "github.com/LimeChain/gosemble/primitives/types"

func callForceAdjustTotalIssuanceWeight() primitives.Weight {
return primitives.WeightFromParts(6507000, 0)
}
2 changes: 1 addition & 1 deletion frame/balances/call_force_set_balance.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ func (c callForceSetBalance) Args() sc.VaryingData {
}

func (c callForceSetBalance) BaseWeight() primitives.Weight {
return primitives.WeightZero()
return callForceSetBalanceCreatingWeight(c.module.constants.DbWeight).Max(callForceSetBalanceKillingWeight(c.module.constants.DbWeight))
}

func (_ callForceSetBalance) WeighData(baseWeight primitives.Weight) primitives.Weight {
Expand Down
9 changes: 9 additions & 0 deletions frame/balances/call_force_set_balance_creating_weight.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package balances

import primitives "github.com/LimeChain/gosemble/primitives/types"

func callForceSetBalanceCreatingWeight(dbWeight primitives.RuntimeDbWeight) primitives.Weight {
return primitives.WeightFromParts(705450000, 0).
SaturatingAdd(dbWeight.Reads(2)).
SaturatingAdd(dbWeight.Writes(2))
}
9 changes: 9 additions & 0 deletions frame/balances/call_force_set_balance_killing_weight.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package balances

import primitives "github.com/LimeChain/gosemble/primitives/types"

func callForceSetBalanceKillingWeight(dbWeight primitives.RuntimeDbWeight) primitives.Weight {
return primitives.WeightFromParts(947950000, 0).
SaturatingAdd(dbWeight.Reads(2)).
SaturatingAdd(dbWeight.Writes(2))
}
2 changes: 1 addition & 1 deletion frame/balances/call_force_transfer.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ func (c callForceTransfer) Args() sc.VaryingData {
}

func (c callForceTransfer) BaseWeight() primitives.Weight {
return primitives.WeightZero()
return callForceTransferWeight(c.module.constants.DbWeight)
}

func (_ callForceTransfer) WeighData(baseWeight primitives.Weight) primitives.Weight {
Expand Down
9 changes: 9 additions & 0 deletions frame/balances/call_force_transfer_weight.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package balances

import primitives "github.com/LimeChain/gosemble/primitives/types"

func callForceTransferWeight(dbWeight primitives.RuntimeDbWeight) primitives.Weight {
return primitives.WeightFromParts(1773600000, 0).
SaturatingAdd(dbWeight.Reads(2)).
SaturatingAdd(dbWeight.Writes(2))
}
2 changes: 1 addition & 1 deletion frame/balances/call_force_unreserve.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ func (c callForceUnreserve) Args() sc.VaryingData {
}

func (c callForceUnreserve) BaseWeight() primitives.Weight {
return primitives.WeightZero()
return callForceUnreserveWeight(c.module.constants.DbWeight)
}

func (_ callForceUnreserve) WeighData(baseWeight primitives.Weight) primitives.Weight {
Expand Down
9 changes: 9 additions & 0 deletions frame/balances/call_force_unreserve_weight.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package balances

import primitives "github.com/LimeChain/gosemble/primitives/types"

func callForceUnreserveWeight(dbWeight primitives.RuntimeDbWeight) primitives.Weight {
return primitives.WeightFromParts(718350000, 0).
SaturatingAdd(dbWeight.Reads(1)).
SaturatingAdd(dbWeight.Writes(1))
}
2 changes: 1 addition & 1 deletion frame/balances/call_transfer_all.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ func (c callTransferAll) Args() sc.VaryingData {
}

func (c callTransferAll) BaseWeight() primitives.Weight {
return primitives.WeightZero()
return callTransferAllWeight(c.module.constants.DbWeight)
}

func (_ callTransferAll) WeighData(baseWeight primitives.Weight) primitives.Weight {
Expand Down
9 changes: 9 additions & 0 deletions frame/balances/call_transfer_all_weight.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package balances

import primitives "github.com/LimeChain/gosemble/primitives/types"

func callTransferAllWeight(dbWeight primitives.RuntimeDbWeight) primitives.Weight {
return primitives.WeightFromParts(2083900000, 0).
SaturatingAdd(dbWeight.Reads(1)).
SaturatingAdd(dbWeight.Writes(1))
}
2 changes: 1 addition & 1 deletion frame/balances/call_transfer_allow_death.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ func (c callTransferAllowDeath) Args() sc.VaryingData {
}

func (c callTransferAllowDeath) BaseWeight() primitives.Weight {
return primitives.WeightZero()
return callTransferAllowDeathWeight(c.module.constants.DbWeight)
}

func (_ callTransferAllowDeath) WeighData(baseWeight primitives.Weight) primitives.Weight {
Expand Down
9 changes: 9 additions & 0 deletions frame/balances/call_transfer_allow_death_weight.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package balances

import primitives "github.com/LimeChain/gosemble/primitives/types"

func callTransferAllowDeathWeight(dbWeight primitives.RuntimeDbWeight) primitives.Weight {
return primitives.WeightFromParts(47297000, 3593).
SaturatingAdd(dbWeight.Reads(1)).
SaturatingAdd(dbWeight.Writes(1))
}
2 changes: 1 addition & 1 deletion frame/balances/call_transfer_keep_alive.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ func (c callTransferKeepAlive) Args() sc.VaryingData {
}

func (c callTransferKeepAlive) BaseWeight() primitives.Weight {
return primitives.WeightZero()
return callTransferKeepAliveWeight(c.module.constants.DbWeight)
}

func (_ callTransferKeepAlive) WeighData(baseWeight primitives.Weight) primitives.Weight {
Expand Down
9 changes: 9 additions & 0 deletions frame/balances/call_transfer_keep_alive_weight.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package balances

import primitives "github.com/LimeChain/gosemble/primitives/types"

func callTransferKeepAliveWeight(dbWeight primitives.RuntimeDbWeight) primitives.Weight {
return primitives.WeightFromParts(1782050000, 0).
SaturatingAdd(dbWeight.Reads(1)).
SaturatingAdd(dbWeight.Writes(1))
}
4 changes: 2 additions & 2 deletions frame/balances/call_upgrade_accounts.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ func (c callUpgradeAccounts) FunctionIndex() sc.U8 { return c.Callable.FunctionI
func (c callUpgradeAccounts) Args() sc.VaryingData { return c.Callable.Args() }

func (c callUpgradeAccounts) BaseWeight() primitives.Weight {
// TODO: weight
return primitives.WeightZero()
accounts := c.Arguments[0].(sc.Sequence[primitives.AccountId])
return callUpgradeAccountsWeight(c.module.constants.DbWeight, sc.U64(len(accounts)))
}

func (_ callUpgradeAccounts) WeighData(baseWeight primitives.Weight) primitives.Weight {
Expand Down
14 changes: 14 additions & 0 deletions frame/balances/call_upgrade_accounts_weight.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package balances

import (
sc "github.com/LimeChain/goscale"
primitives "github.com/LimeChain/gosemble/primitives/types"
)

func callUpgradeAccountsWeight(dbWeight primitives.RuntimeDbWeight, length sc.U64) primitives.Weight {
return primitives.WeightFromParts(16118000, 990).
SaturatingAdd(primitives.WeightFromParts(13327660, 0).SaturatingMul(length)).
SaturatingAdd(dbWeight.Reads(1).SaturatingMul(length)).
SaturatingAdd(dbWeight.Writes(1).SaturatingMul(length)).
SaturatingAdd(primitives.WeightFromParts(0, 2603).SaturatingMul(length))
}
7 changes: 6 additions & 1 deletion frame/balances/genesis_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,12 @@ func (m Module) BuildConfig(config []byte) error {

totalIssuance = totalIssuance.Add(b.Balance)

_, err := m.Config.StoredMap.Insert(b.AccountId, types.AccountData{
_, err := m.Config.StoredMap.IncProviders(b.AccountId)
if err != nil {
return err
}

_, err = m.Config.StoredMap.Insert(b.AccountId, types.AccountData{
Free: b.Balance,
Reserved: sc.NewU128(0),
Frozen: sc.NewU128(0),
Expand Down
98 changes: 92 additions & 6 deletions frame/balances/metadata.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,6 @@ import (
)

func (m Module) Metadata() primitives.MetadataModule {
metadataIdBalancesCalls := m.mdGenerator.BuildCallsMetadata("Balances", m.functions, &sc.Sequence[primitives.MetadataTypeParameter]{
primitives.NewMetadataEmptyTypeParameter("T"),
primitives.NewMetadataEmptyTypeParameter("I")})

mdConstants := metadataConstants{
ExistentialDeposit: primitives.ExistentialDeposit{U128: m.constants.ExistentialDeposit},
MaxLocks: primitives.MaxLocks{U32: m.constants.MaxLocks},
Expand All @@ -24,12 +20,12 @@ func (m Module) Metadata() primitives.MetadataModule {
dataV14 := primitives.MetadataModuleV14{
Name: m.name(),
Storage: m.metadataStorage(),
Call: sc.NewOption[sc.Compact](sc.ToCompact(metadataIdBalancesCalls)),
Call: sc.NewOption[sc.Compact](sc.ToCompact(metadata.BalancesCalls)),
CallDef: sc.NewOption[primitives.MetadataDefinitionVariant](
primitives.NewMetadataDefinitionVariantStr(
m.name(),
sc.Sequence[primitives.MetadataTypeDefinitionField]{
primitives.NewMetadataTypeDefinitionFieldWithName(metadataIdBalancesCalls, "self::sp_api_hidden_includes_construct_runtime::hidden_include::dispatch\n::CallableCallFor<Balances, Runtime>"),
primitives.NewMetadataTypeDefinitionFieldWithName(metadata.BalancesCalls, "self::sp_api_hidden_includes_construct_runtime::hidden_include::dispatch\n::CallableCallFor<Balances, Runtime>"),
},
m.Index,
"Call.Balances"),
Expand Down Expand Up @@ -290,6 +286,24 @@ func (m Module) metadataTypes() sc.Sequence[primitives.MetadataType] {
),
),

primitives.NewMetadataTypeWithPath(metadata.TypesBalancesAdjustDirection,
"AdjustDirection",
sc.Sequence[sc.Str]{"frame_support", "traits", "tokens", "misc", "AdjustDirection"}, primitives.NewMetadataTypeDefinitionVariant(
sc.Sequence[primitives.MetadataDefinitionVariant]{
primitives.NewMetadataDefinitionVariant(
"Increase",
sc.Sequence[primitives.MetadataTypeDefinitionField]{},
types.AdjustDirectionIncrease,
"AdjustDirection.Increase"),
primitives.NewMetadataDefinitionVariant(
"Decrease",
sc.Sequence[primitives.MetadataTypeDefinitionField]{},
types.AdjustDirectionDecrease,
"AdjustDirection.Decrease"),
},
),
),

primitives.NewMetadataTypeWithParams(metadata.TypesBalancesErrors,
"pallet_balances pallet Error",
sc.Sequence[sc.Str]{"pallet_balances", "pallet", "Error"},
Expand Down Expand Up @@ -360,5 +374,77 @@ func (m Module) metadataTypes() sc.Sequence[primitives.MetadataType] {
primitives.NewMetadataEmptyTypeParameter("T"),
primitives.NewMetadataEmptyTypeParameter("I"),
}),

primitives.NewMetadataTypeWithParam(metadata.BalancesCalls,
"Balance calls",
sc.Sequence[sc.Str]{"pallet_balances", "pallet", "Call"},
primitives.NewMetadataTypeDefinitionVariant(
sc.Sequence[primitives.MetadataDefinitionVariant]{
primitives.NewMetadataDefinitionVariant(
"transfer_allow_death",
sc.Sequence[primitives.MetadataTypeDefinitionField]{
primitives.NewMetadataTypeDefinitionFieldWithNames(metadata.TypesMultiAddress, "dest", "MultiAddress"),
primitives.NewMetadataTypeDefinitionFieldWithNames(metadata.TypesCompactU128, "value", "T::Balance"),
},
functionTransferAllowDeath,
"Transfer some liquid free balance to another account."),
primitives.NewMetadataDefinitionVariant(
"force_transfer",
sc.Sequence[primitives.MetadataTypeDefinitionField]{
primitives.NewMetadataTypeDefinitionFieldWithNames(metadata.TypesMultiAddress, "source", "MultiAddress"),
primitives.NewMetadataTypeDefinitionFieldWithNames(metadata.TypesMultiAddress, "dest", "MultiAddress"),
primitives.NewMetadataTypeDefinitionFieldWithNames(metadata.TypesCompactU128, "value", "T::Balance"),
},
functionForceTransfer,
"Exactly as `transfer_allow_death`, except the origin must be root and the source account may be specified."),
primitives.NewMetadataDefinitionVariant(
"transfer_keep_alive",
sc.Sequence[primitives.MetadataTypeDefinitionField]{
primitives.NewMetadataTypeDefinitionFieldWithNames(metadata.TypesMultiAddress, "dest", "MultiAddress"),
primitives.NewMetadataTypeDefinitionFieldWithNames(metadata.TypesCompactU128, "value", "T::Balance"),
},
functionTransferKeepAlive,
"Same as the [`transfer_allow_death`] call, but with a check that the transfer will not kill the origin account."),
primitives.NewMetadataDefinitionVariant(
"transfer_all",
sc.Sequence[primitives.MetadataTypeDefinitionField]{
primitives.NewMetadataTypeDefinitionFieldWithNames(metadata.TypesMultiAddress, "dest", "MultiAddress"),
primitives.NewMetadataTypeDefinitionFieldWithNames(metadata.PrimitiveTypesBool, "keep_alive", "bool"),
},
functionTransferAll,
"Transfer the entire transferable balance from the caller account."),
primitives.NewMetadataDefinitionVariant(
"force_unreserve",
sc.Sequence[primitives.MetadataTypeDefinitionField]{
primitives.NewMetadataTypeDefinitionFieldWithNames(metadata.TypesMultiAddress, "who", "MultiAddress"),
primitives.NewMetadataTypeDefinitionFieldWithNames(metadata.PrimitiveTypesU128, "amount", "T::Balance"),
},
functionForceUnreserve,
"Unreserve some balance from a user by force."),
primitives.NewMetadataDefinitionVariant(
"upgrade_accounts",
sc.Sequence[primitives.MetadataTypeDefinitionField]{
primitives.NewMetadataTypeDefinitionFieldWithNames(metadata.TypesSequenceAddress32, "who", "Vec<AccountId>"),
},
functionForceUpgradeAccounts,
"Upgrade a specified account."),
primitives.NewMetadataDefinitionVariant(
"force_set_balance",
sc.Sequence[primitives.MetadataTypeDefinitionField]{
primitives.NewMetadataTypeDefinitionFieldWithNames(metadata.TypesMultiAddress, "who", "MultiAddress"),
primitives.NewMetadataTypeDefinitionFieldWithNames(metadata.TypesCompactU128, "new_free", "T::Balance"),
},
functionForceSetBalance,
"Set the regular balance of a given account."),
primitives.NewMetadataDefinitionVariant(
"force_adjust_total_issuance",
sc.Sequence[primitives.MetadataTypeDefinitionField]{
primitives.NewMetadataTypeDefinitionFieldWithNames(metadata.TypesBalancesAdjustDirection, "direction", "AdjustmentDireciton"),
primitives.NewMetadataTypeDefinitionFieldWithNames(metadata.TypesCompactU128, "delta", "T::Balance"),
},
functionForceAdjustTotalIssuance,
"Adjust the total issuance in a saturating way."),
}),
primitives.NewMetadataEmptyTypeParameter("T")),
}
}
16 changes: 8 additions & 8 deletions frame/balances/module.go
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ func (m Module) ensureUpgraded(who primitives.AccountId) (bool, error) {
return false, nil
}
acc.Data.Flags = acc.Data.Flags.SetNewLogic()
if !acc.Data.Reserved.Eq(constants.Zero) && !acc.Data.Frozen.Eq(constants.Zero) {
if !acc.Data.Reserved.Eq(constants.Zero) && acc.Data.Frozen.Eq(constants.Zero) {
if acc.Providers == 0 {
m.logger.Warnf("account with a non-zero reserve balance has no provider refs, acc_id [%s]", hex.EncodeToString(who.Bytes()))
acc.Data.Free = sc.Max128(acc.Data.Free, m.constants.ExistentialDeposit)
Expand Down Expand Up @@ -324,27 +324,26 @@ func (m Module) decreaseBalance(who primitives.AccountId, value sc.U128, precisi
if err != nil {
return sc.U128{}, primitives.NewDispatchErrorOther(sc.Str(err.Error()))
}
oldBalance := acc.Data.Free

reducible, err := m.reducibleBalance(who, preservation, fortitude)
if err != nil {
return sc.U128{}, err
}
if precision == types.PrecisionBestEffort {
value = sc.Min128(value, reducible)
} else {
} else if precision == types.PrecisionExact {
if value.Gt(reducible) {
return sc.U128{}, primitives.NewDispatchErrorToken(primitives.NewTokenErrorFundsUnavailable())
}
}

oldBalance := acc.Data.Free

newBalance, err := sc.CheckedSubU128(oldBalance, value)
if err != nil {
return sc.U128{}, primitives.NewDispatchErrorToken(primitives.NewTokenErrorFundsUnavailable())
}

maybeDust, err := m.writeBalance(who, value)
maybeDust, err := m.writeBalance(who, newBalance)
if err != nil {
return sc.U128{}, err
}
Expand Down Expand Up @@ -474,9 +473,10 @@ func (m Module) tryMutateAccount(who primitives.AccountId, f func(who *primitive
}

func (m Module) mutateAccount(who primitives.AccountId, maybeAccount *primitives.AccountData, f func(who *primitives.AccountData, _ bool) (sc.Encodable, error)) (sc.Encodable, error) {
account := &primitives.AccountData{}
data := primitives.DefaultAccountData()
account := &data
isNew := true
if !reflect.DeepEqual(*maybeAccount, primitives.AccountData{}) {
if !reflect.DeepEqual(*maybeAccount, primitives.DefaultAccountData()) {
account = maybeAccount
isNew = false
}
Expand All @@ -487,7 +487,7 @@ func (m Module) mutateAccount(who primitives.AccountId, maybeAccount *primitives
}

didProvide := account.Free.Gte(m.constants.ExistentialDeposit) && acc.Providers > 0
didConsume := !isNew && (!account.Reserved.Eq(constants.Zero) || !account.Free.Eq(constants.Zero))
didConsume := !isNew && (!account.Reserved.Eq(constants.Zero) || !account.Frozen.Eq(constants.Zero))

result, err := f(account, isNew)
if err != nil {
Expand Down
Loading

0 comments on commit d012a6a

Please sign in to comment.