Skip to content

Commit 095050b

Browse files
failfmiradkomih
andauthored
feat(balances): latest implementation (#420)
* wip(balances): latest implementation * fix(balances): logic, tests and metadata * style: imports * refactor(system/storage): account default value * fix benchmarks * fix existing tests * balances tests --------- Co-authored-by: Rado M <radkomih@gmail.com>
1 parent 2d3bcf2 commit 095050b

File tree

118 files changed

+4392
-4508
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

118 files changed

+4392
-4508
lines changed

Makefile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,13 @@ start-network-babe:
168168
cd ../../../..; \
169169
WASMTIME_BACKTRACE_DETAILS=1 RUST_LOG=runtime=trace ./target/release/substrate-node --dev --execution=wasm
170170

171+
start-network:
172+
cp build/runtime.wasm polkadot-sdk/substrate/bin/node-template/runtime.wasm; \
173+
cd polkadot-sdk/substrate/bin/node-template/node; \
174+
cargo build --release; \
175+
cd ../../../..; \
176+
WASMTIME_BACKTRACE_DETAILS=1 RUST_LOG=runtime=trace ./target/release/node-template --dev --execution=wasm
177+
171178
# gossamer node configuration
172179
CHAIN_SPEC_PLAIN = ../testdata/chain-spec/plain.json
173180
CHAIN_SPEC_UPDATED = ../testdata/chain-spec/plain-updated.json

api/benchmarking/module.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,14 +275,15 @@ func (m Module) originAndMaybeAccount(benchmarkConfig benchmarking.BenchmarkConf
275275

276276
func (m Module) whitelistWellKnownKeys() {
277277
keySystemHash := m.hashing.Twox128([]byte("System"))
278+
keyBalancesHash := m.hashing.Twox128([]byte("Balances"))
278279
keyBlockWeight := m.hashing.Twox128([]byte("BlockWeight"))
279280
keyExecutionPhaseHash := m.hashing.Twox128([]byte("ExecutionPhase"))
280281
keyEventCountHash := m.hashing.Twox128([]byte("EventCount"))
281282
keyEventsHash := m.hashing.Twox128([]byte("Events"))
282283
keyNumberHash := m.hashing.Twox128([]byte("Number"))
283284
keyTotalIssuanceHash := m.hashing.Twox128([]byte("TotalIssuance"))
284285

285-
benchmarking.SetWhitelist(append(keySystemHash, keyTotalIssuanceHash...))
286+
benchmarking.SetWhitelist(append(keyBalancesHash, keyTotalIssuanceHash...))
286287
benchmarking.SetWhitelist(append(keySystemHash, keyBlockWeight...))
287288
benchmarking.SetWhitelist(append(keySystemHash, keyNumberHash...))
288289
benchmarking.SetWhitelist(append(keySystemHash, keyExecutionPhaseHash...))

api/metadata/module.go

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,14 @@ func (m Module) basicTypes() sc.Sequence[primitives.MetadataType] {
281281
primitives.NewMetadataTypeDefinitionComposite(sc.Sequence[primitives.MetadataTypeDefinitionField]{
282282
primitives.NewMetadataTypeDefinitionField(metadata.TypesFixedSequence32U8)})),
283283

284+
primitives.NewMetadataType(
285+
metadata.TypesCompactU128,
286+
"compact U128",
287+
primitives.NewMetadataTypeDefinitionCompact(
288+
sc.ToCompact(metadata.PrimitiveTypesU128),
289+
),
290+
),
291+
284292
primitives.NewMetadataTypeWithPath(metadata.TypesAddress32, "Address32", sc.Sequence[sc.Str]{"sp_core", "crypto", "AccountId32"}, primitives.NewMetadataTypeDefinitionComposite(
285293
sc.Sequence[primitives.MetadataTypeDefinitionField]{primitives.NewMetadataTypeDefinitionFieldWithName(metadata.TypesFixedSequence32U8, "[u8; 32]")},
286294
)),
@@ -337,8 +345,8 @@ func (m Module) basicTypes() sc.Sequence[primitives.MetadataType] {
337345
sc.Sequence[primitives.MetadataTypeDefinitionField]{
338346
primitives.NewMetadataTypeDefinitionFieldWithNames(metadata.PrimitiveTypesU128, "free", "Balance"),
339347
primitives.NewMetadataTypeDefinitionFieldWithNames(metadata.PrimitiveTypesU128, "reserved", "Balance"),
340-
primitives.NewMetadataTypeDefinitionFieldWithNames(metadata.PrimitiveTypesU128, "misc_frozen", "Balance"),
341-
primitives.NewMetadataTypeDefinitionFieldWithNames(metadata.PrimitiveTypesU128, "fee_frozen", "Balance"),
348+
primitives.NewMetadataTypeDefinitionFieldWithNames(metadata.PrimitiveTypesU128, "frozen", "Balance"),
349+
primitives.NewMetadataTypeDefinitionFieldWithNames(metadata.PrimitiveTypesU128, "flags", "ExtraFlags"),
342350
},
343351
)),
344352
primitives.NewMetadataTypeWithPath(metadata.TypesAccountInfo, "AccountInfo", sc.Sequence[sc.Str]{"frame_system", "AccountInfo"}, primitives.NewMetadataTypeDefinitionComposite(
@@ -591,17 +599,17 @@ func (m Module) basicTypes() sc.Sequence[primitives.MetadataType] {
591599
primitives.NewMetadataTypeWithPath(metadata.TypesTokenError, "TokenError", sc.Sequence[sc.Str]{"sp_runtime", "TokenError"}, primitives.NewMetadataTypeDefinitionVariant(
592600
sc.Sequence[primitives.MetadataDefinitionVariant]{
593601
primitives.NewMetadataDefinitionVariant(
594-
"NoFunds",
602+
"FundsUnavailable",
595603
sc.Sequence[primitives.MetadataTypeDefinitionField]{},
596-
primitives.TokenErrorNoFunds,
597-
"TokenError.NoFunds"),
604+
primitives.TokenErrorFundsUnavailable,
605+
"TokenError.FundsUnavailable"),
598606
primitives.NewMetadataDefinitionVariant(
599-
"WouldDie",
607+
"OnlyProvider",
600608
sc.Sequence[primitives.MetadataTypeDefinitionField]{},
601-
primitives.TokenErrorWouldDie,
602-
"TokenError.WouldDie"),
609+
primitives.TokenErrorOnlyProvider,
610+
"TokenError.OnlyProvider"),
603611
primitives.NewMetadataDefinitionVariant(
604-
"Mandatory",
612+
"BelowMinimum",
605613
sc.Sequence[primitives.MetadataTypeDefinitionField]{},
606614
primitives.TokenErrorBelowMinimum,
607615
"TokenError.BelowMinimum"),
@@ -625,6 +633,21 @@ func (m Module) basicTypes() sc.Sequence[primitives.MetadataType] {
625633
sc.Sequence[primitives.MetadataTypeDefinitionField]{},
626634
primitives.TokenErrorUnsupported,
627635
"TokenError.Unsupported"),
636+
primitives.NewMetadataDefinitionVariant(
637+
"CannotCreateHold",
638+
sc.Sequence[primitives.MetadataTypeDefinitionField]{},
639+
primitives.TokenErrorCannotCreateHold,
640+
"TokenError.CannotCreateHold"),
641+
primitives.NewMetadataDefinitionVariant(
642+
"NotExpendable",
643+
sc.Sequence[primitives.MetadataTypeDefinitionField]{},
644+
primitives.TokenErrorNotExpendable,
645+
"TokenError.NotExpendable"),
646+
primitives.NewMetadataDefinitionVariant(
647+
"Blocked",
648+
sc.Sequence[primitives.MetadataTypeDefinitionField]{},
649+
primitives.TokenErrorBlocked,
650+
"TokenError.Blocked"),
628651
})),
629652
primitives.NewMetadataTypeWithPath(metadata.TypesArithmeticError, "ArithmeticError", sc.Sequence[sc.Str]{"sp_arithmetic", "ArithmeticError"}, primitives.NewMetadataTypeDefinitionVariant(
630653
sc.Sequence[primitives.MetadataDefinitionVariant]{

build/runtime-benchmarks.wasm

63.2 KB
Binary file not shown.

build/runtime.wasm

-3.57 MB
Binary file not shown.

constants/currency.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,6 @@ const (
1313

1414
var (
1515
Zero = sc.NewU128(0)
16+
One = sc.NewU128(1)
1617
DefaultTip = Zero
1718
)

constants/metadata/metadata.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ const (
5353

5454
TypesBalancesEvent
5555
TypesBalanceStatus
56+
TypesBalancesAdjustDirection
5657
TypesVecTopics
5758
TypesLastRuntimeUpgradeInfo
5859
TypesSystemErrors
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
package balances
2+
3+
import (
4+
"bytes"
5+
6+
sc "github.com/LimeChain/goscale"
7+
"github.com/LimeChain/gosemble/constants"
8+
"github.com/LimeChain/gosemble/frame/balances/types"
9+
primitives "github.com/LimeChain/gosemble/primitives/types"
10+
)
11+
12+
type callForceAdjustTotalIssuance struct {
13+
primitives.Callable
14+
storage *storage
15+
eventDepositor primitives.EventDepositor
16+
}
17+
18+
func newCallForceAdjustTotalIssuance(moduleId sc.U8, functionId sc.U8, eventDepositor primitives.EventDepositor, storage *storage) primitives.Call {
19+
return callForceAdjustTotalIssuance{
20+
Callable: primitives.Callable{
21+
ModuleId: moduleId,
22+
FunctionId: functionId,
23+
Arguments: sc.NewVaryingData(types.AdjustDirection{}, sc.Compact{Number: sc.U128{}}),
24+
},
25+
eventDepositor: eventDepositor,
26+
storage: storage,
27+
}
28+
}
29+
30+
func (c callForceAdjustTotalIssuance) DecodeArgs(buffer *bytes.Buffer) (primitives.Call, error) {
31+
direction, err := types.DecodeAdjustDirection(buffer)
32+
if err != nil {
33+
return nil, err
34+
}
35+
delta, err := sc.DecodeCompact[sc.U128](buffer)
36+
if err != nil {
37+
return nil, err
38+
}
39+
c.Arguments = sc.NewVaryingData(
40+
direction,
41+
delta,
42+
)
43+
44+
return c, nil
45+
}
46+
47+
func (c callForceAdjustTotalIssuance) Encode(buffer *bytes.Buffer) error {
48+
return c.Callable.Encode(buffer)
49+
}
50+
51+
func (c callForceAdjustTotalIssuance) Bytes() []byte {
52+
return c.Callable.Bytes()
53+
}
54+
55+
func (c callForceAdjustTotalIssuance) ModuleIndex() sc.U8 { return c.Callable.ModuleIndex() }
56+
57+
func (c callForceAdjustTotalIssuance) FunctionIndex() sc.U8 { return c.Callable.FunctionIndex() }
58+
59+
func (c callForceAdjustTotalIssuance) Args() sc.VaryingData { return c.Callable.Args() }
60+
61+
func (c callForceAdjustTotalIssuance) BaseWeight() primitives.Weight {
62+
return callForceAdjustTotalIssuanceWeight()
63+
}
64+
65+
func (_ callForceAdjustTotalIssuance) WeighData(baseWeight primitives.Weight) primitives.Weight {
66+
return primitives.WeightFromParts(baseWeight.RefTime, 0)
67+
}
68+
69+
func (_ callForceAdjustTotalIssuance) ClassifyDispatch(baseWeight primitives.Weight) primitives.DispatchClass {
70+
return primitives.NewDispatchClassNormal()
71+
}
72+
73+
func (_ callForceAdjustTotalIssuance) PaysFee(baseWeight primitives.Weight) primitives.Pays {
74+
return primitives.PaysYes
75+
}
76+
77+
func (_ callForceAdjustTotalIssuance) Docs() string {
78+
return "Adjust the total issuance in a saturating way. Can only be called by root and always needs a positive `delta`."
79+
}
80+
81+
func (c callForceAdjustTotalIssuance) Dispatch(origin primitives.RuntimeOrigin, args sc.VaryingData) (primitives.PostDispatchInfo, error) {
82+
if !origin.IsRootOrigin() {
83+
return primitives.PostDispatchInfo{}, primitives.NewDispatchErrorBadOrigin()
84+
}
85+
direction, ok := args[0].(types.AdjustDirection)
86+
if !ok {
87+
return primitives.PostDispatchInfo{}, primitives.NewDispatchErrorOther("invalid direction value when dispatching callForceAdjustTotalIssuance")
88+
}
89+
deltaCompact, ok := args[1].(sc.Compact)
90+
if !ok {
91+
return primitives.PostDispatchInfo{}, primitives.NewDispatchErrorOther("invalid amount value when dispatching call force free")
92+
}
93+
94+
delta, ok := deltaCompact.Number.(sc.U128)
95+
if !ok {
96+
return primitives.PostDispatchInfo{}, primitives.NewDispatchErrorOther("invalid Compact field delta when dispatch call_force_adjust_total_issuance")
97+
}
98+
99+
if delta.Lte(constants.Zero) {
100+
return primitives.PostDispatchInfo{}, primitives.NewDispatchErrorModule(primitives.CustomModuleError{
101+
Index: c.ModuleId,
102+
Err: sc.U32(ErrorDeltaZero),
103+
Message: sc.NewOption[sc.Str](nil),
104+
})
105+
}
106+
107+
totalIssuance, err := c.storage.TotalIssuance.Get()
108+
if err != nil {
109+
return primitives.PostDispatchInfo{}, primitives.NewDispatchErrorOther(sc.Str(err.Error()))
110+
}
111+
112+
var newIssuance sc.U128
113+
if direction.IsIncrease() {
114+
newIssuance = sc.SaturatingAddU128(totalIssuance, delta)
115+
} else {
116+
newIssuance = sc.SaturatingSubU128(totalIssuance, delta)
117+
}
118+
119+
inactiveIssuance, err := c.storage.InactiveIssuance.Get()
120+
if err != nil {
121+
return primitives.PostDispatchInfo{}, primitives.NewDispatchErrorOther(sc.Str(err.Error()))
122+
}
123+
124+
if inactiveIssuance.Gt(newIssuance) {
125+
return primitives.PostDispatchInfo{}, primitives.NewDispatchErrorModule(primitives.CustomModuleError{
126+
Index: c.ModuleId,
127+
Err: sc.U32(ErrorIssuanceDeactivated),
128+
Message: sc.NewOption[sc.Str](nil),
129+
})
130+
}
131+
c.storage.TotalIssuance.Put(newIssuance)
132+
c.eventDepositor.DepositEvent(newEventTotalIssuanceForced(c.ModuleId, totalIssuance, newIssuance))
133+
134+
return primitives.PostDispatchInfo{}, nil
135+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package balances
2+
3+
import primitives "github.com/LimeChain/gosemble/primitives/types"
4+
5+
func callForceAdjustTotalIssuanceWeight() primitives.Weight {
6+
return primitives.WeightFromParts(6507000, 0)
7+
}

0 commit comments

Comments
 (0)