aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJhih-Ming Huang <jm@byzantine-lab.io>2019-09-01 14:50:37 +0800
committerJhih-Ming Huang <jm@byzantine-lab.io>2019-09-01 14:50:37 +0800
commitaf1549650b77c2434ff3ee4ea18ab716d4d0a1fc (patch)
treeb887e18aaec358350593cd2aa3514816385e2c6b
downloadtangerine-monitor-af1549650b77c2434ff3ee4ea18ab716d4d0a1fc.tar.gz
tangerine-monitor-af1549650b77c2434ff3ee4ea18ab716d4d0a1fc.tar.zst
tangerine-monitor-af1549650b77c2434ff3ee4ea18ab716d4d0a1fc.zip
init commit
-rw-r--r--.gitignore2
-rw-r--r--LICENSE21
-rw-r--r--README.md8
-rw-r--r--go.mod47
-rw-r--r--go.sum177
-rw-r--r--main.go77
-rw-r--r--monitor/backend.go185
-rw-r--r--monitor/cc-list.txt1
-rw-r--r--monitor/contracts.go3660
-rw-r--r--monitor/monitor.go199
-rw-r--r--monitor/monitor_test.go88
-rw-r--r--monitor/notifier.go205
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
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..4834b17
--- /dev/null
+++ b/LICENSE
@@ -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.
diff --git a/go.mod b/go.mod
new file mode 100644
index 0000000..22c9ccc
--- /dev/null
+++ b/go.mod
@@ -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
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000..ba747f2
--- /dev/null
+++ b/go.sum
@@ -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=
diff --git a/main.go b/main.go
new file mode 100644
index 0000000..daed613
--- /dev/null
+++ b/main.go
@@ -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()
+}