Skip to content

Commit 276863c

Browse files
authored
FEATURE: Efficiency Refactoring and Slot Selection for Staking Contracts (#321)
* uses dictionaries for approved and staked * update proposed getter * added panic for approved nodes not in ID table and name changes * adds movesPending list and candidate node list * adds tests for candidate list * add unstaking request event and candidate utility function * role specific candidate lists and limits * add candidate remove test * pr comments and update staking contract: * Adds slot limits and random slot selection using candidate node list (#328) * merge from pending moves * add preconditions and transactions * add new staking changes * add tests for slot selection * get tests passing with merged changes * add slot over limit test * more comments and clearer conditionals * remove test dependency workarounds * update proposed Node IDs and add event * iterate through pending list and update dependencies * make ci * remove upgrade transaction * remove removeNode * add updates to role counts * update dependencies * make ci * include approved access nodes in proposed node IDs * PR comments
1 parent 732f378 commit 276863c

38 files changed

+2613
-1862
lines changed

contracts/FlowIDTableStaking.cdc

+536-116
Large diffs are not rendered by default.

contracts/FlowIDTableStaking_old.cdc

-1,063
This file was deleted.

contracts/testContracts/TestFlowIDTableStaking.cdc

+1-1
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,6 @@ pub contract FlowIDTableStaking {
262262
return <-create NodeDelegator(id: 1, nodeID: nodeID)
263263
}
264264

265-
init(_ epochTokenPayout: UFix64, _ rewardCut: UFix64) {
265+
init(_ epochTokenPayout: UFix64, _ rewardCut: UFix64, _ candidateLimits: {UInt8: UInt64}) {
266266
}
267267
}

lib/go/contracts/contracts.go

+1-5
Original file line numberDiff line numberDiff line change
@@ -182,11 +182,7 @@ func FlowServiceAccount(fungibleTokenAddress, flowTokenAddress, flowFeesAddress,
182182
func FlowIDTableStaking(fungibleTokenAddress, flowTokenAddress, flowFeesAddress string, latest bool) []byte {
183183
var code string
184184

185-
if latest {
186-
code = assets.MustAssetString(flowIdentityTableFilename)
187-
} else {
188-
code = assets.MustAssetString("FlowIDTableStaking_old.cdc")
189-
}
185+
code = assets.MustAssetString(flowIdentityTableFilename)
190186

191187
code = strings.ReplaceAll(code, placeholderFungibleTokenAddress, withHexPrefix(fungibleTokenAddress))
192188
code = strings.ReplaceAll(code, placeholderFlowTokenAddress, withHexPrefix(flowTokenAddress))

lib/go/contracts/go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/onflow/flow-core-contracts/lib/go/contracts
22

3-
go 1.19
3+
go 1.18
44

55
require (
66
github.com/kevinburke/go-bindata v3.23.0+incompatible

lib/go/contracts/internal/assets/assets.go

+6-29
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/go/templates/go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/onflow/flow-core-contracts/lib/go/templates
22

3-
go 1.19
3+
go 1.18
44

55
require (
66
github.com/kevinburke/go-bindata v3.23.0+incompatible

lib/go/templates/idtable_staking_templates.go

+60-3
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ const (
99

1010
removeNodeFilename = "idTableStaking/admin/remove_node.cdc"
1111
endStakingFilename = "idTableStaking/admin/end_staking.cdc"
12-
removeUnapprovedNodesFilename = "idTableStaking/admin/remove_unapproved_nodes.cdc"
12+
removeInvalidNodesFilename = "idTableStaking/admin/remove_invalid_nodes.cdc"
1313
setApprovedNodesFilename = "idTableStaking/admin/set_approved_nodes.cdc"
1414
addApprovedNodesFilename = "idTableStaking/admin/add_approved_nodes.cdc"
15+
addApproveAndLimitsFilename = "idTableStaking/admin/add_approved_and_limits.cdc"
1516
removeApprovedNodesFilename = "idTableStaking/admin/remove_approved_nodes.cdc"
1617
payRewardsFilename = "idTableStaking/admin/pay_rewards.cdc"
1718
moveTokensFilename = "idTableStaking/admin/move_tokens.cdc"
@@ -27,6 +28,9 @@ const (
2728
capabilityEndEpochFilename = "idTableStaking/admin/capability_end_epoch.cdc"
2829
transferFeesAdminFilename = "idTableStaking/admin/transfer_fees_admin.cdc"
2930
setNonOperationalFilename = "idTableStaking/admin/set_non_operational.cdc"
31+
setCandidateLimitsFilename = "idTableStaking/admin/change_candidate_limits.cdc"
32+
setNodeWeightFilename = "idTableStaking/admin/set_node_weight.cdc"
33+
setSlotLimitsFilename = "idTableStaking/admin/set_slot_limits.cdc"
3034

3135
// for testing only
3236
scaleRewardsTestFilename = "idTableStaking/admin/scale_rewards_test.cdc"
@@ -44,6 +48,7 @@ const (
4448

4549
registerManyNodesFilename = "idTableStaking/node/register_many_nodes.cdc"
4650

51+
// Scripts
4752
getTableFilename = "idTableStaking/scripts/get_table.cdc"
4853
currentTableFilename = "idTableStaking/scripts/get_current_table.cdc"
4954
proposedTableFilename = "idTableStaking/scripts/get_proposed_table.cdc"
@@ -70,6 +75,10 @@ const (
7075
totalStakedFilename = "idTableStaking/scripts/get_total_staked.cdc"
7176
rewardRatioFilename = "idTableStaking/scripts/get_node_type_ratio.cdc"
7277
weeklyPayoutFilename = "idTableStaking/scripts/get_weekly_payout.cdc"
78+
getCandidateLimitsFilename = "idTableStaking/scripts/get_candidate_limits.cdc"
79+
getCandidateNodesFilename = "idTableStaking/scripts/get_candidate_nodes.cdc"
80+
getSlotLimitsFilename = "idTableStaking/scripts/get_slot_limits.cdc"
81+
getRoleCountsFilename = "idTableStaking/scripts/get_role_counts.cdc"
7382
)
7483

7584
// Admin Templates -----------------------------------------------------------
@@ -104,8 +113,8 @@ func GenerateEndStakingScript(env Environment) []byte {
104113
return []byte(ReplaceAddresses(code, env))
105114
}
106115

107-
func GenerateRemoveUnapprovedNodesScript(env Environment) []byte {
108-
code := assets.MustAssetString(removeUnapprovedNodesFilename)
116+
func GenerateRemoveInvalidNodesScript(env Environment) []byte {
117+
code := assets.MustAssetString(removeInvalidNodesFilename)
109118

110119
return []byte(ReplaceAddresses(code, env))
111120
}
@@ -122,6 +131,12 @@ func GenerateAddApprovedNodesScript(env Environment) []byte {
122131
return []byte(ReplaceAddresses(code, env))
123132
}
124133

134+
func GenerateAddApprovedAndLimitsScript(env Environment) []byte {
135+
code := assets.MustAssetString(addApproveAndLimitsFilename)
136+
137+
return []byte(ReplaceAddresses(code, env))
138+
}
139+
125140
func GenerateRemoveApprovedNodesScript(env Environment) []byte {
126141
code := assets.MustAssetString(removeApprovedNodesFilename)
127142

@@ -215,6 +230,24 @@ func GenerateSetNonOperationalScript(env Environment) []byte {
215230
return []byte(ReplaceAddresses(code, env))
216231
}
217232

233+
func GenerateSetCandidateLimitsScript(env Environment) []byte {
234+
code := assets.MustAssetString(setCandidateLimitsFilename)
235+
236+
return []byte(ReplaceAddresses(code, env))
237+
}
238+
239+
func GenerateSetNodeWeightScript(env Environment) []byte {
240+
code := assets.MustAssetString(setNodeWeightFilename)
241+
242+
return []byte(ReplaceAddresses(code, env))
243+
}
244+
245+
func GenerateSetSlotLimitsScript(env Environment) []byte {
246+
code := assets.MustAssetString(setSlotLimitsFilename)
247+
248+
return []byte(ReplaceAddresses(code, env))
249+
}
250+
218251
// For testing only
219252
func GenerateScaleRewardsTestScript(env Environment) []byte {
220253
code := assets.MustAssetString(scaleRewardsTestFilename)
@@ -491,6 +524,30 @@ func GenerateGetNonOperationalListScript(env Environment) []byte {
491524
return []byte(ReplaceAddresses(code, env))
492525
}
493526

527+
func GenerateGetCandidateLimitsScript(env Environment) []byte {
528+
code := assets.MustAssetString(getCandidateLimitsFilename)
529+
530+
return []byte(ReplaceAddresses(code, env))
531+
}
532+
533+
func GenerateGetCandidateNodesScript(env Environment) []byte {
534+
code := assets.MustAssetString(getCandidateNodesFilename)
535+
536+
return []byte(ReplaceAddresses(code, env))
537+
}
538+
539+
func GenerateGetSlotLimitsScript(env Environment) []byte {
540+
code := assets.MustAssetString(getSlotLimitsFilename)
541+
542+
return []byte(ReplaceAddresses(code, env))
543+
}
544+
545+
func GenerateGetRoleCountsScript(env Environment) []byte {
546+
code := assets.MustAssetString(getRoleCountsFilename)
547+
548+
return []byte(ReplaceAddresses(code, env))
549+
}
550+
494551
// For testing
495552

496553
func GenerateRegisterManyNodesScript(env Environment) []byte {

0 commit comments

Comments
 (0)