diff --git a/accounts/abi/bind/auth.go b/accounts/abi/bind/auth.go index e6bb0c3b5..0379dd936 100644 --- a/accounts/abi/bind/auth.go +++ b/accounts/abi/bind/auth.go @@ -26,7 +26,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" -) + "github.com/ethereum/go-ethereum/accounts" + ) // NewTransactor is a utility method to easily create a transaction signer from // an encrypted json key stream and the associated passphrase. @@ -60,3 +61,17 @@ func NewKeyedTransactor(key *ecdsa.PrivateKey) *TransactOpts { }, } } + + +func NewWalletTransactor(w accounts.Wallet, from accounts.Account) *TransactOpts { + return &TransactOpts{ + From: from.Address, + Signer: func(signer types.Signer, address common.Address, tx *types.Transaction) (*types.Transaction, error) { + signature, err := w.SignHash(from, signer.Hash(tx).Bytes()) + if err != nil { + return nil, err + } + return tx.WithSignature(signer, signature) + }, + } +} \ No newline at end of file diff --git a/controls/cluster/clusterkey_binding.go b/controls/bind/clusterkey_binding.go similarity index 99% rename from controls/cluster/clusterkey_binding.go rename to controls/bind/clusterkey_binding.go index 6e4207a00..84fb2ef47 100644 --- a/controls/cluster/clusterkey_binding.go +++ b/controls/bind/clusterkey_binding.go @@ -1,7 +1,7 @@ // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. -package cluster +package bind import ( "strings" diff --git a/controls/permbind/permission_binding.go b/controls/bind/permission_binding.go similarity index 94% rename from controls/permbind/permission_binding.go rename to controls/bind/permission_binding.go index c96c93078..3da9d1cbb 100644 --- a/controls/permbind/permission_binding.go +++ b/controls/bind/permission_binding.go @@ -1,7 +1,7 @@ // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. -package permbind +package bind import ( "math/big" @@ -16,7 +16,7 @@ import ( ) // PermissionsABI is the input ABI used to generate the binding from. -const PermissionsABI = "[{\"constant\":true,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"getVoteCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_voter\",\"type\":\"address\"}],\"name\":\"getVoteStatus\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"approveNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getNumberOfAccounts\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"getNodeStatus\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"deactivateNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"updateNetworkBootStatus\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"proposeDeactivation\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"blacklistNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getNetworkBootStatus\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_ipAddrPort\",\"type\":\"string\"},{\"name\":\"_discPort\",\"type\":\"string\"},{\"name\":\"_raftPort\",\"type\":\"string\"}],\"name\":\"proposeNodeBlacklisting\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getEnodeId\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"removeVoter\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getNumberOfNodes\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"},{\"name\":\"_accountAccess\",\"type\":\"uint8\"}],\"name\":\"updateAccountAccess\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_ipAddrPort\",\"type\":\"string\"},{\"name\":\"_discPort\",\"type\":\"string\"},{\"name\":\"_raftPort\",\"type\":\"string\"}],\"name\":\"proposeNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getAccountAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"addVoter\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"NodeProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_ipAddrPort\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_discPort\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_raftPort\",\"type\":\"string\"}],\"name\":\"NodeApproved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_accountAddress\",\"type\":\"address\"}],\"name\":\"VoteNodeApproval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"NodePendingDeactivation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_ipAddrPort\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_discPort\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_raftPort\",\"type\":\"string\"}],\"name\":\"NodeDeactivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_accountAddress\",\"type\":\"address\"}],\"name\":\"VoteNodeDeactivation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"NodePendingBlacklist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_ipAddrPort\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_discPort\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_raftPort\",\"type\":\"string\"}],\"name\":\"NodeBlacklisted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_accountAddress\",\"type\":\"address\"}],\"name\":\"VoteNodeBlacklist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_address\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_access\",\"type\":\"uint8\"}],\"name\":\"AccountAccessModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"NoVotingAccount\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"VoterAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"VoterRemoved\",\"type\":\"event\"}]" +const PermissionsABI = "[{\"constant\":true,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"getVoteCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_voter\",\"type\":\"address\"}],\"name\":\"getVoteStatus\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"approveNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getNumberOfAccounts\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"getNodeStatus\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"deactivateNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"updateNetworkBootStatus\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"proposeDeactivation\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"blacklistNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getNetworkBootStatus\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_ipAddrPort\",\"type\":\"string\"},{\"name\":\"_discPort\",\"type\":\"string\"},{\"name\":\"_raftPort\",\"type\":\"string\"}],\"name\":\"proposeNodeBlacklisting\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getEnodeId\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"removeVoter\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getNumberofVoters\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getNumberOfNodes\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"},{\"name\":\"_accountAccess\",\"type\":\"uint8\"}],\"name\":\"updateAccountAccess\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_ipAddrPort\",\"type\":\"string\"},{\"name\":\"_discPort\",\"type\":\"string\"},{\"name\":\"_raftPort\",\"type\":\"string\"}],\"name\":\"proposeNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getAccountAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"addVoter\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"NodeProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_ipAddrPort\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_discPort\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_raftPort\",\"type\":\"string\"}],\"name\":\"NodeApproved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_accountAddress\",\"type\":\"address\"}],\"name\":\"VoteNodeApproval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"NodePendingDeactivation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_ipAddrPort\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_discPort\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_raftPort\",\"type\":\"string\"}],\"name\":\"NodeDeactivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_accountAddress\",\"type\":\"address\"}],\"name\":\"VoteNodeDeactivation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"NodePendingBlacklist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_ipAddrPort\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_discPort\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_raftPort\",\"type\":\"string\"}],\"name\":\"NodeBlacklisted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_accountAddress\",\"type\":\"address\"}],\"name\":\"VoteNodeBlacklist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_address\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_access\",\"type\":\"uint8\"}],\"name\":\"AccountAccessModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"NoVotingAccount\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"VoterAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"VoterRemoved\",\"type\":\"event\"}]" // Permissions is an auto generated Go binding around an Ethereum contract. type Permissions struct { @@ -316,6 +316,32 @@ func (_Permissions *PermissionsCallerSession) GetNumberOfNodes() (*big.Int, erro return _Permissions.Contract.GetNumberOfNodes(&_Permissions.CallOpts) } +// GetNumberofVoters is a free data retrieval call binding the contract method 0xb369f285. +// +// Solidity: function getNumberofVoters() constant returns(uint256) +func (_Permissions *PermissionsCaller) GetNumberofVoters(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Permissions.contract.Call(opts, out, "getNumberofVoters") + return *ret0, err +} + +// GetNumberofVoters is a free data retrieval call binding the contract method 0xb369f285. +// +// Solidity: function getNumberofVoters() constant returns(uint256) +func (_Permissions *PermissionsSession) GetNumberofVoters() (*big.Int, error) { + return _Permissions.Contract.GetNumberofVoters(&_Permissions.CallOpts) +} + +// GetNumberofVoters is a free data retrieval call binding the contract method 0xb369f285. +// +// Solidity: function getNumberofVoters() constant returns(uint256) +func (_Permissions *PermissionsCallerSession) GetNumberofVoters() (*big.Int, error) { + return _Permissions.Contract.GetNumberofVoters(&_Permissions.CallOpts) +} + // GetVoteCount is a free data retrieval call binding the contract method 0x069953a7. // // Solidity: function getVoteCount(_enodeId string) constant returns(uint256) diff --git a/controls/cluster/cluster.go b/controls/cluster/cluster.go index dfee6d615..64e75fd3b 100644 --- a/controls/cluster/cluster.go +++ b/controls/cluster/cluster.go @@ -8,6 +8,7 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/node" "github.com/ethereum/go-ethereum/controls" + pbind "github.com/ethereum/go-ethereum/controls/bind" ) type OrgKeyCtrl struct { @@ -27,7 +28,7 @@ func NewOrgKeyCtrl(node *node.Node) (*OrgKeyCtrl, error) { // the permissiones contract deployed as a precompile via genesis.json func (k *OrgKeyCtrl) Start() error { - _, err := NewClusterFilterer(params.PrivateKeyManagementContract, k.ethClient) + _, err := pbind.NewClusterFilterer(params.QuorumPrivateKeyManagementContract, k.ethClient) // check if permissioning contract is there at address. If not return from here if err != nil { log.Error("Cluster not enabled for the network : ", "err", err) @@ -49,7 +50,7 @@ func (k *OrgKeyCtrl) manageClusterKeys() error { } func (k *OrgKeyCtrl) populatePrivateKeys() error { - cluster, err := NewClusterFilterer(params.PrivateKeyManagementContract, k.ethClient) + cluster, err := pbind.NewClusterFilterer(params.QuorumPrivateKeyManagementContract, k.ethClient) if err != nil { log.Error("Failed to monitor node delete: ", "err", err) return err @@ -86,16 +87,16 @@ func (k *OrgKeyCtrl) monitorKeyChanges() { } func (k *OrgKeyCtrl) monitorKeyAdd() { - cluster, err := NewClusterFilterer(params.PrivateKeyManagementContract, k.ethClient) + cluster, err := pbind.NewClusterFilterer(params.QuorumPrivateKeyManagementContract, k.ethClient) if err != nil { log.Error("Failed to monitor Account cluster : ", "err", err) } - ch := make(chan *ClusterOrgKeyAdded) + ch := make(chan *pbind.ClusterOrgKeyAdded) opts := &bind.WatchOpts{} var blockNumber uint64 = 1 opts.Start = &blockNumber - var newEvent *ClusterOrgKeyAdded + var newEvent *pbind.ClusterOrgKeyAdded _, err = cluster.WatchOrgKeyAdded(opts, ch) if err != nil { @@ -111,16 +112,16 @@ func (k *OrgKeyCtrl) monitorKeyAdd() { } func (k *OrgKeyCtrl) monitorKeyDelete() { - cluster, err := NewClusterFilterer(params.PrivateKeyManagementContract, k.ethClient) + cluster, err := pbind.NewClusterFilterer(params.QuorumPrivateKeyManagementContract, k.ethClient) if err != nil { log.Error("Failed to monitor Account cluster : ", "err", err) } - ch := make(chan *ClusterOrgKeyDeleted) + ch := make(chan *pbind.ClusterOrgKeyDeleted) opts := &bind.WatchOpts{} var blockNumber uint64 = 1 opts.Start = &blockNumber - var newEvent *ClusterOrgKeyDeleted + var newEvent *pbind.ClusterOrgKeyDeleted _, err = cluster.WatchOrgKeyDeleted(opts, ch) if err != nil { diff --git a/controls/permission/Permission.sol b/controls/permission/Permission.sol index cab353f00..e8631e3e2 100644 --- a/controls/permission/Permission.sol +++ b/controls/permission/Permission.sol @@ -87,6 +87,11 @@ contract Permissions { /* public and external functions */ // view functions + // Get number of nodes + function getNumberofVoters() public view returns (uint) + { + return accountList.length; + } // Get number of nodes function getNetworkBootStatus() public view returns (bool) { diff --git a/controls/permission/abi/Permissions.abi b/controls/permission/abi/Permissions.abi index e5ed3fe82..c19dcfd34 100644 --- a/controls/permission/abi/Permissions.abi +++ b/controls/permission/abi/Permissions.abi @@ -1 +1 @@ -[{"constant":true,"inputs":[{"name":"_enodeId","type":"string"}],"name":"getVoteCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_enodeId","type":"string"},{"name":"_voter","type":"address"}],"name":"getVoteStatus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"}],"name":"approveNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getNumberOfAccounts","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_enodeId","type":"string"}],"name":"getNodeStatus","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"}],"name":"deactivateNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"updateNetworkBootStatus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"}],"name":"proposeDeactivation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"}],"name":"blacklistNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getNetworkBootStatus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"},{"name":"_ipAddrPort","type":"string"},{"name":"_discPort","type":"string"},{"name":"_raftPort","type":"string"}],"name":"proposeNodeBlacklisting","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"getEnodeId","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"removeVoter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getNumberOfNodes","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"_accountAccess","type":"uint8"}],"name":"updateAccountAccess","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"},{"name":"_ipAddrPort","type":"string"},{"name":"_discPort","type":"string"},{"name":"_raftPort","type":"string"}],"name":"proposeNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"getAccountAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"addVoter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"}],"name":"NodeProposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_ipAddrPort","type":"string"},{"indexed":false,"name":"_discPort","type":"string"},{"indexed":false,"name":"_raftPort","type":"string"}],"name":"NodeApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_accountAddress","type":"address"}],"name":"VoteNodeApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"}],"name":"NodePendingDeactivation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_ipAddrPort","type":"string"},{"indexed":false,"name":"_discPort","type":"string"},{"indexed":false,"name":"_raftPort","type":"string"}],"name":"NodeDeactivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_accountAddress","type":"address"}],"name":"VoteNodeDeactivation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"}],"name":"NodePendingBlacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_ipAddrPort","type":"string"},{"indexed":false,"name":"_discPort","type":"string"},{"indexed":false,"name":"_raftPort","type":"string"}],"name":"NodeBlacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_accountAddress","type":"address"}],"name":"VoteNodeBlacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_address","type":"address"},{"indexed":false,"name":"_access","type":"uint8"}],"name":"AccountAccessModified","type":"event"},{"anonymous":false,"inputs":[],"name":"NoVotingAccount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_address","type":"address"}],"name":"VoterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_address","type":"address"}],"name":"VoterRemoved","type":"event"}] \ No newline at end of file +[{"constant":true,"inputs":[{"name":"_enodeId","type":"string"}],"name":"getVoteCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_enodeId","type":"string"},{"name":"_voter","type":"address"}],"name":"getVoteStatus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"}],"name":"approveNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getNumberOfAccounts","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_enodeId","type":"string"}],"name":"getNodeStatus","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"}],"name":"deactivateNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"updateNetworkBootStatus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"}],"name":"proposeDeactivation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"}],"name":"blacklistNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getNetworkBootStatus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"},{"name":"_ipAddrPort","type":"string"},{"name":"_discPort","type":"string"},{"name":"_raftPort","type":"string"}],"name":"proposeNodeBlacklisting","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"getEnodeId","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"removeVoter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getNumberofVoters","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNumberOfNodes","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"_accountAccess","type":"uint8"}],"name":"updateAccountAccess","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"},{"name":"_ipAddrPort","type":"string"},{"name":"_discPort","type":"string"},{"name":"_raftPort","type":"string"}],"name":"proposeNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"getAccountAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"addVoter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"}],"name":"NodeProposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_ipAddrPort","type":"string"},{"indexed":false,"name":"_discPort","type":"string"},{"indexed":false,"name":"_raftPort","type":"string"}],"name":"NodeApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_accountAddress","type":"address"}],"name":"VoteNodeApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"}],"name":"NodePendingDeactivation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_ipAddrPort","type":"string"},{"indexed":false,"name":"_discPort","type":"string"},{"indexed":false,"name":"_raftPort","type":"string"}],"name":"NodeDeactivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_accountAddress","type":"address"}],"name":"VoteNodeDeactivation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"}],"name":"NodePendingBlacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_ipAddrPort","type":"string"},{"indexed":false,"name":"_discPort","type":"string"},{"indexed":false,"name":"_raftPort","type":"string"}],"name":"NodeBlacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_accountAddress","type":"address"}],"name":"VoteNodeBlacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_address","type":"address"},{"indexed":false,"name":"_access","type":"uint8"}],"name":"AccountAccessModified","type":"event"},{"anonymous":false,"inputs":[],"name":"NoVotingAccount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_address","type":"address"}],"name":"VoterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_address","type":"address"}],"name":"VoterRemoved","type":"event"}] \ No newline at end of file diff --git a/controls/permission/abi/Permissions.bin-runtime b/controls/permission/abi/Permissions.bin-runtime index 36e4da6ef..145831aa8 100644 --- a/controls/permission/abi/Permissions.bin-runtime +++ b/controls/permission/abi/Permissions.bin-runtime @@ -1 +1 @@ -6080604052600436106100fc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063069953a7146101015780630fdc21501461017e57806321c670881461021f578063309e36ef1461025a578063397eeccb14610285578063420c26de1461031057806344478e791461034b57806347b8fe571461037a578063487363f9146103b55780634cbfa82e146103f057806360514a5a1461041f578063769b24f2146104a257806386c1ff6814610548578063b81c806a1461058b578063c6962b99146105b6578063c7ab7ccf14610606578063db4cf8e614610689578063f4ab9adf146106f6575b600080fd5b34801561010d57600080fd5b50610168600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050610739565b6040518082815260200191505060405180910390f35b34801561018a57600080fd5b50610205600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108c2565b604051808215151515815260200191505060405180910390f35b34801561022b57600080fd5b50610258600480360381019080803590602001908201803590602001919091929391929390505050610a96565b005b34801561026657600080fd5b5061026f610eff565b6040518082815260200191505060405180910390f35b34801561029157600080fd5b506102ec600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050610f0c565b604051808260068111156102fc57fe5b60ff16815260200191505060405180910390f35b34801561031c57600080fd5b506103496004803603810190808035906020019082018035906020019190919293919293905050506110af565b005b34801561035757600080fd5b50610360611518565b604051808215151515815260200191505060405180910390f35b34801561038657600080fd5b506103b36004803603810190808035906020019082018035906020019190919293919293905050506115fa565b005b3480156103c157600080fd5b506103ee600480360381019080803590602001908201803590602001919091929391929390505050611a3f565b005b3480156103fc57600080fd5b50610405611ea8565b604051808215151515815260200191505060405180910390f35b34801561042b57600080fd5b506104a0600480360381019080803590602001908201803590602001919091929391929390803590602001908201803590602001919091929391929390803590602001908201803590602001919091929391929390803590602001908201803590602001919091929391929390505050611ebf565b005b3480156104ae57600080fd5b506104cd600480360381019080803590602001909291905050506123c3565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561050d5780820151818401526020810190506104f2565b50505050905090810190601f16801561053a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561055457600080fd5b50610589600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124a9565b005b34801561059757600080fd5b506105a0612696565b6040518082815260200191505060405180910390f35b3480156105c257600080fd5b50610604600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff1690602001909291905050506126a0565b005b34801561061257600080fd5b5061068760048036038101908080359060200190820180359060200191909192939192939080359060200190820180359060200191909192939192939080359060200190820180359060200191909192939192939080359060200190820180359060200191909192939192939050505061271d565b005b34801561069557600080fd5b506106b460048036038101908080359060200190929190505050612f22565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561070257600080fd5b50610737600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f7d565b005b600081600060016000836040516020018082805190602001908083835b60208310151561077b5780518252602082019150602081019050602083039250610756565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b6020831015156107e457805182526020820191506020810190506020830392506107bf565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916600019168152602001908152602001600020541415151561089e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f456e6f6465206973206e6f7420696e20746865206c697374000000000000000081525060200191505060405180910390fd5b600560006108ab856130dd565b815260200190815260200160002054915050919050565b600082600060016000836040516020018082805190602001908083835b60208310151561090457805182526020820191506020810190506020830392506108df565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310151561096d5780518252602082019150602081019050602083039250610948565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600019166000191681526020019081526020016000205414151515610a27576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f456e6f6465206973206e6f7420696e20746865206c697374000000000000000081525060200191505060405180910390fd5b60046000610a34866130dd565b815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1691505092915050565b6000806000809150600090505b600380549050811015610b33573373ffffffffffffffffffffffffffffffffffffffff16600382815481101515610ad657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610b265760019150610b33565b8080600101915050610aa3565b811515610ba8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4163636f756e742063616e206e6f7420766f746500000000000000000000000081525060200191505060405180910390fd5b60016006811115610bb557fe5b610bf086868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050610f0c565b6006811115610bfb57fe5b141515610c96576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f4e6f6465206e65656420746f20626520696e2050656e64696e67417070726f7681526020017f616c20737461747573000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b610cd185858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506130dd565b9250600015156004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141515610dac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4e6f64652063616e206e6f7420646f75626c6520766f7465000000000000000081525060200191505060405180910390fd5b60016004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060056000848152602001908152602001600020600081548092919060010191905055507fffbebd8cfb97304c3b16b9139a3f06e547af483cc4b5111bdbb66ccdf2aa43f385853360405180806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281038252858582818152602001925080828437820191505094505050505060405180910390a1610ef885858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506131d2565b5050505050565b6000600380549050905090565b600081600060016000836040516020018082805190602001908083835b602083101515610f4e5780518252602082019150602081019050602083039250610f29565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b602083101515610fb75780518252602082019150602081019050602083039250610f92565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600019166000191681526020019081526020016000205414151515611071576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f456e6f6465206973206e6f7420696e20746865206c697374000000000000000081525060200191505060405180910390fd5b600061107c846130dd565b81548110151561108857fe5b906000526020600020906005020160040160009054906101000a900460ff16915050919050565b6000806000809150600090505b60038054905081101561114c573373ffffffffffffffffffffffffffffffffffffffff166003828154811015156110ef57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561113f576001915061114c565b80806001019150506110bc565b8115156111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4163636f756e742063616e206e6f7420766f746500000000000000000000000081525060200191505060405180910390fd5b600360068111156111ce57fe5b61120986868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050610f0c565b600681111561121457fe5b1415156112af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f4e6f6465206e65656420746f20626520696e2050656e64696e6744656163746981526020017f766174696f6e207374617475730000000000000000000000000000000000000081525060400191505060405180910390fd5b6112ea85858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506130dd565b9250600015156004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415156113c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4e6f64652063616e206e6f7420646f75626c6520766f7465000000000000000081525060200191505060405180910390fd5b60016004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060056000848152602001908152602001600020600081548092919060010191905055507fa5243abad84fa64b3ca3ab0b45c7954a089a38bd40d0797fc3c0e8ee304229e185853360405180806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281038252858582818152602001925080828437820191505094505050505060405180910390a161151185858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050613525565b5050505050565b6000801515600660009054906101000a900460ff1615151415156115ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f496e76616c69642063616c6c3a204e6574776f726b20626f6f7420757020636f81526020017f6d706c657465640000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600660006101000a81548160ff021916908315150217905550600660009054906101000a900460ff16905090565b60008083838080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050600060016000836040516020018082805190602001908083835b60208310151561166f578051825260208201915060208101905060208303925061164a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b6020831015156116d857805182526020820191506020810190506020830392506116b3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600019166000191681526020019081526020016000205414151515611792576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f456e6f6465206973206e6f7420696e20746865206c697374000000000000000081525060200191505060405180910390fd5b61179a613878565b15611a3857600260068111156117ac57fe5b6117e786868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050610f0c565b60068111156117f257fe5b14151561188d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4e6f6465206e65656420746f20626520696e20417070726f766564207374617481526020017f757300000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6118c885858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506130dd565b925060036000848154811015156118db57fe5b906000526020600020906005020160040160006101000a81548160ff0219169083600681111561190757fe5b0217905550600091505b6003805490508210156119cd57600060046000858152602001908152602001600020600060038581548110151561194457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508180600101925050611911565b600060056000858152602001908152602001600020819055507f2b5689b33f48f1dcbda2084e130a9bee7b3bf14dc767ea74cbdf3e5fffb118e48585604051808060200182810382528484828181526020019250808284378201915050935050505060405180910390a15b5050505050565b6000806000809150600090505b600380549050811015611adc573373ffffffffffffffffffffffffffffffffffffffff16600382815481101515611a7f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611acf5760019150611adc565b8080600101915050611a4c565b811515611b51576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4163636f756e742063616e206e6f7420766f746500000000000000000000000081525060200191505060405180910390fd5b60056006811115611b5e57fe5b611b9986868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050610f0c565b6006811115611ba457fe5b141515611c3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f4e6f6465206e65656420746f20626520696e2050656e64696e67426c61636b6c81526020017f697374696e67207374617475730000000000000000000000000000000000000081525060400191505060405180910390fd5b611c7a85858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506130dd565b9250600015156004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141515611d55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4e6f64652063616e206e6f7420646f75626c6520766f7465000000000000000081525060200191505060405180910390fd5b60016004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060056000848152602001908152602001600020600081548092919060010191905055507fe5db3c593cd193882142dc86075a90f3b5075cbe3df4f433517393e29aa7327f85853360405180806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281038252858582818152602001925080828437820191505094505050505060405180910390a1611ea185858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506138c4565b5050505050565b6000600660009054906101000a900460ff16905090565b600080611eca613878565b156123b7576000600160008c8c604051602001808383808284378201915050925050506040516020818303038152906040526040518082805190602001908083835b602083101515611f315780518252602082019150602081019050602083039250611f0c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002054141515612000576005600083815481101515611f8d57fe5b906000526020600020906005020160040160006101000a81548160ff02191690836006811115611fb957fe5b0217905550611ff98a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506130dd565b915061228b565b600260008154809291906001019190505550600254600160008c8c604051602001808383808284378201915050925050506040516020818303038152906040526040518082805190602001908083835b6020831015156120755780518252602082019150602081019050602083039250612050565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002081905550600060a0604051908101604052808c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505081526020018a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200186868080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050508152602001600560068111156121b757fe5b815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190612201929190613c17565b50602082015181600101908051906020019061221e929190613c17565b50604082015181600201908051906020019061223b929190613c17565b506060820151816003019080519060200190612258929190613c17565b5060808201518160040160006101000a81548160ff0219169083600681111561227d57fe5b021790555050505060025491505b600090505b60038054905081101561234c5760006004600084815260200190815260200160002060006003848154811015156122c357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050612290565b600060056000848152602001908152602001600020819055507fb249ebebf429f1c79f3c9663998b3e22d45f242de6527c4a95e41d4d28115d748a8a604051808060200182810382528484828181526020019250808284378201915050935050505060405180910390a15b50505050505050505050565b606060025482111515612490576000828154811015156123df57fe5b90600052602060002090600502016000018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124845780601f1061245957610100808354040283529160200191612484565b820191906000526020600020905b81548152906001019060200180831161246757829003601f168201915b505050505090506124a4565b602060405190810160405280600081525090505b919050565b600080600091505b600380549050821015612691578273ffffffffffffffffffffffffffffffffffffffff166003838154811015156124e457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612684576001820190505b6003805490508110156125e05760038181548110151561254e57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660036001830381548110151561258b57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080600101915050612532565b600380805490508154811015156125f357fe5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690557fa14a79af012d1756818f9bd59ccfc9ad185a71df86b9392d9059d9e6faf6d64483604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b81806001019250506124b1565b505050565b6000600254905090565b7f5c7c83802ef5601aed89f3f4e4ab42298ecf8ac3fe099adad5712fc65ba9676d8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600381111561270557fe5b60ff1681526020019250505060405180910390a15050565b600088888080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050600060016000836040516020018082805190602001908083835b602083101515612791578051825260208201915060208101905060208303925061276c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b6020831015156127fa57805182526020820191506020810190506020830392506127d5565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916600019168152602001908152602001600020541415156128b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f456e6f646520697320696e20746865206c69737400000000000000000000000081525060200191505060405180910390fd5b600660009054906101000a900460ff161515612b5357600260008154809291906001019190505550600254600160008c8c604051602001808383808284378201915050925050506040516020818303038152906040526040518082805190602001908083835b60208310151561293e5780518252602082019150602081019050602083039250612919565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002081905550600060a0604051908101604052808c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505081526020018a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200160026006811115612a8057fe5b815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190612aca929190613c17565b506020820151816001019080519060200190612ae7929190613c17565b506040820151816002019080519060200190612b04929190613c17565b506060820151816003019080519060200190612b21929190613c17565b5060808201518160040160006101000a81548160ff02191690836006811115612b4657fe5b0217905550505050612f16565b612b5b613878565b15612f1557600260008154809291906001019190505550600254600160008c8c604051602001808383808284378201915050925050506040516020818303038152906040526040518082805190602001908083835b602083101515612bd55780518252602082019150602081019050602083039250612bb0565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002081905550600060a0604051908101604052808c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505081526020018a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200160016006811115612d1757fe5b815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190612d61929190613c17565b506020820151816001019080519060200190612d7e929190613c17565b506040820151816002019080519060200190612d9b929190613c17565b506060820151816003019080519060200190612db8929190613c17565b5060808201518160040160006101000a81548160ff02191690836006811115612ddd57fe5b0217905550505050600091505b600380549050821015612ea85760006004600060025481526020019081526020016000206000600385815481101515612e1f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508180600101925050612dea565b6000600560006002548152602001908152602001600020819055507faddedf3fcf588a85e0b0c3210c30da3f5597ae35221859f7e19427397a2ba80a8a8a604051808060200182810382528484828181526020019250808284378201915050935050505060405180910390a15b5b50505050505050505050565b600060038054905082111515612f7357600382815481101515612f4157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612f78565b600090505b919050565b60008090505b60038054905081101561300f578173ffffffffffffffffffffffffffffffffffffffff16600382815481101515612fb657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613002576130d9565b8080600101915050612f83565b60038290806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550507fa636f4a11e2d3ba7f89d042ecb0a6b886716e98cd49d8fd876ee0f73bced42b882604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b5050565b60006001806000846040516020018082805190602001908083835b60208310151561311d57805182526020820191506020810190506020830392506130f8565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b6020831015156131865780518252602082019150602081019050602083039250613161565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002054039050919050565b60006131dd826130dd565b905060026003805490508115156131f057fe5b046005600083815260200190815260200160002054111561352157600260008281548110151561321c57fe5b906000526020600020906005020160040160006101000a81548160ff0219169083600681111561324857fe5b02179055507fc6d86deaa3b3cf7c374cfd405aae9f08571fce2bf6ccfe8f98a399cda8960a9860008281548110151561327d57fe5b906000526020600020906005020160000160008381548110151561329d57fe5b90600052602060002090600502016001016000848154811015156132bd57fe5b90600052602060002090600502016002016000858154811015156132dd57fe5b906000526020600020906005020160030160405180806020018060200180602001806020018581038552898181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156133835780601f1061335857610100808354040283529160200191613383565b820191906000526020600020905b81548152906001019060200180831161336657829003601f168201915b50508581038452888181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156134065780601f106133db57610100808354040283529160200191613406565b820191906000526020600020905b8154815290600101906020018083116133e957829003601f168201915b50508581038352878181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156134895780601f1061345e57610100808354040283529160200191613489565b820191906000526020600020905b81548152906001019060200180831161346c57829003601f168201915b505085810382528681815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561350c5780601f106134e15761010080835404028352916020019161350c565b820191906000526020600020905b8154815290600101906020018083116134ef57829003601f168201915b50509850505050505050505060405180910390a15b5050565b6000613530826130dd565b9050600260038054905081151561354357fe5b046005600083815260200190815260200160002054111561387457600460008281548110151561356f57fe5b906000526020600020906005020160040160006101000a81548160ff0219169083600681111561359b57fe5b02179055507fd5fa0ecdea15b332dd0a270c65234bc4aee212edf2ed62eb2fd182ef55ca98a16000828154811015156135d057fe5b90600052602060002090600502016000016000838154811015156135f057fe5b906000526020600020906005020160010160008481548110151561361057fe5b906000526020600020906005020160020160008581548110151561363057fe5b906000526020600020906005020160030160405180806020018060200180602001806020018581038552898181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156136d65780601f106136ab576101008083540402835291602001916136d6565b820191906000526020600020905b8154815290600101906020018083116136b957829003601f168201915b50508581038452888181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156137595780601f1061372e57610100808354040283529160200191613759565b820191906000526020600020905b81548152906001019060200180831161373c57829003601f168201915b50508581038352878181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156137dc5780601f106137b1576101008083540402835291602001916137dc565b820191906000526020600020905b8154815290600101906020018083116137bf57829003601f168201915b505085810382528681815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561385f5780601f106138345761010080835404028352916020019161385f565b820191906000526020600020905b81548152906001019060200180831161384257829003601f168201915b50509850505050505050505060405180910390a15b5050565b60008060038054905014156138bc577f4b3dfc3b006eb0d5d60b3f275b4796aa31ed21a75d2e91fe750fc7549b426f6760405160405180910390a1600090506138c1565b600190505b90565b60006138cf826130dd565b905060026003805490508115156138e257fe5b0460056000838152602001908152602001600020541115613c1357600660008281548110151561390e57fe5b906000526020600020906005020160040160006101000a81548160ff0219169083600681111561393a57fe5b02179055507fe1b239bf9d5854aeca74dfeac25d6ce470230bdb5f0eec48713c4375becfe97e60008281548110151561396f57fe5b906000526020600020906005020160000160008381548110151561398f57fe5b90600052602060002090600502016001016000848154811015156139af57fe5b90600052602060002090600502016002016000858154811015156139cf57fe5b90600052602060002090600502016003016040518080602001806020018060200180602001858103855289818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015613a755780601f10613a4a57610100808354040283529160200191613a75565b820191906000526020600020905b815481529060010190602001808311613a5857829003601f168201915b5050858103845288818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015613af85780601f10613acd57610100808354040283529160200191613af8565b820191906000526020600020905b815481529060010190602001808311613adb57829003601f168201915b5050858103835287818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015613b7b5780601f10613b5057610100808354040283529160200191613b7b565b820191906000526020600020905b815481529060010190602001808311613b5e57829003601f168201915b5050858103825286818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015613bfe5780601f10613bd357610100808354040283529160200191613bfe565b820191906000526020600020905b815481529060010190602001808311613be157829003601f168201915b50509850505050505050505060405180910390a15b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613c5857805160ff1916838001178555613c86565b82800160010185558215613c86579182015b82811115613c85578251825591602001919060010190613c6a565b5b509050613c939190613c97565b5090565b613cb991905b80821115613cb5576000816000905550600101613c9d565b5090565b905600a165627a7a723058208fabaa7b19bc91b1b576424d6ac1f39dade73f870d414009d8f8d545b37499580029 \ No newline at end of file +608060405260043610610107576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063069953a71461010c5780630fdc21501461018957806321c670881461022a578063309e36ef14610265578063397eeccb14610290578063420c26de1461031b57806344478e791461035657806347b8fe5714610385578063487363f9146103c05780634cbfa82e146103fb57806360514a5a1461042a578063769b24f2146104ad57806386c1ff6814610553578063b369f28514610596578063b81c806a146105c1578063c6962b99146105ec578063c7ab7ccf1461063c578063db4cf8e6146106bf578063f4ab9adf1461072c575b600080fd5b34801561011857600080fd5b50610173600480360381019080803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061076f565b6040518082815260200191505060405180910390f35b34801561019557600080fd5b50610210600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108f8565b604051808215151515815260200191505060405180910390f35b34801561023657600080fd5b50610263600480360381019080803590602001908201803590602001919091929391929390505050610acc565b005b34801561027157600080fd5b5061027a610f35565b6040518082815260200191505060405180910390f35b34801561029c57600080fd5b506102f7600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050610f42565b6040518082600681111561030757fe5b60ff16815260200191505060405180910390f35b34801561032757600080fd5b506103546004803603810190808035906020019082018035906020019190919293919293905050506110e5565b005b34801561036257600080fd5b5061036b61154e565b604051808215151515815260200191505060405180910390f35b34801561039157600080fd5b506103be600480360381019080803590602001908201803590602001919091929391929390505050611630565b005b3480156103cc57600080fd5b506103f9600480360381019080803590602001908201803590602001919091929391929390505050611a75565b005b34801561040757600080fd5b50610410611ede565b604051808215151515815260200191505060405180910390f35b34801561043657600080fd5b506104ab600480360381019080803590602001908201803590602001919091929391929390803590602001908201803590602001919091929391929390803590602001908201803590602001919091929391929390803590602001908201803590602001919091929391929390505050611ef5565b005b3480156104b957600080fd5b506104d8600480360381019080803590602001909291905050506123f9565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156105185780820151818401526020810190506104fd565b50505050905090810190601f1680156105455780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561055f57600080fd5b50610594600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124df565b005b3480156105a257600080fd5b506105ab6126cc565b6040518082815260200191505060405180910390f35b3480156105cd57600080fd5b506105d66126d9565b6040518082815260200191505060405180910390f35b3480156105f857600080fd5b5061063a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff1690602001909291905050506126e3565b005b34801561064857600080fd5b506106bd600480360381019080803590602001908201803590602001919091929391929390803590602001908201803590602001919091929391929390803590602001908201803590602001919091929391929390803590602001908201803590602001919091929391929390505050612760565b005b3480156106cb57600080fd5b506106ea60048036038101908080359060200190929190505050612f65565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561073857600080fd5b5061076d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612fc0565b005b600081600060016000836040516020018082805190602001908083835b6020831015156107b1578051825260208201915060208101905060208303925061078c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310151561081a57805182526020820191506020810190506020830392506107f5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002054141515156108d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f456e6f6465206973206e6f7420696e20746865206c697374000000000000000081525060200191505060405180910390fd5b600560006108e185613120565b815260200190815260200160002054915050919050565b600082600060016000836040516020018082805190602001908083835b60208310151561093a5780518252602082019150602081019050602083039250610915565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b6020831015156109a3578051825260208201915060208101905060208303925061097e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600019166000191681526020019081526020016000205414151515610a5d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f456e6f6465206973206e6f7420696e20746865206c697374000000000000000081525060200191505060405180910390fd5b60046000610a6a86613120565b815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1691505092915050565b6000806000809150600090505b600380549050811015610b69573373ffffffffffffffffffffffffffffffffffffffff16600382815481101515610b0c57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610b5c5760019150610b69565b8080600101915050610ad9565b811515610bde576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4163636f756e742063616e206e6f7420766f746500000000000000000000000081525060200191505060405180910390fd5b60016006811115610beb57fe5b610c2686868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050610f42565b6006811115610c3157fe5b141515610ccc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f4e6f6465206e65656420746f20626520696e2050656e64696e67417070726f7681526020017f616c20737461747573000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b610d0785858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050613120565b9250600015156004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141515610de2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4e6f64652063616e206e6f7420646f75626c6520766f7465000000000000000081525060200191505060405180910390fd5b60016004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060056000848152602001908152602001600020600081548092919060010191905055507fffbebd8cfb97304c3b16b9139a3f06e547af483cc4b5111bdbb66ccdf2aa43f385853360405180806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281038252858582818152602001925080828437820191505094505050505060405180910390a1610f2e85858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050613215565b5050505050565b6000600380549050905090565b600081600060016000836040516020018082805190602001908083835b602083101515610f845780518252602082019150602081019050602083039250610f5f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b602083101515610fed5780518252602082019150602081019050602083039250610fc8565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002054141515156110a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f456e6f6465206973206e6f7420696e20746865206c697374000000000000000081525060200191505060405180910390fd5b60006110b284613120565b8154811015156110be57fe5b906000526020600020906005020160040160009054906101000a900460ff16915050919050565b6000806000809150600090505b600380549050811015611182573373ffffffffffffffffffffffffffffffffffffffff1660038281548110151561112557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156111755760019150611182565b80806001019150506110f2565b8115156111f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4163636f756e742063616e206e6f7420766f746500000000000000000000000081525060200191505060405180910390fd5b6003600681111561120457fe5b61123f86868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050610f42565b600681111561124a57fe5b1415156112e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f4e6f6465206e65656420746f20626520696e2050656e64696e6744656163746981526020017f766174696f6e207374617475730000000000000000000000000000000000000081525060400191505060405180910390fd5b61132085858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050613120565b9250600015156004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415156113fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4e6f64652063616e206e6f7420646f75626c6520766f7465000000000000000081525060200191505060405180910390fd5b60016004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060056000848152602001908152602001600020600081548092919060010191905055507fa5243abad84fa64b3ca3ab0b45c7954a089a38bd40d0797fc3c0e8ee304229e185853360405180806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281038252858582818152602001925080828437820191505094505050505060405180910390a161154785858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050613568565b5050505050565b6000801515600660009054906101000a900460ff161515141515611600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f496e76616c69642063616c6c3a204e6574776f726b20626f6f7420757020636f81526020017f6d706c657465640000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600660006101000a81548160ff021916908315150217905550600660009054906101000a900460ff16905090565b60008083838080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050600060016000836040516020018082805190602001908083835b6020831015156116a55780518252602082019150602081019050602083039250611680565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310151561170e57805182526020820191506020810190506020830392506116e9565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002054141515156117c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f456e6f6465206973206e6f7420696e20746865206c697374000000000000000081525060200191505060405180910390fd5b6117d06138bb565b15611a6e57600260068111156117e257fe5b61181d86868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050610f42565b600681111561182857fe5b1415156118c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4e6f6465206e65656420746f20626520696e20417070726f766564207374617481526020017f757300000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6118fe85858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050613120565b9250600360008481548110151561191157fe5b906000526020600020906005020160040160006101000a81548160ff0219169083600681111561193d57fe5b0217905550600091505b600380549050821015611a0357600060046000858152602001908152602001600020600060038581548110151561197a57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508180600101925050611947565b600060056000858152602001908152602001600020819055507f2b5689b33f48f1dcbda2084e130a9bee7b3bf14dc767ea74cbdf3e5fffb118e48585604051808060200182810382528484828181526020019250808284378201915050935050505060405180910390a15b5050505050565b6000806000809150600090505b600380549050811015611b12573373ffffffffffffffffffffffffffffffffffffffff16600382815481101515611ab557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b055760019150611b12565b8080600101915050611a82565b811515611b87576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4163636f756e742063616e206e6f7420766f746500000000000000000000000081525060200191505060405180910390fd5b60056006811115611b9457fe5b611bcf86868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050610f42565b6006811115611bda57fe5b141515611c75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f4e6f6465206e65656420746f20626520696e2050656e64696e67426c61636b6c81526020017f697374696e67207374617475730000000000000000000000000000000000000081525060400191505060405180910390fd5b611cb085858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050613120565b9250600015156004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141515611d8b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4e6f64652063616e206e6f7420646f75626c6520766f7465000000000000000081525060200191505060405180910390fd5b60016004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060056000848152602001908152602001600020600081548092919060010191905055507fe5db3c593cd193882142dc86075a90f3b5075cbe3df4f433517393e29aa7327f85853360405180806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281038252858582818152602001925080828437820191505094505050505060405180910390a1611ed785858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050613907565b5050505050565b6000600660009054906101000a900460ff16905090565b600080611f006138bb565b156123ed576000600160008c8c604051602001808383808284378201915050925050506040516020818303038152906040526040518082805190602001908083835b602083101515611f675780518252602082019150602081019050602083039250611f42565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002054141515612036576005600083815481101515611fc357fe5b906000526020600020906005020160040160006101000a81548160ff02191690836006811115611fef57fe5b021790555061202f8a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050613120565b91506122c1565b600260008154809291906001019190505550600254600160008c8c604051602001808383808284378201915050925050506040516020818303038152906040526040518082805190602001908083835b6020831015156120ab5780518252602082019150602081019050602083039250612086565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002081905550600060a0604051908101604052808c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505081526020018a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200186868080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050508152602001600560068111156121ed57fe5b815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190612237929190613c5a565b506020820151816001019080519060200190612254929190613c5a565b506040820151816002019080519060200190612271929190613c5a565b50606082015181600301908051906020019061228e929190613c5a565b5060808201518160040160006101000a81548160ff021916908360068111156122b357fe5b021790555050505060025491505b600090505b6003805490508110156123825760006004600084815260200190815260200160002060006003848154811015156122f957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806001019150506122c6565b600060056000848152602001908152602001600020819055507fb249ebebf429f1c79f3c9663998b3e22d45f242de6527c4a95e41d4d28115d748a8a604051808060200182810382528484828181526020019250808284378201915050935050505060405180910390a15b50505050505050505050565b6060600254821115156124c65760008281548110151561241557fe5b90600052602060002090600502016000018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124ba5780601f1061248f576101008083540402835291602001916124ba565b820191906000526020600020905b81548152906001019060200180831161249d57829003601f168201915b505050505090506124da565b602060405190810160405280600081525090505b919050565b600080600091505b6003805490508210156126c7578273ffffffffffffffffffffffffffffffffffffffff1660038381548110151561251a57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156126ba576001820190505b6003805490508110156126165760038181548110151561258457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166003600183038154811015156125c157fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080600101915050612568565b6003808054905081548110151561262957fe5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690557fa14a79af012d1756818f9bd59ccfc9ad185a71df86b9392d9059d9e6faf6d64483604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b81806001019250506124e7565b505050565b6000600380549050905090565b6000600254905090565b7f5c7c83802ef5601aed89f3f4e4ab42298ecf8ac3fe099adad5712fc65ba9676d8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600381111561274857fe5b60ff1681526020019250505060405180910390a15050565b600088888080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050600060016000836040516020018082805190602001908083835b6020831015156127d457805182526020820191506020810190506020830392506127af565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310151561283d5780518252602082019150602081019050602083039250612818565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916600019168152602001908152602001600020541415156128f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f456e6f646520697320696e20746865206c69737400000000000000000000000081525060200191505060405180910390fd5b600660009054906101000a900460ff161515612b9657600260008154809291906001019190505550600254600160008c8c604051602001808383808284378201915050925050506040516020818303038152906040526040518082805190602001908083835b602083101515612981578051825260208201915060208101905060208303925061295c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002081905550600060a0604051908101604052808c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505081526020018a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200160026006811115612ac357fe5b815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190612b0d929190613c5a565b506020820151816001019080519060200190612b2a929190613c5a565b506040820151816002019080519060200190612b47929190613c5a565b506060820151816003019080519060200190612b64929190613c5a565b5060808201518160040160006101000a81548160ff02191690836006811115612b8957fe5b0217905550505050612f59565b612b9e6138bb565b15612f5857600260008154809291906001019190505550600254600160008c8c604051602001808383808284378201915050925050506040516020818303038152906040526040518082805190602001908083835b602083101515612c185780518252602082019150602081019050602083039250612bf3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002081905550600060a0604051908101604052808c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505081526020018a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200160016006811115612d5a57fe5b815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190612da4929190613c5a565b506020820151816001019080519060200190612dc1929190613c5a565b506040820151816002019080519060200190612dde929190613c5a565b506060820151816003019080519060200190612dfb929190613c5a565b5060808201518160040160006101000a81548160ff02191690836006811115612e2057fe5b0217905550505050600091505b600380549050821015612eeb5760006004600060025481526020019081526020016000206000600385815481101515612e6257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508180600101925050612e2d565b6000600560006002548152602001908152602001600020819055507faddedf3fcf588a85e0b0c3210c30da3f5597ae35221859f7e19427397a2ba80a8a8a604051808060200182810382528484828181526020019250808284378201915050935050505060405180910390a15b5b50505050505050505050565b600060038054905082111515612fb657600382815481101515612f8457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612fbb565b600090505b919050565b60008090505b600380549050811015613052578173ffffffffffffffffffffffffffffffffffffffff16600382815481101515612ff957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156130455761311c565b8080600101915050612fc6565b60038290806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550507fa636f4a11e2d3ba7f89d042ecb0a6b886716e98cd49d8fd876ee0f73bced42b882604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b5050565b60006001806000846040516020018082805190602001908083835b602083101515613160578051825260208201915060208101905060208303925061313b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b6020831015156131c957805182526020820191506020810190506020830392506131a4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002054039050919050565b600061322082613120565b9050600260038054905081151561323357fe5b046005600083815260200190815260200160002054111561356457600260008281548110151561325f57fe5b906000526020600020906005020160040160006101000a81548160ff0219169083600681111561328b57fe5b02179055507fc6d86deaa3b3cf7c374cfd405aae9f08571fce2bf6ccfe8f98a399cda8960a986000828154811015156132c057fe5b90600052602060002090600502016000016000838154811015156132e057fe5b906000526020600020906005020160010160008481548110151561330057fe5b906000526020600020906005020160020160008581548110151561332057fe5b906000526020600020906005020160030160405180806020018060200180602001806020018581038552898181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156133c65780601f1061339b576101008083540402835291602001916133c6565b820191906000526020600020905b8154815290600101906020018083116133a957829003601f168201915b50508581038452888181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156134495780601f1061341e57610100808354040283529160200191613449565b820191906000526020600020905b81548152906001019060200180831161342c57829003601f168201915b50508581038352878181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156134cc5780601f106134a1576101008083540402835291602001916134cc565b820191906000526020600020905b8154815290600101906020018083116134af57829003601f168201915b505085810382528681815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561354f5780601f106135245761010080835404028352916020019161354f565b820191906000526020600020905b81548152906001019060200180831161353257829003601f168201915b50509850505050505050505060405180910390a15b5050565b600061357382613120565b9050600260038054905081151561358657fe5b04600560008381526020019081526020016000205411156138b75760046000828154811015156135b257fe5b906000526020600020906005020160040160006101000a81548160ff021916908360068111156135de57fe5b02179055507fd5fa0ecdea15b332dd0a270c65234bc4aee212edf2ed62eb2fd182ef55ca98a160008281548110151561361357fe5b906000526020600020906005020160000160008381548110151561363357fe5b906000526020600020906005020160010160008481548110151561365357fe5b906000526020600020906005020160020160008581548110151561367357fe5b906000526020600020906005020160030160405180806020018060200180602001806020018581038552898181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156137195780601f106136ee57610100808354040283529160200191613719565b820191906000526020600020905b8154815290600101906020018083116136fc57829003601f168201915b505085810384528881815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561379c5780601f106137715761010080835404028352916020019161379c565b820191906000526020600020905b81548152906001019060200180831161377f57829003601f168201915b505085810383528781815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561381f5780601f106137f45761010080835404028352916020019161381f565b820191906000526020600020905b81548152906001019060200180831161380257829003601f168201915b50508581038252868181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156138a25780601f10613877576101008083540402835291602001916138a2565b820191906000526020600020905b81548152906001019060200180831161388557829003601f168201915b50509850505050505050505060405180910390a15b5050565b60008060038054905014156138ff577f4b3dfc3b006eb0d5d60b3f275b4796aa31ed21a75d2e91fe750fc7549b426f6760405160405180910390a160009050613904565b600190505b90565b600061391282613120565b9050600260038054905081151561392557fe5b0460056000838152602001908152602001600020541115613c5657600660008281548110151561395157fe5b906000526020600020906005020160040160006101000a81548160ff0219169083600681111561397d57fe5b02179055507fe1b239bf9d5854aeca74dfeac25d6ce470230bdb5f0eec48713c4375becfe97e6000828154811015156139b257fe5b90600052602060002090600502016000016000838154811015156139d257fe5b90600052602060002090600502016001016000848154811015156139f257fe5b9060005260206000209060050201600201600085815481101515613a1257fe5b90600052602060002090600502016003016040518080602001806020018060200180602001858103855289818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015613ab85780601f10613a8d57610100808354040283529160200191613ab8565b820191906000526020600020905b815481529060010190602001808311613a9b57829003601f168201915b5050858103845288818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015613b3b5780601f10613b1057610100808354040283529160200191613b3b565b820191906000526020600020905b815481529060010190602001808311613b1e57829003601f168201915b5050858103835287818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015613bbe5780601f10613b9357610100808354040283529160200191613bbe565b820191906000526020600020905b815481529060010190602001808311613ba157829003601f168201915b5050858103825286818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015613c415780601f10613c1657610100808354040283529160200191613c41565b820191906000526020600020905b815481529060010190602001808311613c2457829003601f168201915b50509850505050505050505060405180910390a15b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613c9b57805160ff1916838001178555613cc9565b82800160010185558215613cc9579182015b82811115613cc8578251825591602001919060010190613cad565b5b509050613cd69190613cda565b5090565b613cfc91905b80821115613cf8576000816000905550600101613ce0565b5090565b905600a165627a7a723058209335edb68cd50849275d6f8cfe49b2448dbd0c41ad60aeff0d15701bde3e7f880029 \ No newline at end of file diff --git a/controls/permission/permission.go b/controls/permission/permission.go index 09e4e9b46..35ee6f79d 100644 --- a/controls/permission/permission.go +++ b/controls/permission/permission.go @@ -22,7 +22,7 @@ import ( "github.com/ethereum/go-ethereum/controls" "github.com/ethereum/go-ethereum/cmd/utils" "github.com/ethereum/go-ethereum/raft" - "github.com/ethereum/go-ethereum/controls/permbind" + pbind "github.com/ethereum/go-ethereum/controls/bind" ) const ( @@ -63,7 +63,7 @@ func NewQuorumPermissionCtrl(stack *node.Node, isRaft bool) (*PermissionCtrl, er func (p *PermissionCtrl) Start() error { // check if permissioning contract is there at address. If not return from here - if _, err := permbind.NewPermissionsFilterer(params.QuorumPermissionsContract, p.ethClnt); err != nil { + if _, err := pbind.NewPermissionsFilterer(params.QuorumPermissionsContract, p.ethClnt); err != nil { log.Error("Permissions not enabled for the network : ", "err", err) return nil } @@ -117,17 +117,17 @@ func (p *PermissionCtrl) manageNodePermissions() { // This functions listens on the channel for new node approval via smart contract and // adds the same into permissioned-nodes.json func (p *PermissionCtrl) monitorNewNodeAdd() { - permissions, err := permbind.NewPermissionsFilterer(params.QuorumPermissionsContract, p.ethClnt) + permissions, err := pbind.NewPermissionsFilterer(params.QuorumPermissionsContract, p.ethClnt) if err != nil { log.Error("failed to monitor new node add : ", "err", err) } - ch := make(chan *permbind.PermissionsNodeApproved, 1) + ch := make(chan *pbind.PermissionsNodeApproved, 1) opts := &bind.WatchOpts{} var blockNumber uint64 = 1 opts.Start = &blockNumber - var nodeAddEvent *permbind.PermissionsNodeApproved + var nodeAddEvent *pbind.PermissionsNodeApproved _, err = permissions.WatchNodeApproved(opts, ch) if err != nil { @@ -145,17 +145,17 @@ func (p *PermissionCtrl) monitorNewNodeAdd() { // This functions listens on the channel for new node approval via smart contract and // adds the same into permissioned-nodes.json func (p *PermissionCtrl) monitorNodeDeactivation() { - permissions, err := permbind.NewPermissionsFilterer(params.QuorumPermissionsContract, p.ethClnt) + permissions, err := pbind.NewPermissionsFilterer(params.QuorumPermissionsContract, p.ethClnt) if err != nil { log.Error("Failed to monitor node delete: ", "err", err) } - ch := make(chan *permbind.PermissionsNodeDeactivated) + ch := make(chan *pbind.PermissionsNodeDeactivated) opts := &bind.WatchOpts{} var blockNumber uint64 = 1 opts.Start = &blockNumber - var newNodeDeleteEvent *permbind.PermissionsNodeDeactivated + var newNodeDeleteEvent *pbind.PermissionsNodeDeactivated _, err = permissions.WatchNodeDeactivated(opts, ch) if err != nil { @@ -174,16 +174,16 @@ func (p *PermissionCtrl) monitorNodeDeactivation() { // This function listnes on the channel for any node blacklisting event via smart contract // and adds the same disallowed-nodes.json func (p *PermissionCtrl) monitorNodeBlacklisting() { - permissions, err := permbind.NewPermissionsFilterer(params.QuorumPermissionsContract, p.ethClnt) + permissions, err := pbind.NewPermissionsFilterer(params.QuorumPermissionsContract, p.ethClnt) if err != nil { log.Error("failed to monitor new node add : ", "err", err) } - ch := make(chan *permbind.PermissionsNodeBlacklisted, 1) + ch := make(chan *pbind.PermissionsNodeBlacklisted, 1) opts := &bind.WatchOpts{} var blockNumber uint64 = 1 opts.Start = &blockNumber - var nodeBlacklistEvent *permbind.PermissionsNodeBlacklisted + var nodeBlacklistEvent *pbind.PermissionsNodeBlacklisted _, err = permissions.WatchNodeBlacklisted(opts, ch) if err != nil { @@ -227,7 +227,7 @@ func (p *PermissionCtrl) updatePermissionedNodes(enodeId, ipAddrPort, discPort, } //this function populates the new node information into the permissioned-nodes.json file -func (p *PermissionCtrl) updateDisallowedNodes(nodeBlacklistEvent *permbind.PermissionsNodeBlacklisted) { +func (p *PermissionCtrl) updateDisallowedNodes(nodeBlacklistEvent *pbind.PermissionsNodeBlacklisted) { dataDir := p.node.InstanceDir() log.Debug("updateDisallowedNodes", "DataDir", dataDir, "file", BLACKLIST_CONFIG) @@ -283,7 +283,7 @@ func (p *PermissionCtrl) manageAccountPermissions() error { // populates the nodes list from permissioned-nodes.json into the permissions // smart contract func (p *PermissionCtrl) populatePermissionedNodes() error { - permissions, err := permbind.NewPermissionsFilterer(params.QuorumPermissionsContract, p.ethClnt) + permissions, err := pbind.NewPermissionsFilterer(params.QuorumPermissionsContract, p.ethClnt) if err != nil { log.Error("Failed to monitor node delete: ", "err", err) return err @@ -316,7 +316,7 @@ func (p *PermissionCtrl) populatePermissionedNodes() error { // populates the nodes list from permissioned-nodes.json into the permissions // smart contract func (p *PermissionCtrl) populateAcctPermissions() error { - permissions, err := permbind.NewPermissionsFilterer(params.QuorumPermissionsContract, p.ethClnt) + permissions, err := pbind.NewPermissionsFilterer(params.QuorumPermissionsContract, p.ethClnt) if err != nil { log.Error("Failed to monitor node delete: ", "err", err) return err @@ -338,16 +338,16 @@ func (p *PermissionCtrl) populateAcctPermissions() error { // Monitors permissions changes at acount level and uodate the global permissions // map with the same func (p *PermissionCtrl) monitorAccountPermissions() { - permissions, err := permbind.NewPermissionsFilterer(params.QuorumPermissionsContract, p.ethClnt) + permissions, err := pbind.NewPermissionsFilterer(params.QuorumPermissionsContract, p.ethClnt) if err != nil { log.Error("Failed to monitor Account permissions : ", "err", err) } - ch := make(chan *permbind.PermissionsAccountAccessModified) + ch := make(chan *pbind.PermissionsAccountAccessModified) opts := &bind.WatchOpts{} var blockNumber uint64 = 1 opts.Start = &blockNumber - var newEvent *permbind.PermissionsAccountAccessModified + var newEvent *pbind.PermissionsAccountAccessModified _, err = permissions.WatchAccountAccessModified(opts, ch) if err != nil { @@ -401,7 +401,7 @@ func formatEnodeId(enodeId, ipAddrPort, discPort, raftPort string, isRaft bool) //smart contract func (p *PermissionCtrl) populateStaticNodesToContract() { - permissionsContract, err := permbind.NewPermissions(params.QuorumPermissionsContract, p.ethClnt) + permissionsContract, err := pbind.NewPermissions(params.QuorumPermissionsContract, p.ethClnt) if err != nil { utils.Fatalf("Failed to instantiate a Permissions contract: %v", err) @@ -411,7 +411,7 @@ func (p *PermissionCtrl) populateStaticNodesToContract() { utils.Fatalf("Failed to create authorized transactor: %v", err) } - permissionsSession := &permbind.PermissionsSession{ + permissionsSession := &pbind.PermissionsSession{ Contract: permissionsContract, CallOpts: bind.CallOpts{ Pending: true, diff --git a/controls/permission/permission_api.go b/controls/permission/permission_api.go deleted file mode 100644 index e0adaeec0..000000000 --- a/controls/permission/permission_api.go +++ /dev/null @@ -1,143 +0,0 @@ -package permission -/* -import ( - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/ethclient" - "github.com/ethereum/go-ethereum/eth" - "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "strings" - "math/big" - "github.com/ethereum/go-ethereum/p2p/discover" - "fmt" - "io/ioutil" - "path/filepath" - "github.com/ethereum/go-ethereum/controls/permbind" -) - - -func APIs(ec *ethclient.Client, e *eth.Ethereum, datadir string) []rpc.API { - return []rpc.API{ - { - Namespace: "permnode", - Version: "1.0", - Service: NewPermissionAPI(ec, e, datadir), - Public: true, - }, - } -} - -type PermissionAPI struct { - ethClient *ethclient.Client - eth *eth.Ethereum - permissionsContr *permbind.Permissions - transOpts *bind.TransactOpts - -} - - - - -func getKeyFromKeyStore(datadir string) string { - - files, err := ioutil.ReadDir(filepath.Join(datadir, "keystore")) - if err != nil { - utils.Fatalf("Failed to read keystore directory: %v", err) - } - - // HACK: here we always use the first key as transactor - var keyPath string - for _, f := range files { - keyPath = filepath.Join(datadir, "keystore", f.Name()) - break - } - keyBlob, err := ioutil.ReadFile(keyPath) - if err != nil { - utils.Fatalf("Failed to read key file: %v", err) - } - // n := bytes.IndexByte(keyBlob, 0) - n := len(keyBlob) - - return string(keyBlob[:n]) -} - -func NewPermissionAPI(ec *ethclient.Client, e *eth.Ethereum, datadir string) *PermissionAPI { - permissionsContract, err := permbind.NewPermissions(params.QuorumPermissionsContract, ec) - if err != nil { - utils.Fatalf("Failed to instantiate a Permissions contract: %v", err) - } - //TODO check if reading from keystore is correct approach - key := getKeyFromKeyStore(datadir) - auth, err := bind.NewTransactor(strings.NewReader(key), "") - if err != nil { - utils.Fatalf("Failed to create authorized transactor: %v", err) - } - return &PermissionAPI{ec, e, permissionsContract, auth} -} - -func (s *PermissionAPI) AddVoter(addr string) string { - log.Info("AJ-called1") - return "added voter " + addr -} - -func (s *PermissionAPI) ProposeNode(enodeId string) string { - node, err := discover.ParseNode(enodeId) - if err != nil { - return fmt.Sprintf("invalid node id: %v", err) - } - enodeID := node.ID.String() - ipAddr := node.IP.String() - port := fmt.Sprintf("%v", node.TCP) - discPort := fmt.Sprintf("%v", node.UDP) - raftPort := fmt.Sprintf("%v", node.RaftPort) - ipAddrPort := ipAddr + ":" + port - - log.Trace("AJ-Adding node to permissions contract", "enodeID", enodeID) - - nonce := s.eth.TxPool().Nonce(s.transOpts.From) - s.transOpts.Nonce = new(big.Int).SetUint64(nonce) - - permissionsSession := &permbind.PermissionsSession{ - Contract: s.permissionsContr, - CallOpts: bind.CallOpts{ - Pending: true, - }, - TransactOpts: bind.TransactOpts{ - From: s.transOpts.From, - Signer: s.transOpts.Signer, - GasLimit: 4700000, - GasPrice: big.NewInt(0), - }, - } - - tx, err := permissionsSession.ProposeNode(enodeID, ipAddrPort, discPort, raftPort) - if err != nil { - log.Warn("AJ-Failed to propose node", "err", err) - } - statusMsg := fmt.Sprintf("Transaction pending tx hash %s", tx.Hash()) - log.Debug(statusMsg) - return statusMsg -} - -func (s *PermissionAPI) BlacklistNode(enodeId string) string { - log.Info("AJ-called3") - return "blacklisted node " + enodeId -} - -func (s *PermissionAPI) RemoveNode(enodeId string) string { - log.Info("AJ-called4") - return "removed node " + enodeId -} - -func (s *PermissionAPI) ApproveNode(enodeId string) string { - log.Info("AJ-called5") - return "approved node " + enodeId -} - -func (s *PermissionAPI) ValidNodes() []string { - log.Info("AJ-called6") - return []string{"n1", "n2"} -} -*/ \ No newline at end of file diff --git a/core/quorum/api.go b/core/quorum/api.go new file mode 100644 index 000000000..3d1f47b97 --- /dev/null +++ b/core/quorum/api.go @@ -0,0 +1,276 @@ +package quorum + +import ( + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/ethclient" + "io/ioutil" + "path/filepath" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/p2p/discover" + "fmt" + "math/big" + "github.com/ethereum/go-ethereum/log" + pbind "github.com/ethereum/go-ethereum/controls/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/accounts" + "strings" +) + +var defaultGasLimit = uint64(4700000) +var defaultGasPrice = big.NewInt(0) + +type PermissionAPI struct { + txPool *core.TxPool + ethClnt *ethclient.Client + am *accounts.Manager + trnOpt *bind.TransactOpts + permContr *pbind.Permissions + clustContr *pbind.Cluster +} + +func NewPermissionAPI(tp *core.TxPool, am *accounts.Manager) *PermissionAPI { + pa := &PermissionAPI{tp, nil, am, nil, nil, nil} + return pa +} + +func (p *PermissionAPI) Init(ethClnt *ethclient.Client, datadir string) error { + p.ethClnt = ethClnt + key, kerr := getKeyFromKeyStore(datadir) + if kerr != nil { + log.Error("error reading key file", "err", kerr) + return kerr + } + permContr, err := pbind.NewPermissions(params.QuorumPermissionsContract, p.ethClnt) + if err != nil { + return err + } + p.permContr = permContr + clustContr, err := pbind.NewCluster(params.QuorumPrivateKeyManagementContract, p.ethClnt) + if err != nil { + return err + } + p.clustContr = clustContr + auth, err := bind.NewTransactor(strings.NewReader(key), "") + if err != nil { + return err + } + p.trnOpt = auth + return nil +} + +func (s *PermissionAPI) AddVoter(addr common.Address) bool { + acct := accounts.Account{Address: addr} + w, err := s.am.Find(acct) + if err != nil { + return false + } + + ps := s.newPermSession1(w, acct) + nonce := s.txPool.Nonce(acct.Address) + ps.TransactOpts.Nonce = new(big.Int).SetUint64(nonce) + + tx, err := ps.AddVoter(addr) + if err != nil { + log.Warn("Failed to add voter", "err", err) + return false + } + txHash := tx.Hash() + log.Info("Transaction pending", "tx hash", string(txHash[:])) + return true +} + +func (s *PermissionAPI) RemoveVoter(addr common.Address) bool { + ps := s.newPermSession() + tx, err := ps.RemoveVoter(addr) + if err != nil { + log.Warn("Failed to remove voter", "err", err) + return false + } + txHash := tx.Hash() + log.Info("Transaction pending", "tx hash", string(txHash[:])) + return true +} + +func (s *PermissionAPI) ProposeNode(from common.Address, nodeId string) bool { + acct := accounts.Account{Address: from} + w, err := s.am.Find(acct) + if err != nil { + return false + } + + ps := s.newPermSession1(w, acct) + nonce := s.txPool.Nonce(acct.Address) + ps.TransactOpts.Nonce = new(big.Int).SetUint64(nonce) + + node, err := discover.ParseNode(nodeId) + if err != nil { + log.Error("invalid node id: %v", err) + return false + } + enodeID := node.ID.String() + ipAddr := node.IP.String() + port := fmt.Sprintf("%v", node.TCP) + discPort := fmt.Sprintf("%v", node.UDP) + raftPort := fmt.Sprintf("%v", node.RaftPort) + ipAddrPort := ipAddr + ":" + port + + tx, err := ps.ProposeNode(enodeID, ipAddrPort, discPort, raftPort) + if err != nil { + log.Warn("Failed to propose node", "err", err) + log.Error("Failed to propose node: %v", err) + return false + } + txHash := tx.Hash() + statusMsg := fmt.Sprintf("Transaction pending tx hash %s", string(txHash[:])) + log.Debug(statusMsg) + return true +} + +func (s *PermissionAPI) ApproveNode(nodeId string) bool { + node, err := discover.ParseNode(nodeId) + if err != nil { + log.Error("invalid node id: %v", err) + return false + } + enodeID := node.ID.String() + + ps := s.newPermSession() + tx, err := ps.ApproveNode(enodeID) + if err != nil { + log.Warn("Failed to propose node", "err", err) + return false + } + txHash := tx.Hash() + log.Debug("Transaction pending", "tx hash", string(txHash[:])) + return true +} + +func (s *PermissionAPI) DeactivateNode(nodeId string) bool { + node, err := discover.ParseNode(nodeId) + if err != nil { + log.Error("invalid node id: %v", err) + return false + } + enodeID := node.ID.String() + + ps := s.newPermSession() + tx, err := ps.DeactivateNode(enodeID) + if err != nil { + log.Warn("Failed to propose node", "err", err) + return false + } + txHash := tx.Hash() + log.Debug("Transaction pending", "tx hash", string(txHash[:])) + return true +} + +func (s *PermissionAPI) ApproveDeactivateNode(nodeId string) bool { + node, err := discover.ParseNode(nodeId) + if err != nil { + log.Error("invalid node id: %v", err) + return false + } + enodeID := node.ID.String() + + ps := s.newPermSession() + //TODO change it to approveDeactivate node once contract is updated + tx, err := ps.DeactivateNode(enodeID) + if err != nil { + log.Warn("Failed to propose node", "err", err) + return false + } + txHash := tx.Hash() + log.Debug("Transaction pending", "tx hash", string(txHash[:])) + return true +} + +func (s *PermissionAPI) newPermSession() *pbind.PermissionsSession { + return &pbind.PermissionsSession{ + Contract: s.permContr, + CallOpts: bind.CallOpts{ + Pending: true, + }, + TransactOpts: bind.TransactOpts{ + From: s.trnOpt.From, + Signer: s.trnOpt.Signer, + GasLimit: defaultGasLimit, + GasPrice: defaultGasPrice, + }, + } +} + +func (s *PermissionAPI) newPermSession1(w accounts.Wallet, acct accounts.Account) *pbind.PermissionsSession { + auth := bind.NewWalletTransactor(w, acct) + return &pbind.PermissionsSession{ + Contract: s.permContr, + CallOpts: bind.CallOpts{ + Pending: true, + }, + TransactOpts: bind.TransactOpts{ + From: acct.Address, + GasLimit: defaultGasLimit, + GasPrice: defaultGasPrice, + Signer: auth.Signer, + }, + } +} + +func (s *PermissionAPI) newClusterSession() *pbind.ClusterSession { + return &pbind.ClusterSession{ + Contract: s.clustContr, + CallOpts: bind.CallOpts{ + Pending: true, + }, + TransactOpts: bind.TransactOpts{ + GasLimit: defaultGasLimit, + GasPrice: defaultGasPrice, + }, + } +} + +func (s *PermissionAPI) AddOrgKey(orgId string, pvtKey string) bool { + cs := s.newClusterSession() + tx, err := cs.AddOrgKey(orgId, pvtKey) + if err != nil { + log.Warn("Failed to add org key", "err", err) + return false + } + txHash := tx.Hash() + log.Info("Transaction pending", "tx hash", string(txHash[:])) + return true +} + +func (s *PermissionAPI) RemoveOrgKey(orgId string, pvtKey string) bool { + cs := s.newClusterSession() + tx, err := cs.DeleteOrgKey(orgId, pvtKey) + if err != nil { + log.Warn("Failed to remove org key", "err", err) + return false + } + txHash := tx.Hash() + log.Info("Transaction pending", "tx hash", string(txHash[:])) + return true +} + +func getKeyFromKeyStore(datadir string) (string, error) { + + files, err := ioutil.ReadDir(filepath.Join(datadir, "keystore")) + if err != nil { + return "", err + } + + // HACK: here we always use the first key as transactor + var keyPath string + for _, f := range files { + keyPath = filepath.Join(datadir, "keystore", f.Name()) + break + } + keyBlob, err := ioutil.ReadFile(keyPath) + if err != nil { + return "", err + } + n := len(keyBlob) + + return string(keyBlob[:n]), nil +} diff --git a/core/quorum/permission_api.go b/core/quorum/permission_api.go deleted file mode 100644 index 8f7383ddc..000000000 --- a/core/quorum/permission_api.go +++ /dev/null @@ -1,111 +0,0 @@ -package quorum - -import ( - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/ethclient" - "io/ioutil" - "path/filepath" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/params" - "strings" - "github.com/ethereum/go-ethereum/p2p/discover" - "fmt" - "math/big" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/controls/permbind" - ) - -type PermissionAPI struct { - txPool *core.TxPool - ethClnt *ethclient.Client - permContr *permbind.Permissions - transOpts *bind.TransactOpts -} - -func NewPermissionAPI(e *core.TxPool) *PermissionAPI { - pa := &PermissionAPI{e, nil, nil, nil} - return pa -} - -func (p *PermissionAPI) Init(ethClnt *ethclient.Client, datadir string) error { - p.ethClnt = ethClnt - key, kerr := getKeyFromKeyStore(datadir) - if kerr != nil { - log.Error("error reading key file", "err", kerr) - return kerr - } - - permContr, err := permbind.NewPermissions(params.QuorumPermissionsContract, p.ethClnt) - if err != nil { - return err - } - p.permContr = permContr - auth, err := bind.NewTransactor(strings.NewReader(key), "") - if err != nil { - return err - } - p.transOpts = auth - - return nil -} - -func (s *PermissionAPI) ProposeNode(enodeId string) string { - node, err := discover.ParseNode(enodeId) - if err != nil { - return fmt.Sprintf("invalid node id: %v", err) - } - enodeID := node.ID.String() - ipAddr := node.IP.String() - port := fmt.Sprintf("%v", node.TCP) - discPort := fmt.Sprintf("%v", node.UDP) - raftPort := fmt.Sprintf("%v", node.RaftPort) - ipAddrPort := ipAddr + ":" + port - - log.Trace("AJ-Adding node to permissions contract", "enodeID", enodeID) - - nonce := s.txPool.Nonce(s.transOpts.From) - s.transOpts.Nonce = new(big.Int).SetUint64(nonce) - - permissionsSession := &permbind.PermissionsSession{ - Contract: s.permContr, - CallOpts: bind.CallOpts{ - Pending: true, - }, - TransactOpts: bind.TransactOpts{ - From: s.transOpts.From, - Signer: s.transOpts.Signer, - GasLimit: 4700000, - GasPrice: big.NewInt(0), - }, - } - - tx, err := permissionsSession.ProposeNode(enodeID, ipAddrPort, discPort, raftPort) - if err != nil { - log.Warn("AJ-Failed to propose node", "err", err) - } - statusMsg := fmt.Sprintf("Transaction pending tx hash %s", tx.Hash()) - log.Debug(statusMsg) - return statusMsg -} - -func getKeyFromKeyStore(datadir string) (string, error) { - - files, err := ioutil.ReadDir(filepath.Join(datadir, "keystore")) - if err != nil { - return "", err - } - - // HACK: here we always use the first key as transactor - var keyPath string - for _, f := range files { - keyPath = filepath.Join(datadir, "keystore", f.Name()) - break - } - keyBlob, err := ioutil.ReadFile(keyPath) - if err != nil { - return "", err - } - n := len(keyBlob) - - return string(keyBlob[:n]), nil -} diff --git a/eth/backend.go b/eth/backend.go index dde06b112..6c2bcaacd 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -328,9 +328,9 @@ func (s *Ethereum) APIs() []rpc.API { Public: true, }, { - Namespace: "permnode", + Namespace: "quorum", Version: "1.0", - Service: quorum.NewPermissionAPI(s.txPool), + Service: quorum.NewPermissionAPI(s.txPool, s.accountManager), Public: true, }, diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index 9bb40f116..577ee7062 100755 --- a/internal/web3ext/web3ext.go +++ b/internal/web3ext/web3ext.go @@ -32,7 +32,7 @@ var Modules = map[string]string{ "txpool": TxPool_JS, "raft": Raft_JS, "istanbul": Istanbul_JS, - "permnode": PermissionsNode_JS, + "quorum": QUORUM_JS, } const Chequebook_JS = ` @@ -675,43 +675,56 @@ web3._extend({ }) ` -const PermissionsNode_JS = ` +const QUORUM_JS = ` web3._extend({ - property: 'permnode', + property: 'quorum', methods: [ ], properties: [ new web3._extend.Method({ - name: 'blacklistNode', - call: 'permnode_blacklistNode', - params: 1 + name: 'addVoter', + call: 'quorum_addVoter', + params: 1, + inputFormatter: [web3._extend.formatters.inputAddressFormatter] }), new web3._extend.Method({ - name: 'addVoter', - call: 'permnode_addVoter', - params: 1 + name: 'removeVoter', + call: 'quorum_removeVoter', + params: 1, + inputFormatter: [web3._extend.formatters.inputAddressFormatter] }), new web3._extend.Method({ name: 'proposeNode', - call: 'permnode_proposeNode', - params: 1 - }), - new web3._extend.Method({ - name: 'removeNode', - call: 'permnode_removeNode', - params: 1 + call: 'quorum_proposeNode', + params: 2, + inputFormatter: [web3._extend.formatters.inputAddressFormatter,null] }), new web3._extend.Method({ name: 'approveNode', - call: 'permnode_approveNode', + call: 'quorum_approveNode', params: 1 }), - new web3._extend.Property({ - name: 'ValidNodes', - getter: 'permnode_validNodes', - params: 1 + new web3._extend.Method({ + name: 'deactivateNode', + call: 'quorum_deactivateNode', + params: 1 + }), + new web3._extend.Method({ + name: 'approveDeactivateNode', + call: 'quorum_approveDeactivateNode', + params: 1 + }), + new web3._extend.Method({ + name: 'addOrgKey', + call: 'quorum_addOrgKey', + params: 2 + }), + new web3._extend.Method({ + name: 'removeOrgKey', + call: 'quorum_removeOrgKey', + params: 2 }), ] }) diff --git a/params/quorum.go b/params/quorum.go index a64ef0df0..2d49016ee 100644 --- a/params/quorum.go +++ b/params/quorum.go @@ -3,6 +3,6 @@ package params import "github.com/ethereum/go-ethereum/common" var ( - QuorumPermissionsContract = common.Address{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32} - PrivateKeyManagementContract = common.Address{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34} + QuorumPermissionsContract = common.Address{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32} + QuorumPrivateKeyManagementContract = common.Address{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34} )