diff options
author | Jhih-Ming Huang <jm@byzantine-lab.io> | 2019-09-01 14:50:37 +0800 |
---|---|---|
committer | Jhih-Ming Huang <jm@byzantine-lab.io> | 2019-09-01 14:50:37 +0800 |
commit | af1549650b77c2434ff3ee4ea18ab716d4d0a1fc (patch) | |
tree | b887e18aaec358350593cd2aa3514816385e2c6b | |
download | tangerine-monitor-af1549650b77c2434ff3ee4ea18ab716d4d0a1fc.tar.gz tangerine-monitor-af1549650b77c2434ff3ee4ea18ab716d4d0a1fc.tar.zst tangerine-monitor-af1549650b77c2434ff3ee4ea18ab716d4d0a1fc.zip |
init commit
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | LICENSE | 21 | ||||
-rw-r--r-- | README.md | 8 | ||||
-rw-r--r-- | go.mod | 47 | ||||
-rw-r--r-- | go.sum | 177 | ||||
-rw-r--r-- | main.go | 77 | ||||
-rw-r--r-- | monitor/backend.go | 185 | ||||
-rw-r--r-- | monitor/cc-list.txt | 1 | ||||
-rw-r--r-- | monitor/contracts.go | 3660 | ||||
-rw-r--r-- | monitor/monitor.go | 199 | ||||
-rw-r--r-- | monitor/monitor_test.go | 88 | ||||
-rw-r--r-- | monitor/notifier.go | 205 |
12 files changed, 4670 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..922f859 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +email.password +tan-monitor @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Tangerine Network + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..4658a24 --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# Tangerine full node monitor + +## Introduction +Tan-monitor is a monitor tool for sending notificaions to the node operators. + +When nodes are fined or insufficient TAN/ETH in the node account address, +it will send notification to node owner with the node information +registered in the governance. @@ -0,0 +1,47 @@ +module gitlab.com/byzantine-lab/tan-monitor + +go 1.12 + +require ( + github.com/allegro/bigcache v1.2.1 // indirect + github.com/aristanetworks/goarista v0.0.0-20190712234253-ed1100a1c015 // indirect + github.com/btcsuite/btcd v0.0.0-20190629003639-c26ffa870fd8 // indirect + github.com/byzantine-lab/go-tangerine v0.0.0-20190608131926-6f80629383b2 + github.com/deckarep/golang-set v1.7.1 // indirect + github.com/edsrzf/mmap-go v1.0.0 // indirect + github.com/elastic/gosigar v0.10.4 // indirect + github.com/ethereum/go-ethereum v0.0.0-00010101000000-000000000000 + github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 // indirect + github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect + github.com/golang/protobuf v1.3.2 // indirect + github.com/google/go-cmp v0.3.0 // indirect + github.com/gorilla/websocket v1.4.0 // indirect + github.com/hashicorp/golang-lru v0.5.3 // indirect + github.com/huin/goupnp v1.0.0 // indirect + github.com/jackpal/go-nat-pmp v1.0.1 // indirect + github.com/karalabe/usb v0.0.0-20190703133951-9be757f914c0 // indirect + github.com/kr/pretty v0.1.0 // indirect + github.com/mattn/go-colorable v0.1.2 // indirect + github.com/mattn/go-runewidth v0.0.4 // indirect + github.com/olekukonko/tablewriter v0.0.1 // indirect + github.com/pborman/uuid v1.2.0 // indirect + github.com/pkg/errors v0.8.1 // indirect + github.com/prometheus/tsdb v0.10.0 // indirect + github.com/rjeczalik/notify v0.9.2 // indirect + github.com/rs/cors v1.6.0 // indirect + github.com/status-im/keycard-go v0.0.0-20190424133014-d95853db0f48 // indirect + github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570 // indirect + github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3 // indirect + github.com/stretchr/testify v1.3.0 + github.com/syndtr/goleveldb v1.0.0 // indirect + github.com/tyler-smith/go-bip39 v1.0.0 // indirect + github.com/urfave/cli v1.20.0 + github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208 // indirect + golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 // indirect + gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect + gopkg.in/olebedev/go-duktape.v3 v3.0.0-20190709231704-1e4459ed25ff // indirect + gopkg.in/urfave/cli.v1 v1.20.0 // indirect + gotest.tools v2.2.0+incompatible +) + +replace github.com/ethereum/go-ethereum => github.com/byzantine-lab/go-ethereum v1.8.27-byz8 @@ -0,0 +1,177 @@ +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= +github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/aristanetworks/goarista v0.0.0-20190712234253-ed1100a1c015 h1:7ABPr1+uJdqESAdlVevnc/2FJGiC/K3uMg1JiELeF+0= +github.com/aristanetworks/goarista v0.0.0-20190712234253-ed1100a1c015/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/btcsuite/btcd v0.0.0-20190629003639-c26ffa870fd8 h1:mOg8/RgDSHTQ1R0IR+LMDuW4TDShPv+JzYHuR4GLoNA= +github.com/btcsuite/btcd v0.0.0-20190629003639-c26ffa870fd8/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/byzantine-lab/go-ethereum v1.8.27-byz8 h1:vbCOVb6UG+NXSVvmVCXkQxUGvYxtZnyWMDJQ+OT1n28= +github.com/byzantine-lab/go-ethereum v1.8.27-byz8/go.mod h1:vFqBSO7vIVILxtv/sWJjjLibF9rM79iXedhPcj4Kyc0= +github.com/byzantine-lab/go-tangerine v0.0.0-20190608131926-6f80629383b2 h1:eYhsjqjNEMWEiHOVQQngef9VWrJXUAqIo6lJs+U3ipo= +github.com/byzantine-lab/go-tangerine v0.0.0-20190608131926-6f80629383b2/go.mod h1:oCX15Gpk0PsWjn6WhtWDFkXHIA2DIzTIOob9AgI4dCA= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set v1.7.1 h1:SCQV0S6gTtp6itiFrTqI+pfmJ4LN85S1YzhDf9rTHJQ= +github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/elastic/gosigar v0.10.4 h1:6jfw75dsoflhBMRdO6QPzQUgLqUYTsQQQRkkcsHsuPo= +github.com/elastic/gosigar v0.10.4/go.mod h1:cdorVVzy1fhmEqmtgqkoE3bYtCfSCkVyjTyCIo22xvs= +github.com/ethereum/go-ethereum v1.9.1 h1:MrdTRvKIa3apdx6NW1azzSgl8BQB1eTBVSUmFhuztaU= +github.com/ethereum/go-ethereum v1.9.1/go.mod h1:PwpWDrCLZrV+tfrhqqF6kPknbISMHaJv9Ln3kPCZLwY= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/uuid v1.0.0 h1:b4Gk+7WdP/d3HZH8EJsZpvV7EtDOgaZLtnaNGIu1adA= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk= +github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo= +github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= +github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= +github.com/jackpal/go-nat-pmp v1.0.1 h1:i0LektDkO1QlrTm/cSuP+PyBCDnYvjPLGl4LdWEMiaA= +github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/karalabe/usb v0.0.0-20190703133951-9be757f914c0 h1:S8kWZLXHpcOq3nGAvIs0oDgd4CXxkxE3hkDVRjTu7ro= +github.com/karalabe/usb v0.0.0-20190703133951-9be757f914c0/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.1 h1:b3iUnf1v+ppJiOfNX4yxxqfWKMQPZR5yoh8urCTFX88= +github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/tsdb v0.10.0 h1:If5rVCMTp6W2SiRAQFlbpJNgVlgMEd+U2GZckwK38ic= +github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSgwXEyGCt4= +github.com/rjeczalik/notify v0.9.2 h1:MiTWrPj55mNDHEiIX5YUSKefw/+lCQVoAFmD6oQm5w8= +github.com/rjeczalik/notify v0.9.2/go.mod h1:aErll2f0sUX9PXZnVNyeiObbmTlk5jnMoCa4QEjJeqM= +github.com/rs/cors v1.6.0 h1:G9tHG9lebljV9mfp9SNPDL36nCDxmo3zTlAf1YgvzmI= +github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/status-im/keycard-go v0.0.0-20190424133014-d95853db0f48 h1:ju5UTwk5Odtm4trrY+4Ca4RMj5OyXbmVeDAVad2T0Jw= +github.com/status-im/keycard-go v0.0.0-20190424133014-d95853db0f48/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= +github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570 h1:gIlAHnH1vJb5vwEjIp5kBj/eu99p/bl0Ay2goiPe5xE= +github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8OR4w3TdeIHIh1g6EMY5p0gVNOovcWC+1vpc7naMuAw= +github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3 h1:njlZPzLwU639dk2kqnCPPv+wNjq7Xb6EfUxe/oX0/NM= +github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= +github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= +github.com/tyler-smith/go-bip39 v1.0.0 h1:FOHg9gaQLeBBRbHE/QrTLfEiBHy5pQ/yXzf9JG5pYFM= +github.com/tyler-smith/go-bip39 v1.0.0/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= +github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208 h1:1cngl9mPEoITZG8s8cVcUy5CeIBYhEESkOB7m6Gmkrk= +github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180926160741-c2ed4eda69e7/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/olebedev/go-duktape.v3 v3.0.0-20190709231704-1e4459ed25ff h1:uuol9OUzSvZntY1v963NAbVd7A+PHLMz1FlCe3Lorcs= +gopkg.in/olebedev/go-duktape.v3 v3.0.0-20190709231704-1e4459ed25ff/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/urfave/cli.v1 v1.20.0 h1:NdAVW6RYxDif9DhDHaAortIu956m2c0v+09AZBPTbE0= +gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= @@ -0,0 +1,77 @@ +package main + +import ( + "fmt" + "io/ioutil" + "log" + "os" + "path/filepath" + "strconv" + + "github.com/urfave/cli" + "gitlab.com/byzantine-lab/tan-monitor/monitor" +) + +var app *cli.App + +func init() { + app = cli.NewApp() + app.Name = filepath.Base(os.Args[0]) + app.Usage = "Tangerine Newtwork Monitor" + app.Commands = []cli.Command{ + commandStart, + } +} + +var commandStart = cli.Command{ + Name: "start", + Usage: "Start monitor job", + ArgsUsage: "<networkID> <ethThreshold>", + Description: `Start network monitor with <networkID> and <ethThreshold> + <ethThreshold>'s unit is ETH`, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "emailPassword", + Value: "./email.password", + Usage: "Path to the email sender password", + }, + cli.StringFlag{ + Name: "ccList", + Value: "./cc.txt", + Usage: "Path to the cc list", + }, + }, + Action: func(ctx *cli.Context) error { + if len(ctx.Args()) != 2 { + log.Fatalf("invalid argument count") + } + networkID, err := strconv.Atoi(ctx.Args()[0]) + if err != nil { + panic(err) + } + threshold := ctx.Args()[1] + emailPassword, err := ioutil.ReadFile(ctx.String("emailPassword")) + if err != nil { + panic(err) + } + ccList, _ := ioutil.ReadFile(ctx.String("ccList")) + backend := monitor.NewBlockchainBackend(networkID) + m := monitor.NewMonitor(networkID, backend, threshold) + email := monitor.NewEmail( + "no-reply@byzantine-lab.io", + string(emailPassword), + "smtp-relay.gmail.com", + string(ccList), + ) + m.Register(email) + m.Run() + return nil + }, +} + +func main() { + if err := app.Run(os.Args); err != nil { + fmt.Println("app.Run error:", err) + os.Exit(1) + } +} diff --git a/monitor/backend.go b/monitor/backend.go new file mode 100644 index 0000000..194ed84 --- /dev/null +++ b/monitor/backend.go @@ -0,0 +1,185 @@ +package monitor + +import ( + "context" + "fmt" + "log" + "math/big" + "strings" + "time" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" +) + +type backendIntf interface { + FetchFinedNodes(chan node) + NodeSet() []node + BalanceFromAddress(*ethclient.Client, common.Address) *big.Int +} + +// BlockchainBackend is the blockchain backend object for fetching blockchain info. +type BlockchainBackend struct { + networkID int +} + +// NodeSet returns the registered nodes. +func (b *BlockchainBackend) NodeSet() []node { + nc := NetworkConfigMap[int64(b.networkID)] + conn, err := ethclient.Dial(nc.HTTPEndpoint) + if err != nil { + log.Println("EthClient Dial failed: ", err) + return []node{} + } + g, err := NewGovernance(GovAddress, conn) + if err != nil { + panic(err) + } + txOps := &bind.CallOpts{} + nodeLen, err := g.NodesLength(txOps) + if err != nil { + panic(err) + } + minStake, err := g.MinStake(txOps) + if err != nil { + panic(err) + } + nodes := []node{} + for i := uint64(0); i < nodeLen.Uint64(); i++ { + n, err := g.Nodes(txOps, big.NewInt(int64(i))) + if n.Staked.Cmp(minStake) < 0 { + continue + } + if err != nil { + panic(err) + } + publicKey, err := crypto.UnmarshalPubkey(n.PublicKey) + if err != nil { + log.Println("Unmarshal publicKey fail: ", err) + continue + } + address := crypto.PubkeyToAddress(*publicKey) + nodes = append(nodes, node{ + owner: n.Owner, + email: n.Email, + fined: n.Fined, + name: n.Name, + publicKey: n.PublicKey, + nodeKeyAddress: address, + }) + } + return nodes +} + +// BalanceFromAddress return address's balance. +func (b *BlockchainBackend) BalanceFromAddress(conn *ethclient.Client, + address common.Address) *big.Int { + balance, err := conn.BalanceAt(context.Background(), + address, nil) + if err != nil { + log.Println("Get balance fail: ", err) + return big.NewInt(0) + } + return balance +} + +func (b *BlockchainBackend) subscribe( + logs chan types.Log, + headers chan *types.Header, +) (ethereum.Subscription, *ethclient.Client, error) { + + nc := NetworkConfigMap[int64(b.networkID)] + conn, err := ethclient.Dial(nc.WSEndpoint) + if err != nil { + log.Println("EthClient Dial failed: ", err) + return nil, conn, err + } + abiObject, err := abi.JSON(strings.NewReader(GovernanceABI)) + query := ethereum.FilterQuery{ + Addresses: []common.Address{GovAddress}, + Topics: [][]common.Hash{ + []common.Hash{ + abiObject.Events["Fined"].Id(), + }, + }, + } + sub, err := conn.SubscribeFilterLogs(context.Background(), query, logs) + if err != nil { + log.Println("Subscribe logs failed: ", err) + return nil, conn, err + } + + // Subscribe chain head to keep ws from timeout + _, err = conn.SubscribeNewHead(context.Background(), headers) + if err != nil { + log.Println("Subscribe chain head failed: ", err) + } + return sub, conn, nil +} + +// FetchFinedNodes fetches nodes' information from blockchain. +func (b *BlockchainBackend) FetchFinedNodes(nodeChan chan node) { + logs := make(chan types.Log) + headers := make(chan *types.Header) + sub, conn, err := b.subscribe(logs, headers) + if err != nil { + panic(err) + } + for { + select { + case err := <-sub.Err(): + log.Println("sub.Err()", err) + // retry + for err != nil { + sub, conn, err = b.subscribe(logs, headers) + time.Sleep(30000) + } + case vLog := <-logs: + nodeAddress := common.BytesToAddress(vLog.Topics[1].Bytes()) + log.Println("Notify node: ", nodeAddress.Hex()) + nodeChan <- b.getNodeByAddress(nodeAddress, conn) + } + } +} + +func (b *BlockchainBackend) getNodeByAddress( + nodeAddress common.Address, conn *ethclient.Client) node { + + g, err := NewGovernance(GovAddress, conn) + if err != nil { + panic(err) + } + txOps := &bind.CallOpts{} + offset, err := g.NodesOffsetByAddress(txOps, nodeAddress) + if err != nil { + panic(err) + } + n, err := g.Nodes(txOps, offset) + if err != nil { + panic(err) + } + return node{ + owner: n.Owner, + email: n.Email, + fined: n.Fined, + name: n.Name, + } +} + +func printNodes(nodes []node) { + for i := range nodes { + fmt.Println("Owner", nodes[i].owner.Hex()) + fmt.Println("Email", nodes[i].email) + fmt.Println("Fined", nodes[i].fined.Uint64()) + } +} + +// NewBlockchainBackend is the blockchain backend constructor. +func NewBlockchainBackend(networkID int) *BlockchainBackend { + return &BlockchainBackend{networkID: networkID} +} diff --git a/monitor/cc-list.txt b/monitor/cc-list.txt new file mode 100644 index 0000000..2d5e428 --- /dev/null +++ b/monitor/cc-list.txt @@ -0,0 +1 @@ +cc@example.com diff --git a/monitor/contracts.go b/monitor/contracts.go new file mode 100644 index 0000000..7d36c22 --- /dev/null +++ b/monitor/contracts.go @@ -0,0 +1,3660 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package monitor + +import ( + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = abi.U256 + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription +) + +// GovernanceABI is the input ABI used to generate the binding from. +const GovernanceABI = "[{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"dkgSuccesses\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"notarySetSize\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"MinStake\",\"type\":\"uint256\"},{\"name\":\"LockupPeriod\",\"type\":\"uint256\"},{\"name\":\"MinGasPrice\",\"type\":\"uint256\"},{\"name\":\"BlockGasLimit\",\"type\":\"uint256\"},{\"name\":\"LambdaBA\",\"type\":\"uint256\"},{\"name\":\"LambdaDKG\",\"type\":\"uint256\"},{\"name\":\"NotaryParamAlpha\",\"type\":\"uint256\"},{\"name\":\"NotaryParamBeta\",\"type\":\"uint256\"},{\"name\":\"RoundLength\",\"type\":\"uint256\"},{\"name\":\"MinBlockInterval\",\"type\":\"uint256\"},{\"name\":\"FineValues\",\"type\":\"uint256[]\"}],\"name\":\"updateConfiguration\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"PublicKey\",\"type\":\"bytes\"}],\"name\":\"addDKGMasterPublicKey\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"nodes\",\"outputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"publicKey\",\"type\":\"bytes\"},{\"name\":\"staked\",\"type\":\"uint256\"},{\"name\":\"fined\",\"type\":\"uint256\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"location\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"unstaked\",\"type\":\"uint256\"},{\"name\":\"unstakedAt\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"notaryParamBeta\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"MPKReady\",\"type\":\"bytes\"}],\"name\":\"addDKGMPKReady\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"miningVelocity\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"Finalize\",\"type\":\"bytes\"}],\"name\":\"addDKGFinalize\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"lambdaBA\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"Amount\",\"type\":\"uint256\"}],\"name\":\"unstake\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"Type\",\"type\":\"uint256\"},{\"name\":\"Arg1\",\"type\":\"bytes\"},{\"name\":\"Arg2\",\"type\":\"bytes\"}],\"name\":\"report\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minStake\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"stake\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"NodeAddress\",\"type\":\"address\"}],\"name\":\"payFine\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"NewPublicKey\",\"type\":\"bytes\"}],\"name\":\"replaceNodePublicKey\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"NewOwner\",\"type\":\"address\"}],\"name\":\"transferNodeOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"crsRound\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"notaryParamAlpha\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"dkgSuccessesCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"Success\",\"type\":\"bytes\"}],\"name\":\"addDKGSuccess\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"withdrawable\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"NewSignedCRS\",\"type\":\"bytes\"}],\"name\":\"resetDKG\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"dkgFinalizeds\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"blockGasLimit\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"dkgRound\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"OldOwner\",\"type\":\"address\"},{\"name\":\"NewOwner\",\"type\":\"address\"}],\"name\":\"transferNodeOwnershipByFoundation\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalStaked\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"nodesOffsetByAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"crs\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"roundLength\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"nextHalvingSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"dkgComplaints\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"dkgMasterPublicKeyOffset\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"dkgMPKReadys\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"lastHalvedAmount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"finedRecords\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"lambdaDKG\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"Complaint\",\"type\":\"bytes\"}],\"name\":\"addDKGComplaint\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"fineValues\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"roundHeight\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"dkgMPKReadysCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minBlockInterval\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"Round\",\"type\":\"uint256\"},{\"name\":\"SignedCRS\",\"type\":\"bytes\"}],\"name\":\"proposeCRS\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"Name\",\"type\":\"string\"},{\"name\":\"Email\",\"type\":\"string\"},{\"name\":\"Location\",\"type\":\"string\"},{\"name\":\"Url\",\"type\":\"string\"}],\"name\":\"updateNodeInfo\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"dkgMasterPublicKeys\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"PublicKey\",\"type\":\"bytes\"},{\"name\":\"Name\",\"type\":\"string\"},{\"name\":\"Email\",\"type\":\"string\"},{\"name\":\"Location\",\"type\":\"string\"},{\"name\":\"Url\",\"type\":\"string\"}],\"name\":\"register\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"lastProposedHeight\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minGasPrice\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"dkgFinalizedsCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"dkgComplaintsProposed\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"nodesOffsetByNodeKeyAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"lockupPeriod\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"dkgResetCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"NewOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"nodesLength\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"ConfigurationChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"Round\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"CRS\",\"type\":\"bytes32\"}],\"name\":\"CRSProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"NodeAddress\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"NewOwnerAddress\",\"type\":\"address\"}],\"name\":\"NodeOwnershipTransfered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"NodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"PublicKey\",\"type\":\"bytes\"}],\"name\":\"NodePublicKeyReplaced\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"NodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"Amount\",\"type\":\"uint256\"}],\"name\":\"Staked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"NodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"Amount\",\"type\":\"uint256\"}],\"name\":\"Unstaked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"NodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"Amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"NodeAddress\",\"type\":\"address\"}],\"name\":\"NodeAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"NodeAddress\",\"type\":\"address\"}],\"name\":\"NodeRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"NodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"Type\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"Arg1\",\"type\":\"bytes\"},{\"indexed\":false,\"name\":\"Arg2\",\"type\":\"bytes\"}],\"name\":\"Reported\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"NodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"Amount\",\"type\":\"uint256\"}],\"name\":\"Fined\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"NodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"Amount\",\"type\":\"uint256\"}],\"name\":\"FinePaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"Round\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"BlockHeight\",\"type\":\"uint256\"}],\"name\":\"DKGReset\",\"type\":\"event\"}]" + +// GovernanceFuncSigs maps the 4-byte function signature to its string representation. +var GovernanceFuncSigs = map[string]string{ + + "ab6a4013": "addDKGComplaint(bytes)", + + "29891e74": "addDKGFinalize(bytes)", + + "22f8a889": "addDKGMPKReady(bytes)", + + "19cf10bc": "addDKGMasterPublicKey(bytes)", + + "4ccaa59d": "addDKGSuccess(bytes)", + + "7877a797": "blockGasLimit()", + + "8a591369": "crs()", + + "47731325": "crsRound()", + + "8d90a159": "dkgComplaints(uint256)", + + "e746714d": "dkgComplaintsProposed(bytes32)", + + "70f3ac54": "dkgFinalizeds(address)", + + "dd2083d0": "dkgFinalizedsCount()", + + "9bc9f489": "dkgMPKReadys(address)", + + "b03e75e4": "dkgMPKReadysCount()", + + "99aadb9a": "dkgMasterPublicKeyOffset(bytes32)", + + "d21abb78": "dkgMasterPublicKeys(uint256)", + + "f0771659": "dkgResetCount(uint256)", + + "7a8c1c1e": "dkgRound()", + + "072bf11a": "dkgSuccesses(address)", + + "4cb38c7a": "dkgSuccessesCount()", + + "ae1f289d": "fineValues(uint256)", + + "a1e460eb": "finedRecords(bytes32)", + + "2deb3316": "lambdaBA()", + + "a9601a8d": "lambdaDKG()", + + "a0488e55": "lastHalvedAmount()", + + "d767fdc9": "lastProposedHeight(address)", + + "ee947a7c": "lockupPeriod()", + + "b3606b56": "minBlockInterval()", + + "d96ed505": "minGasPrice()", + + "375b3c0a": "minStake()", + + "2357e72a": "miningVelocity()", + + "8ca55162": "nextHalvingSupply()", + + "1c53c280": "nodes(uint256)", + + "f33de6c0": "nodesLength()", + + "85031123": "nodesOffsetByAddress(address)", + + "ed3fbdf9": "nodesOffsetByNodeKeyAddress(address)", + + "4c523214": "notaryParamAlpha()", + + "1f29f5c8": "notaryParamBeta()", + + "0b3441dc": "notarySetSize()", + + "8da5cb5b": "owner()", + + "3edfa229": "payFine(address)", + + "c448af34": "proposeCRS(uint256,bytes)", + + "d242f4cc": "register(bytes,string,string,string,string)", + + "3f007c20": "replaceNodePublicKey(bytes)", + + "320c0826": "report(uint256,bytes,bytes)", + + "57316157": "resetDKG(bytes)", + + "af58ef06": "roundHeight(uint256)", + + "8b649b94": "roundLength()", + + "3a4b66f1": "stake()", + + "817b1cd2": "totalStaked()", + + "18160ddd": "totalSupply()", + + "4264ecf9": "transferNodeOwnership(address)", + + "7ecfdeca": "transferNodeOwnershipByFoundation(address,address)", + + "f2fde38b": "transferOwnership(address)", + + "2e17de78": "unstake(uint256)", + + "11c7c321": "updateConfiguration(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256[])", + + "c5ea6ea1": "updateNodeInfo(string,string,string,string)", + + "3ccfd60b": "withdraw()", + + "50188301": "withdrawable()", +} + +// GovernanceBin is the compiled bytecode used for deploying new contracts. +const GovernanceBin = `0x608060405234801561001057600080fd5b50611abc806100206000396000f3fe60806040526004361061038c5760003560e01c8063817b1cd2116101dc578063b03e75e411610102578063d96ed505116100a0578063ee947a7c1161006f578063ee947a7c1461144c578063f077165914611461578063f2fde38b1461148b578063f33de6c0146114be5761038c565b8063d96ed505146113c5578063dd2083d0146113da578063e746714d146113ef578063ed3fbdf9146114195761038c565b8063c5ea6ea1116100dc578063c5ea6ea114610e70578063d21abb78146110b0578063d242f4cc146110da578063d767fdc9146113925761038c565b8063b03e75e414610d8e578063b3606b5614610da3578063c448af3414610db85761038c565b806399aadb9a1161017a578063a9601a8d11610149578063a9601a8d14610d25578063ab6a401314610505578063ae1f289d14610d3a578063af58ef0614610d645761038c565b806399aadb9a14610c895780639bc9f48914610cb3578063a0488e5514610ce6578063a1e460eb14610cfb5761038c565b80638b649b94116101b65780638b649b9414610b8f5780638ca5516214610ba45780638d90a15914610bb95780638da5cb5b14610c585761038c565b8063817b1cd214610b325780638503112314610b475780638a59136914610b7a5761038c565b80633a4b66f1116102c15780634cb38c7a1161025f57806370f3ac541161022e57806370f3ac5414610a9a5780637877a79714610acd5780637a8c1c1e14610ae25780637ecfdeca14610af75761038c565b80634cb38c7a14610a705780634ccaa59d146105055780635018830114610a8557806357316157146105055761038c565b80633f007c201161029b5780633f007c20146105055780634264ecf914610a235780634773132514610a465780634c52321414610a5b5761038c565b80633a4b66f1146109e05780633ccfd60b146109e85780633edfa229146109fd5761038c565b806322f8a8891161032e5780632deb3316116103085780632deb33161461084f5780632e17de7814610864578063320c08261461088e578063375b3c0a146109cb5761038c565b806322f8a889146105055780632357e72a1461083a57806329891e74146105055761038c565b806318160ddd1161036a57806318160ddd146104f057806319cf10bc146105055780631c53c280146105b65780631f29f5c8146108255761038c565b8063072bf11a146103915780630b3441dc146103d857806311c7c321146103ff575b600080fd5b34801561039d57600080fd5b506103c4600480360360208110156103b457600080fd5b50356001600160a01b03166114d3565b604080519115158252519081900360200190f35b3480156103e457600080fd5b506103ed6114e8565b60408051918252519081900360200190f35b34801561040b57600080fd5b506104ee600480360361016081101561042357600080fd5b81359160208101359160408201359160608101359160808201359160a08101359160c08201359160e08101359161010082013591610120810135918101906101608101610140820135600160201b81111561047d57600080fd5b82018360208201111561048f57600080fd5b803590602001918460208302840111600160201b831117156104b057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506114ee945050505050565b005b3480156104fc57600080fd5b506103ed611512565b34801561051157600080fd5b506104ee6004803603602081101561052857600080fd5b810190602081018135600160201b81111561054257600080fd5b82018360208201111561055457600080fd5b803590602001918460018302840111600160201b8311171561057557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611518945050505050565b3480156105c257600080fd5b506105e0600480360360208110156105d957600080fd5b503561151b565b604051808b6001600160a01b03166001600160a01b03168152602001806020018a81526020018981526020018060200180602001806020018060200188815260200187815260200186810386528f818151815260200191508051906020019080838360005b8381101561065d578181015183820152602001610645565b50505050905090810190601f16801561068a5780820380516001836020036101000a031916815260200191505b5086810385528c5181528c516020918201918e019080838360005b838110156106bd5781810151838201526020016106a5565b50505050905090810190601f1680156106ea5780820380516001836020036101000a031916815260200191505b5086810384528b5181528b516020918201918d019080838360005b8381101561071d578181015183820152602001610705565b50505050905090810190601f16801561074a5780820380516001836020036101000a031916815260200191505b5086810383528a5181528a516020918201918c019080838360005b8381101561077d578181015183820152602001610765565b50505050905090810190601f1680156107aa5780820380516001836020036101000a031916815260200191505b5086810382528951815289516020918201918b019080838360005b838110156107dd5781810151838201526020016107c5565b50505050905090810190601f16801561080a5780820380516001836020036101000a031916815260200191505b509f5050505050505050505050505050505060405180910390f35b34801561083157600080fd5b506103ed611845565b34801561084657600080fd5b506103ed61184b565b34801561085b57600080fd5b506103ed611851565b34801561087057600080fd5b506104ee6004803603602081101561088757600080fd5b5035611518565b34801561089a57600080fd5b506104ee600480360360608110156108b157600080fd5b81359190810190604081016020820135600160201b8111156108d257600080fd5b8201836020820111156108e457600080fd5b803590602001918460018302840111600160201b8311171561090557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561095757600080fd5b82018360208201111561096957600080fd5b803590602001918460018302840111600160201b8311171561098a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611857945050505050565b3480156109d757600080fd5b506103ed61185c565b6104ee611862565b3480156109f457600080fd5b506104ee611862565b6104ee60048036036020811015610a1357600080fd5b50356001600160a01b0316611518565b348015610a2f57600080fd5b506104ee60048036036020811015610a1357600080fd5b348015610a5257600080fd5b506103ed611864565b348015610a6757600080fd5b506103ed61186a565b348015610a7c57600080fd5b506103ed611870565b348015610a9157600080fd5b506103c4611876565b348015610aa657600080fd5b506103c460048036036020811015610abd57600080fd5b50356001600160a01b031661187b565b348015610ad957600080fd5b506103ed611890565b348015610aee57600080fd5b506103ed611896565b348015610b0357600080fd5b506104ee60048036036040811015610b1a57600080fd5b506001600160a01b038135811691602001351661189c565b348015610b3e57600080fd5b506103ed6118a0565b348015610b5357600080fd5b506103ed60048036036020811015610b6a57600080fd5b50356001600160a01b03166118a6565b348015610b8657600080fd5b506103ed6118b8565b348015610b9b57600080fd5b506103ed6118be565b348015610bb057600080fd5b506103ed6118c4565b348015610bc557600080fd5b50610be360048036036020811015610bdc57600080fd5b50356118ca565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610c1d578181015183820152602001610c05565b50505050905090810190601f168015610c4a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c6457600080fd5b50610c6d611970565b604080516001600160a01b039092168252519081900360200190f35b348015610c9557600080fd5b506103ed60048036036020811015610cac57600080fd5b503561197f565b348015610cbf57600080fd5b506103c460048036036020811015610cd657600080fd5b50356001600160a01b0316611991565b348015610cf257600080fd5b506103ed6119a6565b348015610d0757600080fd5b506103c460048036036020811015610d1e57600080fd5b50356119ac565b348015610d3157600080fd5b506103ed6119c1565b348015610d4657600080fd5b506103ed60048036036020811015610d5d57600080fd5b50356119c7565b348015610d7057600080fd5b506103ed60048036036020811015610d8757600080fd5b50356119e5565b348015610d9a57600080fd5b506103ed6119f2565b348015610daf57600080fd5b506103ed6119f8565b348015610dc457600080fd5b506104ee60048036036040811015610ddb57600080fd5b81359190810190604081016020820135600160201b811115610dfc57600080fd5b820183602082011115610e0e57600080fd5b803590602001918460018302840111600160201b83111715610e2f57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061189c945050505050565b348015610e7c57600080fd5b506104ee60048036036080811015610e9357600080fd5b810190602081018135600160201b811115610ead57600080fd5b820183602082011115610ebf57600080fd5b803590602001918460018302840111600160201b83111715610ee057600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610f3257600080fd5b820183602082011115610f4457600080fd5b803590602001918460018302840111600160201b83111715610f6557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610fb757600080fd5b820183602082011115610fc957600080fd5b803590602001918460018302840111600160201b83111715610fea57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561103c57600080fd5b82018360208201111561104e57600080fd5b803590602001918460018302840111600160201b8311171561106f57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506119fe945050505050565b3480156110bc57600080fd5b50610be3600480360360208110156110d357600080fd5b5035611a04565b6104ee600480360360a08110156110f057600080fd5b810190602081018135600160201b81111561110a57600080fd5b82018360208201111561111c57600080fd5b803590602001918460018302840111600160201b8311171561113d57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561118f57600080fd5b8201836020820111156111a157600080fd5b803590602001918460018302840111600160201b831117156111c257600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561121457600080fd5b82018360208201111561122657600080fd5b803590602001918460018302840111600160201b8311171561124757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561129957600080fd5b8201836020820111156112ab57600080fd5b803590602001918460018302840111600160201b831117156112cc57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561131e57600080fd5b82018360208201111561133057600080fd5b803590602001918460018302840111600160201b8311171561135157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611a11945050505050565b34801561139e57600080fd5b506103ed600480360360208110156113b557600080fd5b50356001600160a01b0316611a18565b3480156113d157600080fd5b506103ed611a2a565b3480156113e657600080fd5b506103ed611a30565b3480156113fb57600080fd5b506103c46004803603602081101561141257600080fd5b5035611a36565b34801561142557600080fd5b506103ed6004803603602081101561143c57600080fd5b50356001600160a01b0316611a4b565b34801561145857600080fd5b506103ed611a5d565b34801561146d57600080fd5b506103ed6004803603602081101561148457600080fd5b5035611a63565b34801561149757600080fd5b506104ee600480360360208110156114ae57600080fd5b50356001600160a01b0316611a70565b3480156114ca57600080fd5b506103ed611876565b60136020526000908152604090205460ff1681565b601f5481565b6015546001600160a01b0316331461150557600080fd5b5050505050505050505050565b60015481565b50565b6003818154811061152857fe5b6000918252602091829020600a9091020180546001808301805460408051601f60026000199685161561010002969096019093169490940491820187900487028401870190528083526001600160a01b0390931695509293909291908301828280156115d55780601f106115aa576101008083540402835291602001916115d5565b820191906000526020600020905b8154815290600101906020018083116115b857829003601f168201915b505050505090806002015490806003015490806004018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561167f5780601f106116545761010080835404028352916020019161167f565b820191906000526020600020905b81548152906001019060200180831161166257829003601f168201915b5050505060058301805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815294959493509083018282801561170f5780601f106116e45761010080835404028352916020019161170f565b820191906000526020600020905b8154815290600101906020018083116116f257829003601f168201915b5050505060068301805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815294959493509083018282801561179f5780601f106117745761010080835404028352916020019161179f565b820191906000526020600020905b81548152906001019060200180831161178257829003601f168201915b5050505060078301805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815294959493509083018282801561182f5780601f106118045761010080835404028352916020019161182f565b820191906000526020600020905b81548152906001019060200180831161181257829003601f168201915b505050505090806008015490806009015490508a565b60215481565b60185481565b601d5481565b505050565b60165481565b565b60075481565b60205481565b60145481565b600090565b60116020526000908152604090205460ff1681565b601c5481565b60095481565b5050565b60025481565b60046020526000908152604090205481565b60085481565b60225481565b60195481565b600d81815481106118d757fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152935090918301828280156119685780601f1061193d57610100808354040283529160200191611968565b820191906000526020600020905b81548152906001019060200180831161194b57829003601f168201915b505050505081565b6015546001600160a01b031681565b600c6020526000908152604090205481565b600f6020526000908152604090205460ff1681565b601a5481565b60256020526000908152604090205460ff1681565b601e5481565b602481815481106119d457fe5b600091825260209091200154905081565b600081815481106119d457fe5b60105481565b60235481565b50505050565b600b81815481106118d757fe5b5050505050565b60066020526000908152604090205481565b601b5481565b60125481565b600e6020526000908152604090205460ff1681565b60056020526000908152604090205481565b60175481565b600a81815481106119d457fe5b6015546001600160a01b0316331461151857600080fdfea265627a7a723058209455fe1d223ee2f67e258f5526b5c272bb000f775541bcb469c3def1b40ad0cc64736f6c634300050a0032` + +// DeployGovernance deploys a new Ethereum contract, binding an instance of Governance to it. +func DeployGovernance(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Governance, error) { + parsed, err := abi.JSON(strings.NewReader(GovernanceABI)) + if err != nil { + return common.Address{}, nil, nil, err + } + address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(GovernanceBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &Governance{GovernanceCaller: GovernanceCaller{contract: contract}, GovernanceTransactor: GovernanceTransactor{contract: contract}, GovernanceFilterer: GovernanceFilterer{contract: contract}}, nil +} + +// Governance is an auto generated Go binding around an Ethereum contract. +type Governance struct { + GovernanceCaller // Read-only binding to the contract + GovernanceTransactor // Write-only binding to the contract + GovernanceFilterer // Log filterer for contract events +} + +// GovernanceCaller is an auto generated read-only Go binding around an Ethereum contract. +type GovernanceCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// GovernanceTransactor is an auto generated write-only Go binding around an Ethereum contract. +type GovernanceTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// GovernanceFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type GovernanceFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// GovernanceSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type GovernanceSession struct { + Contract *Governance // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// GovernanceCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type GovernanceCallerSession struct { + Contract *GovernanceCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// GovernanceTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type GovernanceTransactorSession struct { + Contract *GovernanceTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// GovernanceRaw is an auto generated low-level Go binding around an Ethereum contract. +type GovernanceRaw struct { + Contract *Governance // Generic contract binding to access the raw methods on +} + +// GovernanceCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type GovernanceCallerRaw struct { + Contract *GovernanceCaller // Generic read-only contract binding to access the raw methods on +} + +// GovernanceTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type GovernanceTransactorRaw struct { + Contract *GovernanceTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewGovernance creates a new instance of Governance, bound to a specific deployed contract. +func NewGovernance(address common.Address, backend bind.ContractBackend) (*Governance, error) { + contract, err := bindGovernance(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Governance{GovernanceCaller: GovernanceCaller{contract: contract}, GovernanceTransactor: GovernanceTransactor{contract: contract}, GovernanceFilterer: GovernanceFilterer{contract: contract}}, nil +} + +// NewGovernanceCaller creates a new read-only instance of Governance, bound to a specific deployed contract. +func NewGovernanceCaller(address common.Address, caller bind.ContractCaller) (*GovernanceCaller, error) { + contract, err := bindGovernance(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &GovernanceCaller{contract: contract}, nil +} + +// NewGovernanceTransactor creates a new write-only instance of Governance, bound to a specific deployed contract. +func NewGovernanceTransactor(address common.Address, transactor bind.ContractTransactor) (*GovernanceTransactor, error) { + contract, err := bindGovernance(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &GovernanceTransactor{contract: contract}, nil +} + +// NewGovernanceFilterer creates a new log filterer instance of Governance, bound to a specific deployed contract. +func NewGovernanceFilterer(address common.Address, filterer bind.ContractFilterer) (*GovernanceFilterer, error) { + contract, err := bindGovernance(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &GovernanceFilterer{contract: contract}, nil +} + +// bindGovernance binds a generic wrapper to an already deployed contract. +func bindGovernance(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := abi.JSON(strings.NewReader(GovernanceABI)) + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Governance *GovernanceRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { + return _Governance.Contract.GovernanceCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Governance *GovernanceRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Governance.Contract.GovernanceTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Governance *GovernanceRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Governance.Contract.GovernanceTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Governance *GovernanceCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { + return _Governance.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Governance *GovernanceTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Governance.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Governance *GovernanceTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Governance.Contract.contract.Transact(opts, method, params...) +} + +// BlockGasLimit is a free data retrieval call binding the contract method 0x7877a797. +// +// Solidity: function blockGasLimit() constant returns(uint256) +func (_Governance *GovernanceCaller) BlockGasLimit(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "blockGasLimit") + return *ret0, err +} + +// BlockGasLimit is a free data retrieval call binding the contract method 0x7877a797. +// +// Solidity: function blockGasLimit() constant returns(uint256) +func (_Governance *GovernanceSession) BlockGasLimit() (*big.Int, error) { + return _Governance.Contract.BlockGasLimit(&_Governance.CallOpts) +} + +// BlockGasLimit is a free data retrieval call binding the contract method 0x7877a797. +// +// Solidity: function blockGasLimit() constant returns(uint256) +func (_Governance *GovernanceCallerSession) BlockGasLimit() (*big.Int, error) { + return _Governance.Contract.BlockGasLimit(&_Governance.CallOpts) +} + +// Crs is a free data retrieval call binding the contract method 0x8a591369. +// +// Solidity: function crs() constant returns(bytes32) +func (_Governance *GovernanceCaller) Crs(opts *bind.CallOpts) ([32]byte, error) { + var ( + ret0 = new([32]byte) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "crs") + return *ret0, err +} + +// Crs is a free data retrieval call binding the contract method 0x8a591369. +// +// Solidity: function crs() constant returns(bytes32) +func (_Governance *GovernanceSession) Crs() ([32]byte, error) { + return _Governance.Contract.Crs(&_Governance.CallOpts) +} + +// Crs is a free data retrieval call binding the contract method 0x8a591369. +// +// Solidity: function crs() constant returns(bytes32) +func (_Governance *GovernanceCallerSession) Crs() ([32]byte, error) { + return _Governance.Contract.Crs(&_Governance.CallOpts) +} + +// CrsRound is a free data retrieval call binding the contract method 0x47731325. +// +// Solidity: function crsRound() constant returns(uint256) +func (_Governance *GovernanceCaller) CrsRound(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "crsRound") + return *ret0, err +} + +// CrsRound is a free data retrieval call binding the contract method 0x47731325. +// +// Solidity: function crsRound() constant returns(uint256) +func (_Governance *GovernanceSession) CrsRound() (*big.Int, error) { + return _Governance.Contract.CrsRound(&_Governance.CallOpts) +} + +// CrsRound is a free data retrieval call binding the contract method 0x47731325. +// +// Solidity: function crsRound() constant returns(uint256) +func (_Governance *GovernanceCallerSession) CrsRound() (*big.Int, error) { + return _Governance.Contract.CrsRound(&_Governance.CallOpts) +} + +// DkgComplaints is a free data retrieval call binding the contract method 0x8d90a159. +// +// Solidity: function dkgComplaints(uint256 ) constant returns(bytes) +func (_Governance *GovernanceCaller) DkgComplaints(opts *bind.CallOpts, arg0 *big.Int) ([]byte, error) { + var ( + ret0 = new([]byte) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "dkgComplaints", arg0) + return *ret0, err +} + +// DkgComplaints is a free data retrieval call binding the contract method 0x8d90a159. +// +// Solidity: function dkgComplaints(uint256 ) constant returns(bytes) +func (_Governance *GovernanceSession) DkgComplaints(arg0 *big.Int) ([]byte, error) { + return _Governance.Contract.DkgComplaints(&_Governance.CallOpts, arg0) +} + +// DkgComplaints is a free data retrieval call binding the contract method 0x8d90a159. +// +// Solidity: function dkgComplaints(uint256 ) constant returns(bytes) +func (_Governance *GovernanceCallerSession) DkgComplaints(arg0 *big.Int) ([]byte, error) { + return _Governance.Contract.DkgComplaints(&_Governance.CallOpts, arg0) +} + +// DkgComplaintsProposed is a free data retrieval call binding the contract method 0xe746714d. +// +// Solidity: function dkgComplaintsProposed(bytes32 ) constant returns(bool) +func (_Governance *GovernanceCaller) DkgComplaintsProposed(opts *bind.CallOpts, arg0 [32]byte) (bool, error) { + var ( + ret0 = new(bool) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "dkgComplaintsProposed", arg0) + return *ret0, err +} + +// DkgComplaintsProposed is a free data retrieval call binding the contract method 0xe746714d. +// +// Solidity: function dkgComplaintsProposed(bytes32 ) constant returns(bool) +func (_Governance *GovernanceSession) DkgComplaintsProposed(arg0 [32]byte) (bool, error) { + return _Governance.Contract.DkgComplaintsProposed(&_Governance.CallOpts, arg0) +} + +// DkgComplaintsProposed is a free data retrieval call binding the contract method 0xe746714d. +// +// Solidity: function dkgComplaintsProposed(bytes32 ) constant returns(bool) +func (_Governance *GovernanceCallerSession) DkgComplaintsProposed(arg0 [32]byte) (bool, error) { + return _Governance.Contract.DkgComplaintsProposed(&_Governance.CallOpts, arg0) +} + +// DkgFinalizeds is a free data retrieval call binding the contract method 0x70f3ac54. +// +// Solidity: function dkgFinalizeds(address ) constant returns(bool) +func (_Governance *GovernanceCaller) DkgFinalizeds(opts *bind.CallOpts, arg0 common.Address) (bool, error) { + var ( + ret0 = new(bool) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "dkgFinalizeds", arg0) + return *ret0, err +} + +// DkgFinalizeds is a free data retrieval call binding the contract method 0x70f3ac54. +// +// Solidity: function dkgFinalizeds(address ) constant returns(bool) +func (_Governance *GovernanceSession) DkgFinalizeds(arg0 common.Address) (bool, error) { + return _Governance.Contract.DkgFinalizeds(&_Governance.CallOpts, arg0) +} + +// DkgFinalizeds is a free data retrieval call binding the contract method 0x70f3ac54. +// +// Solidity: function dkgFinalizeds(address ) constant returns(bool) +func (_Governance *GovernanceCallerSession) DkgFinalizeds(arg0 common.Address) (bool, error) { + return _Governance.Contract.DkgFinalizeds(&_Governance.CallOpts, arg0) +} + +// DkgFinalizedsCount is a free data retrieval call binding the contract method 0xdd2083d0. +// +// Solidity: function dkgFinalizedsCount() constant returns(uint256) +func (_Governance *GovernanceCaller) DkgFinalizedsCount(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "dkgFinalizedsCount") + return *ret0, err +} + +// DkgFinalizedsCount is a free data retrieval call binding the contract method 0xdd2083d0. +// +// Solidity: function dkgFinalizedsCount() constant returns(uint256) +func (_Governance *GovernanceSession) DkgFinalizedsCount() (*big.Int, error) { + return _Governance.Contract.DkgFinalizedsCount(&_Governance.CallOpts) +} + +// DkgFinalizedsCount is a free data retrieval call binding the contract method 0xdd2083d0. +// +// Solidity: function dkgFinalizedsCount() constant returns(uint256) +func (_Governance *GovernanceCallerSession) DkgFinalizedsCount() (*big.Int, error) { + return _Governance.Contract.DkgFinalizedsCount(&_Governance.CallOpts) +} + +// DkgMPKReadys is a free data retrieval call binding the contract method 0x9bc9f489. +// +// Solidity: function dkgMPKReadys(address ) constant returns(bool) +func (_Governance *GovernanceCaller) DkgMPKReadys(opts *bind.CallOpts, arg0 common.Address) (bool, error) { + var ( + ret0 = new(bool) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "dkgMPKReadys", arg0) + return *ret0, err +} + +// DkgMPKReadys is a free data retrieval call binding the contract method 0x9bc9f489. +// +// Solidity: function dkgMPKReadys(address ) constant returns(bool) +func (_Governance *GovernanceSession) DkgMPKReadys(arg0 common.Address) (bool, error) { + return _Governance.Contract.DkgMPKReadys(&_Governance.CallOpts, arg0) +} + +// DkgMPKReadys is a free data retrieval call binding the contract method 0x9bc9f489. +// +// Solidity: function dkgMPKReadys(address ) constant returns(bool) +func (_Governance *GovernanceCallerSession) DkgMPKReadys(arg0 common.Address) (bool, error) { + return _Governance.Contract.DkgMPKReadys(&_Governance.CallOpts, arg0) +} + +// DkgMPKReadysCount is a free data retrieval call binding the contract method 0xb03e75e4. +// +// Solidity: function dkgMPKReadysCount() constant returns(uint256) +func (_Governance *GovernanceCaller) DkgMPKReadysCount(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "dkgMPKReadysCount") + return *ret0, err +} + +// DkgMPKReadysCount is a free data retrieval call binding the contract method 0xb03e75e4. +// +// Solidity: function dkgMPKReadysCount() constant returns(uint256) +func (_Governance *GovernanceSession) DkgMPKReadysCount() (*big.Int, error) { + return _Governance.Contract.DkgMPKReadysCount(&_Governance.CallOpts) +} + +// DkgMPKReadysCount is a free data retrieval call binding the contract method 0xb03e75e4. +// +// Solidity: function dkgMPKReadysCount() constant returns(uint256) +func (_Governance *GovernanceCallerSession) DkgMPKReadysCount() (*big.Int, error) { + return _Governance.Contract.DkgMPKReadysCount(&_Governance.CallOpts) +} + +// DkgMasterPublicKeyOffset is a free data retrieval call binding the contract method 0x99aadb9a. +// +// Solidity: function dkgMasterPublicKeyOffset(bytes32 ) constant returns(uint256) +func (_Governance *GovernanceCaller) DkgMasterPublicKeyOffset(opts *bind.CallOpts, arg0 [32]byte) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "dkgMasterPublicKeyOffset", arg0) + return *ret0, err +} + +// DkgMasterPublicKeyOffset is a free data retrieval call binding the contract method 0x99aadb9a. +// +// Solidity: function dkgMasterPublicKeyOffset(bytes32 ) constant returns(uint256) +func (_Governance *GovernanceSession) DkgMasterPublicKeyOffset(arg0 [32]byte) (*big.Int, error) { + return _Governance.Contract.DkgMasterPublicKeyOffset(&_Governance.CallOpts, arg0) +} + +// DkgMasterPublicKeyOffset is a free data retrieval call binding the contract method 0x99aadb9a. +// +// Solidity: function dkgMasterPublicKeyOffset(bytes32 ) constant returns(uint256) +func (_Governance *GovernanceCallerSession) DkgMasterPublicKeyOffset(arg0 [32]byte) (*big.Int, error) { + return _Governance.Contract.DkgMasterPublicKeyOffset(&_Governance.CallOpts, arg0) +} + +// DkgMasterPublicKeys is a free data retrieval call binding the contract method 0xd21abb78. +// +// Solidity: function dkgMasterPublicKeys(uint256 ) constant returns(bytes) +func (_Governance *GovernanceCaller) DkgMasterPublicKeys(opts *bind.CallOpts, arg0 *big.Int) ([]byte, error) { + var ( + ret0 = new([]byte) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "dkgMasterPublicKeys", arg0) + return *ret0, err +} + +// DkgMasterPublicKeys is a free data retrieval call binding the contract method 0xd21abb78. +// +// Solidity: function dkgMasterPublicKeys(uint256 ) constant returns(bytes) +func (_Governance *GovernanceSession) DkgMasterPublicKeys(arg0 *big.Int) ([]byte, error) { + return _Governance.Contract.DkgMasterPublicKeys(&_Governance.CallOpts, arg0) +} + +// DkgMasterPublicKeys is a free data retrieval call binding the contract method 0xd21abb78. +// +// Solidity: function dkgMasterPublicKeys(uint256 ) constant returns(bytes) +func (_Governance *GovernanceCallerSession) DkgMasterPublicKeys(arg0 *big.Int) ([]byte, error) { + return _Governance.Contract.DkgMasterPublicKeys(&_Governance.CallOpts, arg0) +} + +// DkgResetCount is a free data retrieval call binding the contract method 0xf0771659. +// +// Solidity: function dkgResetCount(uint256 ) constant returns(uint256) +func (_Governance *GovernanceCaller) DkgResetCount(opts *bind.CallOpts, arg0 *big.Int) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "dkgResetCount", arg0) + return *ret0, err +} + +// DkgResetCount is a free data retrieval call binding the contract method 0xf0771659. +// +// Solidity: function dkgResetCount(uint256 ) constant returns(uint256) +func (_Governance *GovernanceSession) DkgResetCount(arg0 *big.Int) (*big.Int, error) { + return _Governance.Contract.DkgResetCount(&_Governance.CallOpts, arg0) +} + +// DkgResetCount is a free data retrieval call binding the contract method 0xf0771659. +// +// Solidity: function dkgResetCount(uint256 ) constant returns(uint256) +func (_Governance *GovernanceCallerSession) DkgResetCount(arg0 *big.Int) (*big.Int, error) { + return _Governance.Contract.DkgResetCount(&_Governance.CallOpts, arg0) +} + +// DkgRound is a free data retrieval call binding the contract method 0x7a8c1c1e. +// +// Solidity: function dkgRound() constant returns(uint256) +func (_Governance *GovernanceCaller) DkgRound(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "dkgRound") + return *ret0, err +} + +// DkgRound is a free data retrieval call binding the contract method 0x7a8c1c1e. +// +// Solidity: function dkgRound() constant returns(uint256) +func (_Governance *GovernanceSession) DkgRound() (*big.Int, error) { + return _Governance.Contract.DkgRound(&_Governance.CallOpts) +} + +// DkgRound is a free data retrieval call binding the contract method 0x7a8c1c1e. +// +// Solidity: function dkgRound() constant returns(uint256) +func (_Governance *GovernanceCallerSession) DkgRound() (*big.Int, error) { + return _Governance.Contract.DkgRound(&_Governance.CallOpts) +} + +// DkgSuccesses is a free data retrieval call binding the contract method 0x072bf11a. +// +// Solidity: function dkgSuccesses(address ) constant returns(bool) +func (_Governance *GovernanceCaller) DkgSuccesses(opts *bind.CallOpts, arg0 common.Address) (bool, error) { + var ( + ret0 = new(bool) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "dkgSuccesses", arg0) + return *ret0, err +} + +// DkgSuccesses is a free data retrieval call binding the contract method 0x072bf11a. +// +// Solidity: function dkgSuccesses(address ) constant returns(bool) +func (_Governance *GovernanceSession) DkgSuccesses(arg0 common.Address) (bool, error) { + return _Governance.Contract.DkgSuccesses(&_Governance.CallOpts, arg0) +} + +// DkgSuccesses is a free data retrieval call binding the contract method 0x072bf11a. +// +// Solidity: function dkgSuccesses(address ) constant returns(bool) +func (_Governance *GovernanceCallerSession) DkgSuccesses(arg0 common.Address) (bool, error) { + return _Governance.Contract.DkgSuccesses(&_Governance.CallOpts, arg0) +} + +// DkgSuccessesCount is a free data retrieval call binding the contract method 0x4cb38c7a. +// +// Solidity: function dkgSuccessesCount() constant returns(uint256) +func (_Governance *GovernanceCaller) DkgSuccessesCount(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "dkgSuccessesCount") + return *ret0, err +} + +// DkgSuccessesCount is a free data retrieval call binding the contract method 0x4cb38c7a. +// +// Solidity: function dkgSuccessesCount() constant returns(uint256) +func (_Governance *GovernanceSession) DkgSuccessesCount() (*big.Int, error) { + return _Governance.Contract.DkgSuccessesCount(&_Governance.CallOpts) +} + +// DkgSuccessesCount is a free data retrieval call binding the contract method 0x4cb38c7a. +// +// Solidity: function dkgSuccessesCount() constant returns(uint256) +func (_Governance *GovernanceCallerSession) DkgSuccessesCount() (*big.Int, error) { + return _Governance.Contract.DkgSuccessesCount(&_Governance.CallOpts) +} + +// FineValues is a free data retrieval call binding the contract method 0xae1f289d. +// +// Solidity: function fineValues(uint256 ) constant returns(uint256) +func (_Governance *GovernanceCaller) FineValues(opts *bind.CallOpts, arg0 *big.Int) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "fineValues", arg0) + return *ret0, err +} + +// FineValues is a free data retrieval call binding the contract method 0xae1f289d. +// +// Solidity: function fineValues(uint256 ) constant returns(uint256) +func (_Governance *GovernanceSession) FineValues(arg0 *big.Int) (*big.Int, error) { + return _Governance.Contract.FineValues(&_Governance.CallOpts, arg0) +} + +// FineValues is a free data retrieval call binding the contract method 0xae1f289d. +// +// Solidity: function fineValues(uint256 ) constant returns(uint256) +func (_Governance *GovernanceCallerSession) FineValues(arg0 *big.Int) (*big.Int, error) { + return _Governance.Contract.FineValues(&_Governance.CallOpts, arg0) +} + +// FinedRecords is a free data retrieval call binding the contract method 0xa1e460eb. +// +// Solidity: function finedRecords(bytes32 ) constant returns(bool) +func (_Governance *GovernanceCaller) FinedRecords(opts *bind.CallOpts, arg0 [32]byte) (bool, error) { + var ( + ret0 = new(bool) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "finedRecords", arg0) + return *ret0, err +} + +// FinedRecords is a free data retrieval call binding the contract method 0xa1e460eb. +// +// Solidity: function finedRecords(bytes32 ) constant returns(bool) +func (_Governance *GovernanceSession) FinedRecords(arg0 [32]byte) (bool, error) { + return _Governance.Contract.FinedRecords(&_Governance.CallOpts, arg0) +} + +// FinedRecords is a free data retrieval call binding the contract method 0xa1e460eb. +// +// Solidity: function finedRecords(bytes32 ) constant returns(bool) +func (_Governance *GovernanceCallerSession) FinedRecords(arg0 [32]byte) (bool, error) { + return _Governance.Contract.FinedRecords(&_Governance.CallOpts, arg0) +} + +// LambdaBA is a free data retrieval call binding the contract method 0x2deb3316. +// +// Solidity: function lambdaBA() constant returns(uint256) +func (_Governance *GovernanceCaller) LambdaBA(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "lambdaBA") + return *ret0, err +} + +// LambdaBA is a free data retrieval call binding the contract method 0x2deb3316. +// +// Solidity: function lambdaBA() constant returns(uint256) +func (_Governance *GovernanceSession) LambdaBA() (*big.Int, error) { + return _Governance.Contract.LambdaBA(&_Governance.CallOpts) +} + +// LambdaBA is a free data retrieval call binding the contract method 0x2deb3316. +// +// Solidity: function lambdaBA() constant returns(uint256) +func (_Governance *GovernanceCallerSession) LambdaBA() (*big.Int, error) { + return _Governance.Contract.LambdaBA(&_Governance.CallOpts) +} + +// LambdaDKG is a free data retrieval call binding the contract method 0xa9601a8d. +// +// Solidity: function lambdaDKG() constant returns(uint256) +func (_Governance *GovernanceCaller) LambdaDKG(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "lambdaDKG") + return *ret0, err +} + +// LambdaDKG is a free data retrieval call binding the contract method 0xa9601a8d. +// +// Solidity: function lambdaDKG() constant returns(uint256) +func (_Governance *GovernanceSession) LambdaDKG() (*big.Int, error) { + return _Governance.Contract.LambdaDKG(&_Governance.CallOpts) +} + +// LambdaDKG is a free data retrieval call binding the contract method 0xa9601a8d. +// +// Solidity: function lambdaDKG() constant returns(uint256) +func (_Governance *GovernanceCallerSession) LambdaDKG() (*big.Int, error) { + return _Governance.Contract.LambdaDKG(&_Governance.CallOpts) +} + +// LastHalvedAmount is a free data retrieval call binding the contract method 0xa0488e55. +// +// Solidity: function lastHalvedAmount() constant returns(uint256) +func (_Governance *GovernanceCaller) LastHalvedAmount(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "lastHalvedAmount") + return *ret0, err +} + +// LastHalvedAmount is a free data retrieval call binding the contract method 0xa0488e55. +// +// Solidity: function lastHalvedAmount() constant returns(uint256) +func (_Governance *GovernanceSession) LastHalvedAmount() (*big.Int, error) { + return _Governance.Contract.LastHalvedAmount(&_Governance.CallOpts) +} + +// LastHalvedAmount is a free data retrieval call binding the contract method 0xa0488e55. +// +// Solidity: function lastHalvedAmount() constant returns(uint256) +func (_Governance *GovernanceCallerSession) LastHalvedAmount() (*big.Int, error) { + return _Governance.Contract.LastHalvedAmount(&_Governance.CallOpts) +} + +// LastProposedHeight is a free data retrieval call binding the contract method 0xd767fdc9. +// +// Solidity: function lastProposedHeight(address ) constant returns(uint256) +func (_Governance *GovernanceCaller) LastProposedHeight(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "lastProposedHeight", arg0) + return *ret0, err +} + +// LastProposedHeight is a free data retrieval call binding the contract method 0xd767fdc9. +// +// Solidity: function lastProposedHeight(address ) constant returns(uint256) +func (_Governance *GovernanceSession) LastProposedHeight(arg0 common.Address) (*big.Int, error) { + return _Governance.Contract.LastProposedHeight(&_Governance.CallOpts, arg0) +} + +// LastProposedHeight is a free data retrieval call binding the contract method 0xd767fdc9. +// +// Solidity: function lastProposedHeight(address ) constant returns(uint256) +func (_Governance *GovernanceCallerSession) LastProposedHeight(arg0 common.Address) (*big.Int, error) { + return _Governance.Contract.LastProposedHeight(&_Governance.CallOpts, arg0) +} + +// LockupPeriod is a free data retrieval call binding the contract method 0xee947a7c. +// +// Solidity: function lockupPeriod() constant returns(uint256) +func (_Governance *GovernanceCaller) LockupPeriod(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "lockupPeriod") + return *ret0, err +} + +// LockupPeriod is a free data retrieval call binding the contract method 0xee947a7c. +// +// Solidity: function lockupPeriod() constant returns(uint256) +func (_Governance *GovernanceSession) LockupPeriod() (*big.Int, error) { + return _Governance.Contract.LockupPeriod(&_Governance.CallOpts) +} + +// LockupPeriod is a free data retrieval call binding the contract method 0xee947a7c. +// +// Solidity: function lockupPeriod() constant returns(uint256) +func (_Governance *GovernanceCallerSession) LockupPeriod() (*big.Int, error) { + return _Governance.Contract.LockupPeriod(&_Governance.CallOpts) +} + +// MinBlockInterval is a free data retrieval call binding the contract method 0xb3606b56. +// +// Solidity: function minBlockInterval() constant returns(uint256) +func (_Governance *GovernanceCaller) MinBlockInterval(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "minBlockInterval") + return *ret0, err +} + +// MinBlockInterval is a free data retrieval call binding the contract method 0xb3606b56. +// +// Solidity: function minBlockInterval() constant returns(uint256) +func (_Governance *GovernanceSession) MinBlockInterval() (*big.Int, error) { + return _Governance.Contract.MinBlockInterval(&_Governance.CallOpts) +} + +// MinBlockInterval is a free data retrieval call binding the contract method 0xb3606b56. +// +// Solidity: function minBlockInterval() constant returns(uint256) +func (_Governance *GovernanceCallerSession) MinBlockInterval() (*big.Int, error) { + return _Governance.Contract.MinBlockInterval(&_Governance.CallOpts) +} + +// MinGasPrice is a free data retrieval call binding the contract method 0xd96ed505. +// +// Solidity: function minGasPrice() constant returns(uint256) +func (_Governance *GovernanceCaller) MinGasPrice(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "minGasPrice") + return *ret0, err +} + +// MinGasPrice is a free data retrieval call binding the contract method 0xd96ed505. +// +// Solidity: function minGasPrice() constant returns(uint256) +func (_Governance *GovernanceSession) MinGasPrice() (*big.Int, error) { + return _Governance.Contract.MinGasPrice(&_Governance.CallOpts) +} + +// MinGasPrice is a free data retrieval call binding the contract method 0xd96ed505. +// +// Solidity: function minGasPrice() constant returns(uint256) +func (_Governance *GovernanceCallerSession) MinGasPrice() (*big.Int, error) { + return _Governance.Contract.MinGasPrice(&_Governance.CallOpts) +} + +// MinStake is a free data retrieval call binding the contract method 0x375b3c0a. +// +// Solidity: function minStake() constant returns(uint256) +func (_Governance *GovernanceCaller) MinStake(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "minStake") + return *ret0, err +} + +// MinStake is a free data retrieval call binding the contract method 0x375b3c0a. +// +// Solidity: function minStake() constant returns(uint256) +func (_Governance *GovernanceSession) MinStake() (*big.Int, error) { + return _Governance.Contract.MinStake(&_Governance.CallOpts) +} + +// MinStake is a free data retrieval call binding the contract method 0x375b3c0a. +// +// Solidity: function minStake() constant returns(uint256) +func (_Governance *GovernanceCallerSession) MinStake() (*big.Int, error) { + return _Governance.Contract.MinStake(&_Governance.CallOpts) +} + +// MiningVelocity is a free data retrieval call binding the contract method 0x2357e72a. +// +// Solidity: function miningVelocity() constant returns(uint256) +func (_Governance *GovernanceCaller) MiningVelocity(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "miningVelocity") + return *ret0, err +} + +// MiningVelocity is a free data retrieval call binding the contract method 0x2357e72a. +// +// Solidity: function miningVelocity() constant returns(uint256) +func (_Governance *GovernanceSession) MiningVelocity() (*big.Int, error) { + return _Governance.Contract.MiningVelocity(&_Governance.CallOpts) +} + +// MiningVelocity is a free data retrieval call binding the contract method 0x2357e72a. +// +// Solidity: function miningVelocity() constant returns(uint256) +func (_Governance *GovernanceCallerSession) MiningVelocity() (*big.Int, error) { + return _Governance.Contract.MiningVelocity(&_Governance.CallOpts) +} + +// NextHalvingSupply is a free data retrieval call binding the contract method 0x8ca55162. +// +// Solidity: function nextHalvingSupply() constant returns(uint256) +func (_Governance *GovernanceCaller) NextHalvingSupply(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "nextHalvingSupply") + return *ret0, err +} + +// NextHalvingSupply is a free data retrieval call binding the contract method 0x8ca55162. +// +// Solidity: function nextHalvingSupply() constant returns(uint256) +func (_Governance *GovernanceSession) NextHalvingSupply() (*big.Int, error) { + return _Governance.Contract.NextHalvingSupply(&_Governance.CallOpts) +} + +// NextHalvingSupply is a free data retrieval call binding the contract method 0x8ca55162. +// +// Solidity: function nextHalvingSupply() constant returns(uint256) +func (_Governance *GovernanceCallerSession) NextHalvingSupply() (*big.Int, error) { + return _Governance.Contract.NextHalvingSupply(&_Governance.CallOpts) +} + +// Nodes is a free data retrieval call binding the contract method 0x1c53c280. +// +// Solidity: function nodes(uint256 ) constant returns(address owner, bytes publicKey, uint256 staked, uint256 fined, string name, string email, string location, string url, uint256 unstaked, uint256 unstakedAt) +func (_Governance *GovernanceCaller) Nodes(opts *bind.CallOpts, arg0 *big.Int) (struct { + Owner common.Address + PublicKey []byte + Staked *big.Int + Fined *big.Int + Name string + Email string + Location string + Url string + Unstaked *big.Int + UnstakedAt *big.Int +}, error) { + ret := new(struct { + Owner common.Address + PublicKey []byte + Staked *big.Int + Fined *big.Int + Name string + Email string + Location string + Url string + Unstaked *big.Int + UnstakedAt *big.Int + }) + out := ret + err := _Governance.contract.Call(opts, out, "nodes", arg0) + return *ret, err +} + +// Nodes is a free data retrieval call binding the contract method 0x1c53c280. +// +// Solidity: function nodes(uint256 ) constant returns(address owner, bytes publicKey, uint256 staked, uint256 fined, string name, string email, string location, string url, uint256 unstaked, uint256 unstakedAt) +func (_Governance *GovernanceSession) Nodes(arg0 *big.Int) (struct { + Owner common.Address + PublicKey []byte + Staked *big.Int + Fined *big.Int + Name string + Email string + Location string + Url string + Unstaked *big.Int + UnstakedAt *big.Int +}, error) { + return _Governance.Contract.Nodes(&_Governance.CallOpts, arg0) +} + +// Nodes is a free data retrieval call binding the contract method 0x1c53c280. +// +// Solidity: function nodes(uint256 ) constant returns(address owner, bytes publicKey, uint256 staked, uint256 fined, string name, string email, string location, string url, uint256 unstaked, uint256 unstakedAt) +func (_Governance *GovernanceCallerSession) Nodes(arg0 *big.Int) (struct { + Owner common.Address + PublicKey []byte + Staked *big.Int + Fined *big.Int + Name string + Email string + Location string + Url string + Unstaked *big.Int + UnstakedAt *big.Int +}, error) { + return _Governance.Contract.Nodes(&_Governance.CallOpts, arg0) +} + +// NodesLength is a free data retrieval call binding the contract method 0xf33de6c0. +// +// Solidity: function nodesLength() constant returns(uint256) +func (_Governance *GovernanceCaller) NodesLength(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "nodesLength") + return *ret0, err +} + +// NodesLength is a free data retrieval call binding the contract method 0xf33de6c0. +// +// Solidity: function nodesLength() constant returns(uint256) +func (_Governance *GovernanceSession) NodesLength() (*big.Int, error) { + return _Governance.Contract.NodesLength(&_Governance.CallOpts) +} + +// NodesLength is a free data retrieval call binding the contract method 0xf33de6c0. +// +// Solidity: function nodesLength() constant returns(uint256) +func (_Governance *GovernanceCallerSession) NodesLength() (*big.Int, error) { + return _Governance.Contract.NodesLength(&_Governance.CallOpts) +} + +// NodesOffsetByAddress is a free data retrieval call binding the contract method 0x85031123. +// +// Solidity: function nodesOffsetByAddress(address ) constant returns(int256) +func (_Governance *GovernanceCaller) NodesOffsetByAddress(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "nodesOffsetByAddress", arg0) + return *ret0, err +} + +// NodesOffsetByAddress is a free data retrieval call binding the contract method 0x85031123. +// +// Solidity: function nodesOffsetByAddress(address ) constant returns(int256) +func (_Governance *GovernanceSession) NodesOffsetByAddress(arg0 common.Address) (*big.Int, error) { + return _Governance.Contract.NodesOffsetByAddress(&_Governance.CallOpts, arg0) +} + +// NodesOffsetByAddress is a free data retrieval call binding the contract method 0x85031123. +// +// Solidity: function nodesOffsetByAddress(address ) constant returns(int256) +func (_Governance *GovernanceCallerSession) NodesOffsetByAddress(arg0 common.Address) (*big.Int, error) { + return _Governance.Contract.NodesOffsetByAddress(&_Governance.CallOpts, arg0) +} + +// NodesOffsetByNodeKeyAddress is a free data retrieval call binding the contract method 0xed3fbdf9. +// +// Solidity: function nodesOffsetByNodeKeyAddress(address ) constant returns(int256) +func (_Governance *GovernanceCaller) NodesOffsetByNodeKeyAddress(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "nodesOffsetByNodeKeyAddress", arg0) + return *ret0, err +} + +// NodesOffsetByNodeKeyAddress is a free data retrieval call binding the contract method 0xed3fbdf9. +// +// Solidity: function nodesOffsetByNodeKeyAddress(address ) constant returns(int256) +func (_Governance *GovernanceSession) NodesOffsetByNodeKeyAddress(arg0 common.Address) (*big.Int, error) { + return _Governance.Contract.NodesOffsetByNodeKeyAddress(&_Governance.CallOpts, arg0) +} + +// NodesOffsetByNodeKeyAddress is a free data retrieval call binding the contract method 0xed3fbdf9. +// +// Solidity: function nodesOffsetByNodeKeyAddress(address ) constant returns(int256) +func (_Governance *GovernanceCallerSession) NodesOffsetByNodeKeyAddress(arg0 common.Address) (*big.Int, error) { + return _Governance.Contract.NodesOffsetByNodeKeyAddress(&_Governance.CallOpts, arg0) +} + +// NotaryParamAlpha is a free data retrieval call binding the contract method 0x4c523214. +// +// Solidity: function notaryParamAlpha() constant returns(uint256) +func (_Governance *GovernanceCaller) NotaryParamAlpha(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "notaryParamAlpha") + return *ret0, err +} + +// NotaryParamAlpha is a free data retrieval call binding the contract method 0x4c523214. +// +// Solidity: function notaryParamAlpha() constant returns(uint256) +func (_Governance *GovernanceSession) NotaryParamAlpha() (*big.Int, error) { + return _Governance.Contract.NotaryParamAlpha(&_Governance.CallOpts) +} + +// NotaryParamAlpha is a free data retrieval call binding the contract method 0x4c523214. +// +// Solidity: function notaryParamAlpha() constant returns(uint256) +func (_Governance *GovernanceCallerSession) NotaryParamAlpha() (*big.Int, error) { + return _Governance.Contract.NotaryParamAlpha(&_Governance.CallOpts) +} + +// NotaryParamBeta is a free data retrieval call binding the contract method 0x1f29f5c8. +// +// Solidity: function notaryParamBeta() constant returns(uint256) +func (_Governance *GovernanceCaller) NotaryParamBeta(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "notaryParamBeta") + return *ret0, err +} + +// NotaryParamBeta is a free data retrieval call binding the contract method 0x1f29f5c8. +// +// Solidity: function notaryParamBeta() constant returns(uint256) +func (_Governance *GovernanceSession) NotaryParamBeta() (*big.Int, error) { + return _Governance.Contract.NotaryParamBeta(&_Governance.CallOpts) +} + +// NotaryParamBeta is a free data retrieval call binding the contract method 0x1f29f5c8. +// +// Solidity: function notaryParamBeta() constant returns(uint256) +func (_Governance *GovernanceCallerSession) NotaryParamBeta() (*big.Int, error) { + return _Governance.Contract.NotaryParamBeta(&_Governance.CallOpts) +} + +// NotarySetSize is a free data retrieval call binding the contract method 0x0b3441dc. +// +// Solidity: function notarySetSize() constant returns(uint256) +func (_Governance *GovernanceCaller) NotarySetSize(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "notarySetSize") + return *ret0, err +} + +// NotarySetSize is a free data retrieval call binding the contract method 0x0b3441dc. +// +// Solidity: function notarySetSize() constant returns(uint256) +func (_Governance *GovernanceSession) NotarySetSize() (*big.Int, error) { + return _Governance.Contract.NotarySetSize(&_Governance.CallOpts) +} + +// NotarySetSize is a free data retrieval call binding the contract method 0x0b3441dc. +// +// Solidity: function notarySetSize() constant returns(uint256) +func (_Governance *GovernanceCallerSession) NotarySetSize() (*big.Int, error) { + return _Governance.Contract.NotarySetSize(&_Governance.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() constant returns(address) +func (_Governance *GovernanceCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var ( + ret0 = new(common.Address) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "owner") + return *ret0, err +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() constant returns(address) +func (_Governance *GovernanceSession) Owner() (common.Address, error) { + return _Governance.Contract.Owner(&_Governance.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() constant returns(address) +func (_Governance *GovernanceCallerSession) Owner() (common.Address, error) { + return _Governance.Contract.Owner(&_Governance.CallOpts) +} + +// RoundHeight is a free data retrieval call binding the contract method 0xaf58ef06. +// +// Solidity: function roundHeight(uint256 ) constant returns(uint256) +func (_Governance *GovernanceCaller) RoundHeight(opts *bind.CallOpts, arg0 *big.Int) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "roundHeight", arg0) + return *ret0, err +} + +// RoundHeight is a free data retrieval call binding the contract method 0xaf58ef06. +// +// Solidity: function roundHeight(uint256 ) constant returns(uint256) +func (_Governance *GovernanceSession) RoundHeight(arg0 *big.Int) (*big.Int, error) { + return _Governance.Contract.RoundHeight(&_Governance.CallOpts, arg0) +} + +// RoundHeight is a free data retrieval call binding the contract method 0xaf58ef06. +// +// Solidity: function roundHeight(uint256 ) constant returns(uint256) +func (_Governance *GovernanceCallerSession) RoundHeight(arg0 *big.Int) (*big.Int, error) { + return _Governance.Contract.RoundHeight(&_Governance.CallOpts, arg0) +} + +// RoundLength is a free data retrieval call binding the contract method 0x8b649b94. +// +// Solidity: function roundLength() constant returns(uint256) +func (_Governance *GovernanceCaller) RoundLength(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "roundLength") + return *ret0, err +} + +// RoundLength is a free data retrieval call binding the contract method 0x8b649b94. +// +// Solidity: function roundLength() constant returns(uint256) +func (_Governance *GovernanceSession) RoundLength() (*big.Int, error) { + return _Governance.Contract.RoundLength(&_Governance.CallOpts) +} + +// RoundLength is a free data retrieval call binding the contract method 0x8b649b94. +// +// Solidity: function roundLength() constant returns(uint256) +func (_Governance *GovernanceCallerSession) RoundLength() (*big.Int, error) { + return _Governance.Contract.RoundLength(&_Governance.CallOpts) +} + +// TotalStaked is a free data retrieval call binding the contract method 0x817b1cd2. +// +// Solidity: function totalStaked() constant returns(uint256) +func (_Governance *GovernanceCaller) TotalStaked(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "totalStaked") + return *ret0, err +} + +// TotalStaked is a free data retrieval call binding the contract method 0x817b1cd2. +// +// Solidity: function totalStaked() constant returns(uint256) +func (_Governance *GovernanceSession) TotalStaked() (*big.Int, error) { + return _Governance.Contract.TotalStaked(&_Governance.CallOpts) +} + +// TotalStaked is a free data retrieval call binding the contract method 0x817b1cd2. +// +// Solidity: function totalStaked() constant returns(uint256) +func (_Governance *GovernanceCallerSession) TotalStaked() (*big.Int, error) { + return _Governance.Contract.TotalStaked(&_Governance.CallOpts) +} + +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() constant returns(uint256) +func (_Governance *GovernanceCaller) TotalSupply(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "totalSupply") + return *ret0, err +} + +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() constant returns(uint256) +func (_Governance *GovernanceSession) TotalSupply() (*big.Int, error) { + return _Governance.Contract.TotalSupply(&_Governance.CallOpts) +} + +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() constant returns(uint256) +func (_Governance *GovernanceCallerSession) TotalSupply() (*big.Int, error) { + return _Governance.Contract.TotalSupply(&_Governance.CallOpts) +} + +// Withdrawable is a free data retrieval call binding the contract method 0x50188301. +// +// Solidity: function withdrawable() constant returns(bool) +func (_Governance *GovernanceCaller) Withdrawable(opts *bind.CallOpts) (bool, error) { + var ( + ret0 = new(bool) + ) + out := ret0 + err := _Governance.contract.Call(opts, out, "withdrawable") + return *ret0, err +} + +// Withdrawable is a free data retrieval call binding the contract method 0x50188301. +// +// Solidity: function withdrawable() constant returns(bool) +func (_Governance *GovernanceSession) Withdrawable() (bool, error) { + return _Governance.Contract.Withdrawable(&_Governance.CallOpts) +} + +// Withdrawable is a free data retrieval call binding the contract method 0x50188301. +// +// Solidity: function withdrawable() constant returns(bool) +func (_Governance *GovernanceCallerSession) Withdrawable() (bool, error) { + return _Governance.Contract.Withdrawable(&_Governance.CallOpts) +} + +// AddDKGComplaint is a paid mutator transaction binding the contract method 0xab6a4013. +// +// Solidity: function addDKGComplaint(bytes Complaint) returns() +func (_Governance *GovernanceTransactor) AddDKGComplaint(opts *bind.TransactOpts, Complaint []byte) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "addDKGComplaint", Complaint) +} + +// AddDKGComplaint is a paid mutator transaction binding the contract method 0xab6a4013. +// +// Solidity: function addDKGComplaint(bytes Complaint) returns() +func (_Governance *GovernanceSession) AddDKGComplaint(Complaint []byte) (*types.Transaction, error) { + return _Governance.Contract.AddDKGComplaint(&_Governance.TransactOpts, Complaint) +} + +// AddDKGComplaint is a paid mutator transaction binding the contract method 0xab6a4013. +// +// Solidity: function addDKGComplaint(bytes Complaint) returns() +func (_Governance *GovernanceTransactorSession) AddDKGComplaint(Complaint []byte) (*types.Transaction, error) { + return _Governance.Contract.AddDKGComplaint(&_Governance.TransactOpts, Complaint) +} + +// AddDKGFinalize is a paid mutator transaction binding the contract method 0x29891e74. +// +// Solidity: function addDKGFinalize(bytes Finalize) returns() +func (_Governance *GovernanceTransactor) AddDKGFinalize(opts *bind.TransactOpts, Finalize []byte) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "addDKGFinalize", Finalize) +} + +// AddDKGFinalize is a paid mutator transaction binding the contract method 0x29891e74. +// +// Solidity: function addDKGFinalize(bytes Finalize) returns() +func (_Governance *GovernanceSession) AddDKGFinalize(Finalize []byte) (*types.Transaction, error) { + return _Governance.Contract.AddDKGFinalize(&_Governance.TransactOpts, Finalize) +} + +// AddDKGFinalize is a paid mutator transaction binding the contract method 0x29891e74. +// +// Solidity: function addDKGFinalize(bytes Finalize) returns() +func (_Governance *GovernanceTransactorSession) AddDKGFinalize(Finalize []byte) (*types.Transaction, error) { + return _Governance.Contract.AddDKGFinalize(&_Governance.TransactOpts, Finalize) +} + +// AddDKGMPKReady is a paid mutator transaction binding the contract method 0x22f8a889. +// +// Solidity: function addDKGMPKReady(bytes MPKReady) returns() +func (_Governance *GovernanceTransactor) AddDKGMPKReady(opts *bind.TransactOpts, MPKReady []byte) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "addDKGMPKReady", MPKReady) +} + +// AddDKGMPKReady is a paid mutator transaction binding the contract method 0x22f8a889. +// +// Solidity: function addDKGMPKReady(bytes MPKReady) returns() +func (_Governance *GovernanceSession) AddDKGMPKReady(MPKReady []byte) (*types.Transaction, error) { + return _Governance.Contract.AddDKGMPKReady(&_Governance.TransactOpts, MPKReady) +} + +// AddDKGMPKReady is a paid mutator transaction binding the contract method 0x22f8a889. +// +// Solidity: function addDKGMPKReady(bytes MPKReady) returns() +func (_Governance *GovernanceTransactorSession) AddDKGMPKReady(MPKReady []byte) (*types.Transaction, error) { + return _Governance.Contract.AddDKGMPKReady(&_Governance.TransactOpts, MPKReady) +} + +// AddDKGMasterPublicKey is a paid mutator transaction binding the contract method 0x19cf10bc. +// +// Solidity: function addDKGMasterPublicKey(bytes PublicKey) returns() +func (_Governance *GovernanceTransactor) AddDKGMasterPublicKey(opts *bind.TransactOpts, PublicKey []byte) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "addDKGMasterPublicKey", PublicKey) +} + +// AddDKGMasterPublicKey is a paid mutator transaction binding the contract method 0x19cf10bc. +// +// Solidity: function addDKGMasterPublicKey(bytes PublicKey) returns() +func (_Governance *GovernanceSession) AddDKGMasterPublicKey(PublicKey []byte) (*types.Transaction, error) { + return _Governance.Contract.AddDKGMasterPublicKey(&_Governance.TransactOpts, PublicKey) +} + +// AddDKGMasterPublicKey is a paid mutator transaction binding the contract method 0x19cf10bc. +// +// Solidity: function addDKGMasterPublicKey(bytes PublicKey) returns() +func (_Governance *GovernanceTransactorSession) AddDKGMasterPublicKey(PublicKey []byte) (*types.Transaction, error) { + return _Governance.Contract.AddDKGMasterPublicKey(&_Governance.TransactOpts, PublicKey) +} + +// AddDKGSuccess is a paid mutator transaction binding the contract method 0x4ccaa59d. +// +// Solidity: function addDKGSuccess(bytes Success) returns() +func (_Governance *GovernanceTransactor) AddDKGSuccess(opts *bind.TransactOpts, Success []byte) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "addDKGSuccess", Success) +} + +// AddDKGSuccess is a paid mutator transaction binding the contract method 0x4ccaa59d. +// +// Solidity: function addDKGSuccess(bytes Success) returns() +func (_Governance *GovernanceSession) AddDKGSuccess(Success []byte) (*types.Transaction, error) { + return _Governance.Contract.AddDKGSuccess(&_Governance.TransactOpts, Success) +} + +// AddDKGSuccess is a paid mutator transaction binding the contract method 0x4ccaa59d. +// +// Solidity: function addDKGSuccess(bytes Success) returns() +func (_Governance *GovernanceTransactorSession) AddDKGSuccess(Success []byte) (*types.Transaction, error) { + return _Governance.Contract.AddDKGSuccess(&_Governance.TransactOpts, Success) +} + +// PayFine is a paid mutator transaction binding the contract method 0x3edfa229. +// +// Solidity: function payFine(address NodeAddress) returns() +func (_Governance *GovernanceTransactor) PayFine(opts *bind.TransactOpts, NodeAddress common.Address) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "payFine", NodeAddress) +} + +// PayFine is a paid mutator transaction binding the contract method 0x3edfa229. +// +// Solidity: function payFine(address NodeAddress) returns() +func (_Governance *GovernanceSession) PayFine(NodeAddress common.Address) (*types.Transaction, error) { + return _Governance.Contract.PayFine(&_Governance.TransactOpts, NodeAddress) +} + +// PayFine is a paid mutator transaction binding the contract method 0x3edfa229. +// +// Solidity: function payFine(address NodeAddress) returns() +func (_Governance *GovernanceTransactorSession) PayFine(NodeAddress common.Address) (*types.Transaction, error) { + return _Governance.Contract.PayFine(&_Governance.TransactOpts, NodeAddress) +} + +// ProposeCRS is a paid mutator transaction binding the contract method 0xc448af34. +// +// Solidity: function proposeCRS(uint256 Round, bytes SignedCRS) returns() +func (_Governance *GovernanceTransactor) ProposeCRS(opts *bind.TransactOpts, Round *big.Int, SignedCRS []byte) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "proposeCRS", Round, SignedCRS) +} + +// ProposeCRS is a paid mutator transaction binding the contract method 0xc448af34. +// +// Solidity: function proposeCRS(uint256 Round, bytes SignedCRS) returns() +func (_Governance *GovernanceSession) ProposeCRS(Round *big.Int, SignedCRS []byte) (*types.Transaction, error) { + return _Governance.Contract.ProposeCRS(&_Governance.TransactOpts, Round, SignedCRS) +} + +// ProposeCRS is a paid mutator transaction binding the contract method 0xc448af34. +// +// Solidity: function proposeCRS(uint256 Round, bytes SignedCRS) returns() +func (_Governance *GovernanceTransactorSession) ProposeCRS(Round *big.Int, SignedCRS []byte) (*types.Transaction, error) { + return _Governance.Contract.ProposeCRS(&_Governance.TransactOpts, Round, SignedCRS) +} + +// Register is a paid mutator transaction binding the contract method 0xd242f4cc. +// +// Solidity: function register(bytes PublicKey, string Name, string Email, string Location, string Url) returns() +func (_Governance *GovernanceTransactor) Register(opts *bind.TransactOpts, PublicKey []byte, Name string, Email string, Location string, Url string) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "register", PublicKey, Name, Email, Location, Url) +} + +// Register is a paid mutator transaction binding the contract method 0xd242f4cc. +// +// Solidity: function register(bytes PublicKey, string Name, string Email, string Location, string Url) returns() +func (_Governance *GovernanceSession) Register(PublicKey []byte, Name string, Email string, Location string, Url string) (*types.Transaction, error) { + return _Governance.Contract.Register(&_Governance.TransactOpts, PublicKey, Name, Email, Location, Url) +} + +// Register is a paid mutator transaction binding the contract method 0xd242f4cc. +// +// Solidity: function register(bytes PublicKey, string Name, string Email, string Location, string Url) returns() +func (_Governance *GovernanceTransactorSession) Register(PublicKey []byte, Name string, Email string, Location string, Url string) (*types.Transaction, error) { + return _Governance.Contract.Register(&_Governance.TransactOpts, PublicKey, Name, Email, Location, Url) +} + +// ReplaceNodePublicKey is a paid mutator transaction binding the contract method 0x3f007c20. +// +// Solidity: function replaceNodePublicKey(bytes NewPublicKey) returns() +func (_Governance *GovernanceTransactor) ReplaceNodePublicKey(opts *bind.TransactOpts, NewPublicKey []byte) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "replaceNodePublicKey", NewPublicKey) +} + +// ReplaceNodePublicKey is a paid mutator transaction binding the contract method 0x3f007c20. +// +// Solidity: function replaceNodePublicKey(bytes NewPublicKey) returns() +func (_Governance *GovernanceSession) ReplaceNodePublicKey(NewPublicKey []byte) (*types.Transaction, error) { + return _Governance.Contract.ReplaceNodePublicKey(&_Governance.TransactOpts, NewPublicKey) +} + +// ReplaceNodePublicKey is a paid mutator transaction binding the contract method 0x3f007c20. +// +// Solidity: function replaceNodePublicKey(bytes NewPublicKey) returns() +func (_Governance *GovernanceTransactorSession) ReplaceNodePublicKey(NewPublicKey []byte) (*types.Transaction, error) { + return _Governance.Contract.ReplaceNodePublicKey(&_Governance.TransactOpts, NewPublicKey) +} + +// Report is a paid mutator transaction binding the contract method 0x320c0826. +// +// Solidity: function report(uint256 Type, bytes Arg1, bytes Arg2) returns() +func (_Governance *GovernanceTransactor) Report(opts *bind.TransactOpts, Type *big.Int, Arg1 []byte, Arg2 []byte) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "report", Type, Arg1, Arg2) +} + +// Report is a paid mutator transaction binding the contract method 0x320c0826. +// +// Solidity: function report(uint256 Type, bytes Arg1, bytes Arg2) returns() +func (_Governance *GovernanceSession) Report(Type *big.Int, Arg1 []byte, Arg2 []byte) (*types.Transaction, error) { + return _Governance.Contract.Report(&_Governance.TransactOpts, Type, Arg1, Arg2) +} + +// Report is a paid mutator transaction binding the contract method 0x320c0826. +// +// Solidity: function report(uint256 Type, bytes Arg1, bytes Arg2) returns() +func (_Governance *GovernanceTransactorSession) Report(Type *big.Int, Arg1 []byte, Arg2 []byte) (*types.Transaction, error) { + return _Governance.Contract.Report(&_Governance.TransactOpts, Type, Arg1, Arg2) +} + +// ResetDKG is a paid mutator transaction binding the contract method 0x57316157. +// +// Solidity: function resetDKG(bytes NewSignedCRS) returns() +func (_Governance *GovernanceTransactor) ResetDKG(opts *bind.TransactOpts, NewSignedCRS []byte) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "resetDKG", NewSignedCRS) +} + +// ResetDKG is a paid mutator transaction binding the contract method 0x57316157. +// +// Solidity: function resetDKG(bytes NewSignedCRS) returns() +func (_Governance *GovernanceSession) ResetDKG(NewSignedCRS []byte) (*types.Transaction, error) { + return _Governance.Contract.ResetDKG(&_Governance.TransactOpts, NewSignedCRS) +} + +// ResetDKG is a paid mutator transaction binding the contract method 0x57316157. +// +// Solidity: function resetDKG(bytes NewSignedCRS) returns() +func (_Governance *GovernanceTransactorSession) ResetDKG(NewSignedCRS []byte) (*types.Transaction, error) { + return _Governance.Contract.ResetDKG(&_Governance.TransactOpts, NewSignedCRS) +} + +// Stake is a paid mutator transaction binding the contract method 0x3a4b66f1. +// +// Solidity: function stake() returns() +func (_Governance *GovernanceTransactor) Stake(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "stake") +} + +// Stake is a paid mutator transaction binding the contract method 0x3a4b66f1. +// +// Solidity: function stake() returns() +func (_Governance *GovernanceSession) Stake() (*types.Transaction, error) { + return _Governance.Contract.Stake(&_Governance.TransactOpts) +} + +// Stake is a paid mutator transaction binding the contract method 0x3a4b66f1. +// +// Solidity: function stake() returns() +func (_Governance *GovernanceTransactorSession) Stake() (*types.Transaction, error) { + return _Governance.Contract.Stake(&_Governance.TransactOpts) +} + +// TransferNodeOwnership is a paid mutator transaction binding the contract method 0x4264ecf9. +// +// Solidity: function transferNodeOwnership(address NewOwner) returns() +func (_Governance *GovernanceTransactor) TransferNodeOwnership(opts *bind.TransactOpts, NewOwner common.Address) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "transferNodeOwnership", NewOwner) +} + +// TransferNodeOwnership is a paid mutator transaction binding the contract method 0x4264ecf9. +// +// Solidity: function transferNodeOwnership(address NewOwner) returns() +func (_Governance *GovernanceSession) TransferNodeOwnership(NewOwner common.Address) (*types.Transaction, error) { + return _Governance.Contract.TransferNodeOwnership(&_Governance.TransactOpts, NewOwner) +} + +// TransferNodeOwnership is a paid mutator transaction binding the contract method 0x4264ecf9. +// +// Solidity: function transferNodeOwnership(address NewOwner) returns() +func (_Governance *GovernanceTransactorSession) TransferNodeOwnership(NewOwner common.Address) (*types.Transaction, error) { + return _Governance.Contract.TransferNodeOwnership(&_Governance.TransactOpts, NewOwner) +} + +// TransferNodeOwnershipByFoundation is a paid mutator transaction binding the contract method 0x7ecfdeca. +// +// Solidity: function transferNodeOwnershipByFoundation(address OldOwner, address NewOwner) returns() +func (_Governance *GovernanceTransactor) TransferNodeOwnershipByFoundation(opts *bind.TransactOpts, OldOwner common.Address, NewOwner common.Address) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "transferNodeOwnershipByFoundation", OldOwner, NewOwner) +} + +// TransferNodeOwnershipByFoundation is a paid mutator transaction binding the contract method 0x7ecfdeca. +// +// Solidity: function transferNodeOwnershipByFoundation(address OldOwner, address NewOwner) returns() +func (_Governance *GovernanceSession) TransferNodeOwnershipByFoundation(OldOwner common.Address, NewOwner common.Address) (*types.Transaction, error) { + return _Governance.Contract.TransferNodeOwnershipByFoundation(&_Governance.TransactOpts, OldOwner, NewOwner) +} + +// TransferNodeOwnershipByFoundation is a paid mutator transaction binding the contract method 0x7ecfdeca. +// +// Solidity: function transferNodeOwnershipByFoundation(address OldOwner, address NewOwner) returns() +func (_Governance *GovernanceTransactorSession) TransferNodeOwnershipByFoundation(OldOwner common.Address, NewOwner common.Address) (*types.Transaction, error) { + return _Governance.Contract.TransferNodeOwnershipByFoundation(&_Governance.TransactOpts, OldOwner, NewOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address NewOwner) returns() +func (_Governance *GovernanceTransactor) TransferOwnership(opts *bind.TransactOpts, NewOwner common.Address) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "transferOwnership", NewOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address NewOwner) returns() +func (_Governance *GovernanceSession) TransferOwnership(NewOwner common.Address) (*types.Transaction, error) { + return _Governance.Contract.TransferOwnership(&_Governance.TransactOpts, NewOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address NewOwner) returns() +func (_Governance *GovernanceTransactorSession) TransferOwnership(NewOwner common.Address) (*types.Transaction, error) { + return _Governance.Contract.TransferOwnership(&_Governance.TransactOpts, NewOwner) +} + +// Unstake is a paid mutator transaction binding the contract method 0x2e17de78. +// +// Solidity: function unstake(uint256 Amount) returns() +func (_Governance *GovernanceTransactor) Unstake(opts *bind.TransactOpts, Amount *big.Int) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "unstake", Amount) +} + +// Unstake is a paid mutator transaction binding the contract method 0x2e17de78. +// +// Solidity: function unstake(uint256 Amount) returns() +func (_Governance *GovernanceSession) Unstake(Amount *big.Int) (*types.Transaction, error) { + return _Governance.Contract.Unstake(&_Governance.TransactOpts, Amount) +} + +// Unstake is a paid mutator transaction binding the contract method 0x2e17de78. +// +// Solidity: function unstake(uint256 Amount) returns() +func (_Governance *GovernanceTransactorSession) Unstake(Amount *big.Int) (*types.Transaction, error) { + return _Governance.Contract.Unstake(&_Governance.TransactOpts, Amount) +} + +// UpdateConfiguration is a paid mutator transaction binding the contract method 0x11c7c321. +// +// Solidity: function updateConfiguration(uint256 MinStake, uint256 LockupPeriod, uint256 MinGasPrice, uint256 BlockGasLimit, uint256 LambdaBA, uint256 LambdaDKG, uint256 NotaryParamAlpha, uint256 NotaryParamBeta, uint256 RoundLength, uint256 MinBlockInterval, uint256[] FineValues) returns() +func (_Governance *GovernanceTransactor) UpdateConfiguration(opts *bind.TransactOpts, MinStake *big.Int, LockupPeriod *big.Int, MinGasPrice *big.Int, BlockGasLimit *big.Int, LambdaBA *big.Int, LambdaDKG *big.Int, NotaryParamAlpha *big.Int, NotaryParamBeta *big.Int, RoundLength *big.Int, MinBlockInterval *big.Int, FineValues []*big.Int) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "updateConfiguration", MinStake, LockupPeriod, MinGasPrice, BlockGasLimit, LambdaBA, LambdaDKG, NotaryParamAlpha, NotaryParamBeta, RoundLength, MinBlockInterval, FineValues) +} + +// UpdateConfiguration is a paid mutator transaction binding the contract method 0x11c7c321. +// +// Solidity: function updateConfiguration(uint256 MinStake, uint256 LockupPeriod, uint256 MinGasPrice, uint256 BlockGasLimit, uint256 LambdaBA, uint256 LambdaDKG, uint256 NotaryParamAlpha, uint256 NotaryParamBeta, uint256 RoundLength, uint256 MinBlockInterval, uint256[] FineValues) returns() +func (_Governance *GovernanceSession) UpdateConfiguration(MinStake *big.Int, LockupPeriod *big.Int, MinGasPrice *big.Int, BlockGasLimit *big.Int, LambdaBA *big.Int, LambdaDKG *big.Int, NotaryParamAlpha *big.Int, NotaryParamBeta *big.Int, RoundLength *big.Int, MinBlockInterval *big.Int, FineValues []*big.Int) (*types.Transaction, error) { + return _Governance.Contract.UpdateConfiguration(&_Governance.TransactOpts, MinStake, LockupPeriod, MinGasPrice, BlockGasLimit, LambdaBA, LambdaDKG, NotaryParamAlpha, NotaryParamBeta, RoundLength, MinBlockInterval, FineValues) +} + +// UpdateConfiguration is a paid mutator transaction binding the contract method 0x11c7c321. +// +// Solidity: function updateConfiguration(uint256 MinStake, uint256 LockupPeriod, uint256 MinGasPrice, uint256 BlockGasLimit, uint256 LambdaBA, uint256 LambdaDKG, uint256 NotaryParamAlpha, uint256 NotaryParamBeta, uint256 RoundLength, uint256 MinBlockInterval, uint256[] FineValues) returns() +func (_Governance *GovernanceTransactorSession) UpdateConfiguration(MinStake *big.Int, LockupPeriod *big.Int, MinGasPrice *big.Int, BlockGasLimit *big.Int, LambdaBA *big.Int, LambdaDKG *big.Int, NotaryParamAlpha *big.Int, NotaryParamBeta *big.Int, RoundLength *big.Int, MinBlockInterval *big.Int, FineValues []*big.Int) (*types.Transaction, error) { + return _Governance.Contract.UpdateConfiguration(&_Governance.TransactOpts, MinStake, LockupPeriod, MinGasPrice, BlockGasLimit, LambdaBA, LambdaDKG, NotaryParamAlpha, NotaryParamBeta, RoundLength, MinBlockInterval, FineValues) +} + +// UpdateNodeInfo is a paid mutator transaction binding the contract method 0xc5ea6ea1. +// +// Solidity: function updateNodeInfo(string Name, string Email, string Location, string Url) returns() +func (_Governance *GovernanceTransactor) UpdateNodeInfo(opts *bind.TransactOpts, Name string, Email string, Location string, Url string) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "updateNodeInfo", Name, Email, Location, Url) +} + +// UpdateNodeInfo is a paid mutator transaction binding the contract method 0xc5ea6ea1. +// +// Solidity: function updateNodeInfo(string Name, string Email, string Location, string Url) returns() +func (_Governance *GovernanceSession) UpdateNodeInfo(Name string, Email string, Location string, Url string) (*types.Transaction, error) { + return _Governance.Contract.UpdateNodeInfo(&_Governance.TransactOpts, Name, Email, Location, Url) +} + +// UpdateNodeInfo is a paid mutator transaction binding the contract method 0xc5ea6ea1. +// +// Solidity: function updateNodeInfo(string Name, string Email, string Location, string Url) returns() +func (_Governance *GovernanceTransactorSession) UpdateNodeInfo(Name string, Email string, Location string, Url string) (*types.Transaction, error) { + return _Governance.Contract.UpdateNodeInfo(&_Governance.TransactOpts, Name, Email, Location, Url) +} + +// Withdraw is a paid mutator transaction binding the contract method 0x3ccfd60b. +// +// Solidity: function withdraw() returns() +func (_Governance *GovernanceTransactor) Withdraw(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Governance.contract.Transact(opts, "withdraw") +} + +// Withdraw is a paid mutator transaction binding the contract method 0x3ccfd60b. +// +// Solidity: function withdraw() returns() +func (_Governance *GovernanceSession) Withdraw() (*types.Transaction, error) { + return _Governance.Contract.Withdraw(&_Governance.TransactOpts) +} + +// Withdraw is a paid mutator transaction binding the contract method 0x3ccfd60b. +// +// Solidity: function withdraw() returns() +func (_Governance *GovernanceTransactorSession) Withdraw() (*types.Transaction, error) { + return _Governance.Contract.Withdraw(&_Governance.TransactOpts) +} + +// GovernanceCRSProposedIterator is returned from FilterCRSProposed and is used to iterate over the raw logs and unpacked data for CRSProposed events raised by the Governance contract. +type GovernanceCRSProposedIterator struct { + Event *GovernanceCRSProposed // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceCRSProposedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceCRSProposed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceCRSProposed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceCRSProposedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceCRSProposedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceCRSProposed represents a CRSProposed event raised by the Governance contract. +type GovernanceCRSProposed struct { + Round *big.Int + CRS [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCRSProposed is a free log retrieval operation binding the contract event 0xd9b8f7e45cd2897523743eb19fd2021ba458d2962753a38bc31223e9b05ad408. +// +// Solidity: event CRSProposed(uint256 indexed Round, bytes32 CRS) +func (_Governance *GovernanceFilterer) FilterCRSProposed(opts *bind.FilterOpts, Round []*big.Int) (*GovernanceCRSProposedIterator, error) { + + var RoundRule []interface{} + for _, RoundItem := range Round { + RoundRule = append(RoundRule, RoundItem) + } + + logs, sub, err := _Governance.contract.FilterLogs(opts, "CRSProposed", RoundRule) + if err != nil { + return nil, err + } + return &GovernanceCRSProposedIterator{contract: _Governance.contract, event: "CRSProposed", logs: logs, sub: sub}, nil +} + +// WatchCRSProposed is a free log subscription operation binding the contract event 0xd9b8f7e45cd2897523743eb19fd2021ba458d2962753a38bc31223e9b05ad408. +// +// Solidity: event CRSProposed(uint256 indexed Round, bytes32 CRS) +func (_Governance *GovernanceFilterer) WatchCRSProposed(opts *bind.WatchOpts, sink chan<- *GovernanceCRSProposed, Round []*big.Int) (event.Subscription, error) { + + var RoundRule []interface{} + for _, RoundItem := range Round { + RoundRule = append(RoundRule, RoundItem) + } + + logs, sub, err := _Governance.contract.WatchLogs(opts, "CRSProposed", RoundRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceCRSProposed) + if err := _Governance.contract.UnpackLog(event, "CRSProposed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseCRSProposed is a log parse operation binding the contract event 0xd9b8f7e45cd2897523743eb19fd2021ba458d2962753a38bc31223e9b05ad408. +// +// Solidity: event CRSProposed(uint256 indexed Round, bytes32 CRS) +func (_Governance *GovernanceFilterer) ParseCRSProposed(log types.Log) (*GovernanceCRSProposed, error) { + event := new(GovernanceCRSProposed) + if err := _Governance.contract.UnpackLog(event, "CRSProposed", log); err != nil { + return nil, err + } + return event, nil +} + +// GovernanceConfigurationChangedIterator is returned from FilterConfigurationChanged and is used to iterate over the raw logs and unpacked data for ConfigurationChanged events raised by the Governance contract. +type GovernanceConfigurationChangedIterator struct { + Event *GovernanceConfigurationChanged // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceConfigurationChangedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceConfigurationChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceConfigurationChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceConfigurationChangedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceConfigurationChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceConfigurationChanged represents a ConfigurationChanged event raised by the Governance contract. +type GovernanceConfigurationChanged struct { + Raw types.Log // Blockchain specific contextual infos +} + +// FilterConfigurationChanged is a free log retrieval operation binding the contract event 0xb6aa5c479f96dcbdbe1d8b70883ec95e8799f8e602ee347ed972a22c974b14c0. +// +// Solidity: event ConfigurationChanged() +func (_Governance *GovernanceFilterer) FilterConfigurationChanged(opts *bind.FilterOpts) (*GovernanceConfigurationChangedIterator, error) { + + logs, sub, err := _Governance.contract.FilterLogs(opts, "ConfigurationChanged") + if err != nil { + return nil, err + } + return &GovernanceConfigurationChangedIterator{contract: _Governance.contract, event: "ConfigurationChanged", logs: logs, sub: sub}, nil +} + +// WatchConfigurationChanged is a free log subscription operation binding the contract event 0xb6aa5c479f96dcbdbe1d8b70883ec95e8799f8e602ee347ed972a22c974b14c0. +// +// Solidity: event ConfigurationChanged() +func (_Governance *GovernanceFilterer) WatchConfigurationChanged(opts *bind.WatchOpts, sink chan<- *GovernanceConfigurationChanged) (event.Subscription, error) { + + logs, sub, err := _Governance.contract.WatchLogs(opts, "ConfigurationChanged") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceConfigurationChanged) + if err := _Governance.contract.UnpackLog(event, "ConfigurationChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseConfigurationChanged is a log parse operation binding the contract event 0xb6aa5c479f96dcbdbe1d8b70883ec95e8799f8e602ee347ed972a22c974b14c0. +// +// Solidity: event ConfigurationChanged() +func (_Governance *GovernanceFilterer) ParseConfigurationChanged(log types.Log) (*GovernanceConfigurationChanged, error) { + event := new(GovernanceConfigurationChanged) + if err := _Governance.contract.UnpackLog(event, "ConfigurationChanged", log); err != nil { + return nil, err + } + return event, nil +} + +// GovernanceDKGResetIterator is returned from FilterDKGReset and is used to iterate over the raw logs and unpacked data for DKGReset events raised by the Governance contract. +type GovernanceDKGResetIterator struct { + Event *GovernanceDKGReset // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceDKGResetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceDKGReset) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceDKGReset) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceDKGResetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceDKGResetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceDKGReset represents a DKGReset event raised by the Governance contract. +type GovernanceDKGReset struct { + Round *big.Int + BlockHeight *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDKGReset is a free log retrieval operation binding the contract event 0x1ef9b10077100d06aefe929eb17ff481feebce38b8a770e5b7d744febfab9f50. +// +// Solidity: event DKGReset(uint256 indexed Round, uint256 BlockHeight) +func (_Governance *GovernanceFilterer) FilterDKGReset(opts *bind.FilterOpts, Round []*big.Int) (*GovernanceDKGResetIterator, error) { + + var RoundRule []interface{} + for _, RoundItem := range Round { + RoundRule = append(RoundRule, RoundItem) + } + + logs, sub, err := _Governance.contract.FilterLogs(opts, "DKGReset", RoundRule) + if err != nil { + return nil, err + } + return &GovernanceDKGResetIterator{contract: _Governance.contract, event: "DKGReset", logs: logs, sub: sub}, nil +} + +// WatchDKGReset is a free log subscription operation binding the contract event 0x1ef9b10077100d06aefe929eb17ff481feebce38b8a770e5b7d744febfab9f50. +// +// Solidity: event DKGReset(uint256 indexed Round, uint256 BlockHeight) +func (_Governance *GovernanceFilterer) WatchDKGReset(opts *bind.WatchOpts, sink chan<- *GovernanceDKGReset, Round []*big.Int) (event.Subscription, error) { + + var RoundRule []interface{} + for _, RoundItem := range Round { + RoundRule = append(RoundRule, RoundItem) + } + + logs, sub, err := _Governance.contract.WatchLogs(opts, "DKGReset", RoundRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceDKGReset) + if err := _Governance.contract.UnpackLog(event, "DKGReset", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDKGReset is a log parse operation binding the contract event 0x1ef9b10077100d06aefe929eb17ff481feebce38b8a770e5b7d744febfab9f50. +// +// Solidity: event DKGReset(uint256 indexed Round, uint256 BlockHeight) +func (_Governance *GovernanceFilterer) ParseDKGReset(log types.Log) (*GovernanceDKGReset, error) { + event := new(GovernanceDKGReset) + if err := _Governance.contract.UnpackLog(event, "DKGReset", log); err != nil { + return nil, err + } + return event, nil +} + +// GovernanceFinePaidIterator is returned from FilterFinePaid and is used to iterate over the raw logs and unpacked data for FinePaid events raised by the Governance contract. +type GovernanceFinePaidIterator struct { + Event *GovernanceFinePaid // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceFinePaidIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceFinePaid) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceFinePaid) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceFinePaidIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceFinePaidIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceFinePaid represents a FinePaid event raised by the Governance contract. +type GovernanceFinePaid struct { + NodeAddress common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterFinePaid is a free log retrieval operation binding the contract event 0x34af8d99a30dafb3157ed162369d603f544a74be3858f8c7ac9e159829589c25. +// +// Solidity: event FinePaid(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) FilterFinePaid(opts *bind.FilterOpts, NodeAddress []common.Address) (*GovernanceFinePaidIterator, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.FilterLogs(opts, "FinePaid", NodeAddressRule) + if err != nil { + return nil, err + } + return &GovernanceFinePaidIterator{contract: _Governance.contract, event: "FinePaid", logs: logs, sub: sub}, nil +} + +// WatchFinePaid is a free log subscription operation binding the contract event 0x34af8d99a30dafb3157ed162369d603f544a74be3858f8c7ac9e159829589c25. +// +// Solidity: event FinePaid(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) WatchFinePaid(opts *bind.WatchOpts, sink chan<- *GovernanceFinePaid, NodeAddress []common.Address) (event.Subscription, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.WatchLogs(opts, "FinePaid", NodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceFinePaid) + if err := _Governance.contract.UnpackLog(event, "FinePaid", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseFinePaid is a log parse operation binding the contract event 0x34af8d99a30dafb3157ed162369d603f544a74be3858f8c7ac9e159829589c25. +// +// Solidity: event FinePaid(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) ParseFinePaid(log types.Log) (*GovernanceFinePaid, error) { + event := new(GovernanceFinePaid) + if err := _Governance.contract.UnpackLog(event, "FinePaid", log); err != nil { + return nil, err + } + return event, nil +} + +// GovernanceFinedIterator is returned from FilterFined and is used to iterate over the raw logs and unpacked data for Fined events raised by the Governance contract. +type GovernanceFinedIterator struct { + Event *GovernanceFined // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceFinedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceFined) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceFined) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceFinedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceFinedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceFined represents a Fined event raised by the Governance contract. +type GovernanceFined struct { + NodeAddress common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterFined is a free log retrieval operation binding the contract event 0x00913d46aef0f0d115d70ea1c7c23198505f577d1d1916cc60710ca2204ae6ae. +// +// Solidity: event Fined(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) FilterFined(opts *bind.FilterOpts, NodeAddress []common.Address) (*GovernanceFinedIterator, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.FilterLogs(opts, "Fined", NodeAddressRule) + if err != nil { + return nil, err + } + return &GovernanceFinedIterator{contract: _Governance.contract, event: "Fined", logs: logs, sub: sub}, nil +} + +// WatchFined is a free log subscription operation binding the contract event 0x00913d46aef0f0d115d70ea1c7c23198505f577d1d1916cc60710ca2204ae6ae. +// +// Solidity: event Fined(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) WatchFined(opts *bind.WatchOpts, sink chan<- *GovernanceFined, NodeAddress []common.Address) (event.Subscription, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.WatchLogs(opts, "Fined", NodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceFined) + if err := _Governance.contract.UnpackLog(event, "Fined", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseFined is a log parse operation binding the contract event 0x00913d46aef0f0d115d70ea1c7c23198505f577d1d1916cc60710ca2204ae6ae. +// +// Solidity: event Fined(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) ParseFined(log types.Log) (*GovernanceFined, error) { + event := new(GovernanceFined) + if err := _Governance.contract.UnpackLog(event, "Fined", log); err != nil { + return nil, err + } + return event, nil +} + +// GovernanceNodeAddedIterator is returned from FilterNodeAdded and is used to iterate over the raw logs and unpacked data for NodeAdded events raised by the Governance contract. +type GovernanceNodeAddedIterator struct { + Event *GovernanceNodeAdded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceNodeAddedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceNodeAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceNodeAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceNodeAddedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceNodeAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceNodeAdded represents a NodeAdded event raised by the Governance contract. +type GovernanceNodeAdded struct { + NodeAddress common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNodeAdded is a free log retrieval operation binding the contract event 0xb25d03aaf308d7291709be1ea28b800463cf3a9a4c4a5555d7333a964c1dfebd. +// +// Solidity: event NodeAdded(address indexed NodeAddress) +func (_Governance *GovernanceFilterer) FilterNodeAdded(opts *bind.FilterOpts, NodeAddress []common.Address) (*GovernanceNodeAddedIterator, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.FilterLogs(opts, "NodeAdded", NodeAddressRule) + if err != nil { + return nil, err + } + return &GovernanceNodeAddedIterator{contract: _Governance.contract, event: "NodeAdded", logs: logs, sub: sub}, nil +} + +// WatchNodeAdded is a free log subscription operation binding the contract event 0xb25d03aaf308d7291709be1ea28b800463cf3a9a4c4a5555d7333a964c1dfebd. +// +// Solidity: event NodeAdded(address indexed NodeAddress) +func (_Governance *GovernanceFilterer) WatchNodeAdded(opts *bind.WatchOpts, sink chan<- *GovernanceNodeAdded, NodeAddress []common.Address) (event.Subscription, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.WatchLogs(opts, "NodeAdded", NodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceNodeAdded) + if err := _Governance.contract.UnpackLog(event, "NodeAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNodeAdded is a log parse operation binding the contract event 0xb25d03aaf308d7291709be1ea28b800463cf3a9a4c4a5555d7333a964c1dfebd. +// +// Solidity: event NodeAdded(address indexed NodeAddress) +func (_Governance *GovernanceFilterer) ParseNodeAdded(log types.Log) (*GovernanceNodeAdded, error) { + event := new(GovernanceNodeAdded) + if err := _Governance.contract.UnpackLog(event, "NodeAdded", log); err != nil { + return nil, err + } + return event, nil +} + +// GovernanceNodeOwnershipTransferedIterator is returned from FilterNodeOwnershipTransfered and is used to iterate over the raw logs and unpacked data for NodeOwnershipTransfered events raised by the Governance contract. +type GovernanceNodeOwnershipTransferedIterator struct { + Event *GovernanceNodeOwnershipTransfered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceNodeOwnershipTransferedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceNodeOwnershipTransfered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceNodeOwnershipTransfered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceNodeOwnershipTransferedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceNodeOwnershipTransferedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceNodeOwnershipTransfered represents a NodeOwnershipTransfered event raised by the Governance contract. +type GovernanceNodeOwnershipTransfered struct { + NodeAddress common.Address + NewOwnerAddress common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNodeOwnershipTransfered is a free log retrieval operation binding the contract event 0x63616cf4caeee172ed91719b5e000da424d56855ee726aedb0a1d74fb3f1db2a. +// +// Solidity: event NodeOwnershipTransfered(address indexed NodeAddress, address indexed NewOwnerAddress) +func (_Governance *GovernanceFilterer) FilterNodeOwnershipTransfered(opts *bind.FilterOpts, NodeAddress []common.Address, NewOwnerAddress []common.Address) (*GovernanceNodeOwnershipTransferedIterator, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + var NewOwnerAddressRule []interface{} + for _, NewOwnerAddressItem := range NewOwnerAddress { + NewOwnerAddressRule = append(NewOwnerAddressRule, NewOwnerAddressItem) + } + + logs, sub, err := _Governance.contract.FilterLogs(opts, "NodeOwnershipTransfered", NodeAddressRule, NewOwnerAddressRule) + if err != nil { + return nil, err + } + return &GovernanceNodeOwnershipTransferedIterator{contract: _Governance.contract, event: "NodeOwnershipTransfered", logs: logs, sub: sub}, nil +} + +// WatchNodeOwnershipTransfered is a free log subscription operation binding the contract event 0x63616cf4caeee172ed91719b5e000da424d56855ee726aedb0a1d74fb3f1db2a. +// +// Solidity: event NodeOwnershipTransfered(address indexed NodeAddress, address indexed NewOwnerAddress) +func (_Governance *GovernanceFilterer) WatchNodeOwnershipTransfered(opts *bind.WatchOpts, sink chan<- *GovernanceNodeOwnershipTransfered, NodeAddress []common.Address, NewOwnerAddress []common.Address) (event.Subscription, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + var NewOwnerAddressRule []interface{} + for _, NewOwnerAddressItem := range NewOwnerAddress { + NewOwnerAddressRule = append(NewOwnerAddressRule, NewOwnerAddressItem) + } + + logs, sub, err := _Governance.contract.WatchLogs(opts, "NodeOwnershipTransfered", NodeAddressRule, NewOwnerAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceNodeOwnershipTransfered) + if err := _Governance.contract.UnpackLog(event, "NodeOwnershipTransfered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNodeOwnershipTransfered is a log parse operation binding the contract event 0x63616cf4caeee172ed91719b5e000da424d56855ee726aedb0a1d74fb3f1db2a. +// +// Solidity: event NodeOwnershipTransfered(address indexed NodeAddress, address indexed NewOwnerAddress) +func (_Governance *GovernanceFilterer) ParseNodeOwnershipTransfered(log types.Log) (*GovernanceNodeOwnershipTransfered, error) { + event := new(GovernanceNodeOwnershipTransfered) + if err := _Governance.contract.UnpackLog(event, "NodeOwnershipTransfered", log); err != nil { + return nil, err + } + return event, nil +} + +// GovernanceNodePublicKeyReplacedIterator is returned from FilterNodePublicKeyReplaced and is used to iterate over the raw logs and unpacked data for NodePublicKeyReplaced events raised by the Governance contract. +type GovernanceNodePublicKeyReplacedIterator struct { + Event *GovernanceNodePublicKeyReplaced // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceNodePublicKeyReplacedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceNodePublicKeyReplaced) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceNodePublicKeyReplaced) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceNodePublicKeyReplacedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceNodePublicKeyReplacedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceNodePublicKeyReplaced represents a NodePublicKeyReplaced event raised by the Governance contract. +type GovernanceNodePublicKeyReplaced struct { + NodeAddress common.Address + PublicKey []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNodePublicKeyReplaced is a free log retrieval operation binding the contract event 0x8aa688c270fa0768c37a1f455f711b6ea1a925f04db9ef433e01dcba78b80432. +// +// Solidity: event NodePublicKeyReplaced(address indexed NodeAddress, bytes PublicKey) +func (_Governance *GovernanceFilterer) FilterNodePublicKeyReplaced(opts *bind.FilterOpts, NodeAddress []common.Address) (*GovernanceNodePublicKeyReplacedIterator, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.FilterLogs(opts, "NodePublicKeyReplaced", NodeAddressRule) + if err != nil { + return nil, err + } + return &GovernanceNodePublicKeyReplacedIterator{contract: _Governance.contract, event: "NodePublicKeyReplaced", logs: logs, sub: sub}, nil +} + +// WatchNodePublicKeyReplaced is a free log subscription operation binding the contract event 0x8aa688c270fa0768c37a1f455f711b6ea1a925f04db9ef433e01dcba78b80432. +// +// Solidity: event NodePublicKeyReplaced(address indexed NodeAddress, bytes PublicKey) +func (_Governance *GovernanceFilterer) WatchNodePublicKeyReplaced(opts *bind.WatchOpts, sink chan<- *GovernanceNodePublicKeyReplaced, NodeAddress []common.Address) (event.Subscription, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.WatchLogs(opts, "NodePublicKeyReplaced", NodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceNodePublicKeyReplaced) + if err := _Governance.contract.UnpackLog(event, "NodePublicKeyReplaced", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNodePublicKeyReplaced is a log parse operation binding the contract event 0x8aa688c270fa0768c37a1f455f711b6ea1a925f04db9ef433e01dcba78b80432. +// +// Solidity: event NodePublicKeyReplaced(address indexed NodeAddress, bytes PublicKey) +func (_Governance *GovernanceFilterer) ParseNodePublicKeyReplaced(log types.Log) (*GovernanceNodePublicKeyReplaced, error) { + event := new(GovernanceNodePublicKeyReplaced) + if err := _Governance.contract.UnpackLog(event, "NodePublicKeyReplaced", log); err != nil { + return nil, err + } + return event, nil +} + +// GovernanceNodeRemovedIterator is returned from FilterNodeRemoved and is used to iterate over the raw logs and unpacked data for NodeRemoved events raised by the Governance contract. +type GovernanceNodeRemovedIterator struct { + Event *GovernanceNodeRemoved // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceNodeRemovedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceNodeRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceNodeRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceNodeRemovedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceNodeRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceNodeRemoved represents a NodeRemoved event raised by the Governance contract. +type GovernanceNodeRemoved struct { + NodeAddress common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNodeRemoved is a free log retrieval operation binding the contract event 0xcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b. +// +// Solidity: event NodeRemoved(address indexed NodeAddress) +func (_Governance *GovernanceFilterer) FilterNodeRemoved(opts *bind.FilterOpts, NodeAddress []common.Address) (*GovernanceNodeRemovedIterator, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.FilterLogs(opts, "NodeRemoved", NodeAddressRule) + if err != nil { + return nil, err + } + return &GovernanceNodeRemovedIterator{contract: _Governance.contract, event: "NodeRemoved", logs: logs, sub: sub}, nil +} + +// WatchNodeRemoved is a free log subscription operation binding the contract event 0xcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b. +// +// Solidity: event NodeRemoved(address indexed NodeAddress) +func (_Governance *GovernanceFilterer) WatchNodeRemoved(opts *bind.WatchOpts, sink chan<- *GovernanceNodeRemoved, NodeAddress []common.Address) (event.Subscription, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.WatchLogs(opts, "NodeRemoved", NodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceNodeRemoved) + if err := _Governance.contract.UnpackLog(event, "NodeRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNodeRemoved is a log parse operation binding the contract event 0xcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b. +// +// Solidity: event NodeRemoved(address indexed NodeAddress) +func (_Governance *GovernanceFilterer) ParseNodeRemoved(log types.Log) (*GovernanceNodeRemoved, error) { + event := new(GovernanceNodeRemoved) + if err := _Governance.contract.UnpackLog(event, "NodeRemoved", log); err != nil { + return nil, err + } + return event, nil +} + +// GovernanceReportedIterator is returned from FilterReported and is used to iterate over the raw logs and unpacked data for Reported events raised by the Governance contract. +type GovernanceReportedIterator struct { + Event *GovernanceReported // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceReportedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceReported) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceReported) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceReportedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceReportedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceReported represents a Reported event raised by the Governance contract. +type GovernanceReported struct { + NodeAddress common.Address + Type *big.Int + Arg1 []byte + Arg2 []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterReported is a free log retrieval operation binding the contract event 0x0b4ded2614643cbc6be3ac9a1ed3188f2667636de75ea5250e190ad6af4b43d9. +// +// Solidity: event Reported(address indexed NodeAddress, uint256 Type, bytes Arg1, bytes Arg2) +func (_Governance *GovernanceFilterer) FilterReported(opts *bind.FilterOpts, NodeAddress []common.Address) (*GovernanceReportedIterator, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.FilterLogs(opts, "Reported", NodeAddressRule) + if err != nil { + return nil, err + } + return &GovernanceReportedIterator{contract: _Governance.contract, event: "Reported", logs: logs, sub: sub}, nil +} + +// WatchReported is a free log subscription operation binding the contract event 0x0b4ded2614643cbc6be3ac9a1ed3188f2667636de75ea5250e190ad6af4b43d9. +// +// Solidity: event Reported(address indexed NodeAddress, uint256 Type, bytes Arg1, bytes Arg2) +func (_Governance *GovernanceFilterer) WatchReported(opts *bind.WatchOpts, sink chan<- *GovernanceReported, NodeAddress []common.Address) (event.Subscription, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.WatchLogs(opts, "Reported", NodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceReported) + if err := _Governance.contract.UnpackLog(event, "Reported", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseReported is a log parse operation binding the contract event 0x0b4ded2614643cbc6be3ac9a1ed3188f2667636de75ea5250e190ad6af4b43d9. +// +// Solidity: event Reported(address indexed NodeAddress, uint256 Type, bytes Arg1, bytes Arg2) +func (_Governance *GovernanceFilterer) ParseReported(log types.Log) (*GovernanceReported, error) { + event := new(GovernanceReported) + if err := _Governance.contract.UnpackLog(event, "Reported", log); err != nil { + return nil, err + } + return event, nil +} + +// GovernanceStakedIterator is returned from FilterStaked and is used to iterate over the raw logs and unpacked data for Staked events raised by the Governance contract. +type GovernanceStakedIterator struct { + Event *GovernanceStaked // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceStakedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceStaked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceStaked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceStakedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceStakedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceStaked represents a Staked event raised by the Governance contract. +type GovernanceStaked struct { + NodeAddress common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterStaked is a free log retrieval operation binding the contract event 0x9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d. +// +// Solidity: event Staked(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) FilterStaked(opts *bind.FilterOpts, NodeAddress []common.Address) (*GovernanceStakedIterator, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.FilterLogs(opts, "Staked", NodeAddressRule) + if err != nil { + return nil, err + } + return &GovernanceStakedIterator{contract: _Governance.contract, event: "Staked", logs: logs, sub: sub}, nil +} + +// WatchStaked is a free log subscription operation binding the contract event 0x9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d. +// +// Solidity: event Staked(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) WatchStaked(opts *bind.WatchOpts, sink chan<- *GovernanceStaked, NodeAddress []common.Address) (event.Subscription, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.WatchLogs(opts, "Staked", NodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceStaked) + if err := _Governance.contract.UnpackLog(event, "Staked", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseStaked is a log parse operation binding the contract event 0x9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d. +// +// Solidity: event Staked(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) ParseStaked(log types.Log) (*GovernanceStaked, error) { + event := new(GovernanceStaked) + if err := _Governance.contract.UnpackLog(event, "Staked", log); err != nil { + return nil, err + } + return event, nil +} + +// GovernanceUnstakedIterator is returned from FilterUnstaked and is used to iterate over the raw logs and unpacked data for Unstaked events raised by the Governance contract. +type GovernanceUnstakedIterator struct { + Event *GovernanceUnstaked // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceUnstakedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceUnstaked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceUnstaked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceUnstakedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceUnstakedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceUnstaked represents a Unstaked event raised by the Governance contract. +type GovernanceUnstaked struct { + NodeAddress common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUnstaked is a free log retrieval operation binding the contract event 0x0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f75. +// +// Solidity: event Unstaked(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) FilterUnstaked(opts *bind.FilterOpts, NodeAddress []common.Address) (*GovernanceUnstakedIterator, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.FilterLogs(opts, "Unstaked", NodeAddressRule) + if err != nil { + return nil, err + } + return &GovernanceUnstakedIterator{contract: _Governance.contract, event: "Unstaked", logs: logs, sub: sub}, nil +} + +// WatchUnstaked is a free log subscription operation binding the contract event 0x0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f75. +// +// Solidity: event Unstaked(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) WatchUnstaked(opts *bind.WatchOpts, sink chan<- *GovernanceUnstaked, NodeAddress []common.Address) (event.Subscription, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.WatchLogs(opts, "Unstaked", NodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceUnstaked) + if err := _Governance.contract.UnpackLog(event, "Unstaked", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUnstaked is a log parse operation binding the contract event 0x0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f75. +// +// Solidity: event Unstaked(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) ParseUnstaked(log types.Log) (*GovernanceUnstaked, error) { + event := new(GovernanceUnstaked) + if err := _Governance.contract.UnpackLog(event, "Unstaked", log); err != nil { + return nil, err + } + return event, nil +} + +// GovernanceWithdrawnIterator is returned from FilterWithdrawn and is used to iterate over the raw logs and unpacked data for Withdrawn events raised by the Governance contract. +type GovernanceWithdrawnIterator struct { + Event *GovernanceWithdrawn // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceWithdrawnIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceWithdrawn) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceWithdrawn) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceWithdrawnIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceWithdrawnIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceWithdrawn represents a Withdrawn event raised by the Governance contract. +type GovernanceWithdrawn struct { + NodeAddress common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterWithdrawn is a free log retrieval operation binding the contract event 0x7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5. +// +// Solidity: event Withdrawn(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) FilterWithdrawn(opts *bind.FilterOpts, NodeAddress []common.Address) (*GovernanceWithdrawnIterator, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.FilterLogs(opts, "Withdrawn", NodeAddressRule) + if err != nil { + return nil, err + } + return &GovernanceWithdrawnIterator{contract: _Governance.contract, event: "Withdrawn", logs: logs, sub: sub}, nil +} + +// WatchWithdrawn is a free log subscription operation binding the contract event 0x7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5. +// +// Solidity: event Withdrawn(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) WatchWithdrawn(opts *bind.WatchOpts, sink chan<- *GovernanceWithdrawn, NodeAddress []common.Address) (event.Subscription, error) { + + var NodeAddressRule []interface{} + for _, NodeAddressItem := range NodeAddress { + NodeAddressRule = append(NodeAddressRule, NodeAddressItem) + } + + logs, sub, err := _Governance.contract.WatchLogs(opts, "Withdrawn", NodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceWithdrawn) + if err := _Governance.contract.UnpackLog(event, "Withdrawn", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseWithdrawn is a log parse operation binding the contract event 0x7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5. +// +// Solidity: event Withdrawn(address indexed NodeAddress, uint256 Amount) +func (_Governance *GovernanceFilterer) ParseWithdrawn(log types.Log) (*GovernanceWithdrawn, error) { + event := new(GovernanceWithdrawn) + if err := _Governance.contract.UnpackLog(event, "Withdrawn", log); err != nil { + return nil, err + } + return event, nil +} diff --git a/monitor/monitor.go b/monitor/monitor.go new file mode 100644 index 0000000..5b9e350 --- /dev/null +++ b/monitor/monitor.go @@ -0,0 +1,199 @@ +package monitor + +import ( + "log" + "math" + "math/big" + "strconv" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" +) + +type node struct { + owner common.Address + email string + fined *big.Int + name string + publicKey []byte + nodeKeyAddress common.Address +} + +// NetworkConfig represents the network config. +type NetworkConfig struct { + WSEndpoint string + HTTPEndpoint string + EthHTTPEndpoint string + GovAddress common.Address + Network string +} + +// GovAddress is governance address. +var GovAddress = common.HexToAddress("0x246FcDE58581e2754f215A523C0718C4BFc8041F") + +// Fifty is 50 * 10^18 +var Fifty *big.Int + +// OneHundred is 100 * 10^18 +var OneHundred *big.Int + +func init() { + Fifty, _ = big.NewInt(0).SetString("50000000000000000000", 10) + OneHundred, _ = big.NewInt(0).SetString("100000000000000000000", 10) +} + +// NetworkConfigMap represents the system network config mapping. +var NetworkConfigMap = map[int64]NetworkConfig{ + 373: { + WSEndpoint: "wss://mainnet-rpc.tangerine-network.io/ws", + HTTPEndpoint: "https://mainnet-rpc.tangerine-network.io", + EthHTTPEndpoint: "https://mainnet.infura.io/v3/4eb07139b29d41c59b352f21c4c9f526", + Network: "Mainnet", + }, + 374: { + WSEndpoint: "wss://testnet-rpc.tangerine-network.io/ws", + HTTPEndpoint: "https://testnet-rpc.tangerine-network.io", + EthHTTPEndpoint: "https://rinkeby.infura.io/v3/4eb07139b29d41c59b352f21c4c9f526", + Network: "Testnet", + }, +} + +// Monitor is the object to monitor tangerine network. +type Monitor struct { + networkID int + notifiers []Notifier + backend backendIntf + tanBalancesCache map[common.Address]*big.Int + ethBalancesCache map[common.Address]*big.Int + ethThreshold *big.Int // in wei + ethThresholdString string // in ETH + checkBalanceDuration time.Duration +} + +// NewMonitor is the constructor for monitor object. +func NewMonitor(networkID int, backend backendIntf, threshold string) *Monitor { + tanBalance := make(map[common.Address]*big.Int) + ethBalance := make(map[common.Address]*big.Int) + t, err := strconv.ParseFloat(threshold, 64) + if err != nil { + panic(err) + } + t = t * math.Pow(10, 18) + ethThreshold := new(big.Int) + ethThreshold.SetString( + strconv.FormatFloat(t, 'f', 0, 64), + 10, + ) + m := Monitor{ + networkID: networkID, + backend: backend, + tanBalancesCache: tanBalance, + ethBalancesCache: ethBalance, + checkBalanceDuration: time.Duration(10 * 60 * 1000 * 1000 * 1000), + ethThresholdString: threshold, + ethThreshold: ethThreshold, + } + return &m +} + +// Run is the entry point for running monitor. +func (m *Monitor) Run() { + done := make(chan bool) + finedNodeChan := make(chan node) + go m.fetchFinedNodes(finedNodeChan) + go m.sendNotifications(finedNodeChan, FINED) + go m.checkTanBalance() + go m.checkEthBalance() + <-done +} + +func (m *Monitor) checkEthBalance() { + ethNodeChan := make(chan node) + go m.sendNotifications(ethNodeChan, INSUFFICIENT_ETH) + for { + nc := NetworkConfigMap[int64(m.networkID)] + conn, err := ethclient.Dial(nc.EthHTTPEndpoint) + if err != nil { + log.Println("Get Tan balance fail at") + continue + } + nodes := m.backend.NodeSet() + for i := range nodes { + n := nodes[i] + address := n.nodeKeyAddress + balance := m.backend.BalanceFromAddress(conn, address) + if balance.Cmp(m.ethThreshold) < 0 { + if cacheBalance, exist := m.ethBalancesCache[address]; exist { + if cacheBalance.Cmp(m.ethThreshold) >= 0 { + ethNodeChan <- n + } + } else { + ethNodeChan <- n + } + } + m.ethBalancesCache[address] = balance + } + time.Sleep(m.checkBalanceDuration) + } +} + +func (m *Monitor) checkTanBalance() { + tanNodeChan := make(chan node) + go m.sendNotifications(tanNodeChan, INSUFFICIENT_TAN) + for { + nodes := m.backend.NodeSet() + nc := NetworkConfigMap[int64(m.networkID)] + conn, err := ethclient.Dial(nc.HTTPEndpoint) + if err != nil { + log.Println("Get Eth balance fail") + continue + } + for i := range nodes { + n := nodes[i] + balance := m.backend.BalanceFromAddress(conn, n.nodeKeyAddress) + if balance.Cmp(Fifty) < 0 { + if cacheBalance, exist := m.tanBalancesCache[n.nodeKeyAddress]; exist { + if cacheBalance.Cmp(Fifty) >= 0 { + tanNodeChan <- n + } + } else { + tanNodeChan <- n + } + } else if balance.Cmp(OneHundred) < 0 { + if cacheBalance, exist := m.tanBalancesCache[n.nodeKeyAddress]; exist { + if cacheBalance.Cmp(OneHundred) >= 0 { + tanNodeChan <- n + } + } else { + tanNodeChan <- n + } + } + m.tanBalancesCache[n.nodeKeyAddress] = balance + } + time.Sleep(m.checkBalanceDuration) + } +} + +// Register registries the notifiers. +func (m *Monitor) Register(n Notifier) { + m.notifiers = append(m.notifiers, n) +} + +func (m *Monitor) fetchFinedNodes(nodeChan chan node) { + m.backend.FetchFinedNodes(nodeChan) +} + +func (m *Monitor) sendNotifications(nodeChan chan node, notifyType uint) { + nc := NetworkConfigMap[int64(m.networkID)] + for { + node, open := <-nodeChan + if !open { + return + } + for _, notifier := range m.notifiers { + notifier.notify(node, nc.Network, + notifyType, m.ethThresholdString) + } + } +} diff --git a/monitor/monitor_test.go b/monitor/monitor_test.go new file mode 100644 index 0000000..fb5c9c5 --- /dev/null +++ b/monitor/monitor_test.go @@ -0,0 +1,88 @@ +package monitor + +import ( + "io/ioutil" + "math/big" + "os" + "testing" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/stretchr/testify/suite" +) + +type monitorTestSuite struct { + suite.Suite +} + +type mockBackend struct{} + +func (m *mockBackend) FetchFinedNodes(nodeChan chan node) { + nodeChan <- node{ + owner: common.Address{}, + email: "jm@byzantine-lab.io", + fined: big.NewInt(1), + name: "unit test", + } + close(nodeChan) +} + +func (m *mockBackend) NodeSet() []node { + n := []node{ + { + owner: common.Address{}, + email: "jm@byzantine-lab.io", + fined: big.NewInt(1), + name: "unit test 100, should not be fined", + nodeKeyAddress: common.BytesToAddress([]byte{1}), + }, + { + owner: common.Address{}, + email: "jm@byzantine-lab.io", + fined: Fifty, + name: "unit test 50", + publicKey: []byte{2}, + nodeKeyAddress: common.BytesToAddress([]byte{2}), + }, + } + return n +} + +func (m *mockBackend) BalanceFromAddress(conn *ethclient.Client, + address common.Address) *big.Int { + if address == common.BytesToAddress([]byte{1}) { + return OneHundred + } + lessThanThreshold, _ := big.NewInt(0).SetString("99999999999999999", 10) + return lessThanThreshold +} + +func (s *monitorTestSuite) TestSendNotification() { + backend := mockBackend{} + m := NewMonitor(374, &backend, "0.1") + nodeChan := make(chan node) + go m.fetchFinedNodes(nodeChan) + password := os.Getenv("TEST_EMAIL_PASSWORD") + ccList, _ := ioutil.ReadFile("./cc-list.txt") + email := NewEmail( + "no-reply@byzantine-lab.io", + password, + "smtp-relay.gmail.com", + string(ccList), + ) + m.Register(email) + m.sendNotifications(nodeChan, FINED) + m.tanBalancesCache[common.BytesToAddress([]byte{1})] = OneHundred + m.tanBalancesCache[common.BytesToAddress([]byte{2})] = Fifty + m.ethBalancesCache[common.BytesToAddress([]byte{1})], _ = big.NewInt(0).SetString("99999999999999999", 10) + m.ethBalancesCache[common.BytesToAddress([]byte{2})], _ = big.NewInt(0).SetString("100000000000000000", 10) + + go m.checkTanBalance() + go m.checkEthBalance() + time.Sleep(5000 * time.Millisecond) +} + +func TestMonitor(t *testing.T) { + suite.Run(t, new(monitorTestSuite)) +} diff --git a/monitor/notifier.go b/monitor/notifier.go new file mode 100644 index 0000000..a89d330 --- /dev/null +++ b/monitor/notifier.go @@ -0,0 +1,205 @@ +package monitor + +import ( + "crypto/tls" + "fmt" + "log" + "net" + "net/mail" + "net/smtp" + "strings" + + "github.com/ethereum/go-ethereum/common" +) + +const ( + // FINED notes the node is fined + FINED uint = iota + // INSUFFICIENT_TAN notes the node key with balance < 100 TAN + INSUFFICIENT_TAN + // INSUFFICIENT_ETH notes the node key with balance < threshold + INSUFFICIENT_ETH +) + +// Notifier is the interface for notifier interfaces. +type Notifier interface { + notify(node, string, uint, string) +} + +// Email is the email notifier object. +type Email struct { + sender string + password string + smtpServer string + ccList string +} + +// NewEmail is the Email constructor. +func NewEmail(sender, password, server, ccList string) Notifier { + e := Email{ + sender: sender, + password: password, + smtpServer: server, + ccList: ccList, + } + return &e +} + +func (e *Email) notify(n node, network string, notifyType uint, threshold string) { + var subj string + var body string + switch notifyType { + case FINED: + subj = "[Notification] Your Tangerine " + network + " Network Full Node is Fined" + body = e.finedBody(n.name) + go e.send(n.email, network, subj, body) + case INSUFFICIENT_TAN: + subj = "[Notification] Tangerine " + network + " Insufficient Balance in Node Key" + body = e.insufficientBalanceBody(n.name, n.nodeKeyAddress) + go e.send(n.email, network, subj, body) + case INSUFFICIENT_ETH: + subj = "[Notification] Tangerine " + network + " Insufficient ETH in Node Key" + body = e.insufficientETHBalanceBody(n.name, + n.nodeKeyAddress, threshold, network) + go e.send(n.email, network, subj, body) + } +} + +func (e *Email) finedBody(name string) string { + body := ` +Dear Node Operator: + + Your full node "` + name + `" is fined. + Please pay the fine, and check your node status. + Also, please check https://byzantine-lab.gitlab.io/wiki/#/Rules-for-the-node-set?id=penalty for the penalty condition. + + Thanks for your cooperation. + +-- Tangerine Network +` + return body +} + +func (e *Email) insufficientBalanceBody(name string, address common.Address) string { + body := ` +Dear Node Operator: + + There is no sufficient balacne in your full node "` + name + `" key address "` + address.Hex() + `". + Please transfer some tokens to the node key address and keep the balance at least 200 TAN. + + Thanks for your cooperation. + +-- Tangerine Network +` + return body +} + +func (e *Email) insufficientETHBalanceBody( + name string, + address common.Address, + threshold string, + network string) string { + ethNet := "Rinkeby" + if network == "Mainnet" { + ethNet = "Mainnet" + } + body := ` +Dear Node Operator: + + There is no sufficient ETH in your full node "` + name + `" key address "` + address.Hex() + `". + Please transfer some ETH (` + ethNet + `) to the node key address and keep the balance at least ` + threshold + ` ETH. + + Thanks for your cooperation. + +-- Tangerine Network +` + return body +} + +func (e *Email) send(toAddress, network, subj, body string) { + from := mail.Address{Name: "Tangerine Notifier", Address: e.sender} + to := mail.Address{Address: toAddress} + // Setup headers + headers := make(map[string]string) + headers["From"] = from.String() + headers["To"] = to.String() + headers["Subject"] = subj + if e.ccList != "" { + headers["Cc"] = strings.TrimSuffix(e.ccList, "\n") + } + + // Setup message + message := "" + for k, v := range headers { + message += fmt.Sprintf("%s: %s\r\n", k, v) + } + message += "\r\n" + body + + // Connect to the SMTP Server + servername := e.smtpServer + ":465" + + host, _, _ := net.SplitHostPort(servername) + + auth := smtp.PlainAuth("", e.sender, e.password, host) + + // TLS config + tlsconfig := &tls.Config{ + InsecureSkipVerify: false, + ServerName: host, + } + + // Here is the key, you need to call tls.Dial instead of smtp.Dial + // for smtp servers running on 465 that require an ssl connection + // from the very beginning (no starttls) + conn, err := tls.Dial("tcp", servername, tlsconfig) + if err != nil { + log.Panic(err) + } + + c, err := smtp.NewClient(conn, host) + if err != nil { + log.Panic(err) + } + + // Auth + if err = c.Auth(auth); err != nil { + log.Panic(err) + } + + // To && From + if err = c.Mail(from.Address); err != nil { + log.Panic(err) + } + + if err = c.Rcpt(to.Address); err != nil { + log.Panic(err) + } + + if e.ccList != "" { + cc := strings.Split(e.ccList, ",") + for _, address := range cc { + address = strings.TrimSuffix(address, "\n") + if err = c.Rcpt(address); err != nil { + log.Println("add cc fail", address, err) + } + } + } + + // Data + w, err := c.Data() + if err != nil { + log.Panic(err) + } + + _, err = w.Write([]byte(message)) + if err != nil { + log.Panic(err) + } + + err = w.Close() + if err != nil { + log.Panic(err) + } + + c.Quit() +} |