diff options
author | Jhih-Ming Huang <jm@byzantine-lab.io> | 2019-09-01 14:50:37 +0800 |
---|---|---|
committer | Jhih-Ming Huang <jm@byzantine-lab.io> | 2019-09-01 14:50:37 +0800 |
commit | af1549650b77c2434ff3ee4ea18ab716d4d0a1fc (patch) | |
tree | b887e18aaec358350593cd2aa3514816385e2c6b /monitor | |
download | tangerine-monitor-af1549650b77c2434ff3ee4ea18ab716d4d0a1fc.tar.gz tangerine-monitor-af1549650b77c2434ff3ee4ea18ab716d4d0a1fc.tar.zst tangerine-monitor-af1549650b77c2434ff3ee4ea18ab716d4d0a1fc.zip |
init commit
Diffstat (limited to 'monitor')
-rw-r--r-- | monitor/backend.go | 185 | ||||
-rw-r--r-- | monitor/cc-list.txt | 1 | ||||
-rw-r--r-- | monitor/contracts.go | 3660 | ||||
-rw-r--r-- | monitor/monitor.go | 199 | ||||
-rw-r--r-- | monitor/monitor_test.go | 88 | ||||
-rw-r--r-- | monitor/notifier.go | 205 |
6 files changed, 4338 insertions, 0 deletions
diff --git a/monitor/backend.go b/monitor/backend.go new file mode 100644 index 0000000..194ed84 --- /dev/null +++ b/monitor/backend.go @@ -0,0 +1,185 @@ +package monitor + +import ( + "context" + "fmt" + "log" + "math/big" + "strings" + "time" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" +) + +type backendIntf interface { + FetchFinedNodes(chan node) + NodeSet() []node + BalanceFromAddress(*ethclient.Client, common.Address) *big.Int +} + +// BlockchainBackend is the blockchain backend object for fetching blockchain info. +type BlockchainBackend struct { + networkID int +} + +// NodeSet returns the registered nodes. +func (b *BlockchainBackend) NodeSet() []node { + nc := NetworkConfigMap[int64(b.networkID)] + conn, err := ethclient.Dial(nc.HTTPEndpoint) + if err != nil { + log.Println("EthClient Dial failed: ", err) + return []node{} + } + g, err := NewGovernance(GovAddress, conn) + if err != nil { + panic(err) + } + txOps := &bind.CallOpts{} + nodeLen, err := g.NodesLength(txOps) + if err != nil { + panic(err) + } + minStake, err := g.MinStake(txOps) + if err != nil { + panic(err) + } + nodes := []node{} + for i := uint64(0); i < nodeLen.Uint64(); i++ { + n, err := g.Nodes(txOps, big.NewInt(int64(i))) + if n.Staked.Cmp(minStake) < 0 { + continue + } + if err != nil { + panic(err) + } + publicKey, err := crypto.UnmarshalPubkey(n.PublicKey) + if err != nil { + log.Println("Unmarshal publicKey fail: ", err) + continue + } + address := crypto.PubkeyToAddress(*publicKey) + nodes = append(nodes, node{ + owner: n.Owner, + email: n.Email, + fined: n.Fined, + name: n.Name, + publicKey: n.PublicKey, + nodeKeyAddress: address, + }) + } + return nodes +} + +// BalanceFromAddress return address's balance. +func (b *BlockchainBackend) BalanceFromAddress(conn *ethclient.Client, + address common.Address) *big.Int { + balance, err := conn.BalanceAt(context.Background(), + address, nil) + if err != nil { + log.Println("Get balance fail: ", err) + return big.NewInt(0) + } + return balance +} + +func (b *BlockchainBackend) subscribe( + logs chan types.Log, + headers chan *types.Header, +) (ethereum.Subscription, *ethclient.Client, error) { + + nc := NetworkConfigMap[int64(b.networkID)] + conn, err := ethclient.Dial(nc.WSEndpoint) + if err != nil { + log.Println("EthClient Dial failed: ", err) + return nil, conn, err + } + abiObject, err := abi.JSON(strings.NewReader(GovernanceABI)) + query := ethereum.FilterQuery{ + Addresses: []common.Address{GovAddress}, + Topics: [][]common.Hash{ + []common.Hash{ + abiObject.Events["Fined"].Id(), + }, + }, + } + sub, err := conn.SubscribeFilterLogs(context.Background(), query, logs) + if err != nil { + log.Println("Subscribe logs failed: ", err) + return nil, conn, err + } + + // Subscribe chain head to keep ws from timeout + _, err = conn.SubscribeNewHead(context.Background(), headers) + if err != nil { + log.Println("Subscribe chain head failed: ", err) + } + return sub, conn, nil +} + +// FetchFinedNodes fetches nodes' information from blockchain. +func (b *BlockchainBackend) FetchFinedNodes(nodeChan chan node) { + logs := make(chan types.Log) + headers := make(chan *types.Header) + sub, conn, err := b.subscribe(logs, headers) + if err != nil { + panic(err) + } + for { + select { + case err := <-sub.Err(): + log.Println("sub.Err()", err) + // retry + for err != nil { + sub, conn, err = b.subscribe(logs, headers) + time.Sleep(30000) + } + case vLog := <-logs: + nodeAddress := common.BytesToAddress(vLog.Topics[1].Bytes()) + log.Println("Notify node: ", nodeAddress.Hex()) + nodeChan <- b.getNodeByAddress(nodeAddress, conn) + } + } +} + +func (b *BlockchainBackend) getNodeByAddress( + nodeAddress common.Address, conn *ethclient.Client) node { + + g, err := NewGovernance(GovAddress, conn) + if err != nil { + panic(err) + } + txOps := &bind.CallOpts{} + offset, err := g.NodesOffsetByAddress(txOps, nodeAddress) + if err != nil { + panic(err) + } + n, err := g.Nodes(txOps, offset) + if err != nil { + panic(err) + } + return node{ + owner: n.Owner, + email: n.Email, + fined: n.Fined, + name: n.Name, + } +} + +func printNodes(nodes []node) { + for i := range nodes { + fmt.Println("Owner", nodes[i].owner.Hex()) + fmt.Println("Email", nodes[i].email) + fmt.Println("Fined", nodes[i].fined.Uint64()) + } +} + +// NewBlockchainBackend is the blockchain backend constructor. +func NewBlockchainBackend(networkID int) *BlockchainBackend { + return &BlockchainBackend{networkID: networkID} +} diff --git a/monitor/cc-list.txt b/monitor/cc-list.txt new file mode 100644 index 0000000..2d5e428 --- /dev/null +++ b/monitor/cc-list.txt @@ -0,0 +1 @@ +cc@example.com diff --git a/monitor/contracts.go b/monitor/contracts.go new file mode 100644 index 0000000..7d36c22 --- /dev/null +++ b/monitor/contracts.go @@ -0,0 +1,3660 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package monitor + +import ( + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = abi.U256 + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription +) + +// GovernanceABI is the input ABI used to generate the binding from. +const GovernanceABI = "[{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"dkgSuccesses\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"notarySetSize\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"MinStake\",\"type\":\"uint256\"},{\"name\":\"LockupPeriod\",\"type\":\"uint256\"},{\"name\":\"MinGasPrice\",\"type\":\"uint256\"},{\"name\":\"BlockGasLimit\",\"type\":\"uint256\"},{\"name\":\"LambdaBA\",\"type\":\"uint256\"},{\"name\":\"LambdaDKG\",\"type\":\"uint256\"},{\"name\":\"NotaryParamAlpha\",\"type\":\"uint256\"},{\"name\":\"NotaryParamBeta\",\"type\":\"uint256\"},{\"name\":\"RoundLength\",\"type\":\"uint256\"},{\"name\":\"MinBlockInterval\",\"type\":\"uint256\"},{\"name\":\"FineValues\",\"type\":\"uint256[]\"}],\"name\":\"updateConfiguration\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"PublicKey\",\"type\":\"bytes\"}],\"name\":\"addDKGMasterPublicKey\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"nodes\",\"outputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"publicKey\",\"type\":\"bytes\"},{\"name\":\"staked\",\"type\":\"uint256\"},{\"name\":\"fined\",\"type\":\"uint256\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"location\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"unstaked\",\"type\":\"uint256\"},{\"name\":\"unstakedAt\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"notaryParamBeta\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"MPKReady\",\"type\":\"bytes\"}],\"name\":\"addDKGMPKReady\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"miningVelocity\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"Finalize\",\"type\":\"bytes\"}],\"name\":\"addDKGFinalize\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"lambdaBA\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"Amount\",\"type\":\"uint256\"}],\"name\":\"unstake\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"Type\",\"type\":\"uint256\"},{\"name\":\"Arg1\",\"type\":\"bytes\"},{\"name\":\"Arg2\",\"type\":\"bytes\"}],\"name\":\"report\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minStake\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"stake\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"NodeAddress\",\"type\":\"address\"}],\"name\":\"payFine\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"NewPublicKey\",\"type\":\"bytes\"}],\"name\":\"replaceNodePublicKey\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"NewOwner\",\"type\":\"address\"}],\"name\":\"transferNodeOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"crsRound\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"notaryParamAlpha\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"dkgSuccessesCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"Success\",\"type\":\"bytes\"}],\"name\":\"addDKGSuccess\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"withdrawable\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"NewSignedCRS\",\"type\":\"bytes\"}],\"name\":\"resetDKG\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"dkgFinalizeds\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"blockGasLimit\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"dkgRound\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"OldOwner\",\"type\":\"address\"},{\"name\":\"NewOwner\",\"type\":\"address\"}],\"name\":\"transferNodeOwnershipByFoundation\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalStaked\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"nodesOffsetByAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"crs\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"roundLength\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"nextHalvingSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"dkgComplaints\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"dkgMasterPublicKeyOffset\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"dkgMPKReadys\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"lastHalvedAmount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"finedRecords\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"lambdaDKG\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"Complaint\",\"type\":\"bytes\"}],\"name\":\"addDKGComplaint\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"fineValues\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"roundHeight\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"dkgMPKReadysCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minBlockInterval\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"Round\",\"type\":\"uint256\"},{\"name\":\"SignedCRS\",\"type\":\"bytes\"}],\"name\":\"proposeCRS\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"Name\",\"type\":\"string\"},{\"name\":\"Email\",\"type\":\"string\"},{\"name\":\"Location\",\"type\":\"string\"},{\"name\":\"Url\",\"type\":\"string\"}],\"name\":\"updateNodeInfo\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"dkgMasterPublicKeys\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"PublicKey\",\"type\":\"bytes\"},{\"name\":\"Name\",\"type\":\"string\"},{\"name\":\"Email\",\"type\":\"string\"},{\"name\":\"Location\",\"type\":\"string\"},{\"name\":\"Url\",\"type\":\"string\"}],\"name\":\"register\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"lastProposedHeight\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minGasPrice\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"dkgFinalizedsCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"dkgComplaintsProposed\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"nodesOffsetByNodeKeyAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"lockupPeriod\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"dkgResetCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"NewOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"nodesLength\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"ConfigurationChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"Round\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"CRS\",\"type\":\"bytes32\"}],\"name\":\"CRSProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"NodeAddress\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"NewOwnerAddress\",\"type\":\"address\"}],\"name\":\"NodeOwnershipTransfered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"NodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"PublicKey\",\"type\":\"bytes\"}],\"name\":\"NodePublicKeyReplaced\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"NodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"Amount\",\"type\":\"uint256\"}],\"name\":\"Staked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"NodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"Amount\",\"type\":\"uint256\"}],\"name\":\"Unstaked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"NodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"Amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"NodeAddress\",\"type\":\"address\"}],\"name\":\"NodeAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"NodeAddress\",\"type\":\"address\"}],\"name\":\"NodeRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"NodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"Type\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"Arg1\",\"type\":\"bytes\"},{\"indexed\":false,\"name\":\"Arg2\",\"type\":\"bytes\"}],\"name\":\"Reported\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"NodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"Amount\",\"type\":\"uint256\"}],\"name\":\"Fined\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"NodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"Amount\",\"type\":\"uint256\"}],\"name\":\"FinePaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"Round\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"BlockHeight\",\"type\":\"uint256\"}],\"name\":\"DKGReset\",\"type\":\"event\"}]" + +// GovernanceFuncSigs maps the 4-byte function signature to its string representation. +var GovernanceFuncSigs = map[string]string{ + + "ab6a4013": "addDKGComplaint(bytes)", + + "29891e74": "addDKGFinalize(bytes)", + + "22f8a889": "addDKGMPKReady(bytes)", + + "19cf10bc": "addDKGMasterPublicKey(bytes)", + + "4ccaa59d": "addDKGSuccess(bytes)", + + "7877a797": "blockGasLimit()", + + "8a591369": "crs()", + + "47731325": "crsRound()", + + "8d90a159": "dkgComplaints(uint256)", + + "e746714d": "dkgComplaintsProposed(bytes32)", + + "70f3ac54": "dkgFinalizeds(address)", + + "dd2083d0": "dkgFinalizedsCount()", + + "9bc9f489": "dkgMPKReadys(address)", + + "b03e75e4": "dkgMPKReadysCount()", + + "99aadb9a": "dkgMasterPublicKeyOffset(bytes32)", + + "d21abb78": "dkgMasterPublicKeys(uint256)", + + "f0771659": "dkgResetCount(uint256)", + + "7a8c1c1e": "dkgRound()", + + "072bf11a": "dkgSuccesses(address)", + + "4cb38c7a": "dkgSuccessesCount()", + + "ae1f289d": "fineValues(uint256)", + + "a1e460eb": "finedRecords(bytes32)", + + "2deb3316": "lambdaBA()", + + "a9601a8d": "lambdaDKG()", + + "a0488e55": "lastHalvedAmount()", + + "d767fdc9": "lastProposedHeight(address)", + + "ee947a7c": "lockupPeriod()", + + "b3606b56": "minBlockInterval()", + + "d96ed505": "minGasPrice()", + + "375b3c0a": "minStake()", + + "2357e72a": "miningVelocity()", + + "8ca55162": "nextHalvingSupply()", + + "1c53c280": "nodes(uint256)", + + "f33de6c0": "nodesLength()", + + "85031123": "nodesOffsetByAddress(address)", + + "ed3fbdf9": "nodesOffsetByNodeKeyAddress(address)", + + "4c523214": "notaryParamAlpha()", + + "1f29f5c8": "notaryParamBeta()", + + "0b3441dc": "notarySetSize()", + + "8da5cb5b": "owner()", + + "3edfa229": "payFine(address)", + + "c448af34": "proposeCRS(uint256,bytes)", + + "d242f4cc": "register(bytes,string,string,string,string)", + + "3f007c20": "replaceNodePublicKey(bytes)", + + "320c0826": "report(uint256,bytes,bytes)", + + "57316157": "resetDKG(bytes)", + + "af58ef06": "roundHeight(uint256)", + + "8b649b94": "roundLength()", + + "3a4b66f1": "stake()", + + "817b1cd2": "totalStaked()", + + "18160ddd": "totalSupply()", + + "4264ecf9": "transferNodeOwnership(address)", + + "7ecfdeca": "transferNodeOwnershipByFoundation(address,address)", + + "f2fde38b": "transferOwnership(address)", + + "2e17de78": "unstake(uint256)", + + "11c7c321": "updateConfiguration(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256[])", + + "c5ea6ea1": "updateNodeInfo(string,string,string,string)", + + "3ccfd60b": "withdraw()", + + "50188301": "withdrawable()", +} + +// GovernanceBin is the compiled bytecode used for deploying new contracts. +const GovernanceBin = `0x608060405234801561001057600080fd5b50611abc806100206000396000f3fe60806040526004361061038c5760003560e01c8063817b1cd2116101dc578063b03e75e411610102578063d96ed505116100a0578063ee947a7c1161006f578063ee947a7c1461144c578063f077165914611461578063f2fde38b1461148b578063f33de6c0146114be5761038c565b8063d96ed505146113c5578063dd2083d0146113da578063e746714d146113ef578063ed3fbdf9146114195761038c565b8063c5ea6ea1116100dc578063c5ea6ea114610e70578063d21abb78146110b0578063d242f4cc146110da578063d767fdc9146113925761038c565b8063b03e75e414610d8e578063b3606b5614610da3578063c448af3414610db85761038c565b806399aadb9a1161017a578063a9601a8d11610149578063a9601a8d14610d25578063ab6a401314610505578063ae1f289d14610d3a578063af58ef0614610d645761038c565b806399aadb9a14610c895780639bc9f48914610cb3578063a0488e5514610ce6578063a1e460eb14610cfb5761038c565b80638b649b94116101b65780638b649b9414610b8f5780638ca5516214610ba45780638d90a15914610bb95780638da5cb5b14610c585761038c565b8063817b1cd214610b325780638503112314610b475780638a59136914610b7a5761038c565b80633a4b66f1116102c15780634cb38c7a1161025f57806370f3ac541161022e57806370f3ac5414610a9a5780637877a79714610acd5780637a8c1c1e14610ae25780637ecfdeca14610af75761038c565b80634cb38c7a14610a705780634ccaa59d146105055780635018830114610a8557806357316157146105055761038c565b80633f007c201161029b5780633f007c20146105055780634264ecf914610a235780634773132514610a465780634c52321414610a5b5761038c565b80633a4b66f1146109e05780633ccfd60b146109e85780633edfa229146109fd5761038c565b806322f8a8891161032e5780632deb3316116103085780632deb33161461084f5780632e17de7814610864578063320c08261461088e578063375b3c0a146109cb5761038c565b806322f8a889146105055780632357e72a1461083a57806329891e74146105055761038c565b806318160ddd1161036a57806318160ddd146104f057806319cf10bc146105055780631c53c280146105b65780631f29f5c8146108255761038c565b8063072bf11a146103915780630b3441dc146103d857806311c7c321146103ff575b600080fd5b34801561039d57600080fd5b506103c4600480360360208110156103b457600080fd5b50356001600160a01b03166114d3565b604080519115158252519081900360200190f35b3480156103e457600080fd5b506103ed6114e8565b60408051918252519081900360200190f35b34801561040b57600080fd5b506104ee600480360361016081101561042357600080fd5b81359160208101359160408201359160608101359160808201359160a08101359160c08201359160e08101359161010082013591610120810135918101906101608101610140820135600160201b81111561047d57600080fd5b82018360208201111561048f57600080fd5b803590602001918460208302840111600160201b831117156104b057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506114ee945050505050565b005b3480156104fc57600080fd5b506103ed611512565b34801561051157600080fd5b506104ee6004803603602081101561052857600080fd5b810190602081018135600160201b81111561054257600080fd5b82018360208201111561055457600080fd5b803590602001918460018302840111600160201b8311171561057557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611518945050505050565b3480156105c257600080fd5b506105e0600480360360208110156105d957600080fd5b503561151b565b604051808b6001600160a01b03166001600160a01b03168152602001806020018a81526020018981526020018060200180602001806020018060200188815260200187815260200186810386528f818151815260200191508051906020019080838360005b8381101561065d578181015183820152602001610645565b50505050905090810190601f16801561068a5780820380516001836020036101000a031916815260200191505b5086810385528c5181528c516020918201918e019080838360005b838110156106bd5781810151838201526020016106a5565b50505050905090810190601f1680156106ea5780820380516001836020036101000a031916815260200191505b5086810384528b5181528b516020918201918d019080838360005b8381101561071d578181015183820152602001610705565b50505050905090810190601f16801561074a5780820380516001836020036101000a031916815260200191505b5086810383528a5181528a516020918201918c019080838360005b8381101561077d578181015183820152602001610765565b50505050905090810190601f1680156107aa5780820380516001836020036101000a031916815260200191505b5086810382528951815289516020918201918b019080838360005b838110156107dd5781810151838201526020016107c5565b50505050905090810190601f16801561080a5780820380516001836020036101000a031916815260200191505b509f5050505050505050505050505050505060405180910390f35b34801561083157600080fd5b506103ed611845565b34801561084657600080fd5b506103ed61184b565b34801561085b57600080fd5b506103ed611851565b34801561087057600080fd5b506104ee6004803603602081101561088757600080fd5b5035611518565b34801561089a57600080fd5b506104ee600480360360608110156108b157600080fd5b81359190810190604081016020820135600160201b8111156108d257600080fd5b8201836020820111156108e457600080fd5b803590602001918460018302840111600160201b8311171561090557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561095757600080fd5b82018360208201111561096957600080fd5b803590602001918460018302840111600160201b8311171561098a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611857945050505050565b3480156109d757600080fd5b506103ed61185c565b6104ee611862565b3480156109f457600080fd5b506104ee611862565b6104ee60048036036020811015610a1357600080fd5b50356001600160a01b0316611518565b348015610a2f57600080fd5b506104ee60048036036020811015610a1357600080fd5b348015610a5257600080fd5b506103ed611864565b348015610a6757600080fd5b506103ed61186a565b348015610a7c57600080fd5b506103ed611870565b348015610a9157600080fd5b506103c4611876565b348015610aa657600080fd5b506103c460048036036020811015610abd57600080fd5b50356001600160a01b031661187b565b348015610ad957600080fd5b506103ed611890565b348015610aee57600080fd5b506103ed611896565b348015610b0357600080fd5b506104ee60048036036040811015610b1a57600080fd5b506001600160a01b038135811691602001351661189c565b348015610b3e57600080fd5b506103ed6118a0565b348015610b5357600080fd5b506103ed60048036036020811015610b6a57600080fd5b50356001600160a01b03166118a6565b348015610b8657600080fd5b506103ed6118b8565b348015610b9b57600080fd5b506103ed6118be565b348015610bb057600080fd5b506103ed6118c4565b348015610bc557600080fd5b50610be360048036036020811015610bdc57600080fd5b50356118ca565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610c1d578181015183820152602001610c05565b50505050905090810190601f168015610c4a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c6457600080fd5b50610c6d611970565b604080516001600160a01b039092168252519081900360200190f35b348015610c9557600080fd5b506103ed60048036036020811015610cac57600080fd5b503561197f565b348015610cbf57600080fd5b506103c460048036036020811015610cd657600080fd5b50356001600160a01b0316611991565b348015610cf257600080fd5b506103ed6119a6565b348015610d0757600080fd5b506103c460048036036020811015610d1e57600080fd5b50356119ac565b348015610d3157600080fd5b506103ed6119c1565b348015610d4657600080fd5b506103ed60048036036020811015610d5d57600080fd5b50356119c7565b348015610d7057600080fd5b506103ed60048036036020811015610d8757600080fd5b50356119e5565b348015610d9a57600080fd5b506103ed6119f2565b348015610daf57600080fd5b506103ed6119f8565b348015610dc457600080fd5b506104ee60048036036040811015610ddb57600080fd5b81359190810190604081016020820135600160201b811115610dfc57600080fd5b820183602082011115610e0e57600080fd5b803590602001918460018302840111600160201b83111715610e2f57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061189c945050505050565b348015610e7c57600080fd5b506104ee60048036036080811015610e9357600080fd5b810190602081018135600160201b811115610ead57600080fd5b820183602082011115610ebf57600080fd5b803590602001918460018302840111600160201b83111715610ee057600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610f3257600080fd5b820183602082011115610f4457600080fd5b803590602001918460018302840111600160201b83111715610f6557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610fb757600080fd5b820183602082011115610fc957600080fd5b803590602001918460018302840111600160201b83111715610fea57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561103c57600080fd5b82018360208201111561104e57600080fd5b803590602001918460018302840111600160201b8311171561106f57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506119fe945050505050565b3480156110bc57600080fd5b50610be3600480360360208110156110d357600080fd5b5035611a04565b6104ee600480360360a08110156110f057600080fd5b810190602081018135600160201b81111561110a57600080fd5b82018360208201111561111c57600080fd5b803590602001918460018302840111600160201b8311171561113d57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561118f57600080fd5b8201836020820111156111a157600080fd5b803590602001918460018302840111600160201b831117156111c257600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561121457600080fd5b82018360208201111561122657600080fd5b803590602001918460018302840111600160201b8311171561124757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561129957600080fd5b8201836020820111156112ab57600080fd5b803590602001918460018302840111600160201b831117156112cc57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561131e57600080fd5b82018360208201111561133057600080fd5b803590602001918460018302840111600160201b8311171561135157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611a11945050505050565b34801561139e57600080fd5b506103ed600480360360208110156113b557600080fd5b50356001600160a01b0316611a18565b3480156113d157600080fd5b506103ed611a2a565b3480156113e657600080fd5b506103ed611a30565b3480156113fb57600080fd5b506103c46004803603602081101561141257600080fd5b5035611a36565b34801561142557600080fd5b506103ed6004803603602081101561143c57600080fd5b50356001600160a01b0316611a4b565b34801561145857600080fd5b506103ed611a5d565b34801561146d57600080fd5b506103ed6004803603602081101561148457600080fd5b5035611a63565b34801561149757600080fd5b506104ee600480360360208110156114ae57600080fd5b50356001600160a01b0316611a70565b3480156114ca57600080fd5b506103ed611876565b60136020526000908152604090205460ff1681565b601f5481565b6015546001600160a01b0316331461150557600080fd5b5050505050505050505050565b60015481565b50565b6003818154811061152857fe5b6000918252602091829020600a9091020180546001808301805460408051601f60026000199685161561010002969096019093169490940491820187900487028401870190528083526001600160a01b0390931695509293909291908301828280156115d55780601f106115aa576101008083540402835291602001916115d5565b820191906000526020600020905b8154815290600101906020018083116115b857829003601f168201915b505050505090806002015490806003015490806004018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561167f5780601f106116545761010080835404028352916020019161167f565b820191906000526020600020905b81548152906001019060200180831161166257829003601f168201915b5050505060058301805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815294959493509083018282801561170f5780601f106116e45761010080835404028352916020019161170f565b820191906000526020600020905b8154815290600101906020018083116116f257829003601f168201915b5050505060068301805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815294959493509083018282801561179f5780601f106117745761010080835404028352916020019161179f565b820191906000526020600020905b81548152906001019060200180831161178257829003601f168201915b5050505060078301805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815294959493509083018282801561182f5780601f106118045761010080835404028352916020019161182f565b820191906000526020600020905b81548152906001019060200180831161181257829003601f168201915b505050505090806008015490806009015490508a565b60215481565b60185481565b601d5481565b505050565b60165481565b565b60075481565b60205481565b60145481565b600090565b60116020526000908152604090205460ff1681565b601c5481565b60095481565b5050565b60025481565b60046020526000908152604090205481565b60085481565b60225481565b60195481565b600d81815481106118d757fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152935090918301828280156119685780601f1061193d57610100808354040283529160200191611968565b820191906000526020600020905b81548152906001019060200180831161194b57829003601f168201915b505050505081565b6015546001600160a01b031681565b600c6020526000908152604090205481565b600f6020526000908152604090205460ff1681565b601a5481565b60256020526000908152604090205460ff1681565b601e5481565b602481815481106119d457fe5b600091825260209091200154905081565b600081815481106119d457fe5b60105481565b60235481565b50505050565b600b81815481106118d757fe5b5050505050565b60066020526000908152604090205481565b601b5481565b60125481565b600e6020526000908152604090205460ff1681565b60056020526000908152604090205481565b60175481565b600a81815481106119d457fe5b6015546001600160a01b0316331461151857600080fdfea265627a7a723058209455fe1d223ee2f67e258f5526b5c272bb000f775541bcb469c3def1b40ad0cc64736f6c634300050a0032` + +// DeployGovernance deploys a new Ethereum contract, binding an instance of Governance to it. +func DeployGovernance(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Governance, error) { + parsed, err := abi.JSON(strings.NewReader(GovernanceABI)) + if err != nil { + return common.Address{}, nil, nil, err + } + address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(GovernanceBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &Governance{GovernanceCaller: GovernanceCaller{contract: contract}, GovernanceTransactor: GovernanceTransactor{contract: contract}, GovernanceFilterer: GovernanceFilterer{contract: contract}}, nil +} + +// Governance is an auto generated Go binding around an Ethereum contract. +type Governance struct { + GovernanceCaller // Read-only binding to the contract + GovernanceTransactor // Write-only binding to the contract + GovernanceFilterer // Log filterer for contract events +} + +// GovernanceCaller is an auto generated read-only Go binding around an Ethereum contract. +type GovernanceCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// GovernanceTransactor is an auto generated write-only Go binding around an Ethereum contract. +type GovernanceTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// GovernanceFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type GovernanceFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// GovernanceSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type GovernanceSession struct { + Contract *Governance // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// GovernanceCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type GovernanceCallerSession struct { + Contract *GovernanceCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// GovernanceTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type GovernanceTransactorSession struct { + Contract *GovernanceTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// GovernanceRaw is an auto generated low-level Go binding around an Ethereum contract. +type GovernanceRaw struct { + Contract *Governance // Generic contract binding to access the raw methods on +} + +// GovernanceCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type GovernanceCallerRaw struct { + Contract *GovernanceCaller // Generic read-only contract binding to access the raw methods on +} + +// GovernanceTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type GovernanceTransactorRaw struct { + Contract *GovernanceTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewGovernance creates a new instance of Governance, bound to a specific deployed contract. +func NewGovernance(address common.Address, backend bind.ContractBackend) (*Governance, error) { + contract, err := bindGovernance(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Governance{GovernanceCaller: GovernanceCaller{contract: contract}, GovernanceTransactor: GovernanceTransactor{contract: contract}, GovernanceFilterer: GovernanceFilterer{contract: contract}}, nil +} + +// NewGovernanceCaller creates a new read-only instance of Governance, bound to a specific deployed contract. +func NewGovernanceCaller(address common.Address, caller bind.ContractCaller) (*GovernanceCaller, error) { + contract, err := bindGovernance(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &GovernanceCaller{contract: contract}, nil +} + +// NewGovernanceTransactor creates a new write-only instance of Governance, bound to a specific deployed contract. +func NewGovernanceTransactor(address common.Address, transactor bind.ContractTransactor) (*GovernanceTransactor, error) { + contract, err := bindGovernance(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &GovernanceTransactor{contract: contract}, nil +} + +// NewGovernanceFilterer creates a new log filterer instance of Governance, bound to a specific deployed contract. +func NewGovernanceFilterer(address common.Address, filterer bind.ContractFilterer) (*GovernanceFilterer, error) { + contract, err := bindGovernance(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &GovernanceFilterer{contract: contract}, nil +} + +// bindGovernance binds a generic wrapper to an already deployed contract. +func bindGovernance(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := abi.JSON(strings.NewReader(GovernanceABI)) + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Governance *GovernanceRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { + return _Governance.Contract.GovernanceCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Governance *GovernanceRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Governance.Contract.GovernanceTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Governance *GovernanceRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Governance.Contract.GovernanceTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Governance *GovernanceCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { + return _Governance.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Governance *GovernanceTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Governance.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Governance *GovernanceTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Governance.Contract.contract.Transact(opts, method, params...) +} + +// BlockGasLimit is a free data retrieval call binding the contract method 0x7877a797. +// +// Solidity: function blockGasLimit() constant returns(uint256) +func (_Governance *GovernanceCaller) BlockGasLimit(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "blockGasLimit") + return *ret0, err +} + +// BlockGasLimit is a free data retrieval call binding the contract method 0x7877a797. +// +// Solidity: function blockGasLimit() constant returns(uint256) +func (_Governance *GovernanceSession) BlockGasLimit() (*big.Int, error) { + return _Governance.Contract.BlockGasLimit(&_Governance.CallOpts) +} + +// BlockGasLimit is a free data retrieval call binding the contract method 0x7877a797. +// +// Solidity: function blockGasLimit() constant returns(uint256) +func (_Governance *GovernanceCallerSession) BlockGasLimit() (*big.Int, error) { + return _Governance.Contract.BlockGasLimit(&_Governance.CallOpts) +} + +// Crs is a free data retrieval call binding the contract method 0x8a591369. +// +// Solidity: function crs() constant returns(bytes32) +func (_Governance *GovernanceCaller) Crs(opts *bind.CallOpts) ([32]byte, error) { + var ( + ret0 = new([32]byte) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "crs") + return *ret0, err +} + +// Crs is a free data retrieval call binding the contract method 0x8a591369. +// +// Solidity: function crs() constant returns(bytes32) +func (_Governance *GovernanceSession) Crs() ([32]byte, error) { + return _Governance.Contract.Crs(&_Governance.CallOpts) +} + +// Crs is a free data retrieval call binding the contract method 0x8a591369. +// +// Solidity: function crs() constant returns(bytes32) +func (_Governance *GovernanceCallerSession) Crs() ([32]byte, error) { + return _Governance.Contract.Crs(&_Governance.CallOpts) +} + +// CrsRound is a free data retrieval call binding the contract method 0x47731325. +// +// Solidity: function crsRound() constant returns(uint256) +func (_Governance *GovernanceCaller) CrsRound(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "crsRound") + return *ret0, err +} + +// CrsRound is a free data retrieval call binding the contract method 0x47731325. +// +// Solidity: function crsRound() constant returns(uint256) +func (_Governance *GovernanceSession) CrsRound() (*big.Int, error) { + return _Governance.Contract.CrsRound(&_Governance.CallOpts) +} + +// CrsRound is a free data retrieval call binding the contract method 0x47731325. +// +// Solidity: function crsRound() constant returns(uint256) +func (_Governance *GovernanceCallerSession) CrsRound() (*big.Int, error) { + return _Governance.Contract.CrsRound(&_Governance.CallOpts) +} + +// DkgComplaints is a free data retrieval call binding the contract method 0x8d90a159. +// +// Solidity: function dkgComplaints(uint256 ) constant returns(bytes) +func (_Governance *GovernanceCaller) DkgComplaints(opts *bind.CallOpts, arg0 *big.Int) ([]byte, error) { + var ( + ret0 = new([]byte) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "dkgComplaints", arg0) + return *ret0, err +} + +// DkgComplaints is a free data retrieval call binding the contract method 0x8d90a159. +// +// Solidity: function dkgComplaints(uint256 ) constant returns(bytes) +func (_Governance *GovernanceSession) DkgComplaints(arg0 *big.Int) ([]byte, error) { + return _Governance.Contract.DkgComplaints(&_Governance.CallOpts, arg0) +} + +// DkgComplaints is a free data retrieval call binding the contract method 0x8d90a159. +// +// Solidity: function dkgComplaints(uint256 ) constant returns(bytes) +func (_Governance *GovernanceCallerSession) DkgComplaints(arg0 *big.Int) ([]byte, error) { + return _Governance.Contract.DkgComplaints(&_Governance.CallOpts, arg0) +} + +// DkgComplaintsProposed is a free data retrieval call binding the contract method 0xe746714d. +// +// Solidity: function dkgComplaintsProposed(bytes32 ) constant returns(bool) +func (_Governance *GovernanceCaller) DkgComplaintsProposed(opts *bind.CallOpts, arg0 [32]byte) (bool, error) { + var ( + ret0 = new(bool) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "dkgComplaintsProposed", arg0) + return *ret0, err +} + +// DkgComplaintsProposed is a free data retrieval call binding the contract method 0xe746714d. +// +// Solidity: function dkgComplaintsProposed(bytes32 ) constant returns(bool) +func (_Governance *GovernanceSession) DkgComplaintsProposed(arg0 [32]byte) (bool, error) { + return _Governance.Contract.DkgComplaintsProposed(&_Governance.CallOpts, arg0) +} + +// DkgComplaintsProposed is a free data retrieval call binding the contract method 0xe746714d. +// +// Solidity: function dkgComplaintsProposed(bytes32 ) constant returns(bool) +func (_Governance *GovernanceCallerSession) DkgComplaintsProposed(arg0 [32]byte) (bool, error) { + return _Governance.Contract.DkgComplaintsProposed(&_Governance.CallOpts, arg0) +} + +// DkgFinalizeds is a free data retrieval call binding the contract method 0x70f3ac54. +// +// Solidity: function dkgFinalizeds(address ) constant returns(bool) +func (_Governance *GovernanceCaller) DkgFinalizeds(opts *bind.CallOpts, arg0 common.Address) (bool, error) { + var ( + ret0 = new(bool) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "dkgFinalizeds", arg0) + return *ret0, err +} + +// DkgFinalizeds is a free data retrieval call binding the contract method 0x70f3ac54. +// +// Solidity: function dkgFinalizeds(address ) constant returns(bool) +func (_Governance *GovernanceSession) DkgFinalizeds(arg0 common.Address) (bool, error) { + return _Governance.Contract.DkgFinalizeds(&_Governance.CallOpts, arg0) +} + +// DkgFinalizeds is a free data retrieval call binding the contract method 0x70f3ac54. +// +// Solidity: function dkgFinalizeds(address ) constant returns(bool) +func (_Governance *GovernanceCallerSession) DkgFinalizeds(arg0 common.Address) (bool, error) { + return _Governance.Contract.DkgFinalizeds(&_Governance.CallOpts, arg0) +} + +// DkgFinalizedsCount is a free data retrieval call binding the contract method 0xdd2083d0. +// +// Solidity: function dkgFinalizedsCount() constant returns(uint256) +func (_Governance *GovernanceCaller) DkgFinalizedsCount(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "dkgFinalizedsCount") + return *ret0, err +} + +// DkgFinalizedsCount is a free data retrieval call binding the contract method 0xdd2083d0. +// +// Solidity: function dkgFinalizedsCount() constant returns(uint256) +func (_Governance *GovernanceSession) DkgFinalizedsCount() (*big.Int, error) { + return _Governance.Contract.DkgFinalizedsCount(&_Governance.CallOpts) +} + +// DkgFinalizedsCount is a free data retrieval call binding the contract method 0xdd2083d0. +// +// Solidity: function dkgFinalizedsCount() constant returns(uint256) +func (_Governance *GovernanceCallerSession) DkgFinalizedsCount() (*big.Int, error) { + return _Governance.Contract.DkgFinalizedsCount(&_Governance.CallOpts) +} + +// DkgMPKReadys is a free data retrieval call binding the contract method 0x9bc9f489. +// +// Solidity: function dkgMPKReadys(address ) constant returns(bool) +func (_Governance *GovernanceCaller) DkgMPKReadys(opts *bind.CallOpts, arg0 common.Address) (bool, error) { + var ( + ret0 = new(bool) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "dkgMPKReadys", arg0) + return *ret0, err +} + +// DkgMPKReadys is a free data retrieval call binding the contract method 0x9bc9f489. +// +// Solidity: function dkgMPKReadys(address ) constant returns(bool) +func (_Governance *GovernanceSession) DkgMPKReadys(arg0 common.Address) (bool, error) { + return _Governance.Contract.DkgMPKReadys(&_Governance.CallOpts, arg0) +} + +// DkgMPKReadys is a free data retrieval call binding the contract method 0x9bc9f489. +// +// Solidity: function dkgMPKReadys(address ) constant returns(bool) +func (_Governance *GovernanceCallerSession) DkgMPKReadys(arg0 common.Address) (bool, error) { + return _Governance.Contract.DkgMPKReadys(&_Governance.CallOpts, arg0) +} + +// DkgMPKReadysCount is a free data retrieval call binding the contract method 0xb03e75e4. +// +// Solidity: function dkgMPKReadysCount() constant returns(uint256) +func (_Governance *GovernanceCaller) DkgMPKReadysCount(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "dkgMPKReadysCount") + return *ret0, err +} + +// DkgMPKReadysCount is a free data retrieval call binding the contract method 0xb03e75e4. +// +// Solidity: function dkgMPKReadysCount() constant returns(uint256) +func (_Governance *GovernanceSession) DkgMPKReadysCount() (*big.Int, error) { + return _Governance.Contract.DkgMPKReadysCount(&_Governance.CallOpts) +} + +// DkgMPKReadysCount is a free data retrieval call binding the contract method 0xb03e75e4. +// +// Solidity: function dkgMPKReadysCount() constant returns(uint256) +func (_Governance *GovernanceCallerSession) DkgMPKReadysCount() (*big.Int, error) { + return _Governance.Contract.DkgMPKReadysCount(&_Governance.CallOpts) +} + +// DkgMasterPublicKeyOffset is a free data retrieval call binding the contract method 0x99aadb9a. +// +// Solidity: function dkgMasterPublicKeyOffset(bytes32 ) constant returns(uint256) +func (_Governance *GovernanceCaller) DkgMasterPublicKeyOffset(opts *bind.CallOpts, arg0 [32]byte) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "dkgMasterPublicKeyOffset", arg0) + return *ret0, err +} + +// DkgMasterPublicKeyOffset is a free data retrieval call binding the contract method 0x99aadb9a. +// +// Solidity: function dkgMasterPublicKeyOffset(bytes32 ) constant returns(uint256) +func (_Governance *GovernanceSession) DkgMasterPublicKeyOffset(arg0 [32]byte) (*big.Int, error) { + return _Governance.Contract.DkgMasterPublicKeyOffset(&_Governance.CallOpts, arg0) +} + +// DkgMasterPublicKeyOffset is a free data retrieval call binding the contract method 0x99aadb9a. +// +// Solidity: function dkgMasterPublicKeyOffset(bytes32 ) constant returns(uint256) +func (_Governance *GovernanceCallerSession) DkgMasterPublicKeyOffset(arg0 [32]byte) (*big.Int, error) { + return _Governance.Contract.DkgMasterPublicKeyOffset(&_Governance.CallOpts, arg0) +} + +// DkgMasterPublicKeys is a free data retrieval call binding the contract method 0xd21abb78. +// +// Solidity: function dkgMasterPublicKeys(uint256 ) constant returns(bytes) +func (_Governance *GovernanceCaller) DkgMasterPublicKeys(opts *bind.CallOpts, arg0 *big.Int) ([]byte, error) { + var ( + ret0 = new([]byte) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "dkgMasterPublicKeys", arg0) + return *ret0, err +} + +// DkgMasterPublicKeys is a free data retrieval call binding the contract method 0xd21abb78. +// +// Solidity: function dkgMasterPublicKeys(uint256 ) constant returns(bytes) +func (_Governance *GovernanceSession) DkgMasterPublicKeys(arg0 *big.Int) ([]byte, error) { + return _Governance.Contract.DkgMasterPublicKeys(&_Governance.CallOpts, arg0) +} + +// DkgMasterPublicKeys is a free data retrieval call binding the contract method 0xd21abb78. +// +// Solidity: function dkgMasterPublicKeys(uint256 ) constant returns(bytes) +func (_Governance *GovernanceCallerSession) DkgMasterPublicKeys(arg0 *big.Int) ([]byte, error) { + return _Governance.Contract.DkgMasterPublicKeys(&_Governance.CallOpts, arg0) +} + +// DkgResetCount is a free data retrieval call binding the contract method 0xf0771659. +// +// Solidity: function dkgResetCount(uint256 ) constant returns(uint256) +func (_Governance *GovernanceCaller) DkgResetCount(opts *bind.CallOpts, arg0 *big.Int) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "dkgResetCount", arg0) + return *ret0, err +} + +// DkgResetCount is a free data retrieval call binding the contract method 0xf0771659. +// +// Solidity: function dkgResetCount(uint256 ) constant returns(uint256) +func (_Governance *GovernanceSession) DkgResetCount(arg0 *big.Int) (*big.Int, error) { + return _Governance.Contract.DkgResetCount(&_Governance.CallOpts, arg0) +} + +// DkgResetCount is a free data retrieval call binding the contract method 0xf0771659. +// +// Solidity: function dkgResetCount(uint256 ) constant returns(uint256) +func (_Governance *GovernanceCallerSession) DkgResetCount(arg0 *big.Int) (*big.Int, error) { + return _Governance.Contract.DkgResetCount(&_Governance.CallOpts, arg0) +} + +// DkgRound is a free data retrieval call binding the contract method 0x7a8c1c1e. +// +// Solidity: function dkgRound() constant returns(uint256) +func (_Governance *GovernanceCaller) DkgRound(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "dkgRound") + return *ret0, err +} + +// DkgRound is a free data retrieval call binding the contract method 0x7a8c1c1e. +// +// Solidity: function dkgRound() constant returns(uint256) +func (_Governance *GovernanceSession) DkgRound() (*big.Int, error) { + return _Governance.Contract.DkgRound(&_Governance.CallOpts) +} + +// DkgRound is a free data retrieval call binding the contract method 0x7a8c1c1e. +// +// Solidity: function dkgRound() constant returns(uint256) +func (_Governance *GovernanceCallerSession) DkgRound() (*big.Int, error) { + return _Governance.Contract.DkgRound(&_Governance.CallOpts) +} + +// DkgSuccesses is a free data retrieval call binding the contract method 0x072bf11a. +// +// Solidity: function dkgSuccesses(address ) constant returns(bool) +func (_Governance *GovernanceCaller) DkgSuccesses(opts *bind.CallOpts, arg0 common.Address) (bool, error) { + var ( + ret0 = new(bool) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "dkgSuccesses", arg0) + return *ret0, err +} + +// DkgSuccesses is a free data retrieval call binding the contract method 0x072bf11a. +// +// Solidity: function dkgSuccesses(address ) constant returns(bool) +func (_Governance *GovernanceSession) DkgSuccesses(arg0 common.Address) (bool, error) { + return _Governance.Contract.DkgSuccesses(&_Governance.CallOpts, arg0) +} + +// DkgSuccesses is a free data retrieval call binding the contract method 0x072bf11a. +// +// Solidity: function dkgSuccesses(address ) constant returns(bool) +func (_Governance *GovernanceCallerSession) DkgSuccesses(arg0 common.Address) (bool, error) { + return _Governance.Contract.DkgSuccesses(&_Governance.CallOpts, arg0) +} + +// DkgSuccessesCount is a free data retrieval call binding the contract method 0x4cb38c7a. +// +// Solidity: function dkgSuccessesCount() constant returns(uint256) +func (_Governance *GovernanceCaller) DkgSuccessesCount(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "dkgSuccessesCount") + return *ret0, err +} + +// DkgSuccessesCount is a free data retrieval call binding the contract method 0x4cb38c7a. +// +// Solidity: function dkgSuccessesCount() constant returns(uint256) +func (_Governance *GovernanceSession) DkgSuccessesCount() (*big.Int, error) { + return _Governance.Contract.DkgSuccessesCount(&_Governance.CallOpts) +} + +// DkgSuccessesCount is a free data retrieval call binding the contract method 0x4cb38c7a. +// +// Solidity: function dkgSuccessesCount() constant returns(uint256) +func (_Governance *GovernanceCallerSession) DkgSuccessesCount() (*big.Int, error) { + return _Governance.Contract.DkgSuccessesCount(&_Governance.CallOpts) +} + +// FineValues is a free data retrieval call binding the contract method 0xae1f289d. +// +// Solidity: function fineValues(uint256 ) constant returns(uint256) +func (_Governance *GovernanceCaller) FineValues(opts *bind.CallOpts, arg0 *big.Int) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "fineValues", arg0) + return *ret0, err +} + +// FineValues is a free data retrieval call binding the contract method 0xae1f289d. +// +// Solidity: function fineValues(uint256 ) constant returns(uint256) +func (_Governance *GovernanceSession) FineValues(arg0 *big.Int) (*big.Int, error) { + return _Governance.Contract.FineValues(&_Governance.CallOpts, arg0) +} + +// FineValues is a free data retrieval call binding the contract method 0xae1f289d. +// +// Solidity: function fineValues(uint256 ) constant returns(uint256) +func (_Governance *GovernanceCallerSession) FineValues(arg0 *big.Int) (*big.Int, error) { + return _Governance.Contract.FineValues(&_Governance.CallOpts, arg0) +} + +// FinedRecords is a free data retrieval call binding the contract method 0xa1e460eb. +// +// Solidity: function finedRecords(bytes32 ) constant returns(bool) +func (_Governance *GovernanceCaller) FinedRecords(opts *bind.CallOpts, arg0 [32]byte) (bool, error) { + var ( + ret0 = new(bool) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "finedRecords", arg0) + return *ret0, err +} + +// FinedRecords is a free data retrieval call binding the contract method 0xa1e460eb. +// +// Solidity: function finedRecords(bytes32 ) constant returns(bool) +func (_Governance *GovernanceSession) FinedRecords(arg0 [32]byte) (bool, error) { + return _Governance.Contract.FinedRecords(&_Governance.CallOpts, arg0) +} + +// FinedRecords is a free data retrieval call binding the contract method 0xa1e460eb. +// +// Solidity: function finedRecords(bytes32 ) constant returns(bool) +func (_Governance *GovernanceCallerSession) FinedRecords(arg0 [32]byte) (bool, error) { + return _Governance.Contract.FinedRecords(&_Governance.CallOpts, arg0) +} + +// LambdaBA is a free data retrieval call binding the contract method 0x2deb3316. +// +// Solidity: function lambdaBA() constant returns(uint256) +func (_Governance *GovernanceCaller) LambdaBA(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "lambdaBA") + return *ret0, err +} + +// LambdaBA is a free data retrieval call binding the contract method 0x2deb3316. +// +// Solidity: function lambdaBA() constant returns(uint256) +func (_Governance *GovernanceSession) LambdaBA() (*big.Int, error) { + return _Governance.Contract.LambdaBA(&_Governance.CallOpts) +} + +// LambdaBA is a free data retrieval call binding the contract method 0x2deb3316. +// +// Solidity: function lambdaBA() constant returns(uint256) +func (_Governance *GovernanceCallerSession) LambdaBA() (*big.Int, error) { + return _Governance.Contract.LambdaBA(&_Governance.CallOpts) +} + +// LambdaDKG is a free data retrieval call binding the contract method 0xa9601a8d. +// +// Solidity: function lambdaDKG() constant returns(uint256) +func (_Governance *GovernanceCaller) LambdaDKG(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "lambdaDKG") + return *ret0, err +} + +// LambdaDKG is a free data retrieval call binding the contract method 0xa9601a8d. +// +// Solidity: function lambdaDKG() constant returns(uint256) +func (_Governance *GovernanceSession) LambdaDKG() (*big.Int, error) { + return _Governance.Contract.LambdaDKG(&_Governance.CallOpts) +} + +// LambdaDKG is a free data retrieval call binding the contract method 0xa9601a8d. +// +// Solidity: function lambdaDKG() constant returns(uint256) +func (_Governance *GovernanceCallerSession) LambdaDKG() (*big.Int, error) { + return _Governance.Contract.LambdaDKG(&_Governance.CallOpts) +} + +// LastHalvedAmount is a free data retrieval call binding the contract method 0xa0488e55. +// +// Solidity: function lastHalvedAmount() constant returns(uint256) +func (_Governance *GovernanceCaller) LastHalvedAmount(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "lastHalvedAmount") + return *ret0, err +} + +// LastHalvedAmount is a free data retrieval call binding the contract method 0xa0488e55. +// +// Solidity: function lastHalvedAmount() constant returns(uint256) +func (_Governance *GovernanceSession) LastHalvedAmount() (*big.Int, error) { + return _Governance.Contract.LastHalvedAmount(&_Governance.CallOpts) +} + +// LastHalvedAmount is a free data retrieval call binding the contract method 0xa0488e55. +// +// Solidity: function lastHalvedAmount() constant returns(uint256) +func (_Governance *GovernanceCallerSession) LastHalvedAmount() (*big.Int, error) { + return _Governance.Contract.LastHalvedAmount(&_Governance.CallOpts) +} + +// LastProposedHeight is a free data retrieval call binding the contract method 0xd767fdc9. +// +// Solidity: function lastProposedHeight(address ) constant returns(uint256) +func (_Governance *GovernanceCaller) LastProposedHeight(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "lastProposedHeight", arg0) + return *ret0, err +} + +// LastProposedHeight is a free data retrieval call binding the contract method 0xd767fdc9. +// +// Solidity: function lastProposedHeight(address ) constant returns(uint256) +func (_Governance *GovernanceSession) LastProposedHeight(arg0 common.Address) (*big.Int, error) { + return _Governance.Contract.LastProposedHeight(&_Governance.CallOpts, arg0) +} + +// LastProposedHeight is a free data retrieval call binding the contract method 0xd767fdc9. +// +// Solidity: function lastProposedHeight(address ) constant returns(uint256) +func (_Governance *GovernanceCallerSession) LastProposedHeight(arg0 common.Address) (*big.Int, error) { + return _Governance.Contract.LastProposedHeight(&_Governance.CallOpts, arg0) +} + +// LockupPeriod is a free data retrieval call binding the contract method 0xee947a7c. +// +// Solidity: function lockupPeriod() constant returns(uint256) +func (_Governance *GovernanceCaller) LockupPeriod(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "lockupPeriod") + return *ret0, err +} + +// LockupPeriod is a free data retrieval call binding the contract method 0xee947a7c. +// +// Solidity: function lockupPeriod() constant returns(uint256) +func (_Governance *GovernanceSession) LockupPeriod() (*big.Int, error) { + return _Governance.Contract.LockupPeriod(&_Governance.CallOpts) +} + +// LockupPeriod is a free data retrieval call binding the contract method 0xee947a7c. +// +// Solidity: function lockupPeriod() constant returns(uint256) +func (_Governance *GovernanceCallerSession) LockupPeriod() (*big.Int, error) { + return _Governance.Contract.LockupPeriod(&_Governance.CallOpts) +} + +// MinBlockInterval is a free data retrieval call binding the contract method 0xb3606b56. +// +// Solidity: function minBlockInterval() constant returns(uint256) +func (_Governance *GovernanceCaller) MinBlockInterval(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "minBlockInterval") + return *ret0, err +} + +// MinBlockInterval is a free data retrieval call binding the contract method 0xb3606b56. +// +// Solidity: function minBlockInterval() constant returns(uint256) +func (_Governance *GovernanceSession) MinBlockInterval() (*big.Int, error) { + return _Governance.Contract.MinBlockInterval(&_Governance.CallOpts) +} + +// MinBlockInterval is a free data retrieval call binding the contract method 0xb3606b56. +// +// Solidity: function minBlockInterval() constant returns(uint256) +func (_Governance *GovernanceCallerSession) MinBlockInterval() (*big.Int, error) { + return _Governance.Contract.MinBlockInterval(&_Governance.CallOpts) +} + +// MinGasPrice is a free data retrieval call binding the contract method 0xd96ed505. +// +// Solidity: function minGasPrice() constant returns(uint256) +func (_Governance *GovernanceCaller) MinGasPrice(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "minGasPrice") + return *ret0, err +} + +// MinGasPrice is a free data retrieval call binding the contract method 0xd96ed505. +// +// Solidity: function minGasPrice() constant returns(uint256) +func (_Governance *GovernanceSession) MinGasPrice() (*big.Int, error) { + return _Governance.Contract.MinGasPrice(&_Governance.CallOpts) +} + +// MinGasPrice is a free data retrieval call binding the contract method 0xd96ed505. +// +// Solidity: function minGasPrice() constant returns(uint256) +func (_Governance *GovernanceCallerSession) MinGasPrice() (*big.Int, error) { + return _Governance.Contract.MinGasPrice(&_Governance.CallOpts) +} + +// MinStake is a free data retrieval call binding the contract method 0x375b3c0a. +// +// Solidity: function minStake() constant returns(uint256) +func (_Governance *GovernanceCaller) MinStake(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "minStake") + return *ret0, err +} + +// MinStake is a free data retrieval call binding the contract method 0x375b3c0a. +// +// Solidity: function minStake() constant returns(uint256) +func (_Governance *GovernanceSession) MinStake() (*big.Int, error) { + return _Governance.Contract.MinStake(&_Governance.CallOpts) +} + +// MinStake is a free data retrieval call binding the contract method 0x375b3c0a. +// +// Solidity: function minStake() constant returns(uint256) +func (_Governance *GovernanceCallerSession) MinStake() (*big.Int, error) { + return _Governance.Contract.MinStake(&_Governance.CallOpts) +} + +// MiningVelocity is a free data retrieval call binding the contract method 0x2357e72a. +// +// Solidity: function miningVelocity() constant returns(uint256) +func (_Governance *GovernanceCaller) MiningVelocity(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "miningVelocity") + return *ret0, err +} + +// MiningVelocity is a free data retrieval call binding the contract method 0x2357e72a. +// +// Solidity: function miningVelocity() constant returns(uint256) +func (_Governance *GovernanceSession) MiningVelocity() (*big.Int, error) { + return _Governance.Contract.MiningVelocity(&_Governance.CallOpts) +} + +// MiningVelocity is a free data retrieval call binding the contract method 0x2357e72a. +// +// Solidity: function miningVelocity() constant returns(uint256) +func (_Governance *GovernanceCallerSession) MiningVelocity() (*big.Int, error) { + return _Governance.Contract.MiningVelocity(&_Governance.CallOpts) +} + +// NextHalvingSupply is a free data retrieval call binding the contract method 0x8ca55162. +// +// Solidity: function nextHalvingSupply() constant returns(uint256) +func (_Governance *GovernanceCaller) NextHalvingSupply(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "nextHalvingSupply") + return *ret0, err +} + +// NextHalvingSupply is a free data retrieval call binding the contract method 0x8ca55162. +// +// Solidity: function nextHalvingSupply() constant returns(uint256) +func (_Governance *GovernanceSession) NextHalvingSupply() (*big.Int, error) { + return _Governance.Contract.NextHalvingSupply(&_Governance.CallOpts) +} + +// NextHalvingSupply is a free data retrieval call binding the contract method 0x8ca55162. +// +// Solidity: function nextHalvingSupply() constant returns(uint256) +func (_Governance *GovernanceCallerSession) NextHalvingSupply() (*big.Int, error) { + return _Governance.Contract.NextHalvingSupply(&_Governance.CallOpts) +} + +// Nodes is a free data retrieval call binding the contract method 0x1c53c280. +// +// Solidity: function nodes(uint256 ) constant returns(address owner, bytes publicKey, uint256 staked, uint256 fined, string name, string email, string location, string url, uint256 unstaked, uint256 unstakedAt) +func (_Governance *GovernanceCaller) Nodes(opts *bind.CallOpts, arg0 *big.Int) (struct { + Owner common.Address + PublicKey []byte + Staked *big.Int + Fined *big.Int + Name string + Email string + Location string + Url string + Unstaked *big.Int + UnstakedAt *big.Int +}, error) { + ret := new(struct { + Owner common.Address + PublicKey []byte + Staked *big.Int + Fined *big.Int + Name string + Email string + Location string + Url string + Unstaked *big.Int + UnstakedAt *big.Int + }) + out := ret + err := _Governance.contract.Call(opts, out, "nodes", arg0) + return *ret, err +} + +// Nodes is a free data retrieval call binding the contract method 0x1c53c280. +// +// Solidity: function nodes(uint256 ) constant returns(address owner, bytes publicKey, uint256 staked, uint256 fined, string name, string email, string location, string url, uint256 unstaked, uint256 unstakedAt) +func (_Governance *GovernanceSession) Nodes(arg0 *big.Int) (struct { + Owner common.Address + PublicKey []byte + Staked *big.Int + Fined *big.Int + Name string + Email string + Location string + Url string + Unstaked *big.Int + UnstakedAt *big.Int +}, error) { + return _Governance.Contract.Nodes(&_Governance.CallOpts, arg0) +} + +// Nodes is a free data retrieval call binding the contract method 0x1c53c280. +// +// Solidity: function nodes(uint256 ) constant returns(address owner, bytes publicKey, uint256 staked, uint256 fined, string name, string email, string location, string url, uint256 unstaked, uint256 unstakedAt) +func (_Governance *GovernanceCallerSession) Nodes(arg0 *big.Int) (struct { + Owner common.Address + PublicKey []byte + Staked *big.Int + Fined *big.Int + Name string + Email string + Location string + Url string + Unstaked *big.Int + UnstakedAt *big.Int +}, error) { + return _Governance.Contract.Nodes(&_Governance.CallOpts, arg0) +} + +// NodesLength is a free data retrieval call binding the contract method 0xf33de6c0. +// +// Solidity: function nodesLength() constant returns(uint256) +func (_Governance *GovernanceCaller) NodesLength(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "nodesLength") + return *ret0, err +} + +// NodesLength is a free data retrieval call binding the contract method 0xf33de6c0. +// +// Solidity: function nodesLength() constant returns(uint256) +func (_Governance *GovernanceSession) NodesLength() (*big.Int, error) { + return _Governance.Contract.NodesLength(&_Governance.CallOpts) +} + +// NodesLength is a free data retrieval call binding the contract method 0xf33de6c0. +// +// Solidity: function nodesLength() constant returns(uint256) +func (_Governance *GovernanceCallerSession) NodesLength() (*big.Int, error) { + return _Governance.Contract.NodesLength(&_Governance.CallOpts) +} + +// NodesOffsetByAddress is a free data retrieval call binding the contract method 0x85031123. +// +// Solidity: function nodesOffsetByAddress(address ) constant returns(int256) +func (_Governance *GovernanceCaller) NodesOffsetByAddress(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "nodesOffsetByAddress", arg0) + return *ret0, err +} + +// NodesOffsetByAddress is a free data retrieval call binding the contract method 0x85031123. +// +// Solidity: function nodesOffsetByAddress(address ) constant returns(int256) +func (_Governance *GovernanceSession) NodesOffsetByAddress(arg0 common.Address) (*big.Int, error) { + return _Governance.Contract.NodesOffsetByAddress(&_Governance.CallOpts, arg0) +} + +// NodesOffsetByAddress is a free data retrieval call binding the contract method 0x85031123. +// +// Solidity: function nodesOffsetByAddress(address ) constant returns(int256) +func (_Governance *GovernanceCallerSession) NodesOffsetByAddress(arg0 common.Address) (*big.Int, error) { + return _Governance.Contract.NodesOffsetByAddress(&_Governance.CallOpts, arg0) +} + +// NodesOffsetByNodeKeyAddress is a free data retrieval call binding the contract method 0xed3fbdf9. +// +// Solidity: function nodesOffsetByNodeKeyAddress(address ) constant returns(int256) +func (_Governance *GovernanceCaller) NodesOffsetByNodeKeyAddress(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "nodesOffsetByNodeKeyAddress", arg0) + return *ret0, err +} + +// NodesOffsetByNodeKeyAddress is a free data retrieval call binding the contract method 0xed3fbdf9. +// +// Solidity: function nodesOffsetByNodeKeyAddress(address ) constant returns(int256) +func (_Governance *GovernanceSession) NodesOffsetByNodeKeyAddress(arg0 common.Address) (*big.Int, error) { + return _Governance.Contract.NodesOffsetByNodeKeyAddress(&_Governance.CallOpts, arg0) +} + +// NodesOffsetByNodeKeyAddress is a free data retrieval call binding the contract method 0xed3fbdf9. +// +// Solidity: function nodesOffsetByNodeKeyAddress(address ) constant returns(int256) +func (_Governance *GovernanceCallerSession) NodesOffsetByNodeKeyAddress(arg0 common.Address) (*big.Int, error) { + return _Governance.Contract.NodesOffsetByNodeKeyAddress(&_Governance.CallOpts, arg0) +} + +// NotaryParamAlpha is a free data retrieval call binding the contract method 0x4c523214. +// +// Solidity: function notaryParamAlpha() constant returns(uint256) +func (_Governance *GovernanceCaller) NotaryParamAlpha(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "notaryParamAlpha") + return *ret0, err +} + +// NotaryParamAlpha is a free data retrieval call binding the contract method 0x4c523214. +// +// Solidity: function notaryParamAlpha() constant returns(uint256) +func (_Governance *GovernanceSession) NotaryParamAlpha() (*big.Int, error) { + return _Governance.Contract.NotaryParamAlpha(&_Governance.CallOpts) +} + +// NotaryParamAlpha is a free data retrieval call binding the contract method 0x4c523214. +// +// Solidity: function notaryParamAlpha() constant returns(uint256) +func (_Governance *GovernanceCallerSession) NotaryParamAlpha() (*big.Int, error) { + return _Governance.Contract.NotaryParamAlpha(&_Governance.CallOpts) +} + +// NotaryParamBeta is a free data retrieval call binding the contract method 0x1f29f5c8. +// +// Solidity: function notaryParamBeta() constant returns(uint256) +func (_Governance *GovernanceCaller) NotaryParamBeta(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "notaryParamBeta") + return *ret0, err +} + +// NotaryParamBeta is a free data retrieval call binding the contract method 0x1f29f5c8. +// +// Solidity: function notaryParamBeta() constant returns(uint256) +func (_Governance *GovernanceSession) NotaryParamBeta() (*big.Int, error) { + return _Governance.Contract.NotaryParamBeta(&_Governance.CallOpts) +} + +// NotaryParamBeta is a free data retrieval call binding the contract method 0x1f29f5c8. +// +// Solidity: function notaryParamBeta() constant returns(uint256) +func (_Governance *GovernanceCallerSession) NotaryParamBeta() (*big.Int, error) { + return _Governance.Contract.NotaryParamBeta(&_Governance.CallOpts) +} + +// NotarySetSize is a free data retrieval call binding the contract method 0x0b3441dc. +// +// Solidity: function notarySetSize() constant returns(uint256) +func (_Governance *GovernanceCaller) NotarySetSize(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "notarySetSize") + return *ret0, err +} + +// NotarySetSize is a free data retrieval call binding the contract method 0x0b3441dc. +// +// Solidity: function notarySetSize() constant returns(uint256) +func (_Governance *GovernanceSession) NotarySetSize() (*big.Int, error) { + return _Governance.Contract.NotarySetSize(&_Governance.CallOpts) +} + +// NotarySetSize is a free data retrieval call binding the contract method 0x0b3441dc. +// +// Solidity: function notarySetSize() constant returns(uint256) +func (_Governance *GovernanceCallerSession) NotarySetSize() (*big.Int, error) { + return _Governance.Contract.NotarySetSize(&_Governance.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() constant returns(address) +func (_Governance *GovernanceCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var ( + ret0 = new(common.Address) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "owner") + return *ret0, err +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() constant returns(address) +func (_Governance *GovernanceSession) Owner() (common.Address, error) { + return _Governance.Contract.Owner(&_Governance.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() constant returns(address) +func (_Governance *GovernanceCallerSession) Owner() (common.Address, error) { + return _Governance.Contract.Owner(&_Governance.CallOpts) +} + +// RoundHeight is a free data retrieval call binding the contract method 0xaf58ef06. +// +// Solidity: function roundHeight(uint256 ) constant returns(uint256) +func (_Governance *GovernanceCaller) RoundHeight(opts *bind.CallOpts, arg0 *big.Int) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "roundHeight", arg0) + return *ret0, err +} + +// RoundHeight is a free data retrieval call binding the contract method 0xaf58ef06. +// +// Solidity: function roundHeight(uint256 ) constant returns(uint256) +func (_Governance *GovernanceSession) RoundHeight(arg0 *big.Int) (*big.Int, error) { + return _Governance.Contract.RoundHeight(&_Governance.CallOpts, arg0) +} + +// RoundHeight is a free data retrieval call binding the contract method 0xaf58ef06. +// +// Solidity: function roundHeight(uint256 ) constant returns(uint256) +func (_Governance *GovernanceCallerSession) RoundHeight(arg0 *big.Int) (*big.Int, error) { + return _Governance.Contract.RoundHeight(&_Governance.CallOpts, arg0) +} + +// RoundLength is a free data retrieval call binding the contract method 0x8b649b94. +// +// Solidity: function roundLength() constant returns(uint256) +func (_Governance *GovernanceCaller) RoundLength(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "roundLength") + return *ret0, err +} + +// RoundLength is a free data retrieval call binding the contract method 0x8b649b94. +// +// Solidity: function roundLength() constant returns(uint256) +func (_Governance *GovernanceSession) RoundLength() (*big.Int, error) { + return _Governance.Contract.RoundLength(&_Governance.CallOpts) +} + +// RoundLength is a free data retrieval call binding the contract method 0x8b649b94. +// +// Solidity: function roundLength() constant returns(uint256) +func (_Governance *GovernanceCallerSession) RoundLength() (*big.Int, error) { + return _Governance.Contract.RoundLength(&_Governance.CallOpts) +} + +// TotalStaked is a free data retrieval call binding the contract method 0x817b1cd2. +// +// Solidity: function totalStaked() constant returns(uint256) +func (_Governance *GovernanceCaller) TotalStaked(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "totalStaked") + return *ret0, err +} + +// TotalStaked is a free data retrieval call binding the contract method 0x817b1cd2. +// +// Solidity: function totalStaked() constant returns(uint256) +func (_Governance *GovernanceSession) TotalStaked() (*big.Int, error) { + return _Governance.Contract.TotalStaked(&_Governance.CallOpts) +} + +// TotalStaked is a free data retrieval call binding the contract method 0x817b1cd2. +// +// Solidity: function totalStaked() constant returns(uint256) +func (_Governance *GovernanceCallerSession) TotalStaked() (*big.Int, error) { + return _Governance.Contract.TotalStaked(&_Governance.CallOpts) +} + +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() constant returns(uint256) +func (_Governance *GovernanceCaller) TotalSupply(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "totalSupply") + return *ret0, err +} + +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() constant returns(uint256) +func (_Governance *GovernanceSession) TotalSupply() (*big.Int, error) { + return _Governance.Contract.TotalSupply(&_Governance.CallOpts) +} + +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() constant returns(uint256) +func (_Governance *GovernanceCallerSession) TotalSupply() (*big.Int, error) { + return _Governance.Contract.TotalSupply(&_Governance.CallOpts) +} + +// Withdrawable is a free data retrieval call binding the contract method 0x50188301. +// +// Solidity: function withdrawable() constant returns(bool) +func (_Governance *GovernanceCaller) Withdrawable(opts *bind.CallOpts) (bool, error) { + var ( + ret0 = new(bool) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "withdrawable") + return *ret0, err +} + +// Withdrawable is a free data retrieval call binding the contract method 0x50188301. +// +// Solidity: function withdrawable() constant returns(bool) +func (_Governance *GovernanceSession) Withdrawable() (bool, error) { + return _Governance.Contract.Withdrawable(&_Governance.CallOpts) +} + +// Withdrawable is a free data retrieval call binding the contract method 0x50188301. +// +// Solidity: function withdrawable() constant returns(bool) +func (_Governance *GovernanceCallerSession) Withdrawable() (bool, error) { + return _Governance.Contract.Withdrawable(&_Governance.CallOpts) +} + +// AddDKGComplaint is a paid mutator transaction binding the contract method 0xab6a4013. +// +// Solidity: function addDKGComplaint(bytes Complaint) returns() +func (_Governance *GovernanceTransactor) AddDKGComplaint(opts *bind.TransactOpts, Complaint []byte) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "addDKGComplaint", Complaint) +} + +// AddDKGComplaint is a paid mutator transaction binding the contract method 0xab6a4013. +// +// Solidity: function addDKGComplaint(bytes Complaint) returns() +func (_Governance *GovernanceSession) AddDKGComplaint(Complaint []byte) (*types.Transaction, error) { + return _Governance.Contract.AddDKGComplaint(&_Governance.TransactOpts, Complaint) +} + +// AddDKGComplaint is a paid mutator transaction binding the contract method 0xab6a4013. +// +// Solidity: function addDKGComplaint(bytes Complaint) returns() +func (_Governance *GovernanceTransactorSession) AddDKGComplaint(Complaint []byte) (*types.Transaction, error) { + return _Governance.Contract.AddDKGComplaint(&_Governance.TransactOpts, Complaint) +} + +// AddDKGFinalize is a paid mutator transaction binding the contract method 0x29891e74. +// +// Solidity: function addDKGFinalize(bytes Finalize) returns() +func (_Governance *GovernanceTransactor) AddDKGFinalize(opts *bind.TransactOpts, Finalize []byte) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "addDKGFinalize", Finalize) +} + +// AddDKGFinalize is a paid mutator transaction binding the contract method 0x29891e74. +// +// Solidity: function addDKGFinalize(bytes Finalize) returns() +func (_Governance *GovernanceSession) AddDKGFinalize(Finalize []byte) (*types.Transaction, error) { + return _Governance.Contract.AddDKGFinalize(&_Governance.TransactOpts, Finalize) +} + +// AddDKGFinalize is a paid mutator transaction binding the contract method 0x29891e74. +// +// Solidity: function addDKGFinalize(bytes Finalize) returns() +func (_Governance *GovernanceTransactorSession) AddDKGFinalize(Finalize []byte) (*types.Transaction, error) { + return _Governance.Contract.AddDKGFinalize(&_Governance.TransactOpts, Finalize) +} + +// AddDKGMPKReady is a paid mutator transaction binding the contract method 0x22f8a889. +// +// Solidity: function addDKGMPKReady(bytes MPKReady) returns() +func (_Governance *GovernanceTransactor) AddDKGMPKReady(opts *bind.TransactOpts, MPKReady []byte) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "addDKGMPKReady", MPKReady) +} + +// AddDKGMPKReady is a paid mutator transaction binding the contract method 0x22f8a889. +// +// Solidity: function addDKGMPKReady(bytes MPKReady) returns() +func (_Governance *GovernanceSession) AddDKGMPKReady(MPKReady []byte) (*types.Transaction, error) { + return _Governance.Contract.AddDKGMPKReady(&_Governance.TransactOpts, MPKReady) +} + +// AddDKGMPKReady is a paid mutator transaction binding the contract method 0x22f8a889. +// +// Solidity: function addDKGMPKReady(bytes MPKReady) returns() +func (_Governance *GovernanceTransactorSession) AddDKGMPKReady(MPKReady []byte) (*types.Transaction, error) { + return _Governance.Contract.AddDKGMPKReady(&_Governance.TransactOpts, MPKReady) +} + +// AddDKGMasterPublicKey is a paid mutator transaction binding the contract method 0x19cf10bc. +// +// Solidity: function addDKGMasterPublicKey(bytes PublicKey) returns() +func (_Governance *GovernanceTransactor) AddDKGMasterPublicKey(opts *bind.TransactOpts, PublicKey []byte) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "addDKGMasterPublicKey", PublicKey) +} + +// AddDKGMasterPublicKey is a paid mutator transaction binding the contract method 0x19cf10bc. +// +// Solidity: function addDKGMasterPublicKey(bytes PublicKey) returns() +func (_Governance *GovernanceSession) AddDKGMasterPublicKey(PublicKey []byte) (*types.Transaction, error) { + return _Governance.Contract.AddDKGMasterPublicKey(&_Governance.TransactOpts, PublicKey) +} + +// AddDKGMasterPublicKey is a paid mutator transaction binding the contract method 0x19cf10bc. +// +// Solidity: function addDKGMasterPublicKey(bytes PublicKey) returns() +func (_Governance *GovernanceTransactorSession) AddDKGMasterPublicKey(PublicKey []byte) (*types.Transaction, error) { + return _Governance.Contract.AddDKGMasterPublicKey(&_Governance.TransactOpts, PublicKey) +} + +// AddDKGSuccess is a paid mutator transaction binding the contract method 0x4ccaa59d. +// +// Solidity: function addDKGSuccess(bytes Success) returns() +func (_Governance *GovernanceTransactor) AddDKGSuccess(opts *bind.TransactOpts, Success []byte) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "addDKGSuccess", Success) +} + +// AddDKGSuccess is a paid mutator transaction binding the contract method 0x4ccaa59d. +// +// Solidity: function addDKGSuccess(bytes Success) returns() +func (_Governance *GovernanceSession) AddDKGSuccess(Success []byte) (*types.Transaction, error) { + return _Governance.Contract.AddDKGSuccess(&_Governance.TransactOpts, Success) +} + +// AddDKGSuccess is a paid mutator transaction binding the contract method 0x4ccaa59d. +// +// Solidity: function addDKGSuccess(bytes Success) returns() +func (_Governance *GovernanceTransactorSession) AddDKGSuccess(Success []byte) (*types.Transaction, error) { + return _Governance.Contract.AddDKGSuccess(&_Governance.TransactOpts, Success) +} + +// PayFine is a paid mutator transaction binding the contract method 0x3edfa229. +// +// Solidity: function payFine(address NodeAddress) returns() +func (_Governance *GovernanceTransactor) PayFine(opts *bind.TransactOpts, NodeAddress common.Address) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "payFine", NodeAddress) +} + +// PayFine is a paid mutator transaction binding the contract method 0x3edfa229. +// +// Solidity: function payFine(address NodeAddress) returns() +func (_Governance *GovernanceSession) PayFine(NodeAddress common.Address) (*types.Transaction, error) { + return _Governance.Contract.PayFine(&_Governance.TransactOpts, NodeAddress) +} + +// PayFine is a paid mutator transaction binding the contract method 0x3edfa229. +// +// Solidity: function payFine(address NodeAddress) returns() +func (_Governance *GovernanceTransactorSession) PayFine(NodeAddress common.Address) (*types.Transaction, error) { + return _Governance.Contract.PayFine(&_Governance.TransactOpts, NodeAddress) +} + +// ProposeCRS is a paid mutator transaction binding the contract method 0xc448af34. +// +// Solidity: function proposeCRS(uint256 Round, bytes SignedCRS) returns() +func (_Governance *GovernanceTransactor) ProposeCRS(opts *bind.TransactOpts, Round *big.Int, SignedCRS []byte) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "proposeCRS", Round, SignedCRS) +} + +// ProposeCRS is a paid mutator transaction binding the contract method 0xc448af34. +// +// Solidity: function proposeCRS(uint256 Round, bytes SignedCRS) returns() +func (_Governance *GovernanceSession) ProposeCRS(Round *big.Int, SignedCRS []byte) (*types.Transaction, error) { + return _Governance.Contract.ProposeCRS(&_Governance.TransactOpts, Round, SignedCRS) +} + +// ProposeCRS is a paid mutator transaction binding the contract method 0xc448af34. +// +// Solidity: function proposeCRS(uint256 Round, bytes SignedCRS) returns() +func (_Governance *GovernanceTransactorSession) ProposeCRS(Round *big.Int, SignedCRS []byte) (*types.Transaction, error) { + return _Governance.Contract.ProposeCRS(&_Governance.TransactOpts, Round, SignedCRS) +} + +// Register is a paid mutator transaction binding the contract method 0xd242f4cc. +// +// Solidity: function register(bytes PublicKey, string Name, string Email, string Location, string Url) returns() +func (_Governance *GovernanceTransactor) Register(opts *bind.TransactOpts, PublicKey []byte, Name string, Email string, Location string, Url string) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "register", PublicKey, Name, Email, Location, Url) +} + +// Register is a paid mutator transaction binding the contract method 0xd242f4cc. +// +// Solidity: function register(bytes PublicKey, string Name, string Email, string Location, string Url) returns() +func (_Governance *GovernanceSession) Register(PublicKey []byte, Name string, Email string, Location string, Url string) (*types.Transaction, error) { + return _Governance.Contract.Register(&_Governance.TransactOpts, PublicKey, Name, Email, Location, Url) +} + +// Register is a paid mutator transaction binding the contract method 0xd242f4cc. +// +// Solidity: function register(bytes PublicKey, string Name, string Email, string Location, string Url) returns() +func (_Governance *GovernanceTransactorSession) Register(PublicKey []byte, Name string, Email string, Location string, Url string) (*types.Transaction, error) { + return _Governance.Contract.Register(&_Governance.TransactOpts, PublicKey, Name, Email, Location, Url) +} + +// ReplaceNodePublicKey is a paid mutator transaction binding the contract method 0x3f007c20. +// +// Solidity: function replaceNodePublicKey(bytes NewPublicKey) returns() +func (_Governance *GovernanceTransactor) ReplaceNodePublicKey(opts *bind.TransactOpts, NewPublicKey []byte) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "replaceNodePublicKey", NewPublicKey) +} + +// ReplaceNodePublicKey is a paid mutator transaction binding the contract method 0x3f007c20. +// +// Solidity: function replaceNodePublicKey(bytes NewPublicKey) returns() +func (_Governance *GovernanceSession) ReplaceNodePublicKey(NewPublicKey []byte) (*types.Transaction, error) { + return _Governance.Contract.ReplaceNodePublicKey(&_Governance.TransactOpts, NewPublicKey) +} + +// ReplaceNodePublicKey is a paid mutator transaction binding the contract method 0x3f007c20. +// +// Solidity: function replaceNodePublicKey(bytes NewPublicKey) returns() +func (_Governance *GovernanceTransactorSession) ReplaceNodePublicKey(NewPublicKey []byte) (*types.Transaction, error) { + return _Governance.Contract.ReplaceNodePublicKey(&_Governance.TransactOpts, NewPublicKey) +} + +// Report is a paid mutator transaction binding the contract method 0x320c0826. +// +// Solidity: function report(uint256 Type, bytes Arg1, bytes Arg2) returns() +func (_Governance *GovernanceTransactor) Report(opts *bind.TransactOpts, Type *big.Int, Arg1 []byte, Arg2 []byte) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "report", Type, Arg1, Arg2) +} + +// Report is a paid mutator transaction binding the contract method 0x320c0826. +// +// Solidity: function report(uint256 Type, bytes Arg1, bytes Arg2) returns() +func (_Governance *GovernanceSession) Report(Type *big.Int, Arg1 []byte, Arg2 []byte) (*types.Transaction, error) { + return _Governance.Contract.Report(&_Governance.TransactOpts, Type, Arg1, Arg2) +} + +// Report is a paid mutator transaction binding the contract method 0x320c0826. +// +// Solidity: function report(uint256 Type, bytes Arg1, bytes Arg2) returns() +func (_Governance *GovernanceTransactorSession) Report(Type *big.Int, Arg1 []byte, Arg2 []byte) (*types.Transaction, error) { + return _Governance.Contract.Report(&_Governance.TransactOpts, Type, Arg1, Arg2) +} + +// ResetDKG is a paid mutator transaction binding the contract method 0x57316157. +// +// Solidity: function resetDKG(bytes NewSignedCRS) returns() +func (_Governance *GovernanceTransactor) ResetDKG(opts *bind.TransactOpts, NewSignedCRS []byte) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "resetDKG", NewSignedCRS) +} + +// ResetDKG is a paid mutator transaction binding the contract method 0x57316157. +// +// Solidity: function resetDKG(bytes NewSignedCRS) returns() +func (_Governance *GovernanceSession) ResetDKG(NewSignedCRS []byte) (*types.Transaction, error) { + return _Governance.Contract.ResetDKG(&_Governance.TransactOpts, NewSignedCRS) +} + +// ResetDKG is a paid mutator transaction binding the contract method 0x57316157. +// +// Solidity: function resetDKG(bytes NewSignedCRS) returns() +func (_Governance *GovernanceTransactorSession) ResetDKG(NewSignedCRS []byte) (*types.Transaction, error) { + return _Governance.Contract.ResetDKG(&_Governance.TransactOpts, NewSignedCRS) +} + +// Stake is a paid mutator transaction binding the contract method 0x3a4b66f1. +// +// Solidity: function stake() returns() +func (_Governance *GovernanceTransactor) Stake(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "stake") +} + +// Stake is a paid mutator transaction binding the contract method 0x3a4b66f1. +// +// Solidity: function stake() returns() +func (_Governance *GovernanceSession) Stake() (*types.Transaction, error) { + return _Governance.Contract.Stake(&_Governance.TransactOpts) +} + +// Stake is a paid mutator transaction binding the contract method 0x3a4b66f1. +// +// Solidity: function stake() returns() +func (_Governance *GovernanceTransactorSession) Stake() (*types.Transaction, error) { + return _Governance.Contract.Stake(&_Governance.TransactOpts) +} + +// TransferNodeOwnership is a paid mutator transaction binding the contract method 0x4264ecf9. +// +// Solidity: function transferNodeOwnership(address NewOwner) returns() +func (_Governance *GovernanceTransactor) TransferNodeOwnership(opts *bind.TransactOpts, NewOwner common.Address) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "transferNodeOwnership", NewOwner) +} + +// TransferNodeOwnership is a paid mutator transaction binding the contract method 0x4264ecf9. +// +// Solidity: function transferNodeOwnership(address NewOwner) returns() +func (_Governance *GovernanceSession) TransferNodeOwnership(NewOwner common.Address) (*types.Transaction, error) { + return _Governance.Contract.TransferNodeOwnership(&_Governance.TransactOpts, NewOwner) +} + +// TransferNodeOwnership is a paid mutator transaction binding the contract method 0x4264ecf9. +// +// Solidity: function transferNodeOwnership(address NewOwner) returns() +func (_Governance *GovernanceTransactorSession) TransferNodeOwnership(NewOwner common.Address) (*types.Transaction, error) { + return _Governance.Contract.TransferNodeOwnership(&_Governance.TransactOpts, NewOwner) +} + +// TransferNodeOwnershipByFoundation is a paid mutator transaction binding the contract method 0x7ecfdeca. +// +// Solidity: function transferNodeOwnershipByFoundation(address OldOwner, address NewOwner) returns() +func (_Governance *GovernanceTransactor) TransferNodeOwnershipByFoundation(opts *bind.TransactOpts, OldOwner common.Address, NewOwner common.Address) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "transferNodeOwnershipByFoundation", OldOwner, NewOwner) +} + +// TransferNodeOwnershipByFoundation is a paid mutator transaction binding the contract method 0x7ecfdeca. +// +// Solidity: function transferNodeOwnershipByFoundation(address OldOwner, address NewOwner) returns() +func (_Governance *GovernanceSession) TransferNodeOwnershipByFoundation(OldOwner common.Address, NewOwner common.Address) (*types.Transaction, error) { + return _Governance.Contract.TransferNodeOwnershipByFoundation(&_Governance.TransactOpts, OldOwner, NewOwner) +} + +// TransferNodeOwnershipByFoundation is a paid mutator transaction binding the contract method 0x7ecfdeca. +// +// Solidity: function transferNodeOwnershipByFoundation(address OldOwner, address NewOwner) returns() +func (_Governance *GovernanceTransactorSession) TransferNodeOwnershipByFoundation(OldOwner common.Address, NewOwner common.Address) (*types.Transaction, error) { + return _Governance.Contract.TransferNodeOwnershipByFoundation(&_Governance.TransactOpts, OldOwner, NewOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address NewOwner) returns() +func (_Governance *GovernanceTransactor) TransferOwnership(opts *bind.TransactOpts, NewOwner common.Address) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "transferOwnership", NewOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address NewOwner) returns() +func (_Governance *GovernanceSession) TransferOwnership(NewOwner common.Address) (*types.Transaction, error) { + return _Governance.Contract.TransferOwnership(&_Governance.TransactOpts, NewOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address NewOwner) returns() +func (_Governance *GovernanceTransactorSession) TransferOwnership(NewOwner common.Address) (*types.Transaction, error) { + return _Governance.Contract.TransferOwnership(&_Governance.TransactOpts, NewOwner) +} + +// Unstake is a paid mutator transaction binding the contract method 0x2e17de78. +// +// Solidity: function unstake(uint256 Amount) returns() +func (_Governance *GovernanceTransactor) Unstake(opts *bind.TransactOpts, Amount *big.Int) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "unstake", Amount) +} + +// Unstake is a paid mutator transaction binding the contract method 0x2e17de78. +// +// Solidity: function unstake(uint256 Amount) returns() +func (_Governance *GovernanceSession) Unstake(Amount *big.Int) (*types.Transaction, error) { + return _Governance.Contract.Unstake(&_Governance.TransactOpts, Amount) +} + +// Unstake is a paid mutator transaction binding the contract method 0x2e17de78. +// +// Solidity: function unstake(uint256 Amount) returns() +func (_Governance *GovernanceTransactorSession) Unstake(Amount *big.Int) (*types.Transaction, error) { + return _Governance.Contract.Unstake(&_Governance.TransactOpts, Amount) +} + +// UpdateConfiguration is a paid mutator transaction binding the contract method 0x11c7c321. +// +// Solidity: function updateConfiguration(uint256 MinStake, uint256 LockupPeriod, uint256 MinGasPrice, uint256 BlockGasLimit, uint256 LambdaBA, uint256 LambdaDKG, uint256 NotaryParamAlpha, uint256 NotaryParamBeta, uint256 RoundLength, uint256 MinBlockInterval, uint256[] FineValues) returns() +func (_Governance *GovernanceTransactor) UpdateConfiguration(opts *bind.TransactOpts, MinStake *big.Int, LockupPeriod *big.Int, MinGasPrice *big.Int, BlockGasLimit *big.Int, LambdaBA *big.Int, LambdaDKG *big.Int, NotaryParamAlpha *big.Int, NotaryParamBeta *big.Int, RoundLength *big.Int, MinBlockInterval *big.Int, FineValues []*big.Int) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "updateConfiguration", MinStake, LockupPeriod, MinGasPrice, BlockGasLimit, LambdaBA, LambdaDKG, NotaryParamAlpha, NotaryParamBeta, RoundLength, MinBlockInterval, FineValues) +} + +// UpdateConfiguration is a paid mutator transaction binding the contract method 0x11c7c321. +// +// Solidity: function updateConfiguration(uint256 MinStake, uint256 LockupPeriod, uint256 MinGasPrice, uint256 BlockGasLimit, uint256 LambdaBA, uint256 LambdaDKG, uint256 NotaryParamAlpha, uint256 NotaryParamBeta, uint256 RoundLength, uint256 MinBlockInterval, uint256[] FineValues) returns() +func (_Governance *GovernanceSession) UpdateConfiguration(MinStake *big.Int, LockupPeriod *big.Int, MinGasPrice *big.Int, BlockGasLimit *big.Int, LambdaBA *big.Int, LambdaDKG *big.Int, NotaryParamAlpha *big.Int, NotaryParamBeta *big.Int, RoundLength *big.Int, MinBlockInterval *big.Int, FineValues []*big.Int) (*types.Transaction, error) { + return _Governance.Contract.UpdateConfiguration(&_Governance.TransactOpts, MinStake, LockupPeriod, MinGasPrice, BlockGasLimit, LambdaBA, LambdaDKG, NotaryParamAlpha, NotaryParamBeta, RoundLength, MinBlockInterval, FineValues) +} + +// UpdateConfiguration is a paid mutator transaction binding the contract method 0x11c7c321. +// +// Solidity: function updateConfiguration(uint256 MinStake, uint256 LockupPeriod, uint256 MinGasPrice, uint256 BlockGasLimit, uint256 LambdaBA, uint256 LambdaDKG, uint256 NotaryParamAlpha, uint256 NotaryParamBeta, uint256 RoundLength, uint256 MinBlockInterval, uint256[] FineValues) returns() +func (_Governance *GovernanceTransactorSession) UpdateConfiguration(MinStake *big.Int, LockupPeriod *big.Int, MinGasPrice *big.Int, BlockGasLimit *big.Int, LambdaBA *big.Int, LambdaDKG *big.Int, NotaryParamAlpha *big.Int, NotaryParamBeta *big.Int, RoundLength *big.Int, MinBlockInterval *big.Int, FineValues []*big.Int) (*types.Transaction, error) { + return _Governance.Contract.UpdateConfiguration(&_Governance.TransactOpts, MinStake, LockupPeriod, MinGasPrice, BlockGasLimit, LambdaBA, LambdaDKG, NotaryParamAlpha, NotaryParamBeta, RoundLength, MinBlockInterval, FineValues) +} + +// UpdateNodeInfo is a paid mutator transaction binding the contract method 0xc5ea6ea1. +// +// Solidity: function updateNodeInfo(string Name, string Email, string Location, string Url) returns() +func (_Governance *GovernanceTransactor) UpdateNodeInfo(opts *bind.TransactOpts, Name string, Email string, Location string, Url string) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "updateNodeInfo", Name, Email, Location, Url) +} + +// UpdateNodeInfo is a paid mutator transaction binding the contract method 0xc5ea6ea1. +// +// Solidity: function updateNodeInfo(string Name, string Email, string Location, string Url) returns() +func (_Governance *GovernanceSession) UpdateNodeInfo(Name string, Email string, Location string, Url string) (*types.Transaction, error) { + return _Governance.Contract.UpdateNodeInfo(&_Governance.TransactOpts, Name, Email, Location, Url) +} + +// UpdateNodeInfo is a paid mutator transaction binding the contract method 0xc5ea6ea1. +// +// Solidity: function updateNodeInfo(string Name, string Email, string Location, string Url) returns() +func (_Governance *GovernanceTransactorSession) UpdateNodeInfo(Name string, Email string, Location string, Url string) (*types.Transaction, error) { + return _Governance.Contract.UpdateNodeInfo(&_Governance.TransactOpts, Name, Email, Location, Url) +} + +// Withdraw is a paid mutator transaction binding the contract method 0x3ccfd60b. +// +// Solidity: function withdraw() returns() +func (_Governance *GovernanceTransactor) Withdraw(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "withdraw") +} + +// Withdraw is a paid mutator transaction binding the contract method 0x3ccfd60b. +// +// Solidity: function withdraw() returns() +func (_Governance *GovernanceSession) Withdraw() (*types.Transaction, error) { + return _Governance.Contract.Withdraw(&_Governance.TransactOpts) +} + +// Withdraw is a paid mutator transaction binding the contract method 0x3ccfd60b. +// +// Solidity: function withdraw() returns() +func (_Governance *GovernanceTransactorSession) Withdraw() (*types.Transaction, error) { + return _Governance.Contract.Withdraw(&_Governance.TransactOpts) +} + +// GovernanceCRSProposedIterator is returned from FilterCRSProposed and is used to iterate over the raw logs and unpacked data for CRSProposed events raised by the Governance contract. +type GovernanceCRSProposedIterator struct { + Event *GovernanceCRSProposed // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceCRSProposedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceCRSProposed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceCRSProposed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceCRSProposedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceCRSProposedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceCRSProposed represents a CRSProposed event raised by the Governance contract. +type GovernanceCRSProposed struct { + Round *big.Int + CRS [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCRSProposed is a free log retrieval operation binding the contract event 0xd9b8f7e45cd2897523743eb19fd2021ba458d2962753a38bc31223e9b05ad408. +// +// Solidity: event CRSProposed(uint256 indexed Round, bytes32 CRS) +func (_Governance *GovernanceFilterer) FilterCRSProposed(opts *bind.FilterOpts, Round []*big.Int) (*GovernanceCRSProposedIterator, error) { + + var RoundRule []interface{} + for _, RoundItem := range Round { + RoundRule = append(RoundRule, RoundItem) + } + + logs, sub, err := _Governance.contract.FilterLogs(opts, "CRSProposed", RoundRule) + if err != nil { + return nil, err + } + return &GovernanceCRSProposedIterator{contract: _Governance.contract, event: "CRSProposed", logs: logs, sub: sub}, nil +} + +// WatchCRSProposed is a free log subscription operation binding the contract event 0xd9b8f7e45cd2897523743eb19fd2021ba458d2962753a38bc31223e9b05ad408. +// +// Solidity: event CRSProposed(uint256 indexed Round, bytes32 CRS) +func (_Governance *GovernanceFilterer) WatchCRSProposed(opts *bind.WatchOpts, sink chan<- *GovernanceCRSProposed, Round []*big.Int) (event.Subscription, error) { + + var RoundRule []interface{} + for _, RoundItem := range Round { + RoundRule = append(RoundRule, RoundItem) + } + + logs, sub, err := _Governance.contract.WatchLogs(opts, "CRSProposed", RoundRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceCRSProposed) + if err := _Governance.contract.UnpackLog(event, "CRSProposed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseCRSProposed is a log parse operation binding the contract event 0xd9b8f7e45cd2897523743eb19fd2021ba458d2962753a38bc31223e9b05ad408. +// +// Solidity: event CRSProposed(uint256 indexed Round, bytes32 CRS) +func (_Governance *GovernanceFilterer) ParseCRSProposed(log types.Log) (*GovernanceCRSProposed, error) { + event := new(GovernanceCRSProposed) + if err := _Governance.contract.UnpackLog(event, "CRSProposed", log); err != nil { + return nil, err + } + return event, nil +} + +// GovernanceConfigurationChangedIterator is returned from FilterConfigurationChanged and is used to iterate over the raw logs and unpacked data for ConfigurationChanged events raised by the Governance contract. +type GovernanceConfigurationChangedIterator struct { + Event *GovernanceConfigurationChanged // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceConfigurationChangedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceConfigurationChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceConfigurationChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceConfigurationChangedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceConfigurationChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceConfigurationChanged represents a ConfigurationChanged event raised by the Governance contract. +type GovernanceConfigurationChanged struct { + Raw types.Log // Blockchain specific contextual infos +} + +// FilterConfigurationChanged is a free log retrieval operation binding the contract event 0xb6aa5c479f96dcbdbe1d8b70883ec95e8799f8e602ee347ed972a22c974b14c0. +// +// Solidity: event ConfigurationChanged() +func (_Governance *GovernanceFilterer) FilterConfigurationChanged(opts *bind.FilterOpts) (*GovernanceConfigurationChangedIterator, error) { + + logs, sub, err := _Governance.contract.FilterLogs(opts, "ConfigurationChanged") + if err != nil { + return nil, err + } + return &GovernanceConfigurationChangedIterator{contract: _Governance.contract, event: "ConfigurationChanged", logs: logs, sub: sub}, nil +} + +// WatchConfigurationChanged is a free log subscription operation binding the contract event 0xb6aa5c479f96dcbdbe1d8b70883ec95e8799f8e602ee347ed972a22c974b14c0. +// +// Solidity: event ConfigurationChanged() +func (_Governance *GovernanceFilterer) WatchConfigurationChanged(opts *bind.WatchOpts, sink chan<- *GovernanceConfigurationChanged) (event.Subscription, error) { + + logs, sub, err := _Governance.contract.WatchLogs(opts, "ConfigurationChanged") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceConfigurationChanged) + if err := _Governance.contract.UnpackLog(event, "ConfigurationChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseConfigurationChanged is a log parse operation binding the contract event 0xb6aa5c479f96dcbdbe1d8b70883ec95e8799f8e602ee347ed972a22c974b14c0. +// +// Solidity: event ConfigurationChanged() +func (_Governance *GovernanceFilterer) ParseConfigurationChanged(log types.Log) (*GovernanceConfigurationChanged, error) { + event := new(GovernanceConfigurationChanged) + if err := _Governance.contract.UnpackLog(event, "ConfigurationChanged", log); err != nil { + return nil, err + } + return event, nil +} + +// GovernanceDKGResetIterator is returned from FilterDKGReset and is used to iterate over the raw logs and unpacked data for DKGReset events raised by the Governance contract. +type GovernanceDKGResetIterator struct { + Event *GovernanceDKGReset // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceDKGResetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceDKGReset) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceDKGReset) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceDKGResetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceDKGResetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceDKGReset represents a DKGReset event raised by the Governance contract. +type GovernanceDKGReset struct { + Round *big.Int + BlockHeight *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDKGReset is a free log retrieval operation binding the contract event 0x1ef9b10077100d06aefe929eb17ff481feebce38b8a770e5b7d744febfab9f50. +// +// Solidity: event DKGReset(uint256 indexed Round, uint256 BlockHeight) +func (_Governance *GovernanceFilterer) FilterDKGReset(opts *bind.FilterOpts, Round []*big.Int) (*GovernanceDKGResetIterator, error) { + + var RoundRule []interface{} + for _, RoundItem := range Round { + RoundRule = append(RoundRule, RoundItem) + } + + logs, sub, err := _Governance.contract.FilterLogs(opts, "DKGReset", RoundRule) + if err != nil { + return nil, err + } + return &GovernanceDKGResetIterator{contract: _Governance.contract, event: "DKGReset", logs: logs, sub: sub}, nil +} + +// WatchDKGReset is a free log subscription operation binding the contract event 0x1ef9b10077100d06aefe929eb17ff481feebce38b8a770e5b7d744febfab9f50. +// +// Solidity: event DKGReset(uint256 indexed Round, uint256 BlockHeight) +func (_Governance *GovernanceFilterer) WatchDKGReset(opts *bind.WatchOpts, sink chan<- *GovernanceDKGReset, Round []*big.Int) (event.Subscription, error) { + + var RoundRule []interface{} + for _, RoundItem := range Round { + RoundRule = append(RoundRule, RoundItem) + } + + logs, sub, err := _Governance.contract.WatchLogs(opts, "DKGReset", RoundRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceDKGReset) + if err := _Governance.contract.UnpackLog(event, "DKGReset", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDKGReset is a log parse operation binding the contract event 0x1ef9b10077100d06aefe929eb17ff481feebce38b8a770e5b7d744febfab9f50. +// +// Solidity: event DKGReset(uint256 indexed Round, uint256 BlockHeight) +func (_Governance *GovernanceFilterer) ParseDKGReset(log types.Log) (*GovernanceDKGReset, error) { + event := new(GovernanceDKGReset) + if err := _Governance.contract.UnpackLog(event, "DKGReset", log); err != nil { + return nil, err + } + return event, nil +} + +// GovernanceFinePaidIterator is returned from FilterFinePaid and is used to iterate over the raw logs and unpacked data for FinePaid events raised by the Governance contract. +type GovernanceFinePaidIterator struct { + Event *GovernanceFinePaid // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceFinePaidIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceFinePaid) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceFinePaid) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceFinePaidIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceFinePaidIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceFinePaid represents a FinePaid event raised by the Governance contract. +type GovernanceFinePaid struct { + NodeAddress common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterFinePaid is a free log retrieval operation binding the contract event 0x34af8d99a30dafb3157ed162369d603f544a74be3858f8c7ac9e159829589c25. +// +// Solidity: event FinePaid(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) FilterFinePaid(opts *bind.FilterOpts, NodeAddress []common.Address) (*GovernanceFinePaidIterator, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.FilterLogs(opts, "FinePaid", NodeAddressRule) + if err != nil { + return nil, err + } + return &GovernanceFinePaidIterator{contract: _Governance.contract, event: "FinePaid", logs: logs, sub: sub}, nil +} + +// WatchFinePaid is a free log subscription operation binding the contract event 0x34af8d99a30dafb3157ed162369d603f544a74be3858f8c7ac9e159829589c25. +// +// Solidity: event FinePaid(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) WatchFinePaid(opts *bind.WatchOpts, sink chan<- *GovernanceFinePaid, NodeAddress []common.Address) (event.Subscription, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.WatchLogs(opts, "FinePaid", NodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceFinePaid) + if err := _Governance.contract.UnpackLog(event, "FinePaid", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseFinePaid is a log parse operation binding the contract event 0x34af8d99a30dafb3157ed162369d603f544a74be3858f8c7ac9e159829589c25. +// +// Solidity: event FinePaid(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) ParseFinePaid(log types.Log) (*GovernanceFinePaid, error) { + event := new(GovernanceFinePaid) + if err := _Governance.contract.UnpackLog(event, "FinePaid", log); err != nil { + return nil, err + } + return event, nil +} + +// GovernanceFinedIterator is returned from FilterFined and is used to iterate over the raw logs and unpacked data for Fined events raised by the Governance contract. +type GovernanceFinedIterator struct { + Event *GovernanceFined // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceFinedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceFined) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceFined) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceFinedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceFinedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceFined represents a Fined event raised by the Governance contract. +type GovernanceFined struct { + NodeAddress common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterFined is a free log retrieval operation binding the contract event 0x00913d46aef0f0d115d70ea1c7c23198505f577d1d1916cc60710ca2204ae6ae. +// +// Solidity: event Fined(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) FilterFined(opts *bind.FilterOpts, NodeAddress []common.Address) (*GovernanceFinedIterator, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.FilterLogs(opts, "Fined", NodeAddressRule) + if err != nil { + return nil, err + } + return &GovernanceFinedIterator{contract: _Governance.contract, event: "Fined", logs: logs, sub: sub}, nil +} + +// WatchFined is a free log subscription operation binding the contract event 0x00913d46aef0f0d115d70ea1c7c23198505f577d1d1916cc60710ca2204ae6ae. +// +// Solidity: event Fined(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) WatchFined(opts *bind.WatchOpts, sink chan<- *GovernanceFined, NodeAddress []common.Address) (event.Subscription, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.WatchLogs(opts, "Fined", NodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceFined) + if err := _Governance.contract.UnpackLog(event, "Fined", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseFined is a log parse operation binding the contract event 0x00913d46aef0f0d115d70ea1c7c23198505f577d1d1916cc60710ca2204ae6ae. +// +// Solidity: event Fined(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) ParseFined(log types.Log) (*GovernanceFined, error) { + event := new(GovernanceFined) + if err := _Governance.contract.UnpackLog(event, "Fined", log); err != nil { + return nil, err + } + return event, nil +} + +// GovernanceNodeAddedIterator is returned from FilterNodeAdded and is used to iterate over the raw logs and unpacked data for NodeAdded events raised by the Governance contract. +type GovernanceNodeAddedIterator struct { + Event *GovernanceNodeAdded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceNodeAddedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceNodeAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceNodeAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceNodeAddedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceNodeAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceNodeAdded represents a NodeAdded event raised by the Governance contract. +type GovernanceNodeAdded struct { + NodeAddress common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNodeAdded is a free log retrieval operation binding the contract event 0xb25d03aaf308d7291709be1ea28b800463cf3a9a4c4a5555d7333a964c1dfebd. +// +// Solidity: event NodeAdded(address indexed NodeAddress) +func (_Governance *GovernanceFilterer) FilterNodeAdded(opts *bind.FilterOpts, NodeAddress []common.Address) (*GovernanceNodeAddedIterator, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.FilterLogs(opts, "NodeAdded", NodeAddressRule) + if err != nil { + return nil, err + } + return &GovernanceNodeAddedIterator{contract: _Governance.contract, event: "NodeAdded", logs: logs, sub: sub}, nil +} + +// WatchNodeAdded is a free log subscription operation binding the contract event 0xb25d03aaf308d7291709be1ea28b800463cf3a9a4c4a5555d7333a964c1dfebd. +// +// Solidity: event NodeAdded(address indexed NodeAddress) +func (_Governance *GovernanceFilterer) WatchNodeAdded(opts *bind.WatchOpts, sink chan<- *GovernanceNodeAdded, NodeAddress []common.Address) (event.Subscription, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.WatchLogs(opts, "NodeAdded", NodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceNodeAdded) + if err := _Governance.contract.UnpackLog(event, "NodeAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNodeAdded is a log parse operation binding the contract event 0xb25d03aaf308d7291709be1ea28b800463cf3a9a4c4a5555d7333a964c1dfebd. +// +// Solidity: event NodeAdded(address indexed NodeAddress) +func (_Governance *GovernanceFilterer) ParseNodeAdded(log types.Log) (*GovernanceNodeAdded, error) { + event := new(GovernanceNodeAdded) + if err := _Governance.contract.UnpackLog(event, "NodeAdded", log); err != nil { + return nil, err + } + return event, nil +} + +// GovernanceNodeOwnershipTransferedIterator is returned from FilterNodeOwnershipTransfered and is used to iterate over the raw logs and unpacked data for NodeOwnershipTransfered events raised by the Governance contract. +type GovernanceNodeOwnershipTransferedIterator struct { + Event *GovernanceNodeOwnershipTransfered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceNodeOwnershipTransferedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceNodeOwnershipTransfered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceNodeOwnershipTransfered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceNodeOwnershipTransferedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceNodeOwnershipTransferedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceNodeOwnershipTransfered represents a NodeOwnershipTransfered event raised by the Governance contract. +type GovernanceNodeOwnershipTransfered struct { + NodeAddress common.Address + NewOwnerAddress common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNodeOwnershipTransfered is a free log retrieval operation binding the contract event 0x63616cf4caeee172ed91719b5e000da424d56855ee726aedb0a1d74fb3f1db2a. +// +// Solidity: event NodeOwnershipTransfered(address indexed NodeAddress, address indexed NewOwnerAddress) +func (_Governance *GovernanceFilterer) FilterNodeOwnershipTransfered(opts *bind.FilterOpts, NodeAddress []common.Address, NewOwnerAddress []common.Address) (*GovernanceNodeOwnershipTransferedIterator, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + var NewOwnerAddressRule []interface{} + for _, NewOwnerAddressItem := range NewOwnerAddress { + NewOwnerAddressRule = append(NewOwnerAddressRule, NewOwnerAddressItem) + } + + logs, sub, err := _Governance.contract.FilterLogs(opts, "NodeOwnershipTransfered", NodeAddressRule, NewOwnerAddressRule) + if err != nil { + return nil, err + } + return &GovernanceNodeOwnershipTransferedIterator{contract: _Governance.contract, event: "NodeOwnershipTransfered", logs: logs, sub: sub}, nil +} + +// WatchNodeOwnershipTransfered is a free log subscription operation binding the contract event 0x63616cf4caeee172ed91719b5e000da424d56855ee726aedb0a1d74fb3f1db2a. +// +// Solidity: event NodeOwnershipTransfered(address indexed NodeAddress, address indexed NewOwnerAddress) +func (_Governance *GovernanceFilterer) WatchNodeOwnershipTransfered(opts *bind.WatchOpts, sink chan<- *GovernanceNodeOwnershipTransfered, NodeAddress []common.Address, NewOwnerAddress []common.Address) (event.Subscription, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + var NewOwnerAddressRule []interface{} + for _, NewOwnerAddressItem := range NewOwnerAddress { + NewOwnerAddressRule = append(NewOwnerAddressRule, NewOwnerAddressItem) + } + + logs, sub, err := _Governance.contract.WatchLogs(opts, "NodeOwnershipTransfered", NodeAddressRule, NewOwnerAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceNodeOwnershipTransfered) + if err := _Governance.contract.UnpackLog(event, "NodeOwnershipTransfered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNodeOwnershipTransfered is a log parse operation binding the contract event 0x63616cf4caeee172ed91719b5e000da424d56855ee726aedb0a1d74fb3f1db2a. +// +// Solidity: event NodeOwnershipTransfered(address indexed NodeAddress, address indexed NewOwnerAddress) +func (_Governance *GovernanceFilterer) ParseNodeOwnershipTransfered(log types.Log) (*GovernanceNodeOwnershipTransfered, error) { + event := new(GovernanceNodeOwnershipTransfered) + if err := _Governance.contract.UnpackLog(event, "NodeOwnershipTransfered", log); err != nil { + return nil, err + } + return event, nil +} + +// GovernanceNodePublicKeyReplacedIterator is returned from FilterNodePublicKeyReplaced and is used to iterate over the raw logs and unpacked data for NodePublicKeyReplaced events raised by the Governance contract. +type GovernanceNodePublicKeyReplacedIterator struct { + Event *GovernanceNodePublicKeyReplaced // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceNodePublicKeyReplacedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceNodePublicKeyReplaced) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceNodePublicKeyReplaced) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceNodePublicKeyReplacedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceNodePublicKeyReplacedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceNodePublicKeyReplaced represents a NodePublicKeyReplaced event raised by the Governance contract. +type GovernanceNodePublicKeyReplaced struct { + NodeAddress common.Address + PublicKey []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNodePublicKeyReplaced is a free log retrieval operation binding the contract event 0x8aa688c270fa0768c37a1f455f711b6ea1a925f04db9ef433e01dcba78b80432. +// +// Solidity: event NodePublicKeyReplaced(address indexed NodeAddress, bytes PublicKey) +func (_Governance *GovernanceFilterer) FilterNodePublicKeyReplaced(opts *bind.FilterOpts, NodeAddress []common.Address) (*GovernanceNodePublicKeyReplacedIterator, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.FilterLogs(opts, "NodePublicKeyReplaced", NodeAddressRule) + if err != nil { + return nil, err + } + return &GovernanceNodePublicKeyReplacedIterator{contract: _Governance.contract, event: "NodePublicKeyReplaced", logs: logs, sub: sub}, nil +} + +// WatchNodePublicKeyReplaced is a free log subscription operation binding the contract event 0x8aa688c270fa0768c37a1f455f711b6ea1a925f04db9ef433e01dcba78b80432. +// +// Solidity: event NodePublicKeyReplaced(address indexed NodeAddress, bytes PublicKey) +func (_Governance *GovernanceFilterer) WatchNodePublicKeyReplaced(opts *bind.WatchOpts, sink chan<- *GovernanceNodePublicKeyReplaced, NodeAddress []common.Address) (event.Subscription, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.WatchLogs(opts, "NodePublicKeyReplaced", NodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceNodePublicKeyReplaced) + if err := _Governance.contract.UnpackLog(event, "NodePublicKeyReplaced", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNodePublicKeyReplaced is a log parse operation binding the contract event 0x8aa688c270fa0768c37a1f455f711b6ea1a925f04db9ef433e01dcba78b80432. +// +// Solidity: event NodePublicKeyReplaced(address indexed NodeAddress, bytes PublicKey) +func (_Governance *GovernanceFilterer) ParseNodePublicKeyReplaced(log types.Log) (*GovernanceNodePublicKeyReplaced, error) { + event := new(GovernanceNodePublicKeyReplaced) + if err := _Governance.contract.UnpackLog(event, "NodePublicKeyReplaced", log); err != nil { + return nil, err + } + return event, nil +} + +// GovernanceNodeRemovedIterator is returned from FilterNodeRemoved and is used to iterate over the raw logs and unpacked data for NodeRemoved events raised by the Governance contract. +type GovernanceNodeRemovedIterator struct { + Event *GovernanceNodeRemoved // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceNodeRemovedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceNodeRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceNodeRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceNodeRemovedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceNodeRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceNodeRemoved represents a NodeRemoved event raised by the Governance contract. +type GovernanceNodeRemoved struct { + NodeAddress common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNodeRemoved is a free log retrieval operation binding the contract event 0xcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b. +// +// Solidity: event NodeRemoved(address indexed NodeAddress) +func (_Governance *GovernanceFilterer) FilterNodeRemoved(opts *bind.FilterOpts, NodeAddress []common.Address) (*GovernanceNodeRemovedIterator, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.FilterLogs(opts, "NodeRemoved", NodeAddressRule) + if err != nil { + return nil, err + } + return &GovernanceNodeRemovedIterator{contract: _Governance.contract, event: "NodeRemoved", logs: logs, sub: sub}, nil +} + +// WatchNodeRemoved is a free log subscription operation binding the contract event 0xcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b. +// +// Solidity: event NodeRemoved(address indexed NodeAddress) +func (_Governance *GovernanceFilterer) WatchNodeRemoved(opts *bind.WatchOpts, sink chan<- *GovernanceNodeRemoved, NodeAddress []common.Address) (event.Subscription, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.WatchLogs(opts, "NodeRemoved", NodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceNodeRemoved) + if err := _Governance.contract.UnpackLog(event, "NodeRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNodeRemoved is a log parse operation binding the contract event 0xcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b. +// +// Solidity: event NodeRemoved(address indexed NodeAddress) +func (_Governance *GovernanceFilterer) ParseNodeRemoved(log types.Log) (*GovernanceNodeRemoved, error) { + event := new(GovernanceNodeRemoved) + if err := _Governance.contract.UnpackLog(event, "NodeRemoved", log); err != nil { + return nil, err + } + return event, nil +} + +// GovernanceReportedIterator is returned from FilterReported and is used to iterate over the raw logs and unpacked data for Reported events raised by the Governance contract. +type GovernanceReportedIterator struct { + Event *GovernanceReported // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceReportedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceReported) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceReported) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceReportedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceReportedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceReported represents a Reported event raised by the Governance contract. +type GovernanceReported struct { + NodeAddress common.Address + Type *big.Int + Arg1 []byte + Arg2 []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterReported is a free log retrieval operation binding the contract event 0x0b4ded2614643cbc6be3ac9a1ed3188f2667636de75ea5250e190ad6af4b43d9. +// +// Solidity: event Reported(address indexed NodeAddress, uint256 Type, bytes Arg1, bytes Arg2) +func (_Governance *GovernanceFilterer) FilterReported(opts *bind.FilterOpts, NodeAddress []common.Address) (*GovernanceReportedIterator, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.FilterLogs(opts, "Reported", NodeAddressRule) + if err != nil { + return nil, err + } + return &GovernanceReportedIterator{contract: _Governance.contract, event: "Reported", logs: logs, sub: sub}, nil +} + +// WatchReported is a free log subscription operation binding the contract event 0x0b4ded2614643cbc6be3ac9a1ed3188f2667636de75ea5250e190ad6af4b43d9. +// +// Solidity: event Reported(address indexed NodeAddress, uint256 Type, bytes Arg1, bytes Arg2) +func (_Governance *GovernanceFilterer) WatchReported(opts *bind.WatchOpts, sink chan<- *GovernanceReported, NodeAddress []common.Address) (event.Subscription, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.WatchLogs(opts, "Reported", NodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceReported) + if err := _Governance.contract.UnpackLog(event, "Reported", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseReported is a log parse operation binding the contract event 0x0b4ded2614643cbc6be3ac9a1ed3188f2667636de75ea5250e190ad6af4b43d9. +// +// Solidity: event Reported(address indexed NodeAddress, uint256 Type, bytes Arg1, bytes Arg2) +func (_Governance *GovernanceFilterer) ParseReported(log types.Log) (*GovernanceReported, error) { + event := new(GovernanceReported) + if err := _Governance.contract.UnpackLog(event, "Reported", log); err != nil { + return nil, err + } + return event, nil +} + +// GovernanceStakedIterator is returned from FilterStaked and is used to iterate over the raw logs and unpacked data for Staked events raised by the Governance contract. +type GovernanceStakedIterator struct { + Event *GovernanceStaked // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceStakedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceStaked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceStaked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceStakedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceStakedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceStaked represents a Staked event raised by the Governance contract. +type GovernanceStaked struct { + NodeAddress common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterStaked is a free log retrieval operation binding the contract event 0x9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d. +// +// Solidity: event Staked(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) FilterStaked(opts *bind.FilterOpts, NodeAddress []common.Address) (*GovernanceStakedIterator, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.FilterLogs(opts, "Staked", NodeAddressRule) + if err != nil { + return nil, err + } + return &GovernanceStakedIterator{contract: _Governance.contract, event: "Staked", logs: logs, sub: sub}, nil +} + +// WatchStaked is a free log subscription operation binding the contract event 0x9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d. +// +// Solidity: event Staked(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) WatchStaked(opts *bind.WatchOpts, sink chan<- *GovernanceStaked, NodeAddress []common.Address) (event.Subscription, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.WatchLogs(opts, "Staked", NodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceStaked) + if err := _Governance.contract.UnpackLog(event, "Staked", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseStaked is a log parse operation binding the contract event 0x9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d. +// +// Solidity: event Staked(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) ParseStaked(log types.Log) (*GovernanceStaked, error) { + event := new(GovernanceStaked) + if err := _Governance.contract.UnpackLog(event, "Staked", log); err != nil { + return nil, err + } + return event, nil +} + +// GovernanceUnstakedIterator is returned from FilterUnstaked and is used to iterate over the raw logs and unpacked data for Unstaked events raised by the Governance contract. +type GovernanceUnstakedIterator struct { + Event *GovernanceUnstaked // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceUnstakedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceUnstaked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceUnstaked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceUnstakedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceUnstakedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceUnstaked represents a Unstaked event raised by the Governance contract. +type GovernanceUnstaked struct { + NodeAddress common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUnstaked is a free log retrieval operation binding the contract event 0x0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f75. +// +// Solidity: event Unstaked(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) FilterUnstaked(opts *bind.FilterOpts, NodeAddress []common.Address) (*GovernanceUnstakedIterator, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.FilterLogs(opts, "Unstaked", NodeAddressRule) + if err != nil { + return nil, err + } + return &GovernanceUnstakedIterator{contract: _Governance.contract, event: "Unstaked", logs: logs, sub: sub}, nil +} + +// WatchUnstaked is a free log subscription operation binding the contract event 0x0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f75. +// +// Solidity: event Unstaked(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) WatchUnstaked(opts *bind.WatchOpts, sink chan<- *GovernanceUnstaked, NodeAddress []common.Address) (event.Subscription, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.WatchLogs(opts, "Unstaked", NodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceUnstaked) + if err := _Governance.contract.UnpackLog(event, "Unstaked", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUnstaked is a log parse operation binding the contract event 0x0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f75. +// +// Solidity: event Unstaked(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) ParseUnstaked(log types.Log) (*GovernanceUnstaked, error) { + event := new(GovernanceUnstaked) + if err := _Governance.contract.UnpackLog(event, "Unstaked", log); err != nil { + return nil, err + } + return event, nil +} + +// GovernanceWithdrawnIterator is returned from FilterWithdrawn and is used to iterate over the raw logs and unpacked data for Withdrawn events raised by the Governance contract. +type GovernanceWithdrawnIterator struct { + Event *GovernanceWithdrawn // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceWithdrawnIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceWithdrawn) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceWithdrawn) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceWithdrawnIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceWithdrawnIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceWithdrawn represents a Withdrawn event raised by the Governance contract. +type GovernanceWithdrawn struct { + NodeAddress common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterWithdrawn is a free log retrieval operation binding the contract event 0x7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5. +// +// Solidity: event Withdrawn(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) FilterWithdrawn(opts *bind.FilterOpts, NodeAddress []common.Address) (*GovernanceWithdrawnIterator, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.FilterLogs(opts, "Withdrawn", NodeAddressRule) + if err != nil { + return nil, err + } + return &GovernanceWithdrawnIterator{contract: _Governance.contract, event: "Withdrawn", logs: logs, sub: sub}, nil +} + +// WatchWithdrawn is a free log subscription operation binding the contract event 0x7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5. +// +// Solidity: event Withdrawn(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) WatchWithdrawn(opts *bind.WatchOpts, sink chan<- *GovernanceWithdrawn, NodeAddress []common.Address) (event.Subscription, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.WatchLogs(opts, "Withdrawn", NodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceWithdrawn) + if err := _Governance.contract.UnpackLog(event, "Withdrawn", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseWithdrawn is a log parse operation binding the contract event 0x7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5. +// +// Solidity: event Withdrawn(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) ParseWithdrawn(log types.Log) (*GovernanceWithdrawn, error) { + event := new(GovernanceWithdrawn) + if err := _Governance.contract.UnpackLog(event, "Withdrawn", log); err != nil { + return nil, err + } + return event, nil +} diff --git a/monitor/monitor.go b/monitor/monitor.go new file mode 100644 index 0000000..5b9e350 --- /dev/null +++ b/monitor/monitor.go @@ -0,0 +1,199 @@ +package monitor + +import ( + "log" + "math" + "math/big" + "strconv" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" +) + +type node struct { + owner common.Address + email string + fined *big.Int + name string + publicKey []byte + nodeKeyAddress common.Address +} + +// NetworkConfig represents the network config. +type NetworkConfig struct { + WSEndpoint string + HTTPEndpoint string + EthHTTPEndpoint string + GovAddress common.Address + Network string +} + +// GovAddress is governance address. +var GovAddress = common.HexToAddress("0x246FcDE58581e2754f215A523C0718C4BFc8041F") + +// Fifty is 50 * 10^18 +var Fifty *big.Int + +// OneHundred is 100 * 10^18 +var OneHundred *big.Int + +func init() { + Fifty, _ = big.NewInt(0).SetString("50000000000000000000", 10) + OneHundred, _ = big.NewInt(0).SetString("100000000000000000000", 10) +} + +// NetworkConfigMap represents the system network config mapping. +var NetworkConfigMap = map[int64]NetworkConfig{ + 373: { + WSEndpoint: "wss://mainnet-rpc.tangerine-network.io/ws", + HTTPEndpoint: "https://mainnet-rpc.tangerine-network.io", + EthHTTPEndpoint: "https://mainnet.infura.io/v3/4eb07139b29d41c59b352f21c4c9f526", + Network: "Mainnet", + }, + 374: { + WSEndpoint: "wss://testnet-rpc.tangerine-network.io/ws", + HTTPEndpoint: "https://testnet-rpc.tangerine-network.io", + EthHTTPEndpoint: "https://rinkeby.infura.io/v3/4eb07139b29d41c59b352f21c4c9f526", + Network: "Testnet", + }, +} + +// Monitor is the object to monitor tangerine network. +type Monitor struct { + networkID int + notifiers []Notifier + backend backendIntf + tanBalancesCache map[common.Address]*big.Int + ethBalancesCache map[common.Address]*big.Int + ethThreshold *big.Int // in wei + ethThresholdString string // in ETH + checkBalanceDuration time.Duration +} + +// NewMonitor is the constructor for monitor object. +func NewMonitor(networkID int, backend backendIntf, threshold string) *Monitor { + tanBalance := make(map[common.Address]*big.Int) + ethBalance := make(map[common.Address]*big.Int) + t, err := strconv.ParseFloat(threshold, 64) + if err != nil { + panic(err) + } + t = t * math.Pow(10, 18) + ethThreshold := new(big.Int) + ethThreshold.SetString( + strconv.FormatFloat(t, 'f', 0, 64), + 10, + ) + m := Monitor{ + networkID: networkID, + backend: backend, + tanBalancesCache: tanBalance, + ethBalancesCache: ethBalance, + checkBalanceDuration: time.Duration(10 * 60 * 1000 * 1000 * 1000), + ethThresholdString: threshold, + ethThreshold: ethThreshold, + } + return &m +} + +// Run is the entry point for running monitor. +func (m *Monitor) Run() { + done := make(chan bool) + finedNodeChan := make(chan node) + go m.fetchFinedNodes(finedNodeChan) + go m.sendNotifications(finedNodeChan, FINED) + go m.checkTanBalance() + go m.checkEthBalance() + <-done +} + +func (m *Monitor) checkEthBalance() { + ethNodeChan := make(chan node) + go m.sendNotifications(ethNodeChan, INSUFFICIENT_ETH) + for { + nc := NetworkConfigMap[int64(m.networkID)] + conn, err := ethclient.Dial(nc.EthHTTPEndpoint) + if err != nil { + log.Println("Get Tan balance fail at") + continue + } + nodes := m.backend.NodeSet() + for i := range nodes { + n := nodes[i] + address := n.nodeKeyAddress + balance := m.backend.BalanceFromAddress(conn, address) + if balance.Cmp(m.ethThreshold) < 0 { + if cacheBalance, exist := m.ethBalancesCache[address]; exist { + if cacheBalance.Cmp(m.ethThreshold) >= 0 { + ethNodeChan <- n + } + } else { + ethNodeChan <- n + } + } + m.ethBalancesCache[address] = balance + } + time.Sleep(m.checkBalanceDuration) + } +} + +func (m *Monitor) checkTanBalance() { + tanNodeChan := make(chan node) + go m.sendNotifications(tanNodeChan, INSUFFICIENT_TAN) + for { + nodes := m.backend.NodeSet() + nc := NetworkConfigMap[int64(m.networkID)] + conn, err := ethclient.Dial(nc.HTTPEndpoint) + if err != nil { + log.Println("Get Eth balance fail") + continue + } + for i := range nodes { + n := nodes[i] + balance := m.backend.BalanceFromAddress(conn, n.nodeKeyAddress) + if balance.Cmp(Fifty) < 0 { + if cacheBalance, exist := m.tanBalancesCache[n.nodeKeyAddress]; exist { + if cacheBalance.Cmp(Fifty) >= 0 { + tanNodeChan <- n + } + } else { + tanNodeChan <- n + } + } else if balance.Cmp(OneHundred) < 0 { + if cacheBalance, exist := m.tanBalancesCache[n.nodeKeyAddress]; exist { + if cacheBalance.Cmp(OneHundred) >= 0 { + tanNodeChan <- n + } + } else { + tanNodeChan <- n + } + } + m.tanBalancesCache[n.nodeKeyAddress] = balance + } + time.Sleep(m.checkBalanceDuration) + } +} + +// Register registries the notifiers. +func (m *Monitor) Register(n Notifier) { + m.notifiers = append(m.notifiers, n) +} + +func (m *Monitor) fetchFinedNodes(nodeChan chan node) { + m.backend.FetchFinedNodes(nodeChan) +} + +func (m *Monitor) sendNotifications(nodeChan chan node, notifyType uint) { + nc := NetworkConfigMap[int64(m.networkID)] + for { + node, open := <-nodeChan + if !open { + return + } + for _, notifier := range m.notifiers { + notifier.notify(node, nc.Network, + notifyType, m.ethThresholdString) + } + } +} diff --git a/monitor/monitor_test.go b/monitor/monitor_test.go new file mode 100644 index 0000000..fb5c9c5 --- /dev/null +++ b/monitor/monitor_test.go @@ -0,0 +1,88 @@ +package monitor + +import ( + "io/ioutil" + "math/big" + "os" + "testing" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/stretchr/testify/suite" +) + +type monitorTestSuite struct { + suite.Suite +} + +type mockBackend struct{} + +func (m *mockBackend) FetchFinedNodes(nodeChan chan node) { + nodeChan <- node{ + owner: common.Address{}, + email: "jm@byzantine-lab.io", + fined: big.NewInt(1), + name: "unit test", + } + close(nodeChan) +} + +func (m *mockBackend) NodeSet() []node { + n := []node{ + { + owner: common.Address{}, + email: "jm@byzantine-lab.io", + fined: big.NewInt(1), + name: "unit test 100, should not be fined", + nodeKeyAddress: common.BytesToAddress([]byte{1}), + }, + { + owner: common.Address{}, + email: "jm@byzantine-lab.io", + fined: Fifty, + name: "unit test 50", + publicKey: []byte{2}, + nodeKeyAddress: common.BytesToAddress([]byte{2}), + }, + } + return n +} + +func (m *mockBackend) BalanceFromAddress(conn *ethclient.Client, + address common.Address) *big.Int { + if address == common.BytesToAddress([]byte{1}) { + return OneHundred + } + lessThanThreshold, _ := big.NewInt(0).SetString("99999999999999999", 10) + return lessThanThreshold +} + +func (s *monitorTestSuite) TestSendNotification() { + backend := mockBackend{} + m := NewMonitor(374, &backend, "0.1") + nodeChan := make(chan node) + go m.fetchFinedNodes(nodeChan) + password := os.Getenv("TEST_EMAIL_PASSWORD") + ccList, _ := ioutil.ReadFile("./cc-list.txt") + email := NewEmail( + "no-reply@byzantine-lab.io", + password, + "smtp-relay.gmail.com", + string(ccList), + ) + m.Register(email) + m.sendNotifications(nodeChan, FINED) + m.tanBalancesCache[common.BytesToAddress([]byte{1})] = OneHundred + m.tanBalancesCache[common.BytesToAddress([]byte{2})] = Fifty + m.ethBalancesCache[common.BytesToAddress([]byte{1})], _ = big.NewInt(0).SetString("99999999999999999", 10) + m.ethBalancesCache[common.BytesToAddress([]byte{2})], _ = big.NewInt(0).SetString("100000000000000000", 10) + + go m.checkTanBalance() + go m.checkEthBalance() + time.Sleep(5000 * time.Millisecond) +} + +func TestMonitor(t *testing.T) { + suite.Run(t, new(monitorTestSuite)) +} diff --git a/monitor/notifier.go b/monitor/notifier.go new file mode 100644 index 0000000..a89d330 --- /dev/null +++ b/monitor/notifier.go @@ -0,0 +1,205 @@ +package monitor + +import ( + "crypto/tls" + "fmt" + "log" + "net" + "net/mail" + "net/smtp" + "strings" + + "github.com/ethereum/go-ethereum/common" +) + +const ( + // FINED notes the node is fined + FINED uint = iota + // INSUFFICIENT_TAN notes the node key with balance < 100 TAN + INSUFFICIENT_TAN + // INSUFFICIENT_ETH notes the node key with balance < threshold + INSUFFICIENT_ETH +) + +// Notifier is the interface for notifier interfaces. +type Notifier interface { + notify(node, string, uint, string) +} + +// Email is the email notifier object. +type Email struct { + sender string + password string + smtpServer string + ccList string +} + +// NewEmail is the Email constructor. +func NewEmail(sender, password, server, ccList string) Notifier { + e := Email{ + sender: sender, + password: password, + smtpServer: server, + ccList: ccList, + } + return &e +} + +func (e *Email) notify(n node, network string, notifyType uint, threshold string) { + var subj string + var body string + switch notifyType { + case FINED: + subj = "[Notification] Your Tangerine " + network + " Network Full Node is Fined" + body = e.finedBody(n.name) + go e.send(n.email, network, subj, body) + case INSUFFICIENT_TAN: + subj = "[Notification] Tangerine " + network + " Insufficient Balance in Node Key" + body = e.insufficientBalanceBody(n.name, n.nodeKeyAddress) + go e.send(n.email, network, subj, body) + case INSUFFICIENT_ETH: + subj = "[Notification] Tangerine " + network + " Insufficient ETH in Node Key" + body = e.insufficientETHBalanceBody(n.name, + n.nodeKeyAddress, threshold, network) + go e.send(n.email, network, subj, body) + } +} + +func (e *Email) finedBody(name string) string { + body := ` +Dear Node Operator: + + Your full node "` + name + `" is fined. + Please pay the fine, and check your node status. + Also, please check https://byzantine-lab.gitlab.io/wiki/#/Rules-for-the-node-set?id=penalty for the penalty condition. + + Thanks for your cooperation. + +-- Tangerine Network +` + return body +} + +func (e *Email) insufficientBalanceBody(name string, address common.Address) string { + body := ` +Dear Node Operator: + + There is no sufficient balacne in your full node "` + name + `" key address "` + address.Hex() + `". + Please transfer some tokens to the node key address and keep the balance at least 200 TAN. + + Thanks for your cooperation. + +-- Tangerine Network +` + return body +} + +func (e *Email) insufficientETHBalanceBody( + name string, + address common.Address, + threshold string, + network string) string { + ethNet := "Rinkeby" + if network == "Mainnet" { + ethNet = "Mainnet" + } + body := ` +Dear Node Operator: + + There is no sufficient ETH in your full node "` + name + `" key address "` + address.Hex() + `". + Please transfer some ETH (` + ethNet + `) to the node key address and keep the balance at least ` + threshold + ` ETH. + + Thanks for your cooperation. + +-- Tangerine Network +` + return body +} + +func (e *Email) send(toAddress, network, subj, body string) { + from := mail.Address{Name: "Tangerine Notifier", Address: e.sender} + to := mail.Address{Address: toAddress} + // Setup headers + headers := make(map[string]string) + headers["From"] = from.String() + headers["To"] = to.String() + headers["Subject"] = subj + if e.ccList != "" { + headers["Cc"] = strings.TrimSuffix(e.ccList, "\n") + } + + // Setup message + message := "" + for k, v := range headers { + message += fmt.Sprintf("%s: %s\r\n", k, v) + } + message += "\r\n" + body + + // Connect to the SMTP Server + servername := e.smtpServer + ":465" + + host, _, _ := net.SplitHostPort(servername) + + auth := smtp.PlainAuth("", e.sender, e.password, host) + + // TLS config + tlsconfig := &tls.Config{ + InsecureSkipVerify: false, + ServerName: host, + } + + // Here is the key, you need to call tls.Dial instead of smtp.Dial + // for smtp servers running on 465 that require an ssl connection + // from the very beginning (no starttls) + conn, err := tls.Dial("tcp", servername, tlsconfig) + if err != nil { + log.Panic(err) + } + + c, err := smtp.NewClient(conn, host) + if err != nil { + log.Panic(err) + } + + // Auth + if err = c.Auth(auth); err != nil { + log.Panic(err) + } + + // To && From + if err = c.Mail(from.Address); err != nil { + log.Panic(err) + } + + if err = c.Rcpt(to.Address); err != nil { + log.Panic(err) + } + + if e.ccList != "" { + cc := strings.Split(e.ccList, ",") + for _, address := range cc { + address = strings.TrimSuffix(address, "\n") + if err = c.Rcpt(address); err != nil { + log.Println("add cc fail", address, err) + } + } + } + + // Data + w, err := c.Data() + if err != nil { + log.Panic(err) + } + + _, err = w.Write([]byte(message)) + if err != nil { + log.Panic(err) + } + + err = w.Close() + if err != nil { + log.Panic(err) + } + + c.Quit() +} |