Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updated ETHDKG with new flow and contract bindings #66

Merged
merged 52 commits into from
Feb 22, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
8fb2f43
Make the binary compile with the new ETHDKG bindings
vtleonardo Jan 12, 2022
45a39f8
Make the code compile
vtleonardo Jan 12, 2022
498f32e
Updated event IDs and started refactor for the new ETHDKG
ricardopinto Jan 13, 2022
1ef6722
Validators will now proceed to ShareDistribution phase after all vali…
ricardopinto Jan 14, 2022
5ff0f53
ETHDKG will now run the happy path to completion
ricardopinto Jan 18, 2022
8c164b3
Fixed marshall bugs and scheduling to account for exclusive end bound…
ricardopinto Jan 18, 2022
d4e3f85
- Cleaned ETHDKG state
ricardopinto Jan 19, 2022
11c8814
Validators can now dispute ETHDKG missing registration
ricardopinto Jan 19, 2022
279c13d
- Improved state management to rely on events instead of arbitrarily …
ricardopinto Jan 21, 2022
a3e4cfa
Stabler ethdkg with better should retry logic (still wip)
ricardopinto Jan 25, 2022
7f2423e
- Implemented 10% fee/tip increase on registration retry
ricardopinto Jan 26, 2022
634dccb
- Fixed nonce assignment when transactions fail.
ricardopinto Jan 27, 2022
eaee085
Stabler version with replacement and "nonce too low" fix
ricardopinto Jan 28, 2022
06ff640
update doTask() and ShouldRetry() of each dkgtasks
kosegor Jan 31, 2022
497d940
Fixed test setup files
ricardopinto Feb 1, 2022
04028cd
testing register dkgtask
kosegor Feb 1, 2022
aede085
Create OnboardingDocumentation
bretg93 Feb 2, 2022
2dbd06c
add tests for dispute_missing_registration_task
kosegor Feb 2, 2022
33e7d72
Implemented mechanism to wait for a number of confirmations before co…
ricardopinto Feb 3, 2022
ac1b6a5
- Added eth.GetFinalityDelay() method to Ethereum interface
ricardopinto Feb 3, 2022
efd704a
test share_distribution_task
kosegor Feb 3, 2022
ce16d3a
Added more tests to missing share distributions
ricardopinto Feb 3, 2022
b6122eb
test ShouldRetry share_distribution and dispute_missing_share_distrib…
kosegor Feb 3, 2022
94beda9
Added tests for bad distributed shares
ricardopinto Feb 4, 2022
6c1fd3b
updating tests using processors
kosegor Feb 4, 2022
60bdbbd
- Decoupled ethdkg state management from monitorState code to be able…
ricardopinto Feb 7, 2022
e758291
Tested key share submission
ricardopinto Feb 8, 2022
4a5536a
test dispute_share_distribution_task
kosegor Feb 8, 2022
203ffc6
update participant phase in processors and validators, test dispute m…
kosegor Feb 9, 2022
caf235e
test mkp_submission_task
kosegor Feb 10, 2022
ac39128
Added tests for dispute missing gpkj phase
ricardopinto Feb 10, 2022
6495ab8
gpkj_submission_task
kosegor Feb 10, 2022
9e9dcc5
test completion dkgtask
kosegor Feb 11, 2022
b53a57f
Implemented Dispute GPKj tests
ricardopinto Feb 11, 2022
903af0e
Merge branch 'new-ethdkg' of https://github.com/vtleonardo/MadNet int…
ricardopinto Feb 11, 2022
a5ab4c9
Improved ETHDKG state management
ricardopinto Feb 11, 2022
f9bf412
Fixed bug where validators would not accuse bad shares when on the di…
ricardopinto Feb 11, 2022
3945cf4
- Fixed bug where it would not be possible to accuse both missing and…
ricardopinto Feb 14, 2022
917d254
Fixed tests
ricardopinto Feb 14, 2022
6516cf8
fix dkg math tests and some comments for the functions
kosegor Feb 14, 2022
c7e3f0e
fix dkg_test.go, add comments to dkgtasks and cleanup
kosegor Feb 15, 2022
d97b19c
Merge branch 'MadBase:main' into new-ethdkg
ricardopinto Feb 16, 2022
8a9bac7
Fixed bridge import
ricardopinto Feb 16, 2022
a41b7d3
deleted test accounts
ricardopinto Feb 16, 2022
ac8d012
Fixed type assertion
ricardopinto Feb 16, 2022
8e089a2
Fixed PR review notes
ricardopinto Feb 17, 2022
97c6755
Fixed more PR review notes
ricardopinto Feb 17, 2022
e382741
Fixing PR review notes
ricardopinto Feb 17, 2022
022bf1c
More fixes related to PR review notes
ricardopinto Feb 17, 2022
1cb2b12
Fixed tests noted in the PR review (all tests inside blockchain/ are …
ricardopinto Feb 18, 2022
97361ec
adding flag for transaction_queue test run
kosegor Feb 18, 2022
3cb700c
Merge branch 'candidate' into new-ethdkg
kosegor Feb 22, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ local-geth/*
**/thumbs.db
**/desktop.ini
**/.directory
.idea/

# generated files
scripts/generated
Expand Down
25 changes: 8 additions & 17 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,49 +14,40 @@
"args": ["--config", "./assets/config/bootnode.toml", "bootnode"]
},
{
"name": "validator0",
"name": "val1",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${workspaceFolder}/cmd",
"cwd": "${workspaceFolder}",
"args": ["--config", "./assets/config/validator0.toml", "validator"]
"args": ["--config", "./scripts/generated/config/validator1.toml", "validator"]
},
{
"name": "validator1",
"name": "val2",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${workspaceFolder}/cmd",
"cwd": "${workspaceFolder}",
"args": ["--config", "./assets/config/validator1.toml", "validator"]
"args": ["--config", "./scripts/generated/config/validator2.toml", "validator"]
},
{
"name": "validator2",
"name": "val3",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${workspaceFolder}/cmd",
"cwd": "${workspaceFolder}",
"args": ["--config", "./assets/config/validator2.toml", "validator"]
"args": ["--config", "./scripts/generated/config/validator3.toml", "validator"]
},
{
"name": "validator3",
"name": "val4",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${workspaceFolder}/cmd",
"cwd": "${workspaceFolder}",
"args": ["--config", "./assets/config/validator3.toml", "validator"]
"args": ["--config", "./scripts/generated/config/validator4.toml", "validator"]
},
{
"name": "validator4",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${workspaceFolder}/cmd",
"cwd": "${workspaceFolder}",
"args": ["--config", "./assets/config/validator4.toml", "validator"]
}
]
}
1 change: 1 addition & 0 deletions TechDocs/OnboardingDocumentation
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

209 changes: 62 additions & 147 deletions blockchain/contracts.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,27 +19,28 @@ import (

// ContractDetails contains bindings to smart contract system
type ContractDetails struct {
eth *EthereumDetails
accusation *bindings.Accusation
crypto *bindings.Crypto
cryptoAddress common.Address
deposit *bindings.Deposit
depositAddress common.Address
governor *bindings.Governor
governorAddress common.Address
ethdkg *bindings.ETHDKG
ethdkgAddress common.Address
participants *bindings.Participants
registry *bindings.Registry
registryAddress common.Address
snapshots *bindings.Snapshots
staking *bindings.Staking
stakingToken *bindings.Token
stakingTokenAddress common.Address
utilityToken *bindings.Token
utilityTokenAddress common.Address
validators *bindings.Validators
validatorsAddress common.Address
eth *EthereumDetails
crypto *bindings.Crypto
cryptoAddress common.Address
deposit *bindings.Deposit
depositAddress common.Address
governor *bindings.Governor
governorAddress common.Address
ethdkg *bindings.ETHDKG
ethdkgAddress common.Address
participants *bindings.Participants
registry *bindings.Registry
registryAddress common.Address
snapshots *bindings.Snapshots
staking *bindings.Staking
stakingToken *bindings.Token
stakingTokenAddress common.Address
utilityToken *bindings.Token
utilityTokenAddress common.Address
validators *bindings.Validators
validatorsAddress common.Address
validatorPool *bindings.ValidatorPool
validatorPoolAddress common.Address
}

// LookupContracts uses the registry to lookup and create bindings for all required contracts
Expand Down Expand Up @@ -128,6 +129,15 @@ func (c *ContractDetails) LookupContracts(ctx context.Context, registryAddress c
continue
}

c.validatorPoolAddress, err = lookup("validatorPool/v1")
logAndEat(logger, err)
if bytes.Equal(c.validatorPoolAddress.Bytes(), make([]byte, 20)) {
continue
}

c.validatorPool, err = bindings.NewValidatorPool(c.validatorPoolAddress, eth.client)
logAndEat(logger, err)

// These all call the ValidatorsDiamond contract but we need various interfaces to keep API
c.validators, err = bindings.NewValidators(c.validatorsAddress, eth.client)
logAndEat(logger, err)
Expand Down Expand Up @@ -260,18 +270,6 @@ func (c *ContractDetails) DeployContracts(ctx context.Context, account accounts.
}
q.QueueGroupTransaction(ctx, deployGroup, txn)

// Deploy accusation facet
accusationFacet, txn, _, err := bindings.DeployAccusationMultipleProposalFacet(txnOpts, eth.client)
if err != nil {
logger.Error("Failed to deploy accusation multiple proposal...")
return nil, common.Address{}, err
}
q.QueueGroupTransaction(ctx, deployGroup, txn)

// Bind diamond to interfaces
c.accusation, err = bindings.NewAccusation(c.validatorsAddress, eth.client)
logAndEat(logger, err)

c.participants, err = bindings.NewParticipants(c.validatorsAddress, eth.client)
logAndEat(logger, err)

Expand Down Expand Up @@ -302,9 +300,6 @@ func (c *ContractDetails) DeployContracts(ctx context.Context, account accounts.
// Register all the validators facets
vu := &Updater{Updater: validatorsUpdate, TxnOpts: txnOpts, Logger: logger}

// Accusation management
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("AccuseMultipleProposal(bytes,bytes,bytes,bytes)", accusationFacet))

// Staking maintenance
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("initializeStaking(address)", stakingFacet))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("balanceReward()", stakingFacet))
Expand Down Expand Up @@ -357,138 +352,53 @@ func (c *ContractDetails) DeployContracts(ctx context.Context, account accounts.
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("validatorCount()", participantsFacet))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("setValidatorMaxCount(uint8)", participantsFacet))

c.ethdkgAddress, txn, _, err = bindings.DeployEthDKGDiamond(txnOpts, eth.client)
if err != nil {
logger.Errorf("Failed to deploy EthDKGDiamond...")
return nil, common.Address{}, err
}
q.QueueGroupTransaction(ctx, facetConfigGroup, txn)
logger.Infof(" Gas = %0.10v EthDKGDiamond = \"0x%0.40x\"", txn.Gas(), c.EthdkgAddress())

c.ethdkg, err = bindings.NewETHDKG(c.ethdkgAddress, eth.client)
logAndEat(logger, err)

var ethdkgCompletionAddress common.Address
ethdkgCompletionAddress, txn, _, err = bindings.DeployEthDKGCompletionFacet(txnOpts, eth.client)
if err != nil {
logger.Errorf("Failed to deploy EthDKGCompletionFacet...")
return nil, common.Address{}, err
}
q.QueueGroupTransaction(ctx, facetConfigGroup, txn)
logger.Infof(" Gas = %0.10v EthDKGCompletionFacet = \"0x%0.40x\"", txn.Gas(), ethdkgCompletionAddress)

var ethdkgGroupAccusationAddress common.Address
ethdkgGroupAccusationAddress, txn, _, err = bindings.DeployEthDKGGroupAccusationFacet(txnOpts, eth.client)
if err != nil {
logger.Errorf("Failed to deploy EthDKGGroupAccusationFacet...")
return nil, common.Address{}, err
}
q.QueueGroupTransaction(ctx, facetConfigGroup, txn)
logger.Infof(" Gas = %0.10v EthDKGGroupAccusationFacet = \"0x%0.40x\"", txn.Gas(), ethdkgGroupAccusationAddress)

var ethdkgInitializeAddress common.Address
ethdkgInitializeAddress, txn, _, err = bindings.DeployEthDKGInitializeFacet(txnOpts, eth.client)
c.validatorPoolAddress, txn, _, err = bindings.DeployValidatorPool(txnOpts, eth.client, make([]byte, 0))
if err != nil {
logger.Errorf("Failed to deploy EthDKGInitializeFacet...")
logger.Errorf("Failed to deploy Validator Pool contract...")
return nil, common.Address{}, err
}
q.QueueGroupTransaction(ctx, facetConfigGroup, txn)
logger.Infof(" Gas = %0.10v EthDKGInitializeFacet = \"0x%0.40x\"", txn.Gas(), ethdkgInitializeAddress)
logger.Infof(" Gas = %0.10v Validator Pool = \"0x%0.40x\"", txn.Gas(), c.ValidatorPoolAddress())

var ethdkgSubmitMPKAddress common.Address
ethdkgSubmitMPKAddress, txn, _, err = bindings.DeployEthDKGSubmitMPKFacet(txnOpts, eth.client)
ethdkgAccusationAddress, txn, _, err := bindings.DeployETHDKGAccusations(txnOpts, eth.client)
if err != nil {
logger.Errorf("Failed to deploy EthDKGSubmitMPKFacet...")
logger.Errorf("Failed to deploy ETHDKGAccusation contract...")
return nil, common.Address{}, err
}
q.QueueGroupTransaction(ctx, facetConfigGroup, txn)
logger.Infof(" Gas = %0.10v EthDKGSubmitMPKFacet = \"0x%0.40x\"", txn.Gas(), ethdkgSubmitMPKAddress)
logger.Infof(" Gas = %0.10v Ethdkg Accusation = \"0x%0.40x\"", txn.Gas(), ethdkgAccusationAddress)

var ethdkgSubmitDisputeAddress common.Address
ethdkgSubmitDisputeAddress, txn, _, err = bindings.DeployEthDKGSubmitDisputeFacet(txnOpts, eth.client)
ethdkgPhasesAddress, txn, _, err := bindings.DeployETHDKGPhases(txnOpts, eth.client)
if err != nil {
logger.Errorf("Failed to deploy EthDKGSubmitDisputeFacet...")
logger.Errorf("Failed to deploy ETHDKGPhases contract...")
return nil, common.Address{}, err
}
q.QueueGroupTransaction(ctx, facetConfigGroup, txn)
logger.Infof(" Gas = %0.10v EthDKGSubmitDisputeFacet = \"0x%0.40x\"", txn.Gas(), ethdkgSubmitDisputeAddress)
logger.Infof(" Gas = %0.10v ETHDKG Phases = \"0x%0.40x\"", txn.Gas(), ethdkgPhasesAddress)

var ethdkgMiscAddress common.Address
ethdkgMiscAddress, txn, _, err = bindings.DeployEthDKGMiscFacet(txnOpts, eth.client)
c.ethdkgAddress, txn, _, err = bindings.DeployETHDKG(txnOpts, eth.client, c.validatorPoolAddress, ethdkgAccusationAddress, ethdkgPhasesAddress, make([]byte, 0))
if err != nil {
logger.Errorf("Failed to deploy EthDKGMiscFacet...")
logger.Errorf("Failed to deploy EthDKG...")
return nil, common.Address{}, err
}
q.QueueGroupTransaction(ctx, facetConfigGroup, txn)
logger.Infof(" Gas = %0.10v EthDKGMiscFacet = \"0x%0.40x\"", txn.Gas(), ethdkgMiscAddress)
logger.Infof(" Gas = %0.10v EthDKG = \"0x%0.40x\"", txn.Gas(), c.EthdkgAddress())

var ethdkgInfoFacetAddress common.Address
ethdkgInfoFacetAddress, txn, _, err = bindings.DeployEthDKGInformationFacet(txnOpts, eth.client)
if err != nil {
logger.Errorf("Failed to deploy EthDKGInformationFacet...")
return nil, common.Address{}, err
}
q.QueueGroupTransaction(ctx, facetConfigGroup, txn)
logger.Infof(" Gas = %0.10v EthDKGInformationFacet = \"0x%0.40x\"", txn.Gas(), ethdkgInfoFacetAddress)
c.ethdkg, err = bindings.NewETHDKG(c.ethdkgAddress, eth.client)
logAndEat(logger, err)

ethdkgUpdate, err := bindings.NewDiamondUpdateFacet(c.ethdkgAddress, eth.client)
if err != nil {
logger.Errorf("Failed to bind ethdkg update ..")
return nil, common.Address{}, err
}
c.validatorPool, err = bindings.NewValidatorPool(c.validatorPoolAddress, eth.client)
logAndEat(logger, err)

// Wait for all the deploys to finish
eth.commit()

q.WaitGroupTransactions(ctx, facetConfigGroup)
// flushQ(txnQueue)

// Register all the ethdkg facets
vu = &Updater{Updater: ethdkgUpdate, TxnOpts: txnOpts, Logger: logger}

//
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("initializeEthDKG(address)", ethdkgInitializeAddress))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("initializeState()", ethdkgInitializeAddress))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("updatePhaseLength(uint256)", ethdkgInitializeAddress))

q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("submit_master_public_key(uint256[4])", ethdkgSubmitMPKAddress))

q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("getPhaseLength()", ethdkgInfoFacetAddress))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("initialMessage()", ethdkgInfoFacetAddress))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("initialSignatures(address,uint256)", ethdkgInfoFacetAddress))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("T_REGISTRATION_END()", ethdkgInfoFacetAddress))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("T_SHARE_DISTRIBUTION_END()", ethdkgInfoFacetAddress))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("T_DISPUTE_END()", ethdkgInfoFacetAddress))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("T_KEY_SHARE_SUBMISSION_END()", ethdkgInfoFacetAddress))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("T_MPK_SUBMISSION_END()", ethdkgInfoFacetAddress))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("T_GPKJ_SUBMISSION_END()", ethdkgInfoFacetAddress))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("T_GPKJDISPUTE_END()", ethdkgInfoFacetAddress))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("T_DKG_COMPLETE()", ethdkgInfoFacetAddress))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("publicKeys(address,uint256)", ethdkgInfoFacetAddress))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("isMalicious(address)", ethdkgInfoFacetAddress))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("shareDistributionHashes(address)", ethdkgInfoFacetAddress))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("keyShares(address,uint256)", ethdkgInfoFacetAddress))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("commitments_1st_coefficient(address,uint256)", ethdkgInfoFacetAddress))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("gpkj_submissions(address,uint256)", ethdkgInfoFacetAddress))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("master_public_key(uint256)", ethdkgInfoFacetAddress))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("numberOfRegistrations()", ethdkgInfoFacetAddress))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("addresses(uint256)", ethdkgInfoFacetAddress))

q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("Group_Accusation_GPKj(uint256[],uint256[],uint256[])", ethdkgGroupAccusationAddress))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("Group_Accusation_GPKj_Comp(uint256[][],uint256[2][][],uint256,address)", ethdkgGroupAccusationAddress))

q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("submit_dispute(address,uint256,uint256,uint256[],uint256[2][],uint256[2],uint256[2])", ethdkgSubmitDisputeAddress))

q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("submit_key_share(address,uint256[2],uint256[2],uint256[4])", ethdkgMiscAddress))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("register(uint256[2])", ethdkgMiscAddress))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("Submit_GPKj(uint256[4],uint256[2])", ethdkgMiscAddress))
q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("distribute_shares(uint256[],uint256[2][])", ethdkgMiscAddress))

q.QueueGroupTransaction(ctx, facetConfigGroup, vu.Add("Successful_Completion()", ethdkgCompletionAddress))

// Flush everything
// eth.contracts = c
eth.commit()
txn, err = c.ValidatorPool().SetETHDKG(txnOpts, c.ethdkgAddress)
logAndEat(logger, err)
q.QueueGroupTransaction(ctx, facetConfigGroup, txn)

txn, err = c.registry.Register(txnOpts, "deposit/v1", c.depositAddress)
logAndEat(logger, err)
Expand Down Expand Up @@ -522,6 +432,10 @@ func (c *ContractDetails) DeployContracts(ctx context.Context, account accounts.
logAndEat(logger, err)
q.QueueGroupTransaction(ctx, facetConfigGroup, txn)

txn, err = c.registry.Register(txnOpts, "validatorPool/v1", c.validatorPoolAddress)
logAndEat(logger, err)
q.QueueGroupTransaction(ctx, facetConfigGroup, txn)

eth.commit()

// Wait for all the deploys to finish
Expand Down Expand Up @@ -652,13 +566,6 @@ func (c *ContractDetails) DeployContracts(ctx context.Context, account accounts.
logger.Infof("deposit update status: %v", rcpt.Status)
}

// ETHDKG updates
tx, err = c.ethdkg.InitializeEthDKG(txnOpts, c.registryAddress)
if err != nil {
logger.Errorf("Failed to update ethdkg contract references: %v", err)
return nil, common.Address{}, err
}

eth.commit()

rcpt, err = eth.Queue().QueueAndWait(ctx, tx)
Expand Down Expand Up @@ -765,3 +672,11 @@ func (c *ContractDetails) Validators() *bindings.Validators {
func (c *ContractDetails) ValidatorsAddress() common.Address {
return c.validatorsAddress
}

func (c *ContractDetails) ValidatorPool() *bindings.ValidatorPool {
return c.validatorPool
}

func (c *ContractDetails) ValidatorPoolAddress() common.Address {
return c.validatorPoolAddress
}
Loading