Commit 28715397 authored by hezhengjun's avatar hezhengjun Committed by vipwzw

update ethereum to 1.10

parent bba7112c
...@@ -17,13 +17,13 @@ require ( ...@@ -17,13 +17,13 @@ require (
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f // indirect github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f // indirect
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect
github.com/davecgh/go-spew v1.1.1 github.com/davecgh/go-spew v1.1.1
github.com/ethereum/go-ethereum v1.9.9 github.com/ethereum/go-ethereum v1.10.0
github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b
github.com/golang/protobuf v1.4.3 github.com/golang/protobuf v1.4.3
github.com/hashicorp/golang-lru v0.5.4 github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d
github.com/holiman/uint256 v1.1.1 github.com/holiman/uint256 v1.1.1
github.com/huin/goupnp v1.0.0 github.com/huin/goupnp v1.0.1-0.20200620063722-49508fba0031
github.com/jackpal/go-nat-pmp v1.0.2 github.com/jackpal/go-nat-pmp v1.0.2
github.com/miguelmota/go-solidity-sha3 v0.1.0 github.com/miguelmota/go-solidity-sha3 v0.1.0
github.com/mr-tron/base58 v1.2.0 github.com/mr-tron/base58 v1.2.0
...@@ -31,12 +31,11 @@ require ( ...@@ -31,12 +31,11 @@ require (
github.com/perlin-network/life v0.0.0-20191203030451-05c0e0f7eaea github.com/perlin-network/life v0.0.0-20191203030451-05c0e0f7eaea
github.com/phoreproject/bls v0.0.0-20200525203911-a88a5ae26844 github.com/phoreproject/bls v0.0.0-20200525203911-a88a5ae26844
github.com/pkg/errors v0.9.1 github.com/pkg/errors v0.9.1
github.com/prometheus/client_golang v0.9.2 // indirect github.com/prometheus/common v0.6.0
github.com/prometheus/common v0.4.1
github.com/prometheus/procfs v0.0.3 // indirect github.com/prometheus/procfs v0.0.3 // indirect
github.com/robertkrimen/otto v0.0.0-20180617131154-15f95af6e78d github.com/robertkrimen/otto v0.0.0-20180617131154-15f95af6e78d
github.com/rs/cors v1.6.0 github.com/rs/cors v1.7.0
github.com/spf13/cobra v0.0.5 github.com/spf13/cobra v1.1.1
github.com/stretchr/testify v1.7.0 github.com/stretchr/testify v1.7.0
github.com/tjfoc/gmsm v1.3.2 github.com/tjfoc/gmsm v1.3.2
github.com/valyala/fasthttp v1.5.0 github.com/valyala/fasthttp v1.5.0
...@@ -46,5 +45,6 @@ require ( ...@@ -46,5 +45,6 @@ require (
golang.org/x/sys v0.0.0-20210426080607-c94f62235c83 golang.org/x/sys v0.0.0-20210426080607-c94f62235c83
golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0 // indirect golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0 // indirect
google.golang.org/grpc v1.33.2 google.golang.org/grpc v1.33.2
gopkg.in/sourcemap.v1 v1.0.5 // indirect
gopkg.in/yaml.v2 v2.3.0 gopkg.in/yaml.v2 v2.3.0
) )
...@@ -2,7 +2,26 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT ...@@ -2,7 +2,26 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg=
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE=
dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU=
dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4=
dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU=
...@@ -29,6 +48,8 @@ github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6L ...@@ -29,6 +48,8 @@ github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6L
github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y=
github.com/NebulousLabs/Sia v1.3.7 h1:gYfYnXVyeaEzyyVwjpQjszBcENNZ8DPIJc/pgOiLuGA= github.com/NebulousLabs/Sia v1.3.7 h1:gYfYnXVyeaEzyyVwjpQjszBcENNZ8DPIJc/pgOiLuGA=
github.com/NebulousLabs/Sia v1.3.7/go.mod h1:SCASk6mV8QdEojKyecjj/Jd0OGSXkZonkhow7XXKk6Q= github.com/NebulousLabs/Sia v1.3.7/go.mod h1:SCASk6mV8QdEojKyecjj/Jd0OGSXkZonkhow7XXKk6Q=
...@@ -45,31 +66,44 @@ github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIO ...@@ -45,31 +66,44 @@ github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIO
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
github.com/VictoriaMetrics/fastcache v1.5.3 h1:2odJnXLbFZcoV9KYtQ+7TH1UOq3dn3AssMgieaezkR4= github.com/VictoriaMetrics/fastcache v1.5.3 h1:2odJnXLbFZcoV9KYtQ+7TH1UOq3dn3AssMgieaezkR4=
github.com/VictoriaMetrics/fastcache v1.5.3/go.mod h1:+jv9Ckb+za/P1ZRg/sulP5Ni1v49daAVERr0H3CuscE= github.com/VictoriaMetrics/fastcache v1.5.3/go.mod h1:+jv9Ckb+za/P1ZRg/sulP5Ni1v49daAVERr0H3CuscE=
github.com/VictoriaMetrics/fastcache v1.5.7/go.mod h1:ptDBkNMQI4RtmVo8VS/XwRY6RoTu1dAWCbrk+6WsEM8=
github.com/XiaoMi/pegasus-go-client v0.0.0-20181029071519-9400942c5d1c h1:3fAhdHMhoSG57DjJ/dqLFfgD+FoooPbQH6szINbrr3k= github.com/XiaoMi/pegasus-go-client v0.0.0-20181029071519-9400942c5d1c h1:3fAhdHMhoSG57DjJ/dqLFfgD+FoooPbQH6szINbrr3k=
github.com/XiaoMi/pegasus-go-client v0.0.0-20181029071519-9400942c5d1c/go.mod h1:KcL6D/4RZ8RAYzQ5gKI0odcdWUmCVlbQTOlWrhP71CY= github.com/XiaoMi/pegasus-go-client v0.0.0-20181029071519-9400942c5d1c/go.mod h1:KcL6D/4RZ8RAYzQ5gKI0odcdWUmCVlbQTOlWrhP71CY=
github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc h1:cAKDfWh5VpdgMhJosfJnn5/FoN2SRZ4p7fJNX58YPaU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc h1:cAKDfWh5VpdgMhJosfJnn5/FoN2SRZ4p7fJNX58YPaU=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf h1:qet1QNfXsQxTZqLG4oE62mJzwPIB8+Tee4RNCL9ulrY= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf h1:qet1QNfXsQxTZqLG4oE62mJzwPIB8+Tee4RNCL9ulrY=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8=
github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0=
github.com/apache/thrift v0.0.0-20171203172758-327ebb6c2b6d h1:b/FqDLjWXDQI6XBYvWDVgEKv3xOTs68qRkuqyU37lBc= github.com/apache/thrift v0.0.0-20171203172758-327ebb6c2b6d h1:b/FqDLjWXDQI6XBYvWDVgEKv3xOTs68qRkuqyU37lBc=
github.com/apache/thrift v0.0.0-20171203172758-327ebb6c2b6d/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.0.0-20171203172758-327ebb6c2b6d/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847 h1:rtI0fD4oG/8eVokGVPYJEW1F88p1ZNgXiEIs9thEE4A= github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847 h1:rtI0fD4oG/8eVokGVPYJEW1F88p1ZNgXiEIs9thEE4A=
github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ= github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
github.com/benbjohnson/clock v1.0.3 h1:vkLuvpK4fmtSCuo60+yC63p7y0BmQ8gm5ZXGuBCJyXg= github.com/benbjohnson/clock v1.0.3 h1:vkLuvpK4fmtSCuo60+yC63p7y0BmQ8gm5ZXGuBCJyXg=
github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= 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/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y= github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y=
github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA=
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY=
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c=
github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g=
github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6/go.mod h1:Dmm/EzmjnCiweXmzRIAiUWCInVmPgjkzgv5k4tVyXiQ= github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6/go.mod h1:Dmm/EzmjnCiweXmzRIAiUWCInVmPgjkzgv5k4tVyXiQ=
github.com/btcsuite/btcd v0.0.0-20190109040709-5bda5314ca95/go.mod h1:d3C0AkH6BRcvO8T0UEPu53cnw4IbV63x1bEjildYhO0= github.com/btcsuite/btcd v0.0.0-20190109040709-5bda5314ca95/go.mod h1:d3C0AkH6BRcvO8T0UEPu53cnw4IbV63x1bEjildYhO0=
...@@ -98,6 +132,7 @@ github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3 ...@@ -98,6 +132,7 @@ github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= 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/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=
github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34=
github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8= github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk=
...@@ -109,10 +144,18 @@ github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+ ...@@ -109,10 +144,18 @@ github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE=
github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cloudflare/cloudflare-go v0.10.2-0.20190916151808-a80f83b9add9/go.mod h1:1MxXX1Ux4x6mqPmjkUgTP1CdXIBXKX7T+Jk9Gxrmx+U= github.com/cloudflare/cloudflare-go v0.10.2-0.20190916151808-a80f83b9add9/go.mod h1:1MxXX1Ux4x6mqPmjkUgTP1CdXIBXKX7T+Jk9Gxrmx+U=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/consensys/bavard v0.1.8-0.20210105233146-c16790d2aa8b/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ=
github.com/consensys/goff v0.3.10/go.mod h1:xTldOBEHmFiYS0gPXd3NsaEqZWlnmeWcRLWgD3ba3xc=
github.com/consensys/gurvy v0.3.8/go.mod h1:sN75xnsiD593XnhbhvG2PkOy194pZBzqShWF/kwuW/g=
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/etcd v3.3.15+incompatible h1:+9RjdC18gMxNQVvSiXvObLu29mOFmkgdsB4cRTlV+EE= github.com/coreos/etcd v3.3.15+incompatible h1:+9RjdC18gMxNQVvSiXvObLu29mOFmkgdsB4cRTlV+EE=
github.com/coreos/etcd v3.3.15+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.15+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
...@@ -120,12 +163,15 @@ github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee ...@@ -120,12 +163,15 @@ github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee
github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f h1:JOrtw2xFKzlg+cbHpyrpLDmnN1HqhBfnX7WDiW7eG2c= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f h1:JOrtw2xFKzlg+cbHpyrpLDmnN1HqhBfnX7WDiW7eG2c=
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg=
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg=
github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
...@@ -151,14 +197,19 @@ github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrV ...@@ -151,14 +197,19 @@ github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrV
github.com/dgraph-io/ristretto v0.0.2 h1:a5WaUrDa0qm0YrAAS1tUykT5El3kt62KNZZeMxQn3po= github.com/dgraph-io/ristretto v0.0.2 h1:a5WaUrDa0qm0YrAAS1tUykT5El3kt62KNZZeMxQn3po=
github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ=
github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA=
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
github.com/dlespiau/covertool v0.0.0-20180314162135-b0c4c6d0583a/go.mod h1:/eQMcW3eA1bzKx23ZYI2H3tXPdJB5JWYTHzoUPBvQY4= github.com/dlespiau/covertool v0.0.0-20180314162135-b0c4c6d0583a/go.mod h1:/eQMcW3eA1bzKx23ZYI2H3tXPdJB5JWYTHzoUPBvQY4=
github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA=
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/dvyukov/go-fuzz v0.0.0-20200318091601-be3528f3a813/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw=
github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts=
github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw=
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
...@@ -171,13 +222,19 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 ...@@ -171,13 +222,19 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7
github.com/ethereum/go-ethereum v1.8.20/go.mod h1:PwpWDrCLZrV+tfrhqqF6kPknbISMHaJv9Ln3kPCZLwY= github.com/ethereum/go-ethereum v1.8.20/go.mod h1:PwpWDrCLZrV+tfrhqqF6kPknbISMHaJv9Ln3kPCZLwY=
github.com/ethereum/go-ethereum v1.9.9 h1:jnoBvjH8aMH++iH14XmiJdAsnRcmZUM+B5fsnEZBVE0= github.com/ethereum/go-ethereum v1.9.9 h1:jnoBvjH8aMH++iH14XmiJdAsnRcmZUM+B5fsnEZBVE0=
github.com/ethereum/go-ethereum v1.9.9/go.mod h1:a9TqabFudpDu1nucId+k9S8R9whYaHnGBLKFouA5EAo= github.com/ethereum/go-ethereum v1.9.9/go.mod h1:a9TqabFudpDu1nucId+k9S8R9whYaHnGBLKFouA5EAo=
github.com/ethereum/go-ethereum v1.9.25/go.mod h1:vMkFiYLHI4tgPw4k2j4MHKoovchFE8plZ0M9VMk4/oM=
github.com/ethereum/go-ethereum v1.10.0 h1:EBZuZYjk1DHboBJb2YkBN8xItELRY6mtZEiYJKuH0+M=
github.com/ethereum/go-ethereum v1.10.0/go.mod h1:E5e/zvdfUVr91JZ0AwjyuJM3x+no51zZJRz61orLLSk=
github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc h1:jtW8jbpkO4YirRSyepBOH8E+2HEw6/hKkBvFPwhUN8c= github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc h1:jtW8jbpkO4YirRSyepBOH8E+2HEw6/hKkBvFPwhUN8c=
github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
github.com/flynn/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:1i71OnUq3iUe1ma7Lr6yG6/rjvM3emb6yoL7xLFzcVQ= github.com/flynn/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:1i71OnUq3iUe1ma7Lr6yG6/rjvM3emb6yoL7xLFzcVQ=
github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ=
github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag=
github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk=
...@@ -189,18 +246,26 @@ github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqG ...@@ -189,18 +246,26 @@ github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqG
github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE=
github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24=
github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98=
github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-interpreter/wagon v0.6.0 h1:BBxDxjiJiHgw9EdkYXAWs8NHhwnazZ5P2EWBW5hFNWw= github.com/go-interpreter/wagon v0.6.0 h1:BBxDxjiJiHgw9EdkYXAWs8NHhwnazZ5P2EWBW5hFNWw=
github.com/go-interpreter/wagon v0.6.0/go.mod h1:5+b/MBYkclRZngKF5s6qrgWxSLgE9F5dFdO1hAueZLc= github.com/go-interpreter/wagon v0.6.0/go.mod h1:5+b/MBYkclRZngKF5s6qrgWxSLgE9F5dFdO1hAueZLc=
github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0= github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-logfmt/logfmt v0.3.0 h1:8HUsc87TaSWLKwrnumgC8/YconD2fJQsRJAsWaPg2ic= github.com/go-logfmt/logfmt v0.3.0 h1:8HUsc87TaSWLKwrnumgC8/YconD2fJQsRJAsWaPg2ic=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E= github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E=
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
github.com/go-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg=
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= 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/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
...@@ -210,15 +275,20 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= ...@@ -210,15 +275,20 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 h1:zN2lZNZRflqFyxVaTIU61KNKQ9C0055u9CAfpmqUvo4= github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 h1:zN2lZNZRflqFyxVaTIU61KNKQ9C0055u9CAfpmqUvo4=
github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3/go.mod h1:nPpo7qLxd6XL3hWJG/O60sR8ZKfMCiIoNap5GvD12KU= github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3/go.mod h1:nPpo7qLxd6XL3hWJG/O60sR8ZKfMCiIoNap5GvD12KU=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc=
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
...@@ -241,7 +311,11 @@ github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8l ...@@ -241,7 +311,11 @@ github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8l
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf h1:gFVkHXmVAhEbxZVDln5V9GKrLaluNoFHDbrZwAWZgws= github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf h1:gFVkHXmVAhEbxZVDln5V9GKrLaluNoFHDbrZwAWZgws=
github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.3-0.20201103224600-674baa8c7fc3 h1:ur2rms48b3Ep1dxh7aUV2FZEQ8jEVO2F6ILKx8ofkAg=
github.com/golang/snappy v0.0.3-0.20201103224600-674baa8c7fc3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
...@@ -251,6 +325,7 @@ github.com/google/go-cmp v0.5.3 h1:x95R7cp+rSeeqAMI2knLtQ0DKlaBhv2NrtrOvafPHRo= ...@@ -251,6 +325,7 @@ github.com/google/go-cmp v0.5.3 h1:x95R7cp+rSeeqAMI2knLtQ0DKlaBhv2NrtrOvafPHRo=
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gopacket v1.1.17 h1:rMrlX2ZY2UbvT+sdz3+6J+pp2z+msCq9MxTU6ymxbBY= github.com/google/gopacket v1.1.17 h1:rMrlX2ZY2UbvT+sdz3+6J+pp2z+msCq9MxTU6ymxbBY=
github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM=
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
...@@ -258,49 +333,88 @@ github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo ...@@ -258,49 +333,88 @@ github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20190309163659-77426154d546/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190309163659-77426154d546/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs=
github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gorilla/websocket v1.4.1-0.20190629185528-ae1634f6a989/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1-0.20190629185528-ae1634f6a989/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/graph-gophers/graphql-go v0.0.0-20191115155744-f33e81362277/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/graph-gophers/graphql-go v0.0.0-20191115155744-f33e81362277/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc=
github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc=
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU=
github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48=
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
github.com/hashicorp/golang-lru v0.0.0-20160813221303-0a025b7e63ad/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.0.0-20160813221303-0a025b7e63ad/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs=
github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA=
github.com/holiman/uint256 v1.1.1 h1:4JywC80b+/hSfljFlEBLHrrh+CIONLDz9NuFl0af4Mw= github.com/holiman/uint256 v1.1.1 h1:4JywC80b+/hSfljFlEBLHrrh+CIONLDz9NuFl0af4Mw=
github.com/holiman/uint256 v1.1.1/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/holiman/uint256 v1.1.1/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/huin/goupnp v0.0.0-20161224104101-679507af18f3/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag= github.com/huin/goupnp v0.0.0-20161224104101-679507af18f3/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag=
github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo= 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/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc=
github.com/huin/goupnp v1.0.1-0.20200620063722-49508fba0031 h1:HarGZ5h9HD9LgEg1yRVMXyfiw4wlXiLiYM2oMjeA/SE=
github.com/huin/goupnp v1.0.1-0.20200620063722-49508fba0031/go.mod h1:nNs7wvRfN1eKaMknBydLNQU6146XQim8t4h+q90biWo=
github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY=
github.com/influxdata/influxdb v1.2.3-0.20180221223340-01288bdb0883/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= github.com/influxdata/influxdb v1.2.3-0.20180221223340-01288bdb0883/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY=
github.com/influxdata/influxdb v1.7.9 h1:uSeBTNO4rBkbp1Be5FKRsAmglM9nlx25TzVQRQt1An4= github.com/influxdata/influxdb v1.7.9 h1:uSeBTNO4rBkbp1Be5FKRsAmglM9nlx25TzVQRQt1An4=
github.com/influxdata/influxdb v1.7.9/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= github.com/influxdata/influxdb v1.7.9/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY=
github.com/influxdata/influxdb v1.8.3 h1:WEypI1BQFTT4teLM+1qkEcvUi0dAvopAI/ir0vAiBg8=
github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI=
github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk=
github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE=
github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8=
github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE=
github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0=
github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po=
github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
...@@ -364,30 +478,43 @@ github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsj ...@@ -364,30 +478,43 @@ github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsj
github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4=
github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o=
github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4=
github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU=
github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU=
github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= 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/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/julienschmidt/httprouter v1.1.1-0.20170430222011-975b5c4c7c21/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.1.1-0.20170430222011-975b5c4c7c21/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0=
github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0= github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0=
github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356 h1:I/yrLt2WilKxlQKCM52clh5rGzTKpVctGT1lH4Dc8Jw= github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356 h1:I/yrLt2WilKxlQKCM52clh5rGzTKpVctGT1lH4Dc8Jw=
github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU=
github.com/kevinms/leakybucket-go v0.0.0-20200115003610-082473db97ca h1:qNtd6alRqd3qOdPrKXMZImV192ngQ0WSh1briEO33Tk= github.com/kevinms/leakybucket-go v0.0.0-20200115003610-082473db97ca h1:qNtd6alRqd3qOdPrKXMZImV192ngQ0WSh1briEO33Tk=
github.com/kevinms/leakybucket-go v0.0.0-20200115003610-082473db97ca/go.mod h1:ph+C5vpnCcQvKBwJwKLTK3JLNGnBXYlG7m7JjoC/zYA= github.com/kevinms/leakybucket-go v0.0.0-20200115003610-082473db97ca/go.mod h1:ph+C5vpnCcQvKBwJwKLTK3JLNGnBXYlG7m7JjoC/zYA=
github.com/kilic/bls12-381 v0.0.0-20201226121925-69dacb279461/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig=
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
github.com/klauspost/compress v1.8.2 h1:Bx0qjetmNjdFXASH02NSAREKpiaDwkO1DRZ3dV2KCcs= github.com/klauspost/compress v1.8.2 h1:Bx0qjetmNjdFXASH02NSAREKpiaDwkO1DRZ3dV2KCcs=
github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w= github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w=
github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
github.com/klauspost/cpuid/v2 v2.0.4 h1:g0I61F2K2DjRHz1cnxlkNSBIaePVoJIjjnHui8QHbiw= github.com/klauspost/cpuid/v2 v2.0.4 h1:g0I61F2K2DjRHz1cnxlkNSBIaePVoJIjjnHui8QHbiw=
github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg=
github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d h1:68u9r4wEvL3gYg2jvAOgROwZ3H+Y3hIDk4tbbmIjcYQ= github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d h1:68u9r4wEvL3gYg2jvAOgROwZ3H+Y3hIDk4tbbmIjcYQ=
...@@ -403,6 +530,9 @@ github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= ...@@ -403,6 +530,9 @@ github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= 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/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/leanovate/gopter v0.2.8/go.mod h1:gNcbPWNEWRe4lm+bycKqxUYoH5uoVje5SkOJ3uoLer8=
github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8=
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ=
github.com/libp2p/go-addr-util v0.0.2 h1:7cWK5cdA5x72jX0g8iLrQWm5TRJZ6CzGdPEhWj7plWU= github.com/libp2p/go-addr-util v0.0.2 h1:7cWK5cdA5x72jX0g8iLrQWm5TRJZ6CzGdPEhWj7plWU=
github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E=
...@@ -641,6 +771,7 @@ github.com/lucas-clemente/quic-go v0.19.3 h1:eCDQqvGBB+kCTkA0XrAFtNe81FMa0/fn4QS ...@@ -641,6 +771,7 @@ github.com/lucas-clemente/quic-go v0.19.3 h1:eCDQqvGBB+kCTkA0XrAFtNe81FMa0/fn4QS
github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8=
github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc=
...@@ -655,6 +786,7 @@ github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx ...@@ -655,6 +786,7 @@ github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc=
github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
...@@ -663,10 +795,13 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd ...@@ -663,10 +795,13 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd
github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= 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/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE=
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
...@@ -684,7 +819,13 @@ github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKU ...@@ -684,7 +819,13 @@ github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKU
github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g=
github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM=
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mmcloughlin/avo v0.0.0-20190318053554-7a0eb66183da/go.mod h1:lf5GMZxA5kz8dnCweJuER5Rmbx6dDu6qvw0fO3uYKK8= github.com/mmcloughlin/avo v0.0.0-20190318053554-7a0eb66183da/go.mod h1:lf5GMZxA5kz8dnCweJuER5Rmbx6dDu6qvw0fO3uYKK8=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
...@@ -695,6 +836,7 @@ github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjW ...@@ -695,6 +836,7 @@ github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjW
github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg=
github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI=
github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA=
github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4=
...@@ -782,59 +924,86 @@ github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoT ...@@ -782,59 +924,86 @@ github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoT
github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE=
github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34=
github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= 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/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/perlin-network/life v0.0.0-20191203030451-05c0e0f7eaea h1:okKoivlkNRRLqXraEtatHfEhW+D71QTwkaj+4n4M2Xc= github.com/perlin-network/life v0.0.0-20191203030451-05c0e0f7eaea h1:okKoivlkNRRLqXraEtatHfEhW+D71QTwkaj+4n4M2Xc=
github.com/perlin-network/life v0.0.0-20191203030451-05c0e0f7eaea/go.mod h1:3KEU5Dm8MAYWZqity880wOFJ9PhQjyKVZGwAEfc5Q4E= github.com/perlin-network/life v0.0.0-20191203030451-05c0e0f7eaea/go.mod h1:3KEU5Dm8MAYWZqity880wOFJ9PhQjyKVZGwAEfc5Q4E=
github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0=
github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
github.com/phoreproject/bls v0.0.0-20200525203911-a88a5ae26844 h1:Yflyn+XFLEu7RPzxovgEVLP6Es8JLJrHqdXunpm2ak4= github.com/phoreproject/bls v0.0.0-20200525203911-a88a5ae26844 h1:Yflyn+XFLEu7RPzxovgEVLP6Es8JLJrHqdXunpm2ak4=
github.com/phoreproject/bls v0.0.0-20200525203911-a88a5ae26844/go.mod h1:xHJKf2TLXUA39Dhv8k5QmQOxLsbrb1KeTS/3ERfLeqc= github.com/phoreproject/bls v0.0.0-20200525203911-a88a5ae26844/go.mod h1:xHJKf2TLXUA39Dhv8k5QmQOxLsbrb1KeTS/3ERfLeqc=
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 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/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v0.9.2 h1:awm861/B8OKDd2I/6o1dy3ra4BamzKhYOiGItCeZ740= github.com/prometheus/client_golang v0.9.2 h1:awm861/B8OKDd2I/6o1dy3ra4BamzKhYOiGItCeZ740=
github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM=
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-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.4.1 h1:K0MGApIoQvMw27RTdJkPbr3JZ7DNbtxQNyi5STVM6Kw= github.com/prometheus/common v0.4.1 h1:K0MGApIoQvMw27RTdJkPbr3JZ7DNbtxQNyi5STVM6Kw=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.6.0 h1:kRhiuYSXR3+uv2IbVbZhUxK5zVD/2pp3Gd2PpvPkpEo=
github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.3 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURmKE= github.com/prometheus/procfs v0.0.3 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURmKE=
github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150 h1:ZeU+auZj1iNzN8iVhff6M38Mfu73FQiJve/GEXYJBjE= github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150 h1:ZeU+auZj1iNzN8iVhff6M38Mfu73FQiJve/GEXYJBjE=
github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563 h1:dY6ETXrvDG7Sa4vE8ZQG4yqWg6UnOcbqTAahkV813vQ= github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563 h1:dY6ETXrvDG7Sa4vE8ZQG4yqWg6UnOcbqTAahkV813vQ=
github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc=
github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE= github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE=
github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho=
github.com/robertkrimen/otto v0.0.0-20170205013659-6a77b7cbc37d/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY= github.com/robertkrimen/otto v0.0.0-20170205013659-6a77b7cbc37d/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY=
github.com/robertkrimen/otto v0.0.0-20180617131154-15f95af6e78d h1:1VUlQbCfkoSGv7qP7Y+ro3ap1P1pPZxgdGVqiTVy5C4= github.com/robertkrimen/otto v0.0.0-20180617131154-15f95af6e78d h1:1VUlQbCfkoSGv7qP7Y+ro3ap1P1pPZxgdGVqiTVy5C4=
github.com/robertkrimen/otto v0.0.0-20180617131154-15f95af6e78d/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY= github.com/robertkrimen/otto v0.0.0-20180617131154-15f95af6e78d/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
github.com/rs/cors v1.6.0 h1:G9tHG9lebljV9mfp9SNPDL36nCDxmo3zTlAf1YgvzmI= 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/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik=
github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ= github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ=
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo=
github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/shirou/gopsutil v2.20.5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY=
github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM=
github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0=
...@@ -860,7 +1029,10 @@ github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYED ...@@ -860,7 +1029,10 @@ github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYED
github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw=
github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo= github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY= github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY=
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE=
github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA=
github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0=
...@@ -872,12 +1044,18 @@ github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0b ...@@ -872,12 +1044,18 @@ github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0b
github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s=
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4=
github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI=
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc= github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc=
github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4 h1:Gb2Tyox57NRNuZ2d3rmvB3pcmbu7O1RS3m8WRx7ilrg= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4 h1:Gb2Tyox57NRNuZ2d3rmvB3pcmbu7O1RS3m8WRx7ilrg=
github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q=
...@@ -888,6 +1066,7 @@ github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUW ...@@ -888,6 +1066,7 @@ github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUW
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
github.com/stretchr/objx v0.1.1/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.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
...@@ -895,12 +1074,17 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 ...@@ -895,12 +1074,17 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d h1:gZZadD8H+fF+n9CmNhYL1Y0dJB+kLOmKd7FbPJLeGHs= github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d h1:gZZadD8H+fF+n9CmNhYL1Y0dJB+kLOmKd7FbPJLeGHs=
github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA= github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA=
github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca h1:Ld/zXl5t4+D69SiV4JoN7kkfvJdOWlPpfxrzxpLMoUk=
github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM=
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
github.com/tjfoc/gmsm v1.3.2 h1:7JVkAn5bvUJ7HtU08iW6UiD+UTmJTIToHCfeFzkcCxM= github.com/tjfoc/gmsm v1.3.2 h1:7JVkAn5bvUJ7HtU08iW6UiD+UTmJTIToHCfeFzkcCxM=
github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w= github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/twitchyliquid64/golang-asm v0.0.0-20190126203739-365674df15fc h1:RTUQlKzoZZVG3umWNzOYeFecQLIh+dbxXvJp1zPQJTI= github.com/twitchyliquid64/golang-asm v0.0.0-20190126203739-365674df15fc h1:RTUQlKzoZZVG3umWNzOYeFecQLIh+dbxXvJp1zPQJTI=
github.com/twitchyliquid64/golang-asm v0.0.0-20190126203739-365674df15fc/go.mod h1:NoCfSFWosfqMqmmD7hApkirIK9ozpHjxRnRxs1l413A= github.com/twitchyliquid64/golang-asm v0.0.0-20190126203739-365674df15fc/go.mod h1:NoCfSFWosfqMqmmD7hApkirIK9ozpHjxRnRxs1l413A=
github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef h1:wHSqTBrZW24CsNJDfeh9Ex6Pm0Rcpc7qrgKBiL44vF4= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef h1:wHSqTBrZW24CsNJDfeh9Ex6Pm0Rcpc7qrgKBiL44vF4=
...@@ -929,16 +1113,20 @@ github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1: ...@@ -929,16 +1113,20 @@ github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:
github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI=
github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow= github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow=
github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg=
github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208 h1:1cngl9mPEoITZG8s8cVcUy5CeIBYhEESkOB7m6Gmkrk= 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= github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees=
github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg=
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
...@@ -946,6 +1134,7 @@ go.opencensus.io v0.22.4 h1:LYy1Hy3MJdrCdMwwzxA/dRok4ejH+RwNGbuoD9fCjto= ...@@ -946,6 +1134,7 @@ go.opencensus.io v0.22.4 h1:LYy1Hy3MJdrCdMwwzxA/dRok4ejH+RwNGbuoD9fCjto=
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk=
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
...@@ -959,6 +1148,7 @@ go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKY ...@@ -959,6 +1148,7 @@ go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKY
go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
...@@ -970,6 +1160,7 @@ golang.org/x/arch v0.0.0-20190312162104-788fe5ffcd8c/go.mod h1:flIaEI6LNU6xOCD5P ...@@ -970,6 +1160,7 @@ golang.org/x/arch v0.0.0-20190312162104-788fe5ffcd8c/go.mod h1:flIaEI6LNU6xOCD5P
golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw=
golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 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-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190103213133-ff983b9c42bc/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190103213133-ff983b9c42bc/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
...@@ -981,8 +1172,10 @@ golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACk ...@@ -981,8 +1172,10 @@ golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACk
golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
...@@ -995,16 +1188,38 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh ...@@ -995,16 +1188,38 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4=
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
golang.org/x/mobile v0.0.0-20200801112145-973feb4309de/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
...@@ -1013,10 +1228,12 @@ golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73r ...@@ -1013,10 +1228,12 @@ golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73r
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 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-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181106065722-10aee1819953/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-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
...@@ -1024,14 +1241,22 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn ...@@ -1024,14 +1241,22 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn
golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190326090315-15845e8f865b/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190326090315-15845e8f865b/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7 h1:AeiKBIuRw3UomYXSbLy0Mc2dDLfdtbT/IVn4keq83P0= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7 h1:AeiKBIuRw3UomYXSbLy0Mc2dDLfdtbT/IVn4keq83P0=
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
...@@ -1041,6 +1266,9 @@ golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAG ...@@ -1041,6 +1266,9 @@ golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAG
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 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-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
...@@ -1052,9 +1280,11 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ ...@@ -1052,9 +1280,11 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 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-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/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-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
...@@ -1064,26 +1294,39 @@ golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5h ...@@ -1064,26 +1294,39 @@ golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5h
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/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-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190306220234-b354f8bf4d9e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190306220234-b354f8bf4d9e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190322080309-f49334f85ddc/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190322080309-f49334f85ddc/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190526052359-791d8a0f4d09/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190526052359-791d8a0f4d09/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200824131525-c12d262b63d8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210105210732-16f7687f5001/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
...@@ -1106,6 +1349,7 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb ...@@ -1106,6 +1349,7 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb
golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0 h1:xQwXv67TxFo9nC1GJFyab5eq/5B590r6RlnL/G8Sz7w= golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0 h1:xQwXv67TxFo9nC1GJFyab5eq/5B590r6RlnL/G8Sz7w=
golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
...@@ -1113,17 +1357,35 @@ golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGm ...@@ -1113,17 +1357,35 @@ golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGm
golang.org/x/tools v0.0.0-20181130052023-1c3d964395ce/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181130052023-1c3d964395ce/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190106171756-3ef68632349c/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190106171756-3ef68632349c/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190325223049-1d95b17f1b04/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190325223049-1d95b17f1b04/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a h1:CB3a9Nez8M13wwlr/E2YtwoU+qYHKfC+JrDa45RXXoQ= golang.org/x/tools v0.0.0-20210106214847-113979e3529a h1:CB3a9Nez8M13wwlr/E2YtwoU+qYHKfC+JrDa45RXXoQ=
...@@ -1134,23 +1396,49 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IV ...@@ -1134,23 +1396,49 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IV
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU=
gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=
google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y=
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.6.0 h1:Tfd7cKwKbFRsI8RMAD3oqqw7JPFRrvFlOsfbgVkjOOw= google.golang.org/appengine v1.6.0 h1:Tfd7cKwKbFRsI8RMAD3oqqw7JPFRrvFlOsfbgVkjOOw=
google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg=
google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
...@@ -1158,8 +1446,10 @@ google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9M ...@@ -1158,8 +1446,10 @@ google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9M
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.28.1/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.28.1/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
...@@ -1186,12 +1476,15 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= ...@@ -1186,12 +1476,15 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/go-playground/webhooks.v5 v5.2.0/go.mod h1:LZbya/qLVdbqDR1aKrGuWV6qbia2zCYSR5dpom2SInQ= gopkg.in/go-playground/webhooks.v5 v5.2.0/go.mod h1:LZbya/qLVdbqDR1aKrGuWV6qbia2zCYSR5dpom2SInQ=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/natefinch/lumberjack.v2 v2.0.0-20170531160350-a96e63847dc3 h1:AFxeG48hTWHhDTQDk/m2gorfVHUEa9vo3tp3D7TzwjI= gopkg.in/natefinch/lumberjack.v2 v2.0.0-20170531160350-a96e63847dc3 h1:AFxeG48hTWHhDTQDk/m2gorfVHUEa9vo3tp3D7TzwjI=
gopkg.in/natefinch/lumberjack.v2 v2.0.0-20170531160350-a96e63847dc3/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/natefinch/lumberjack.v2 v2.0.0-20170531160350-a96e63847dc3/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU=
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c=
gopkg.in/olebedev/go-duktape.v3 v3.0.0-20190213234257-ec84240a7772 h1:hhsSf/5z74Ck/DJYc+R8zpq8KGm7uJvpdLRQED/IedA= gopkg.in/olebedev/go-duktape.v3 v3.0.0-20190213234257-ec84240a7772 h1:hhsSf/5z74Ck/DJYc+R8zpq8KGm7uJvpdLRQED/IedA=
gopkg.in/olebedev/go-duktape.v3 v3.0.0-20190213234257-ec84240a7772/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= gopkg.in/olebedev/go-duktape.v3 v3.0.0-20190213234257-ec84240a7772/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns=
gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns=
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
gopkg.in/sourcemap.v1 v1.0.5 h1:inv58fC9f9J3TK2Y2R1NPntXEn3/wjWHkonhIUODNTI= gopkg.in/sourcemap.v1 v1.0.5 h1:inv58fC9f9J3TK2Y2R1NPntXEn3/wjWHkonhIUODNTI=
gopkg.in/sourcemap.v1 v1.0.5/go.mod h1:2RlvNNSMglmRrcvhfuzp4hQHwOtjxlbjX7UPY/GXb78= gopkg.in/sourcemap.v1 v1.0.5/go.mod h1:2RlvNNSMglmRrcvhfuzp4hQHwOtjxlbjX7UPY/GXb78=
gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8= gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8=
...@@ -1202,9 +1495,11 @@ gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637 h1:yiW+nvdHb9LVqSHQBXfZCieqV ...@@ -1202,9 +1495,11 @@ gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637 h1:yiW+nvdHb9LVqSHQBXfZCieqV
gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637/go.mod h1:BHsqpu/nsuzkT5BpiH1EMZPLyqSMM8JbIavyFACoFNk= gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637/go.mod h1:BHsqpu/nsuzkT5BpiH1EMZPLyqSMM8JbIavyFACoFNk=
gopkg.in/urfave/cli.v1 v1.20.0 h1:NdAVW6RYxDif9DhDHaAortIu956m2c0v+09AZBPTbE0= 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/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0=
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
...@@ -1214,9 +1509,11 @@ grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJd ...@@ -1214,9 +1509,11 @@ grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJd
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
......
...@@ -34,5 +34,4 @@ import ( ...@@ -34,5 +34,4 @@ import (
_ "github.com/33cn/plugin/plugin/dapp/valnode" //auto gen _ "github.com/33cn/plugin/plugin/dapp/valnode" //auto gen
_ "github.com/33cn/plugin/plugin/dapp/vote" //auto gen _ "github.com/33cn/plugin/plugin/dapp/vote" //auto gen
_ "github.com/33cn/plugin/plugin/dapp/wasm" //auto gen _ "github.com/33cn/plugin/plugin/dapp/wasm" //auto gen
_ "github.com/33cn/plugin/plugin/dapp/x2ethereum" //auto gen
) )
...@@ -5,25 +5,26 @@ strpwd=$(pwd) ...@@ -5,25 +5,26 @@ strpwd=$(pwd)
strcmd=${strpwd##*dapp/} strcmd=${strpwd##*dapp/}
strapp=${strcmd%/cmd*} strapp=${strcmd%/cmd*}
SRC_EBCLI=github.com/33cn/plugin/plugin/dapp/x2ethereum/ebcli #SRC_EBCLI=github.com/33cn/plugin/plugin/dapp/x2ethereum/ebcli
SRC_EBRELAYER=github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer #SRC_EBRELAYER=github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer
OUT_DIR="${1}/$strapp" #OUT_DIR="${1}/$strapp"
FLAG=$2 #FLAG=$2
#
# shellcheck disable=SC2086,1072 ## shellcheck disable=SC2086,1072
go build ${FLAG} -v -o "${OUT_DIR}/ebrelayer" "${SRC_EBRELAYER}" #go build -i ${FLAG} -v -o "${OUT_DIR}/ebrelayer" "${SRC_EBRELAYER}"
# shellcheck disable=SC2086,1072 ## shellcheck disable=SC2086,1072
go build ${FLAG} -v -o "${OUT_DIR}/ebcli_A" "${SRC_EBCLI}" #go build -i ${FLAG} -v -o "${OUT_DIR}/ebcli_A" "${SRC_EBCLI}"
# shellcheck disable=SC2086,1072 ## shellcheck disable=SC2086,1072
go build ${FLAG} -v -o "${OUT_DIR}/ebcli_B" -ldflags "-X ${SRC_EBCLI}/buildflags.RPCAddr=http://localhost:9902" "${SRC_EBCLI}" #go build -i ${FLAG} -v -o "${OUT_DIR}/ebcli_B" -ldflags "-X ${SRC_EBCLI}/buildflags.RPCAddr=http://localhost:9902" "${SRC_EBCLI}"
# shellcheck disable=SC2086,1072 ## shellcheck disable=SC2086,1072
go build ${FLAG} -v -o "${OUT_DIR}/ebcli_C" -ldflags "-X ${SRC_EBCLI}/buildflags.RPCAddr=http://localhost:9903" "${SRC_EBCLI}" #go build -i ${FLAG} -v -o "${OUT_DIR}/ebcli_C" -ldflags "-X ${SRC_EBCLI}/buildflags.RPCAddr=http://localhost:9903" "${SRC_EBCLI}"
# shellcheck disable=SC2086,1072 ## shellcheck disable=SC2086,1072
go build ${FLAG} -v -o "${OUT_DIR}/ebcli_D" -ldflags "-X ${SRC_EBCLI}/buildflags.RPCAddr=http://localhost:9904" "${SRC_EBCLI}" #go build -i ${FLAG} -v -o "${OUT_DIR}/ebcli_D" -ldflags "-X ${SRC_EBCLI}/buildflags.RPCAddr=http://localhost:9904" "${SRC_EBCLI}"
#
cp ../ebrelayer/relayer.toml "${OUT_DIR}/relayer.toml" #cp ../ebrelayer/relayer.toml "${OUT_DIR}/relayer.toml"
cp ./build/* "${OUT_DIR}" #cp ./build/* "${OUT_DIR}"
OUT_TESTDIR="${1}/dapptest/$strapp" OUT_TESTDIR="${1}/dapptest/$strapp"
mkdir -p "${OUT_TESTDIR}" mkdir -p "${OUT_TESTDIR}"
cp ./test/* "${OUT_TESTDIR}" cp ./test/* "${OUT_TESTDIR}"
#!/usr/bin/env bash #!/usr/bin/env bash
#shellcheck disable=SC2128 ##shellcheck disable=SC2128
#shellcheck source=/dev/null ##shellcheck source=/dev/null
set -x #set -x
source ../dapp-test-common.sh #source ../dapp-test-common.sh
source "../x2ethereum/publicTest.sh" #source "../x2ethereum/publicTest.sh"
#
sendAddress="12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv" #sendAddress="12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
sendPriKey="0x4257d8692ef7fe13c68b65d6a52f03933db2fa5ce8faf210b5b8b80c721ced01" #sendPriKey="0x4257d8692ef7fe13c68b65d6a52f03933db2fa5ce8faf210b5b8b80c721ced01"
MAIN_HTTP="" #MAIN_HTTP=""
chain33SenderAddr="14KEKbYtKKQm4wMthSK9J4La4nAiidGozt" #chain33SenderAddr="14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
# validatorsAddr=["0x92c8b16afd6d423652559c6e266cbe1c29bfd84f", "0x0df9a824699bc5878232c9e612fe1a5346a5a368", "0xcb074cb21cdddf3ce9c3c0a7ac4497d633c9d9f1", "0xd9dab021e74ecf475788ed7b61356056b2095830"] ## validatorsAddr=["0x92c8b16afd6d423652559c6e266cbe1c29bfd84f", "0x0df9a824699bc5878232c9e612fe1a5346a5a368", "0xcb074cb21cdddf3ce9c3c0a7ac4497d633c9d9f1", "0xd9dab021e74ecf475788ed7b61356056b2095830"]
ethValidatorAddrKeyA="3fa21584ae2e4fd74db9b58e2386f5481607dfa4d7ba0617aaa7858e5025dc1e" #ethValidatorAddrKeyA="3fa21584ae2e4fd74db9b58e2386f5481607dfa4d7ba0617aaa7858e5025dc1e"
ethValidatorAddrKeyB="a5f3063552f4483cfc20ac4f40f45b798791379862219de9e915c64722c1d400" #ethValidatorAddrKeyB="a5f3063552f4483cfc20ac4f40f45b798791379862219de9e915c64722c1d400"
ethValidatorAddrKeyC="bbf5e65539e9af0eb0cfac30bad475111054b09c11d668fc0731d54ea777471e" #ethValidatorAddrKeyC="bbf5e65539e9af0eb0cfac30bad475111054b09c11d668fc0731d54ea777471e"
ethValidatorAddrKeyD="c9fa31d7984edf81b8ef3b40c761f1847f6fcd5711ab2462da97dc458f1f896b" #ethValidatorAddrKeyD="c9fa31d7984edf81b8ef3b40c761f1847f6fcd5711ab2462da97dc458f1f896b"
# 新增地址 chain33 需要导入地址 转入 10 bty当收费费 ## 新增地址 chain33 需要导入地址 转入 10 bty当收费费
chain33Validator1="1H4zzzQEQQR2FxXwppiMRXcvqLvqzxK2nv" #chain33Validator1="1H4zzzQEQQR2FxXwppiMRXcvqLvqzxK2nv"
chain33Validator2="1Nq5AhTgVNvYaWQqih8ZQQEaRk3CFhTDHp" #chain33Validator2="1Nq5AhTgVNvYaWQqih8ZQQEaRk3CFhTDHp"
chain33Validator3="16nmxjF58z5oKK9m44cGy241zMSJWPN1Ty" #chain33Validator3="16nmxjF58z5oKK9m44cGy241zMSJWPN1Ty"
chain33Validator4="182nAEMxF1JWWxEWdu4jvd68aZhQumS97H" #chain33Validator4="182nAEMxF1JWWxEWdu4jvd68aZhQumS97H"
chain33ValidatorKey1="0x260124d9c619b0088241ffe2f1d7dc56b0b6100c88c342040387cd62b8ba35a3" #chain33ValidatorKey1="0x260124d9c619b0088241ffe2f1d7dc56b0b6100c88c342040387cd62b8ba35a3"
chain33ValidatorKey2="0x7812f8c688048943f1c168f8f2f76f44912de1f0ff8b12358b213118081869b2" #chain33ValidatorKey2="0x7812f8c688048943f1c168f8f2f76f44912de1f0ff8b12358b213118081869b2"
chain33ValidatorKey3="0xd44c8f3d8cac5d9c7fef7b0a0bf7be0909372ec6368064f742193de0bddeb2d1" #chain33ValidatorKey3="0xd44c8f3d8cac5d9c7fef7b0a0bf7be0909372ec6368064f742193de0bddeb2d1"
chain33ValidatorKey4="0xaad36689ca332026d4a4ceee62c8a91bac7bc100906b25a181a7f28b8552b53e" #chain33ValidatorKey4="0xaad36689ca332026d4a4ceee62c8a91bac7bc100906b25a181a7f28b8552b53e"
ethReceiverAddr1="0xa4ea64a583f6e51c3799335b28a8f0529570a635" #ethReceiverAddr1="0xa4ea64a583f6e51c3799335b28a8f0529570a635"
ethReceiverAddrKey1="355b876d7cbcb930d5dfab767f66336ce327e082cbaa1877210c1bae89b1df71" #ethReceiverAddrKey1="355b876d7cbcb930d5dfab767f66336ce327e082cbaa1877210c1bae89b1df71"
ethReceiverAddr2="0x0c05ba5c230fdaa503b53702af1962e08d0c60bf" #ethReceiverAddr2="0x0c05ba5c230fdaa503b53702af1962e08d0c60bf"
#ethReceiverAddrKey2="9dc6df3a8ab139a54d8a984f54958ae0661f880229bf3bdbb886b87d58b56a08" ##ethReceiverAddrKey2="9dc6df3a8ab139a54d8a984f54958ae0661f880229bf3bdbb886b87d58b56a08"
maturityDegree=5 #maturityDegree=5
#portRelayer=19999 ##portRelayer=19999
ethUrl="" #ethUrl=""
#
CLIA_HTTP="" #CLIA_HTTP=""
CLIB_HTTP="" #CLIB_HTTP=""
CLIC_HTTP="" #CLIC_HTTP=""
CLID_HTTP="" #CLID_HTTP=""
#
# $1 sendAddress, $2 balance ## $1 sendAddress, $2 balance
function queryExecBalance() { #function queryExecBalance() {
local resp="" # local resp=""
chain33_QueryExecBalance "${1}" "x2ethereum" "$MAIN_HTTP" # chain33_QueryExecBalance "${1}" "x2ethereum" "$MAIN_HTTP"
# shellcheck disable=SC2155 # # shellcheck disable=SC2155
local balance=$(echo "$resp" | jq -r ".result" | jq ".[].balance") # local balance=$(echo "$resp" | jq -r ".result" | jq ".[].balance")
if [ "${balance}" != "${2}" ]; then # if [ "${balance}" != "${2}" ]; then
echo_rst "queryExecBalance" "1" "${balance} != ${2}" # echo_rst "queryExecBalance" "1" "${balance} != ${2}"
fi # fi
} #}
#
# $1 chain33Address, $2 balance ## $1 chain33Address, $2 balance
function queryChain33Balance() { #function queryChain33Balance() {
local resp="" # local resp=""
chain33_QueryBalance "${1}" "${MAIN_HTTP}" # chain33_QueryBalance "${1}" "${MAIN_HTTP}"
# shellcheck disable=SC2155 # # shellcheck disable=SC2155
local balance=$(echo $resp | jq -r ".result.execAccount" | jq ".[].account.balance") # local balance=$(echo $resp | jq -r ".result.execAccount" | jq ".[].account.balance")
if [ "${balance}" != "${2}" ]; then # if [ "${balance}" != "${2}" ]; then
echo_rst "queryChain33Balance" "1" "${balance} != ${2}" # echo_rst "queryChain33Balance" "1" "${balance} != ${2}"
fi # fi
} #}
#
# $1 req , $2 balance ## $1 req , $2 balance
function queryRelayerBalance() { #function queryRelayerBalance() {
chain33_Http "${1}" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "GetBalance" ".result.balance" # chain33_Http "${1}" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "GetBalance" ".result.balance"
if [ "${RETURN_RESP}" != "${2}" ]; then # if [ "${RETURN_RESP}" != "${2}" ]; then
echo_rst "queryRelayerBalance" "1" "${RETURN_RESP} != ${2}" # echo_rst "queryRelayerBalance" "1" "${RETURN_RESP} != ${2}"
copyErrLogs # copyErrLogs
fi # fi
} #}
#
# $1 req , $2 balance ## $1 req , $2 balance
function queryChain33X2ethBalance() { #function queryChain33X2ethBalance() {
chain33_Http "${req}" ${MAIN_HTTP} '(.error|not) and (.result != null)' "GetBalance" ".result" # chain33_Http "${req}" ${MAIN_HTTP} '(.error|not) and (.result != null)' "GetBalance" ".result"
# shellcheck disable=SC2155 # # shellcheck disable=SC2155
local balance=$(echo "${RETURN_RESP}" | jq -r ".res" | jq ".[].balance" | sed 's/\"//g') # local balance=$(echo "${RETURN_RESP}" | jq -r ".res" | jq ".[].balance" | sed 's/\"//g')
if [ "${balance}" != "${2}" ]; then # if [ "${balance}" != "${2}" ]; then
echo_rst "queryChain33X2ethBalance" "1" "${balance} != ${2}" # echo_rst "queryChain33X2ethBalance" "1" "${balance} != ${2}"
fi # fi
} #}
#
function start_ebrelayerA() { #function start_ebrelayerA() {
docker cp "./x2ethereum/relayer.toml" "${dockerNamePrefix}_ebrelayera_rpc_1":/root/relayer.toml # docker cp "./x2ethereum/relayer.toml" "${dockerNamePrefix}_ebrelayera_rpc_1":/root/relayer.toml
start_docker_ebrelayer "${dockerNamePrefix}_ebrelayera_rpc_1" "/root/ebrelayer" "./x2ethereum/ebrelayera.log" # start_docker_ebrelayer "${dockerNamePrefix}_ebrelayera_rpc_1" "/root/ebrelayer" "./x2ethereum/ebrelayera.log"
sleep 5 # sleep 5
} #}
#
function StartRelayerAndDeploy() { #function StartRelayerAndDeploy() {
echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}" # echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}"
#
cp ../x2ethereum/* ./x2ethereum/ # cp ../x2ethereum/* ./x2ethereum/
for dockerName in ganachetest ebrelayera ebrelayerb ebrelayerc ebrelayerd; do # for dockerName in ganachetest ebrelayera ebrelayerb ebrelayerc ebrelayerd; do
line=$(delete_line_show "./x2ethereum/docker-compose-x2ethereum.yml" "${dockerName}:") # line=$(delete_line_show "./x2ethereum/docker-compose-x2ethereum.yml" "${dockerName}:")
sed -i ''"${line}"' a \ \ '${dockerName}'_rpc:' "./x2ethereum/docker-compose-x2ethereum.yml" # sed -i ''"${line}"' a \ \ '${dockerName}'_rpc:' "./x2ethereum/docker-compose-x2ethereum.yml"
done # done
#
docker-compose -f ./x2ethereum/docker-compose-x2ethereum.yml up --build -d # docker-compose -f ./x2ethereum/docker-compose-x2ethereum.yml up --build -d
sleep 5 # sleep 5
#
# change EthProvider url # # change EthProvider url
dockerAddr=$(get_docker_addr "${dockerNamePrefix}_ganachetest_rpc_1") # dockerAddr=$(get_docker_addr "${dockerNamePrefix}_ganachetest_rpc_1")
ethUrl="http://${dockerAddr}:8545" # ethUrl="http://${dockerAddr}:8545"
#
# 修改 relayer.toml 配置文件 # # 修改 relayer.toml 配置文件
updata_relayer_a_toml "${dockerAddr}" "${dockerNamePrefix}_ebrelayera_rpc_1" "./x2ethereum/relayer.toml" # updata_relayer_a_toml "${dockerAddr}" "${dockerNamePrefix}_ebrelayera_rpc_1" "./x2ethereum/relayer.toml"
#
line=$(delete_line_show "./x2ethereum/relayer.toml" "localhost:9901") # line=$(delete_line_show "./x2ethereum/relayer.toml" "localhost:9901")
sed -i ''"${line}"' a JrpcBindAddr=":9901"' "./x2ethereum/relayer.toml" # sed -i ''"${line}"' a JrpcBindAddr=":9901"' "./x2ethereum/relayer.toml"
# start ebrelayer A # # start ebrelayer A
start_ebrelayerA # start_ebrelayerA
#
ebrelayeraRpcHost=$(get_docker_addr "${dockerNamePrefix}_ebrelayera_rpc_1") # ebrelayeraRpcHost=$(get_docker_addr "${dockerNamePrefix}_ebrelayera_rpc_1")
if [[ ${ebrelayeraRpcHost} == "" ]]; then # if [[ ${ebrelayeraRpcHost} == "" ]]; then
echo -e "${RED}ebrelayeraRpcHost a is empty${NOC}" # echo -e "${RED}ebrelayeraRpcHost a is empty${NOC}"
fi # fi
CLIA_HTTP="http://${ebrelayeraRpcHost}:9901" # CLIA_HTTP="http://${ebrelayeraRpcHost}:9901"
#
# 部署合约 # # 部署合约
InitAndDeploy # InitAndDeploy
#
# 获取 BridgeRegistry 地址 # # 获取 BridgeRegistry 地址
local req='{"method":"Manager.ShowBridgeRegistryAddr","params":[{}]}' # local req='{"method":"Manager.ShowBridgeRegistryAddr","params":[{}]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "$FUNCNAME" ".result.addr" # chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "$FUNCNAME" ".result.addr"
local BridgeRegistry="$RETURN_RESP" # local BridgeRegistry="$RETURN_RESP"
#
# kill ebrelayer A # # kill ebrelayer A
kill_docker_ebrelayer "${dockerNamePrefix}_ebrelayera_rpc_1" # kill_docker_ebrelayer "${dockerNamePrefix}_ebrelayera_rpc_1"
sleep 1 # sleep 1
#
# 修改 relayer.toml 配置文件 # # 修改 relayer.toml 配置文件
updata_relayer_toml "${BridgeRegistry}" ${maturityDegree} "./x2ethereum/relayer.toml" # updata_relayer_toml "${BridgeRegistry}" ${maturityDegree} "./x2ethereum/relayer.toml"
# 重启 # # 重启
start_ebrelayerA # start_ebrelayerA
#
# start ebrelayer B C D # # start ebrelayer B C D
for name in b c d; do # for name in b c d; do
local file="./x2ethereum/relayer$name.toml" # local file="./x2ethereum/relayer$name.toml"
cp './x2ethereum/relayer.toml' "${file}" # cp './x2ethereum/relayer.toml' "${file}"
#
# 删除配置文件中不需要的字段 # # 删除配置文件中不需要的字段
for deleteName in "deployerPrivateKey" "operatorAddr" "validatorsAddr" "initPowers" "deployerPrivateKey" "deploy"; do # for deleteName in "deployerPrivateKey" "operatorAddr" "validatorsAddr" "initPowers" "deployerPrivateKey" "deploy"; do
delete_line "${file}" "${deleteName}" # delete_line "${file}" "${deleteName}"
done # done
#
sed -i 's/x2ethereum/x2ethereum'${name}'/g' "${file}" # sed -i 's/x2ethereum/x2ethereum'${name}'/g' "${file}"
#
pushHost=$(get_docker_addr "${dockerNamePrefix}_ebrelayer${name}_rpc_1") # pushHost=$(get_docker_addr "${dockerNamePrefix}_ebrelayer${name}_rpc_1")
line=$(delete_line_show "${file}" "pushHost") # line=$(delete_line_show "${file}" "pushHost")
sed -i ''"${line}"' a pushHost="http://'"${pushHost}"':20000"' "${file}" # sed -i ''"${line}"' a pushHost="http://'"${pushHost}"':20000"' "${file}"
#
line=$(delete_line_show "${file}" "pushBind") # line=$(delete_line_show "${file}" "pushBind")
sed -i ''"${line}"' a pushBind="'"${pushHost}"':20000"' "${file}" # sed -i ''"${line}"' a pushBind="'"${pushHost}"':20000"' "${file}"
#
docker cp "${file}" "${dockerNamePrefix}_ebrelayer${name}_rpc_1":/root/relayer.toml # docker cp "${file}" "${dockerNamePrefix}_ebrelayer${name}_rpc_1":/root/relayer.toml
start_docker_ebrelayer "${dockerNamePrefix}_ebrelayer${name}_rpc_1" "/root/ebrelayer" "./x2ethereum/ebrelayer${name}.log" # start_docker_ebrelayer "${dockerNamePrefix}_ebrelayer${name}_rpc_1" "/root/ebrelayer" "./x2ethereum/ebrelayer${name}.log"
done # done
sleep 5 # sleep 5
#
ebrelayeraRpcHost=$(get_docker_addr "${dockerNamePrefix}_ebrelayera_rpc_1") # ebrelayeraRpcHost=$(get_docker_addr "${dockerNamePrefix}_ebrelayera_rpc_1")
CLIA_HTTP="http://${ebrelayeraRpcHost}:9901" # CLIA_HTTP="http://${ebrelayeraRpcHost}:9901"
ebrelayeraRpcHost=$(get_docker_addr "${dockerNamePrefix}_ebrelayerb_rpc_1") # ebrelayeraRpcHost=$(get_docker_addr "${dockerNamePrefix}_ebrelayerb_rpc_1")
CLIB_HTTP="http://${ebrelayeraRpcHost}:9901" # CLIB_HTTP="http://${ebrelayeraRpcHost}:9901"
ebrelayeraRpcHost=$(get_docker_addr "${dockerNamePrefix}_ebrelayerc_rpc_1") # ebrelayeraRpcHost=$(get_docker_addr "${dockerNamePrefix}_ebrelayerc_rpc_1")
CLIC_HTTP="http://${ebrelayeraRpcHost}:9901" # CLIC_HTTP="http://${ebrelayeraRpcHost}:9901"
ebrelayeraRpcHost=$(get_docker_addr "${dockerNamePrefix}_ebrelayerd_rpc_1") # ebrelayeraRpcHost=$(get_docker_addr "${dockerNamePrefix}_ebrelayerd_rpc_1")
CLID_HTTP="http://${ebrelayeraRpcHost}:9901" # CLID_HTTP="http://${ebrelayeraRpcHost}:9901"
#
docker ps -a # docker ps -a
#
echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}" # echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}"
} #}
#
function InitAndDeploy() { #function InitAndDeploy() {
echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}" # echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}"
local req='{"method":"Manager.SetPassphase","params":[{"Passphase":"123456hzj"}]}' # local req='{"method":"Manager.SetPassphase","params":[{"Passphase":"123456hzj"}]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "SetPassphase" ".result" # chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "SetPassphase" ".result"
#
local req='{"method":"Manager.Unlock","params":["123456hzj"]}' # local req='{"method":"Manager.Unlock","params":["123456hzj"]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "Unlock" ".result" # chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "Unlock" ".result"
#
local req='{"method":"Manager.DeployContrcts","params":[{}]}' # local req='{"method":"Manager.DeployContrcts","params":[{}]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "$FUNCNAME" ".result" # chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "$FUNCNAME" ".result"
echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}" # echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}"
} #}
#
# chian33 添加验证着及权重 ## chian33 添加验证着及权重
function InitChain33Vilators() { #function InitChain33Vilators() {
echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}" # echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}"
# 导入 chain33Validators 私钥生成地址 # # 导入 chain33Validators 私钥生成地址
chain33_ImportPrivkey "${chain33ValidatorKey1}" "${chain33Validator1}" "tokenAddr" "${MAIN_HTTP}" # chain33_ImportPrivkey "${chain33ValidatorKey1}" "${chain33Validator1}" "tokenAddr" "${MAIN_HTTP}"
chain33_ImportPrivkey "${chain33ValidatorKey2}" "${chain33Validator2}" "tokenAddr" "${MAIN_HTTP}" # chain33_ImportPrivkey "${chain33ValidatorKey2}" "${chain33Validator2}" "tokenAddr" "${MAIN_HTTP}"
chain33_ImportPrivkey "${chain33ValidatorKey3}" "${chain33Validator3}" "tokenAddr" "${MAIN_HTTP}" # chain33_ImportPrivkey "${chain33ValidatorKey3}" "${chain33Validator3}" "tokenAddr" "${MAIN_HTTP}"
chain33_ImportPrivkey "${chain33ValidatorKey4}" "${chain33Validator4}" "tokenAddr" "${MAIN_HTTP}" # chain33_ImportPrivkey "${chain33ValidatorKey4}" "${chain33Validator4}" "tokenAddr" "${MAIN_HTTP}"
#
# SetConsensusThreshold # # SetConsensusThreshold
tx=$(curl -ksd '{"method":"Chain33.CreateTransaction","params":[{"execer":"x2ethereum","actionName":"SetConsensusThreshold","payload":{"consensusThreshold":"80"}}]}' ${MAIN_HTTP} | jq -r ".result") # tx=$(curl -ksd '{"method":"Chain33.CreateTransaction","params":[{"execer":"x2ethereum","actionName":"SetConsensusThreshold","payload":{"consensusThreshold":"80"}}]}' ${MAIN_HTTP} | jq -r ".result")
chain33_SignAndSendTxWait "$tx" "$sendPriKey" ${MAIN_HTTP} "SetConsensusThreshold" # chain33_SignAndSendTxWait "$tx" "$sendPriKey" ${MAIN_HTTP} "SetConsensusThreshold"
#
# add a validator # # add a validator
tx=$(curl -ksd '{"method":"Chain33.CreateTransaction","params":[{"execer":"x2ethereum","actionName":"AddValidator","payload":{"address":"'${chain33Validator1}'","power":"25"}}]}' ${MAIN_HTTP} | jq -r ".result") # tx=$(curl -ksd '{"method":"Chain33.CreateTransaction","params":[{"execer":"x2ethereum","actionName":"AddValidator","payload":{"address":"'${chain33Validator1}'","power":"25"}}]}' ${MAIN_HTTP} | jq -r ".result")
chain33_SignAndSendTxWait "$tx" "$sendPriKey" ${MAIN_HTTP} "AddValidator" # chain33_SignAndSendTxWait "$tx" "$sendPriKey" ${MAIN_HTTP} "AddValidator"
tx=$(curl -ksd '{"method":"Chain33.CreateTransaction","params":[{"execer":"x2ethereum","actionName":"AddValidator","payload":{"address":"'${chain33Validator2}'","power":"25"}}]}' ${MAIN_HTTP} | jq -r ".result") # tx=$(curl -ksd '{"method":"Chain33.CreateTransaction","params":[{"execer":"x2ethereum","actionName":"AddValidator","payload":{"address":"'${chain33Validator2}'","power":"25"}}]}' ${MAIN_HTTP} | jq -r ".result")
chain33_SignAndSendTxWait "$tx" "$sendPriKey" ${MAIN_HTTP} "AddValidator" # chain33_SignAndSendTxWait "$tx" "$sendPriKey" ${MAIN_HTTP} "AddValidator"
tx=$(curl -ksd '{"method":"Chain33.CreateTransaction","params":[{"execer":"x2ethereum","actionName":"AddValidator","payload":{"address":"'${chain33Validator3}'","power":"25"}}]}' ${MAIN_HTTP} | jq -r ".result") # tx=$(curl -ksd '{"method":"Chain33.CreateTransaction","params":[{"execer":"x2ethereum","actionName":"AddValidator","payload":{"address":"'${chain33Validator3}'","power":"25"}}]}' ${MAIN_HTTP} | jq -r ".result")
chain33_SignAndSendTxWait "$tx" "$sendPriKey" ${MAIN_HTTP} "AddValidator" # chain33_SignAndSendTxWait "$tx" "$sendPriKey" ${MAIN_HTTP} "AddValidator"
tx=$(curl -ksd '{"method":"Chain33.CreateTransaction","params":[{"execer":"x2ethereum","actionName":"AddValidator","payload":{"address":"'${chain33Validator4}'","power":"25"}}]}' ${MAIN_HTTP} | jq -r ".result") # tx=$(curl -ksd '{"method":"Chain33.CreateTransaction","params":[{"execer":"x2ethereum","actionName":"AddValidator","payload":{"address":"'${chain33Validator4}'","power":"25"}}]}' ${MAIN_HTTP} | jq -r ".result")
chain33_SignAndSendTxWait "$tx" "$sendPriKey" ${MAIN_HTTP} "AddValidator" # chain33_SignAndSendTxWait "$tx" "$sendPriKey" ${MAIN_HTTP} "AddValidator"
#
# query Validators # # query Validators
chain33_Http '{"method":"Chain33.Query","params":[{"execer":"x2ethereum","funcName":"GetTotalPower","payload":{}}]}' ${MAIN_HTTP} '(.error|not) and (.result != null)' "GetTotalPower" ".result.totalPower" # chain33_Http '{"method":"Chain33.Query","params":[{"execer":"x2ethereum","funcName":"GetTotalPower","payload":{}}]}' ${MAIN_HTTP} '(.error|not) and (.result != null)' "GetTotalPower" ".result.totalPower"
if [ "${RETURN_RESP}" != "100" ]; then # if [ "${RETURN_RESP}" != "100" ]; then
echo -e "${RED}=========== GetTotalPower err: TotalPower = $RETURN_RESP ===========${NOC}" # echo -e "${RED}=========== GetTotalPower err: TotalPower = $RETURN_RESP ===========${NOC}"
fi # fi
#
# cions 转帐到 x2ethereum 合约地址 # # cions 转帐到 x2ethereum 合约地址
x2eth_addr=$(curl -ksd '{"method":"Chain33.ConvertExectoAddr","params":[{"execname":"x2ethereum"}]}' ${MAIN_HTTP} | jq -r ".result") # x2eth_addr=$(curl -ksd '{"method":"Chain33.ConvertExectoAddr","params":[{"execname":"x2ethereum"}]}' ${MAIN_HTTP} | jq -r ".result")
chain33_SendToAddress "${sendAddress}" "${x2eth_addr}" 20000000000 "${MAIN_HTTP}" # chain33_SendToAddress "${sendAddress}" "${x2eth_addr}" 20000000000 "${MAIN_HTTP}"
queryExecBalance "${sendAddress}" "20000000000" # queryExecBalance "${sendAddress}" "20000000000"
#
# chain33Validator 要有手续费 # # chain33Validator 要有手续费
chain33_applyCoins "${chain33Validator1}" 1000000000 "${MAIN_HTTP}" # chain33_applyCoins "${chain33Validator1}" 1000000000 "${MAIN_HTTP}"
queryChain33Balance "${chain33Validator1}" "1000000000" # queryChain33Balance "${chain33Validator1}" "1000000000"
chain33_applyCoins "${chain33Validator2}" 1000000000 "${MAIN_HTTP}" # chain33_applyCoins "${chain33Validator2}" 1000000000 "${MAIN_HTTP}"
queryChain33Balance "${chain33Validator2}" "1000000000" # queryChain33Balance "${chain33Validator2}" "1000000000"
chain33_applyCoins "${chain33Validator3}" 1000000000 "${MAIN_HTTP}" # chain33_applyCoins "${chain33Validator3}" 1000000000 "${MAIN_HTTP}"
queryChain33Balance "${chain33Validator3}" "1000000000" # queryChain33Balance "${chain33Validator3}" "1000000000"
chain33_applyCoins "${chain33Validator4}" 1000000000 "${MAIN_HTTP}" # chain33_applyCoins "${chain33Validator4}" 1000000000 "${MAIN_HTTP}"
queryChain33Balance "${chain33Validator4}" "1000000000" # queryChain33Balance "${chain33Validator4}" "1000000000"
echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}" # echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}"
} #}
#
function EthImportKey() { #function EthImportKey() {
echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}" # echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}"
#
# 解锁 # # 解锁
local req='{"method":"Manager.SetPassphase","params":[{"Passphase":"123456hzj"}]}' # local req='{"method":"Manager.SetPassphase","params":[{"Passphase":"123456hzj"}]}'
chain33_Http "$req" "${CLIB_HTTP}" '(.error|not) and (.result != null)' "SetPassphase" ".result" # chain33_Http "$req" "${CLIB_HTTP}" '(.error|not) and (.result != null)' "SetPassphase" ".result"
chain33_Http "$req" "${CLIC_HTTP}" '(.error|not) and (.result != null)' "SetPassphase" ".result" # chain33_Http "$req" "${CLIC_HTTP}" '(.error|not) and (.result != null)' "SetPassphase" ".result"
chain33_Http "$req" "${CLID_HTTP}" '(.error|not) and (.result != null)' "SetPassphase" ".result" # chain33_Http "$req" "${CLID_HTTP}" '(.error|not) and (.result != null)' "SetPassphase" ".result"
req='{"method":"Manager.Unlock","params":["123456hzj"]}' # req='{"method":"Manager.Unlock","params":["123456hzj"]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "Unlock" ".result" # chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "Unlock" ".result"
chain33_Http "$req" "${CLIB_HTTP}" '(.error|not) and (.result != null)' "Unlock" ".result" # chain33_Http "$req" "${CLIB_HTTP}" '(.error|not) and (.result != null)' "Unlock" ".result"
chain33_Http "$req" "${CLIC_HTTP}" '(.error|not) and (.result != null)' "Unlock" ".result" # chain33_Http "$req" "${CLIC_HTTP}" '(.error|not) and (.result != null)' "Unlock" ".result"
chain33_Http "$req" "${CLID_HTTP}" '(.error|not) and (.result != null)' "Unlock" ".result" # chain33_Http "$req" "${CLID_HTTP}" '(.error|not) and (.result != null)' "Unlock" ".result"
#
req='{"method":"Manager.ImportChain33PrivateKey4EthRelayer","params":["'${chain33ValidatorKey1}'"]}' # req='{"method":"Manager.ImportChain33PrivateKey4EthRelayer","params":["'${chain33ValidatorKey1}'"]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "ImportChain33PrivateKey4EthRelayer" ".result" # chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "ImportChain33PrivateKey4EthRelayer" ".result"
req='{"method":"Manager.ImportChain33PrivateKey4EthRelayer","params":["'${chain33ValidatorKey2}'"]}' # req='{"method":"Manager.ImportChain33PrivateKey4EthRelayer","params":["'${chain33ValidatorKey2}'"]}'
chain33_Http "$req" "${CLIB_HTTP}" '(.error|not) and (.result != null)' "ImportChain33PrivateKey4EthRelayer" ".result" # chain33_Http "$req" "${CLIB_HTTP}" '(.error|not) and (.result != null)' "ImportChain33PrivateKey4EthRelayer" ".result"
req='{"method":"Manager.ImportChain33PrivateKey4EthRelayer","params":["'${chain33ValidatorKey3}'"]}' # req='{"method":"Manager.ImportChain33PrivateKey4EthRelayer","params":["'${chain33ValidatorKey3}'"]}'
chain33_Http "$req" "${CLIC_HTTP}" '(.error|not) and (.result != null)' "ImportChain33PrivateKey4EthRelayer" ".result" # chain33_Http "$req" "${CLIC_HTTP}" '(.error|not) and (.result != null)' "ImportChain33PrivateKey4EthRelayer" ".result"
req='{"method":"Manager.ImportChain33PrivateKey4EthRelayer","params":["'${chain33ValidatorKey4}'"]}' # req='{"method":"Manager.ImportChain33PrivateKey4EthRelayer","params":["'${chain33ValidatorKey4}'"]}'
chain33_Http "$req" "${CLID_HTTP}" '(.error|not) and (.result != null)' "ImportChain33PrivateKey4EthRelayer" ".result" # chain33_Http "$req" "${CLID_HTTP}" '(.error|not) and (.result != null)' "ImportChain33PrivateKey4EthRelayer" ".result"
#
req='{"method":"Manager.ImportChain33RelayerPrivateKey","params":[{"privateKey":"'${ethValidatorAddrKeyA}'"}]}' # req='{"method":"Manager.ImportChain33RelayerPrivateKey","params":[{"privateKey":"'${ethValidatorAddrKeyA}'"}]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "ImportChain33RelayerPrivateKey" ".result" # chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "ImportChain33RelayerPrivateKey" ".result"
req='{"method":"Manager.ImportChain33RelayerPrivateKey","params":[{"privateKey":"'${ethValidatorAddrKeyB}'"}]}' # req='{"method":"Manager.ImportChain33RelayerPrivateKey","params":[{"privateKey":"'${ethValidatorAddrKeyB}'"}]}'
chain33_Http "$req" "${CLIB_HTTP}" '(.error|not) and (.result != null)' "ImportChain33RelayerPrivateKey" ".result" # chain33_Http "$req" "${CLIB_HTTP}" '(.error|not) and (.result != null)' "ImportChain33RelayerPrivateKey" ".result"
req='{"method":"Manager.ImportChain33RelayerPrivateKey","params":[{"privateKey":"'${ethValidatorAddrKeyC}'"}]}' # req='{"method":"Manager.ImportChain33RelayerPrivateKey","params":[{"privateKey":"'${ethValidatorAddrKeyC}'"}]}'
chain33_Http "$req" "${CLIC_HTTP}" '(.error|not) and (.result != null)' "ImportChain33RelayerPrivateKey" ".result" # chain33_Http "$req" "${CLIC_HTTP}" '(.error|not) and (.result != null)' "ImportChain33RelayerPrivateKey" ".result"
req='{"method":"Manager.ImportChain33RelayerPrivateKey","params":[{"privateKey":"'${ethValidatorAddrKeyD}'"}]}' # req='{"method":"Manager.ImportChain33RelayerPrivateKey","params":[{"privateKey":"'${ethValidatorAddrKeyD}'"}]}'
chain33_Http "$req" "${CLID_HTTP}" '(.error|not) and (.result != null)' "ImportChain33RelayerPrivateKey" ".result" # chain33_Http "$req" "${CLID_HTTP}" '(.error|not) and (.result != null)' "ImportChain33RelayerPrivateKey" ".result"
#
echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}" # echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}"
} #}
#
function TestChain33ToEthAssets() { #function TestChain33ToEthAssets() {
echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}" # echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}"
# token4chain33 在 以太坊 上先有 bty # # token4chain33 在 以太坊 上先有 bty
local req='{"method":"Manager.CreateBridgeToken","params":["coins.bty"]}' # local req='{"method":"Manager.CreateBridgeToken","params":["coins.bty"]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "CreateBridgeToken" ".result.addr" # chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "CreateBridgeToken" ".result.addr"
tokenAddrBty=${RETURN_RESP} # tokenAddrBty=${RETURN_RESP}
#
req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr1}'","tokenAddr":"'${tokenAddrBty}'"}]}' # req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr1}'","tokenAddr":"'${tokenAddrBty}'"}]}'
queryRelayerBalance "$req" "0" # queryRelayerBalance "$req" "0"
#
# chain33 lock bty # # chain33 lock bty
#shellcheck disable=SC2086 # #shellcheck disable=SC2086
tx=$(curl -ksd '{"method":"Chain33.CreateTransaction","params":[{"execer":"x2ethereum","actionName":"Chain33ToEthLock","payload":{"TokenContract":"'${tokenAddrBty}'","Chain33Sender":"'${sendPriKey}'","EthereumReceiver":"'${ethReceiverAddr1}'","Amount":"500000000","IssuerDotSymbol":"coins.bty","Decimals":"8"}}]}' ${MAIN_HTTP} | jq -r ".result") # tx=$(curl -ksd '{"method":"Chain33.CreateTransaction","params":[{"execer":"x2ethereum","actionName":"Chain33ToEthLock","payload":{"TokenContract":"'${tokenAddrBty}'","Chain33Sender":"'${sendPriKey}'","EthereumReceiver":"'${ethReceiverAddr1}'","Amount":"500000000","IssuerDotSymbol":"coins.bty","Decimals":"8"}}]}' ${MAIN_HTTP} | jq -r ".result")
chain33_SignAndSendTxWait "$tx" "$sendPriKey" ${MAIN_HTTP} "Chain33ToEthLock" # chain33_SignAndSendTxWait "$tx" "$sendPriKey" ${MAIN_HTTP} "Chain33ToEthLock"
#
queryExecBalance "${sendAddress}" "19500000000" # queryExecBalance "${sendAddress}" "19500000000"
#
eth_block_wait $((maturityDegree + 2)) "${ethUrl}" # eth_block_wait $((maturityDegree + 2)) "${ethUrl}"
#
req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr1}'","tokenAddr":"'${tokenAddrBty}'"}]}' # req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr1}'","tokenAddr":"'${tokenAddrBty}'"}]}'
queryRelayerBalance "$req" "5" # queryRelayerBalance "$req" "5"
#
# eth burn # # eth burn
req='{"method":"Manager.Burn","params":[{"ownerKey":"'${ethReceiverAddrKey1}'","tokenAddr":"'${tokenAddrBty}'","chain33Receiver":"'${chain33SenderAddr}'","amount":"500000000"}]}' # req='{"method":"Manager.Burn","params":[{"ownerKey":"'${ethReceiverAddrKey1}'","tokenAddr":"'${tokenAddrBty}'","chain33Receiver":"'${chain33SenderAddr}'","amount":"500000000"}]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "Burn" ".result" # chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "Burn" ".result"
#
req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr1}'","tokenAddr":"'${tokenAddrBty}'"}]}' # req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr1}'","tokenAddr":"'${tokenAddrBty}'"}]}'
queryRelayerBalance "$req" "0" # queryRelayerBalance "$req" "0"
#
# eth 等待 10 个区块 # # eth 等待 10 个区块
eth_block_wait $((maturityDegree + 2)) "${ethUrl}" # eth_block_wait $((maturityDegree + 2)) "${ethUrl}"
#
queryExecBalance "${chain33SenderAddr}" "500000000" # queryExecBalance "${chain33SenderAddr}" "500000000"
#
echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}" # echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}"
} #}
#
# eth to chain33 ## eth to chain33
# 在以太坊上锁定资产,然后在 chain33 上铸币,针对 eth 资产 ## 在以太坊上锁定资产,然后在 chain33 上铸币,针对 eth 资产
function TestETH2Chain33Assets() { #function TestETH2Chain33Assets() {
echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}" # echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}"
local req='{"method":"Manager.ShowBridgeBankAddr","params":[{}]}' # local req='{"method":"Manager.ShowBridgeBankAddr","params":[{}]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "ShowBridgeBankAddr" ".result.addr" # chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "ShowBridgeBankAddr" ".result.addr"
bridgeBankAddr="${RETURN_RESP}" # bridgeBankAddr="${RETURN_RESP}"
#
req='{"method":"Manager.GetBalance","params":[{"owner":"'${bridgeBankAddr}'","tokenAddr":""}]}' # req='{"method":"Manager.GetBalance","params":[{"owner":"'${bridgeBankAddr}'","tokenAddr":""}]}'
queryRelayerBalance "$req" "0" # queryRelayerBalance "$req" "0"
#
# eth lock 0.1 # # eth lock 0.1
req='{"method":"Manager.LockEthErc20Asset","params":[{"ownerKey":"'${ethReceiverAddrKey1}'","tokenAddr":"","amount":"100000000000000000","chain33Receiver":"'${sendAddress}'"}]}' # req='{"method":"Manager.LockEthErc20Asset","params":[{"ownerKey":"'${ethReceiverAddrKey1}'","tokenAddr":"","amount":"100000000000000000","chain33Receiver":"'${sendAddress}'"}]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "LockEthErc20Asset" ".result" # chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "LockEthErc20Asset" ".result"
#
req='{"method":"Manager.GetBalance","params":[{"owner":"'${bridgeBankAddr}'","tokenAddr":""}]}' # req='{"method":"Manager.GetBalance","params":[{"owner":"'${bridgeBankAddr}'","tokenAddr":""}]}'
queryRelayerBalance "$req" "0.1" # queryRelayerBalance "$req" "0.1"
#
# eth 等待 10 个区块 # # eth 等待 10 个区块
eth_block_wait $((maturityDegree + 2)) "${ethUrl}" # eth_block_wait $((maturityDegree + 2)) "${ethUrl}"
#
req='{"method":"Chain33.Query","params":[{"execer":"x2ethereum","funcName":"GetRelayerBalance","payload":{"tokenSymbol":"eth","address":"'${sendAddress}'","tokenAddr":"0x0000000000000000000000000000000000000000"}}]}' # req='{"method":"Chain33.Query","params":[{"execer":"x2ethereum","funcName":"GetRelayerBalance","payload":{"tokenSymbol":"eth","address":"'${sendAddress}'","tokenAddr":"0x0000000000000000000000000000000000000000"}}]}'
queryChain33X2ethBalance "${req}" "0.1" # queryChain33X2ethBalance "${req}" "0.1"
#
req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr2}'","tokenAddr":""}]}' # req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr2}'","tokenAddr":""}]}'
chain33_Http "${req}" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "GetBalance" ".result.balance" # chain33_Http "${req}" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "GetBalance" ".result.balance"
local balance=${RETURN_RESP} # local balance=${RETURN_RESP}
#
# burn 0.1 # # burn 0.1
tx=$(curl -ksd '{"method":"Chain33.CreateTransaction","params":[{"execer":"x2ethereum","actionName":"Chain33ToEthBurn","payload":{"TokenContract":"0x0000000000000000000000000000000000000000","Chain33Sender":"'${sendPriKey}'","EthereumReceiver":"'${ethReceiverAddr2}'","Amount":"10000000","IssuerDotSymbol":"eth","Decimals":"18"}}]}' ${MAIN_HTTP} | jq -r ".result") # tx=$(curl -ksd '{"method":"Chain33.CreateTransaction","params":[{"execer":"x2ethereum","actionName":"Chain33ToEthBurn","payload":{"TokenContract":"0x0000000000000000000000000000000000000000","Chain33Sender":"'${sendPriKey}'","EthereumReceiver":"'${ethReceiverAddr2}'","Amount":"10000000","IssuerDotSymbol":"eth","Decimals":"18"}}]}' ${MAIN_HTTP} | jq -r ".result")
chain33_SignAndSendTxWait "$tx" "$sendPriKey" ${MAIN_HTTP} "Chain33ToEthBurn" # chain33_SignAndSendTxWait "$tx" "$sendPriKey" ${MAIN_HTTP} "Chain33ToEthBurn"
#
req='{"method":"Chain33.Query","params":[{"execer":"x2ethereum","funcName":"GetRelayerBalance","payload":{"tokenSymbol":"eth","address":"'${sendAddress}'","tokenAddr":"0x0000000000000000000000000000000000000000"}}]}' # req='{"method":"Chain33.Query","params":[{"execer":"x2ethereum","funcName":"GetRelayerBalance","payload":{"tokenSymbol":"eth","address":"'${sendAddress}'","tokenAddr":"0x0000000000000000000000000000000000000000"}}]}'
queryChain33X2ethBalance "${req}" "0" # queryChain33X2ethBalance "${req}" "0"
#
eth_block_wait $((maturityDegree + 2)) "${ethUrl}" # eth_block_wait $((maturityDegree + 2)) "${ethUrl}"
#
req='{"method":"Manager.GetBalance","params":[{"owner":"'${bridgeBankAddr}'","tokenAddr":""}]}' # req='{"method":"Manager.GetBalance","params":[{"owner":"'${bridgeBankAddr}'","tokenAddr":""}]}'
queryRelayerBalance "$req" "0" # queryRelayerBalance "$req" "0"
#
req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr2}'","tokenAddr":""}]}' # req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr2}'","tokenAddr":""}]}'
#queryRelayerBalance "$req" "$(echo "${balance}+0.1" | bc)" # #queryRelayerBalance "$req" "$(echo "${balance}+0.1" | bc)"
queryRelayerBalance "$req" "100.1" # queryRelayerBalance "$req" "100.1"
#
echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}" # echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}"
} #}
#
function TestETH2Chain33Erc20() { #function TestETH2Chain33Erc20() {
echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}" # echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}"
# token4erc20 在 chain33 上先有 token,同时 mint # # token4erc20 在 chain33 上先有 token,同时 mint
local req='{"method":"Manager.CreateERC20Token","params":["testc"]}' # local req='{"method":"Manager.CreateERC20Token","params":["testc"]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "CreateERC20Token" ".result.addr" # chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "CreateERC20Token" ".result.addr"
tokenAddr="${RETURN_RESP}" # tokenAddr="${RETURN_RESP}"
#
# 先铸币 1000 # # 先铸币 1000
req='{"method":"Manager.MintErc20","params":[{"owner":"'${ethReceiverAddr1}'","tokenAddr":"'${tokenAddr}'","amount":"100000000000"}]}' # req='{"method":"Manager.MintErc20","params":[{"owner":"'${ethReceiverAddr1}'","tokenAddr":"'${tokenAddr}'","amount":"100000000000"}]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "MintErc20" ".result.addr" # chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "MintErc20" ".result.addr"
#
req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr1}'","tokenAddr":"'${tokenAddr}'"}]}' # req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr1}'","tokenAddr":"'${tokenAddr}'"}]}'
queryRelayerBalance "$req" "1000" # queryRelayerBalance "$req" "1000"
#
local req='{"method":"Manager.ShowBridgeBankAddr","params":[{}]}' # local req='{"method":"Manager.ShowBridgeBankAddr","params":[{}]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "ShowBridgeBankAddr" ".result.addr" # chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "ShowBridgeBankAddr" ".result.addr"
bridgeBankAddr="${RETURN_RESP}" # bridgeBankAddr="${RETURN_RESP}"
#
req='{"method":"Manager.GetBalance","params":[{"owner":"'${bridgeBankAddr}'","tokenAddr":"'${tokenAddr}'"}]}' # req='{"method":"Manager.GetBalance","params":[{"owner":"'${bridgeBankAddr}'","tokenAddr":"'${tokenAddr}'"}]}'
queryRelayerBalance "$req" "0" # queryRelayerBalance "$req" "0"
#
# lock 100 # # lock 100
req='{"method":"Manager.LockEthErc20Asset","params":[{"ownerKey":"'${ethReceiverAddrKey1}'","tokenAddr":"'${tokenAddr}'","amount":"10000000000","chain33Receiver":"'${chain33Validator1}'"}]}' # req='{"method":"Manager.LockEthErc20Asset","params":[{"ownerKey":"'${ethReceiverAddrKey1}'","tokenAddr":"'${tokenAddr}'","amount":"10000000000","chain33Receiver":"'${chain33Validator1}'"}]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "LockEthErc20Asset" ".result" # chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "LockEthErc20Asset" ".result"
#
req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr1}'","tokenAddr":"'${tokenAddr}'"}]}' # req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr1}'","tokenAddr":"'${tokenAddr}'"}]}'
queryRelayerBalance "$req" "900" # queryRelayerBalance "$req" "900"
#
req='{"method":"Manager.GetBalance","params":[{"owner":"'${bridgeBankAddr}'","tokenAddr":"'${tokenAddr}'"}]}' # req='{"method":"Manager.GetBalance","params":[{"owner":"'${bridgeBankAddr}'","tokenAddr":"'${tokenAddr}'"}]}'
queryRelayerBalance "$req" "100" # queryRelayerBalance "$req" "100"
#
# eth 等待 10 个区块 # # eth 等待 10 个区块
eth_block_wait $((maturityDegree + 2)) "${ethUrl}" # eth_block_wait $((maturityDegree + 2)) "${ethUrl}"
#
req='{"method":"Chain33.Query","params":[{"execer":"x2ethereum","funcName":"GetRelayerBalance","payload":{"tokenSymbol":"testc","address":"'${chain33Validator1}'","tokenAddr":"'${tokenAddr}'"}}]}' # req='{"method":"Chain33.Query","params":[{"execer":"x2ethereum","funcName":"GetRelayerBalance","payload":{"tokenSymbol":"testc","address":"'${chain33Validator1}'","tokenAddr":"'${tokenAddr}'"}}]}'
queryChain33X2ethBalance "${req}" "100" # queryChain33X2ethBalance "${req}" "100"
#
# chain33 burn 100 # # chain33 burn 100
#shellcheck disable=SC2086 # #shellcheck disable=SC2086
tx=$(curl -ksd '{"method":"Chain33.CreateTransaction","params":[{"execer":"x2ethereum","actionName":"Chain33ToEthBurn","payload":{"TokenContract":"'${tokenAddr}'","Chain33Sender":"'${chain33ValidatorKey1}'","EthereumReceiver":"'${ethReceiverAddr2}'","Amount":"10000000000","IssuerDotSymbol":"testc","Decimals":"8"}}]}' ${MAIN_HTTP} | jq -r ".result") # tx=$(curl -ksd '{"method":"Chain33.CreateTransaction","params":[{"execer":"x2ethereum","actionName":"Chain33ToEthBurn","payload":{"TokenContract":"'${tokenAddr}'","Chain33Sender":"'${chain33ValidatorKey1}'","EthereumReceiver":"'${ethReceiverAddr2}'","Amount":"10000000000","IssuerDotSymbol":"testc","Decimals":"8"}}]}' ${MAIN_HTTP} | jq -r ".result")
chain33_SignAndSendTxWait "$tx" "$chain33ValidatorKey1" ${MAIN_HTTP} "Chain33ToEthBurn" # chain33_SignAndSendTxWait "$tx" "$chain33ValidatorKey1" ${MAIN_HTTP} "Chain33ToEthBurn"
#
req='{"method":"Chain33.Query","params":[{"execer":"x2ethereum","funcName":"GetRelayerBalance","payload":{"tokenSymbol":"testc","address":"'${chain33Validator1}'","tokenAddr":"'${tokenAddr}'"}}]}' # req='{"method":"Chain33.Query","params":[{"execer":"x2ethereum","funcName":"GetRelayerBalance","payload":{"tokenSymbol":"testc","address":"'${chain33Validator1}'","tokenAddr":"'${tokenAddr}'"}}]}'
queryChain33X2ethBalance "${req}" "0" # queryChain33X2ethBalance "${req}" "0"
#
eth_block_wait $((maturityDegree + 2)) "${ethUrl}" # eth_block_wait $((maturityDegree + 2)) "${ethUrl}"
#
req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr2}'","tokenAddr":"'${tokenAddr}'"}]}' # req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr2}'","tokenAddr":"'${tokenAddr}'"}]}'
queryRelayerBalance "$req" "100" # queryRelayerBalance "$req" "100"
#
req='{"method":"Manager.GetBalance","params":[{"owner":"'${bridgeBankAddr}'","tokenAddr":"'${tokenAddr}'"}]}' # req='{"method":"Manager.GetBalance","params":[{"owner":"'${bridgeBankAddr}'","tokenAddr":"'${tokenAddr}'"}]}'
queryRelayerBalance "$req" "0" # queryRelayerBalance "$req" "0"
#
echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}" # echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}"
} #}
#
function rpc_test() { function rpc_test() {
set +e # set +e
set -x # set -x
chain33_RpcTestBegin x2ethereum chain33_RpcTestBegin x2ethereum
MAIN_HTTP="$1" # MAIN_HTTP="$1"
dockerNamePrefix="$2" # dockerNamePrefix="$2"
echo "main_ip=$MAIN_HTTP" # echo "main_ip=$MAIN_HTTP"
#
ispara=$(echo '"'"${MAIN_HTTP}"'"' | jq '.|contains("8901")') ## ispara=$(echo '"'"${MAIN_HTTP}"'"' | jq '.|contains("8901")')
if [ "$ispara" == false ]; then ## if [ "$ispara" == false ]; then
# init ## # init
StartRelayerAndDeploy ## StartRelayerAndDeploy
InitChain33Vilators ## InitChain33Vilators
EthImportKey ## EthImportKey
##
# test ## # test
TestChain33ToEthAssets ## TestChain33ToEthAssets
TestETH2Chain33Assets ## TestETH2Chain33Assets
TestETH2Chain33Erc20 ## TestETH2Chain33Erc20
##
copyErrLogs ## copyErrLogs
##
docker-compose -f ./x2ethereum/docker-compose-x2ethereum.yml down ## docker-compose -f ./x2ethereum/docker-compose-x2ethereum.yml down
fi ## fi
chain33_RpcTestRst x2ethereum "$CASE_ERR" chain33_RpcTestRst x2ethereum "$CASE_ERR"
} }
chain33_debug_function rpc_test "$1" "$2" #chain33_debug_function rpc_test "$1" "$2"
...@@ -29,7 +29,8 @@ func EthereumRelayerCmd() *cobra.Command { ...@@ -29,7 +29,8 @@ func EthereumRelayerCmd() *cobra.Command {
ShowEthereumTxsHashCmd(), ShowEthereumTxsHashCmd(),
IsValidatorActiveCmd(), IsValidatorActiveCmd(),
ShowOperatorCmd(), ShowOperatorCmd(),
DeployContrctsCmd(), DeployContrcts2Chain33Cmd(),
DeployContrcts2EthCmd(),
ShowTxReceiptCmd(), ShowTxReceiptCmd(),
//////auxiliary/////// //////auxiliary///////
CreateBridgeTokenCmd(), CreateBridgeTokenCmd(),
...@@ -209,11 +210,20 @@ func ShowOperator(cmd *cobra.Command, args []string) { ...@@ -209,11 +210,20 @@ func ShowOperator(cmd *cobra.Command, args []string) {
ctx.Run() ctx.Run()
} }
func DeployContrcts2Chain33Cmd() *cobra.Command {
cmd := &cobra.Command{
Use: "deploy2chain33",
Short: "deploy contracts to chain33",
Run: DeployContrcts2Chain33,
}
return cmd
}
//DeployContrctsCmd ... //DeployContrctsCmd ...
func DeployContrctsCmd() *cobra.Command { func DeployContrcts2EthCmd() *cobra.Command {
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "deploy", Use: "deploy2eth",
Short: "deploy the corresponding Ethereum contracts", Short: "deploy contracts to ethereum",
Run: DeployContrcts, Run: DeployContrcts,
} }
return cmd return cmd
...@@ -227,6 +237,13 @@ func DeployContrcts(cmd *cobra.Command, args []string) { ...@@ -227,6 +237,13 @@ func DeployContrcts(cmd *cobra.Command, args []string) {
ctx.Run() ctx.Run()
} }
func DeployContrcts2Chain33(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
var res rpctypes.Reply
ctx := jsonclient.NewRPCCtx(rpcLaddr, "Manager.Deploy2Chain33", nil, &res)
ctx.Run()
}
//ShowTxReceiptCmd ... //ShowTxReceiptCmd ...
func ShowTxReceiptCmd() *cobra.Command { func ShowTxReceiptCmd() *cobra.Command {
cmd := &cobra.Command{ cmd := &cobra.Command{
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -20,7 +20,6 @@ var ( ...@@ -20,7 +20,6 @@ var (
_ = big.NewInt _ = big.NewInt
_ = strings.NewReader _ = strings.NewReader
_ = ethereum.NotFound _ = ethereum.NotFound
_ = abi.U256
_ = bind.Bind _ = bind.Bind
_ = common.Big1 _ = common.Big1
_ = types.BloomLookup _ = types.BloomLookup
...@@ -28,7 +27,7 @@ var ( ...@@ -28,7 +27,7 @@ var (
) )
// BridgeRegistryABI is the input ABI used to generate the binding from. // BridgeRegistryABI is the input ABI used to generate the binding from.
const BridgeRegistryABI = "[{\"constant\":true,\"inputs\":[],\"name\":\"bridgeBank\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"deployHeight\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"oracle\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"valset\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"chain33Bridge\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_chain33Bridge\",\"type\":\"address\"},{\"name\":\"_bridgeBank\",\"type\":\"address\"},{\"name\":\"_oracle\",\"type\":\"address\"},{\"name\":\"_valset\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_chain33Bridge\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_bridgeBank\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_oracle\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_valset\",\"type\":\"address\"}],\"name\":\"LogContractsRegistered\",\"type\":\"event\"}]" const BridgeRegistryABI = "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_chain33Bridge\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_bridgeBank\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_oracle\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_valset\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_chain33Bridge\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_bridgeBank\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_oracle\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_valset\",\"type\":\"address\"}],\"name\":\"LogContractsRegistered\",\"type\":\"event\"},{\"constant\":true,\"inputs\":[],\"name\":\"bridgeBank\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"chain33Bridge\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"deployHeight\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"oracle\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"valset\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]"
// BridgeRegistryFuncSigs maps the 4-byte function signature to its string representation. // BridgeRegistryFuncSigs maps the 4-byte function signature to its string representation.
var BridgeRegistryFuncSigs = map[string]string{ var BridgeRegistryFuncSigs = map[string]string{
...@@ -40,7 +39,7 @@ var BridgeRegistryFuncSigs = map[string]string{ ...@@ -40,7 +39,7 @@ var BridgeRegistryFuncSigs = map[string]string{
} }
// BridgeRegistryBin is the compiled bytecode used for deploying new contracts. // BridgeRegistryBin is the compiled bytecode used for deploying new contracts.
var BridgeRegistryBin = "0x608060405234801561001057600080fd5b506040516080806102b78339810180604052608081101561003057600080fd5b50805160208083015160408085015160609586015160008054600160a060020a03808916600160a060020a031992831617928390556001805482891690841617908190556002805483881690851617908190556003805484881695169490941793849055436004558751948316855290821698840198909852968716828601529095169685019690965290519394919390927f039b733f31259b106f1d278c726870d5b28c7db22957d63df8dbaa70bd3a032a919081900360800190a1505050506101b7806101006000396000f3fe60806040526004361061006c5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630e41f373811461007157806353d953b5146100af5780637dc0d1d0146100d65780637f54af0c146100eb578063eb35535214610100575b600080fd5b34801561007d57600080fd5b50610086610115565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156100bb57600080fd5b506100c4610131565b60408051918252519081900360200190f35b3480156100e257600080fd5b50610086610137565b3480156100f757600080fd5b50610086610153565b34801561010c57600080fd5b5061008661016f565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b60045481565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff168156fea165627a7a72305820bb308a31657002b318d16d39a635d309141c0cc5aef32e8c33b53192d1df4cbc0029" var BridgeRegistryBin = "0x608060405234801561001057600080fd5b5060405161021b38038061021b8339818101604052608081101561003357600080fd5b508051602080830151604080850151606095860151600080546001600160a01b038089166001600160a01b031992831617928390556001805482891690841617908190556002805483881690851617908190556003805484881695169490941793849055436004558751948316855290821698840198909852968716828601529095169685019690965290519394919390927f039b733f31259b106f1d278c726870d5b28c7db22957d63df8dbaa70bd3a032a919081900360800190a150505050610118806101036000396000f3fe6080604052348015600f57600080fd5b506004361060505760003560e01c80630e41f37314605557806353d953b51460775780637dc0d1d014608f5780637f54af0c146095578063eb35535214609b575b600080fd5b605b60a1565b604080516001600160a01b039092168252519081900360200190f35b607d60b0565b60408051918252519081900360200190f35b605b60b6565b605b60c5565b605b60d4565b6001546001600160a01b031681565b60045481565b6002546001600160a01b031681565b6003546001600160a01b031681565b6000546001600160a01b03168156fea265627a7a723158203d23ad42796300416cdb8a5444c4d338cbdd2d7edbe7f7a2ddc16cb07690454164736f6c63430005100032"
// DeployBridgeRegistry deploys a new Ethereum contract, binding an instance of BridgeRegistry to it. // DeployBridgeRegistry deploys a new Ethereum contract, binding an instance of BridgeRegistry to it.
func DeployBridgeRegistry(auth *bind.TransactOpts, backend bind.ContractBackend, _chain33Bridge common.Address, _bridgeBank common.Address, _oracle common.Address, _valset common.Address) (common.Address, *types.Transaction, *BridgeRegistry, error) { func DeployBridgeRegistry(auth *bind.TransactOpts, backend bind.ContractBackend, _chain33Bridge common.Address, _bridgeBank common.Address, _oracle common.Address, _valset common.Address) (common.Address, *types.Transaction, *BridgeRegistry, error) {
...@@ -164,7 +163,7 @@ func bindBridgeRegistry(address common.Address, caller bind.ContractCaller, tran ...@@ -164,7 +163,7 @@ func bindBridgeRegistry(address common.Address, caller bind.ContractCaller, tran
// sets the output to result. The result type might be a single field for simple // 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, a slice of interfaces for anonymous returns and a struct for named
// returns. // returns.
func (_BridgeRegistry *BridgeRegistryRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { func (_BridgeRegistry *BridgeRegistryRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
return _BridgeRegistry.Contract.BridgeRegistryCaller.contract.Call(opts, result, method, params...) return _BridgeRegistry.Contract.BridgeRegistryCaller.contract.Call(opts, result, method, params...)
} }
...@@ -183,7 +182,7 @@ func (_BridgeRegistry *BridgeRegistryRaw) Transact(opts *bind.TransactOpts, meth ...@@ -183,7 +182,7 @@ func (_BridgeRegistry *BridgeRegistryRaw) Transact(opts *bind.TransactOpts, meth
// sets the output to result. The result type might be a single field for simple // 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, a slice of interfaces for anonymous returns and a struct for named
// returns. // returns.
func (_BridgeRegistry *BridgeRegistryCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { func (_BridgeRegistry *BridgeRegistryCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
return _BridgeRegistry.Contract.contract.Call(opts, result, method, params...) return _BridgeRegistry.Contract.contract.Call(opts, result, method, params...)
} }
...@@ -200,130 +199,155 @@ func (_BridgeRegistry *BridgeRegistryTransactorRaw) Transact(opts *bind.Transact ...@@ -200,130 +199,155 @@ func (_BridgeRegistry *BridgeRegistryTransactorRaw) Transact(opts *bind.Transact
// BridgeBank is a free data retrieval call binding the contract method 0x0e41f373. // BridgeBank is a free data retrieval call binding the contract method 0x0e41f373.
// //
// Solidity: function bridgeBank() constant returns(address) // Solidity: function bridgeBank() view returns(address)
func (_BridgeRegistry *BridgeRegistryCaller) BridgeBank(opts *bind.CallOpts) (common.Address, error) { func (_BridgeRegistry *BridgeRegistryCaller) BridgeBank(opts *bind.CallOpts) (common.Address, error) {
var ( var out []interface{}
ret0 = new(common.Address) err := _BridgeRegistry.contract.Call(opts, &out, "bridgeBank")
)
out := ret0 if err != nil {
err := _BridgeRegistry.contract.Call(opts, out, "bridgeBank") return *new(common.Address), err
return *ret0, err }
out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
return out0, err
} }
// BridgeBank is a free data retrieval call binding the contract method 0x0e41f373. // BridgeBank is a free data retrieval call binding the contract method 0x0e41f373.
// //
// Solidity: function bridgeBank() constant returns(address) // Solidity: function bridgeBank() view returns(address)
func (_BridgeRegistry *BridgeRegistrySession) BridgeBank() (common.Address, error) { func (_BridgeRegistry *BridgeRegistrySession) BridgeBank() (common.Address, error) {
return _BridgeRegistry.Contract.BridgeBank(&_BridgeRegistry.CallOpts) return _BridgeRegistry.Contract.BridgeBank(&_BridgeRegistry.CallOpts)
} }
// BridgeBank is a free data retrieval call binding the contract method 0x0e41f373. // BridgeBank is a free data retrieval call binding the contract method 0x0e41f373.
// //
// Solidity: function bridgeBank() constant returns(address) // Solidity: function bridgeBank() view returns(address)
func (_BridgeRegistry *BridgeRegistryCallerSession) BridgeBank() (common.Address, error) { func (_BridgeRegistry *BridgeRegistryCallerSession) BridgeBank() (common.Address, error) {
return _BridgeRegistry.Contract.BridgeBank(&_BridgeRegistry.CallOpts) return _BridgeRegistry.Contract.BridgeBank(&_BridgeRegistry.CallOpts)
} }
// Chain33Bridge is a free data retrieval call binding the contract method 0xeb355352. // Chain33Bridge is a free data retrieval call binding the contract method 0xeb355352.
// //
// Solidity: function chain33Bridge() constant returns(address) // Solidity: function chain33Bridge() view returns(address)
func (_BridgeRegistry *BridgeRegistryCaller) Chain33Bridge(opts *bind.CallOpts) (common.Address, error) { func (_BridgeRegistry *BridgeRegistryCaller) Chain33Bridge(opts *bind.CallOpts) (common.Address, error) {
var ( var out []interface{}
ret0 = new(common.Address) err := _BridgeRegistry.contract.Call(opts, &out, "chain33Bridge")
)
out := ret0 if err != nil {
err := _BridgeRegistry.contract.Call(opts, out, "chain33Bridge") return *new(common.Address), err
return *ret0, err }
out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
return out0, err
} }
// Chain33Bridge is a free data retrieval call binding the contract method 0xeb355352. // Chain33Bridge is a free data retrieval call binding the contract method 0xeb355352.
// //
// Solidity: function chain33Bridge() constant returns(address) // Solidity: function chain33Bridge() view returns(address)
func (_BridgeRegistry *BridgeRegistrySession) Chain33Bridge() (common.Address, error) { func (_BridgeRegistry *BridgeRegistrySession) Chain33Bridge() (common.Address, error) {
return _BridgeRegistry.Contract.Chain33Bridge(&_BridgeRegistry.CallOpts) return _BridgeRegistry.Contract.Chain33Bridge(&_BridgeRegistry.CallOpts)
} }
// Chain33Bridge is a free data retrieval call binding the contract method 0xeb355352. // Chain33Bridge is a free data retrieval call binding the contract method 0xeb355352.
// //
// Solidity: function chain33Bridge() constant returns(address) // Solidity: function chain33Bridge() view returns(address)
func (_BridgeRegistry *BridgeRegistryCallerSession) Chain33Bridge() (common.Address, error) { func (_BridgeRegistry *BridgeRegistryCallerSession) Chain33Bridge() (common.Address, error) {
return _BridgeRegistry.Contract.Chain33Bridge(&_BridgeRegistry.CallOpts) return _BridgeRegistry.Contract.Chain33Bridge(&_BridgeRegistry.CallOpts)
} }
// DeployHeight is a free data retrieval call binding the contract method 0x53d953b5. // DeployHeight is a free data retrieval call binding the contract method 0x53d953b5.
// //
// Solidity: function deployHeight() constant returns(uint256) // Solidity: function deployHeight() view returns(uint256)
func (_BridgeRegistry *BridgeRegistryCaller) DeployHeight(opts *bind.CallOpts) (*big.Int, error) { func (_BridgeRegistry *BridgeRegistryCaller) DeployHeight(opts *bind.CallOpts) (*big.Int, error) {
var ( var out []interface{}
ret0 = new(*big.Int) err := _BridgeRegistry.contract.Call(opts, &out, "deployHeight")
)
out := ret0 if err != nil {
err := _BridgeRegistry.contract.Call(opts, out, "deployHeight") return *new(*big.Int), err
return *ret0, err }
out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
return out0, err
} }
// DeployHeight is a free data retrieval call binding the contract method 0x53d953b5. // DeployHeight is a free data retrieval call binding the contract method 0x53d953b5.
// //
// Solidity: function deployHeight() constant returns(uint256) // Solidity: function deployHeight() view returns(uint256)
func (_BridgeRegistry *BridgeRegistrySession) DeployHeight() (*big.Int, error) { func (_BridgeRegistry *BridgeRegistrySession) DeployHeight() (*big.Int, error) {
return _BridgeRegistry.Contract.DeployHeight(&_BridgeRegistry.CallOpts) return _BridgeRegistry.Contract.DeployHeight(&_BridgeRegistry.CallOpts)
} }
// DeployHeight is a free data retrieval call binding the contract method 0x53d953b5. // DeployHeight is a free data retrieval call binding the contract method 0x53d953b5.
// //
// Solidity: function deployHeight() constant returns(uint256) // Solidity: function deployHeight() view returns(uint256)
func (_BridgeRegistry *BridgeRegistryCallerSession) DeployHeight() (*big.Int, error) { func (_BridgeRegistry *BridgeRegistryCallerSession) DeployHeight() (*big.Int, error) {
return _BridgeRegistry.Contract.DeployHeight(&_BridgeRegistry.CallOpts) return _BridgeRegistry.Contract.DeployHeight(&_BridgeRegistry.CallOpts)
} }
// Oracle is a free data retrieval call binding the contract method 0x7dc0d1d0. // Oracle is a free data retrieval call binding the contract method 0x7dc0d1d0.
// //
// Solidity: function oracle() constant returns(address) // Solidity: function oracle() view returns(address)
func (_BridgeRegistry *BridgeRegistryCaller) Oracle(opts *bind.CallOpts) (common.Address, error) { func (_BridgeRegistry *BridgeRegistryCaller) Oracle(opts *bind.CallOpts) (common.Address, error) {
var ( var out []interface{}
ret0 = new(common.Address) err := _BridgeRegistry.contract.Call(opts, &out, "oracle")
)
out := ret0 if err != nil {
err := _BridgeRegistry.contract.Call(opts, out, "oracle") return *new(common.Address), err
return *ret0, err }
out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
return out0, err
} }
// Oracle is a free data retrieval call binding the contract method 0x7dc0d1d0. // Oracle is a free data retrieval call binding the contract method 0x7dc0d1d0.
// //
// Solidity: function oracle() constant returns(address) // Solidity: function oracle() view returns(address)
func (_BridgeRegistry *BridgeRegistrySession) Oracle() (common.Address, error) { func (_BridgeRegistry *BridgeRegistrySession) Oracle() (common.Address, error) {
return _BridgeRegistry.Contract.Oracle(&_BridgeRegistry.CallOpts) return _BridgeRegistry.Contract.Oracle(&_BridgeRegistry.CallOpts)
} }
// Oracle is a free data retrieval call binding the contract method 0x7dc0d1d0. // Oracle is a free data retrieval call binding the contract method 0x7dc0d1d0.
// //
// Solidity: function oracle() constant returns(address) // Solidity: function oracle() view returns(address)
func (_BridgeRegistry *BridgeRegistryCallerSession) Oracle() (common.Address, error) { func (_BridgeRegistry *BridgeRegistryCallerSession) Oracle() (common.Address, error) {
return _BridgeRegistry.Contract.Oracle(&_BridgeRegistry.CallOpts) return _BridgeRegistry.Contract.Oracle(&_BridgeRegistry.CallOpts)
} }
// Valset is a free data retrieval call binding the contract method 0x7f54af0c. // Valset is a free data retrieval call binding the contract method 0x7f54af0c.
// //
// Solidity: function valset() constant returns(address) // Solidity: function valset() view returns(address)
func (_BridgeRegistry *BridgeRegistryCaller) Valset(opts *bind.CallOpts) (common.Address, error) { func (_BridgeRegistry *BridgeRegistryCaller) Valset(opts *bind.CallOpts) (common.Address, error) {
var ( var out []interface{}
ret0 = new(common.Address) err := _BridgeRegistry.contract.Call(opts, &out, "valset")
)
out := ret0 if err != nil {
err := _BridgeRegistry.contract.Call(opts, out, "valset") return *new(common.Address), err
return *ret0, err }
out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
return out0, err
} }
// Valset is a free data retrieval call binding the contract method 0x7f54af0c. // Valset is a free data retrieval call binding the contract method 0x7f54af0c.
// //
// Solidity: function valset() constant returns(address) // Solidity: function valset() view returns(address)
func (_BridgeRegistry *BridgeRegistrySession) Valset() (common.Address, error) { func (_BridgeRegistry *BridgeRegistrySession) Valset() (common.Address, error) {
return _BridgeRegistry.Contract.Valset(&_BridgeRegistry.CallOpts) return _BridgeRegistry.Contract.Valset(&_BridgeRegistry.CallOpts)
} }
// Valset is a free data retrieval call binding the contract method 0x7f54af0c. // Valset is a free data retrieval call binding the contract method 0x7f54af0c.
// //
// Solidity: function valset() constant returns(address) // Solidity: function valset() view returns(address)
func (_BridgeRegistry *BridgeRegistryCallerSession) Valset() (common.Address, error) { func (_BridgeRegistry *BridgeRegistryCallerSession) Valset() (common.Address, error) {
return _BridgeRegistry.Contract.Valset(&_BridgeRegistry.CallOpts) return _BridgeRegistry.Contract.Valset(&_BridgeRegistry.CallOpts)
} }
...@@ -461,5 +485,6 @@ func (_BridgeRegistry *BridgeRegistryFilterer) ParseLogContractsRegistered(log t ...@@ -461,5 +485,6 @@ func (_BridgeRegistry *BridgeRegistryFilterer) ParseLogContractsRegistered(log t
if err := _BridgeRegistry.contract.UnpackLog(event, "LogContractsRegistered", log); err != nil { if err := _BridgeRegistry.contract.UnpackLog(event, "LogContractsRegistered", log); err != nil {
return nil, err return nil, err
} }
event.Raw = log
return event, nil return event, nil
} }
package test package test
import ( //
"encoding/hex" //import (
"fmt" // "encoding/hex"
"math/big" // "fmt"
"strings" // "math/big"
"testing" // "strings"
// "testing"
"github.com/ethereum/go-ethereum/accounts/abi" //
"github.com/ethereum/go-ethereum/common" // "github.com/ethereum/go-ethereum/accounts/abi"
) // "github.com/ethereum/go-ethereum/common"
//)
func TestUnpackEvent(t *testing.T) { //
const abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"receive","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"}],"name":"receivedAddr","type":"event"}]` //func TestUnpackEvent(t *testing.T) {
abi, err := abi.JSON(strings.NewReader(abiJSON)) // const abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"receive","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"}],"name":"receivedAddr","type":"event"}]`
if err != nil { // abiData, err := abi.JSON(strings.NewReader(abiJSON))
t.Fatal(err) // if err != nil {
} // t.Fatal(err)
// }
const hexdata = `000000000000000000000000376c47978271565f56deb45495afa69e59c16ab200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000158` //
data, err := hex.DecodeString(hexdata) // const hexdata = `000000000000000000000000376c47978271565f56deb45495afa69e59c16ab200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000158`
if err != nil { // data, err := hex.DecodeString(hexdata)
t.Fatal(err) // if err != nil {
} // t.Fatal(err)
if len(data)%32 == 0 { // }
t.Errorf("len(data) is %d, want a non-multiple of 32", len(data)) // if len(data)%32 == 0 {
} // t.Errorf("len(data) is %d, want a non-multiple of 32", len(data))
// }
type ReceivedEvent struct { //
Sender common.Address // type ReceivedEvent struct {
Amount *big.Int // Sender common.Address
Memo []byte // Amount *big.Int
} // Memo []byte
var ev ReceivedEvent // }
// var ev ReceivedEvent
err = abi.Unpack(&ev, "received", data) //
if err != nil { // ret, err := abiData.Unpack("received", data)
t.Error(err) // if err != nil {
} // t.Error(err)
// }
fmt.Printf("\nReceivedEvent sender:%s", ev.Sender.String()) // fmt.Println(ret)
//
type ReceivedAddrEvent struct { // fmt.Printf("\nReceivedEvent sender:%s", ev.Sender.String())
Sender common.Address //
} // type ReceivedAddrEvent struct {
var receivedAddrEv ReceivedAddrEvent // Sender common.Address
err = abi.Unpack(&receivedAddrEv, "receivedAddr", data) // }
if err != nil { // var receivedAddrEv ReceivedAddrEvent
t.Error(err) // ret2, err := abiData.Unpack("receivedAddr", data)
} // if err != nil {
fmt.Printf("\nreceivedAddrEv=%s\n\n\n", receivedAddrEv.Sender.String()) // t.Error(err)
} // }
// fmt.Println(ret2)
// fmt.Printf("\nreceivedAddrEv=%s\n\n\n", receivedAddrEv.Sender.String())
//}
package test package test
import ( //
"context" //import (
"fmt" // "context"
"math/big" // "fmt"
"testing" // "math/big"
"time" // "testing"
// "time"
"github.com/stretchr/testify/assert" //
// "github.com/stretchr/testify/assert"
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethcontract/generated" //
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethcontract/test/setup" // "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethcontract/generated"
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethtxs" // "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethcontract/test/setup"
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/events" // "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethtxs"
"github.com/ethereum/go-ethereum" // "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/events"
"github.com/ethereum/go-ethereum/accounts/abi/bind" // "github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/common" // "github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/core/types" // "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto" // "github.com/ethereum/go-ethereum/core/types"
"github.com/stretchr/testify/require" // "github.com/ethereum/go-ethereum/crypto"
) // "github.com/stretchr/testify/require"
//)
//"BridgeToken creation (Chain33 assets)" //
func TestBrigeTokenCreat(t *testing.T) { ////"BridgeToken creation (Chain33 assets)"
ctx := context.Background() //func TestBrigeTokenCreat(t *testing.T) {
println("TEST:BridgeToken creation (Chain33 assets)") // ctx := context.Background()
//1st部署相关合约 // println("TEST:BridgeToken creation (Chain33 assets)")
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts() // //1st部署相关合约
require.NoError(t, err) // para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
// require.NoError(t, err)
//2nd:订阅事件 //
eventName := "LogNewBridgeToken" // //2nd:订阅事件
bridgeBankABI := ethtxs.LoadABI(ethtxs.BridgeBankABI) // eventName := "LogNewBridgeToken"
logNewBridgeTokenSig := bridgeBankABI.Events[eventName].ID().Hex() // bridgeBankABI := ethtxs.LoadABI(ethtxs.BridgeBankABI)
query := ethereum.FilterQuery{ // logNewBridgeTokenSig := bridgeBankABI.Events[eventName].ID.Hex()
Addresses: []common.Address{x2EthDeployInfo.BridgeBank.Address}, // query := ethereum.FilterQuery{
} // Addresses: []common.Address{x2EthDeployInfo.BridgeBank.Address},
// We will check logs for new events // }
logs := make(chan types.Log) // // We will check logs for new events
// Filter by contract and event, write results to logs // logs := make(chan types.Log)
sub, err := sim.SubscribeFilterLogs(ctx, query, logs) // // Filter by contract and event, write results to logs
require.Nil(t, err) // sub, err := sim.SubscribeFilterLogs(ctx, query, logs)
// require.Nil(t, err)
t.Logf("x2EthDeployInfo.BridgeBank.Address is:%s", x2EthDeployInfo.BridgeBank.Address.String()) //
bridgeBank, err := generated.NewBridgeBank(x2EthDeployInfo.BridgeBank.Address, sim) // t.Logf("x2EthDeployInfo.BridgeBank.Address is:%s", x2EthDeployInfo.BridgeBank.Address.String())
require.Nil(t, err) // bridgeBank, err := generated.NewBridgeBank(x2EthDeployInfo.BridgeBank.Address, sim)
// require.Nil(t, err)
opts := &bind.CallOpts{ //
Pending: true, // opts := &bind.CallOpts{
From: para.Operator, // Pending: true,
Context: ctx, // From: para.Operator,
} // Context: ctx,
BridgeBankAddr, err := x2EthContracts.BridgeRegistry.BridgeBank(opts) // }
require.Nil(t, err) // BridgeBankAddr, err := x2EthContracts.BridgeRegistry.BridgeBank(opts)
t.Logf("BridgeBankAddr is:%s", BridgeBankAddr.String()) // require.Nil(t, err)
// t.Logf("BridgeBankAddr is:%s", BridgeBankAddr.String())
tokenCount, err := bridgeBank.BridgeBankCaller.BridgeTokenCount(opts) //
require.Nil(t, err) // tokenCount, err := bridgeBank.BridgeBankCaller.BridgeTokenCount(opts)
require.Equal(t, tokenCount.Int64(), int64(0)) // require.Nil(t, err)
// require.Equal(t, tokenCount.Int64(), int64(0))
//3rd:创建token //
auth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator) // //3rd:创建token
if nil != err { // auth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
t.Fatalf("PrepareAuth failed due to:%s", err.Error()) // if nil != err {
} // t.Fatalf("PrepareAuth failed due to:%s", err.Error())
symbol := "BTY" // }
_, err = x2EthContracts.BridgeBank.BridgeBankTransactor.CreateNewBridgeToken(auth, symbol) // symbol := "BTY"
if nil != err { // _, err = x2EthContracts.BridgeBank.BridgeBankTransactor.CreateNewBridgeToken(auth, symbol)
t.Fatalf("CreateNewBridgeToken failed due to:%s", err.Error()) // if nil != err {
} // t.Fatalf("CreateNewBridgeToken failed due to:%s", err.Error())
sim.Commit() // }
// sim.Commit()
timer := time.NewTimer(30 * time.Second) //
for { // timer := time.NewTimer(30 * time.Second)
select { // for {
case <-timer.C: // select {
t.Fatal("failed due to timeout") // case <-timer.C:
// Handle any errors // t.Fatal("failed due to timeout")
case err := <-sub.Err(): // // Handle any errors
t.Fatalf("sub error:%s", err.Error()) // case err := <-sub.Err():
// vLog is raw event data // t.Fatalf("sub error:%s", err.Error())
case vLog := <-logs: // // vLog is raw event data
// Check if the event is a 'LogLock' event // case vLog := <-logs:
if vLog.Topics[0].Hex() == logNewBridgeTokenSig { // // Check if the event is a 'LogLock' event
t.Logf("Witnessed new event:%s, Block number:%d, Tx hash:%s", eventName, // if vLog.Topics[0].Hex() == logNewBridgeTokenSig {
vLog.BlockNumber, vLog.TxHash.Hex()) // t.Logf("Witnessed new event:%s, Block number:%d, Tx hash:%s", eventName,
logEvent := &events.LogNewBridgeToken{} // vLog.BlockNumber, vLog.TxHash.Hex())
err = bridgeBankABI.Unpack(logEvent, eventName, vLog.Data) // logEvent := &events.LogNewBridgeToken{}
require.Nil(t, err) // //err = bridgeBankABI.Unpack(logEvent, eventName, vLog.Data)
t.Logf("token addr:%s, symbol:%s", logEvent.Token.String(), logEvent.Symbol) // _, err = bridgeBankABI.Unpack(eventName, vLog.Data)
require.Equal(t, symbol, logEvent.Symbol) // require.Nil(t, err)
// t.Logf("token addr:%s, symbol:%s", logEvent.Token.String(), logEvent.Symbol)
//tokenCount正确加1 // require.Equal(t, symbol, logEvent.Symbol)
tokenCount, err := x2EthContracts.BridgeBank.BridgeTokenCount(opts) //
require.Nil(t, err) // //tokenCount正确加1
require.Equal(t, tokenCount.Int64(), int64(1)) // tokenCount, err := x2EthContracts.BridgeBank.BridgeTokenCount(opts)
// require.Nil(t, err)
return // require.Equal(t, tokenCount.Int64(), int64(1))
} //
} // return
} // }
} // }
// }
//测试在chain33上锁定资产,然后在以太坊上铸币 //}
//发行token="BTY" //
//铸币NewOracleClaim ////测试在chain33上锁定资产,然后在以太坊上铸币
//铸币成功 ////发行token="BTY"
//Bridge token minting (for locked chain33 assets) ////铸币NewOracleClaim
func TestBrigeTokenMint(t *testing.T) { ////铸币成功
ctx := context.Background() ////Bridge token minting (for locked chain33 assets)
println("TEST:BridgeToken creation (Chain33 assets)") //func TestBrigeTokenMint(t *testing.T) {
//1st部署相关合约 // ctx := context.Background()
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts() // println("TEST:BridgeToken creation (Chain33 assets)")
require.NoError(t, err) // //1st部署相关合约
// para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
//2nd:订阅事件 // require.NoError(t, err)
eventName := "LogNewBridgeToken" //
bridgeBankABI := ethtxs.LoadABI(ethtxs.BridgeBankABI) // //2nd:订阅事件
logNewBridgeTokenSig := bridgeBankABI.Events[eventName].ID().Hex() // eventName := "LogNewBridgeToken"
query := ethereum.FilterQuery{ // bridgeBankABI := ethtxs.LoadABI(ethtxs.BridgeBankABI)
Addresses: []common.Address{x2EthDeployInfo.BridgeBank.Address}, // logNewBridgeTokenSig := bridgeBankABI.Events[eventName].ID.Hex()
} // query := ethereum.FilterQuery{
// We will check logs for new events // Addresses: []common.Address{x2EthDeployInfo.BridgeBank.Address},
logs := make(chan types.Log) // }
// Filter by contract and event, write results to logs // // We will check logs for new events
sub, err := sim.SubscribeFilterLogs(ctx, query, logs) // logs := make(chan types.Log)
require.Nil(t, err) // // Filter by contract and event, write results to logs
// sub, err := sim.SubscribeFilterLogs(ctx, query, logs)
opts := &bind.CallOpts{ // require.Nil(t, err)
Pending: true, //
From: para.Operator, // opts := &bind.CallOpts{
Context: ctx, // Pending: true,
} // From: para.Operator,
// Context: ctx,
tokenCount, err := x2EthContracts.BridgeBank.BridgeTokenCount(opts) // }
require.Nil(t, err) //
require.Equal(t, tokenCount.Int64(), int64(0)) // tokenCount, err := x2EthContracts.BridgeBank.BridgeTokenCount(opts)
// require.Nil(t, err)
//3rd:创建token // require.Equal(t, tokenCount.Int64(), int64(0))
symbol := "BTY" //
auth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator) // //3rd:创建token
if nil != err { // symbol := "BTY"
t.Fatalf("PrepareAuth failed due to:%s", err.Error()) // auth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
} // if nil != err {
_, err = x2EthContracts.BridgeBank.BridgeBankTransactor.CreateNewBridgeToken(auth, symbol) // t.Fatalf("PrepareAuth failed due to:%s", err.Error())
if nil != err { // }
t.Fatalf("CreateNewBridgeToken failed due to:%s", err.Error()) // _, err = x2EthContracts.BridgeBank.BridgeBankTransactor.CreateNewBridgeToken(auth, symbol)
} // if nil != err {
sim.Commit() // t.Fatalf("CreateNewBridgeToken failed due to:%s", err.Error())
// }
logEvent := &events.LogNewBridgeToken{} // sim.Commit()
select { //
// Handle any errors // logEvent := &events.LogNewBridgeToken{}
case err := <-sub.Err(): // select {
t.Fatalf("sub error:%s", err.Error()) // // Handle any errors
// vLog is raw event data // case err := <-sub.Err():
case vLog := <-logs: // t.Fatalf("sub error:%s", err.Error())
// Check if the event is a 'LogLock' event // // vLog is raw event data
if vLog.Topics[0].Hex() == logNewBridgeTokenSig { // case vLog := <-logs:
t.Logf("Witnessed new event:%s, Block number:%d, Tx hash:%s", eventName, // // Check if the event is a 'LogLock' event
vLog.BlockNumber, vLog.TxHash.Hex()) // if vLog.Topics[0].Hex() == logNewBridgeTokenSig {
// t.Logf("Witnessed new event:%s, Block number:%d, Tx hash:%s", eventName,
err = bridgeBankABI.Unpack(logEvent, eventName, vLog.Data) // vLog.BlockNumber, vLog.TxHash.Hex())
require.Nil(t, err) //
t.Logf("token addr:%s, symbol:%s", logEvent.Token.String(), logEvent.Symbol) // _, err = bridgeBankABI.Unpack(eventName, vLog.Data)
require.Equal(t, symbol, logEvent.Symbol) // require.Nil(t, err)
// t.Logf("token addr:%s, symbol:%s", logEvent.Token.String(), logEvent.Symbol)
//tokenCount正确加1 // require.Equal(t, symbol, logEvent.Symbol)
tokenCount, err = x2EthContracts.BridgeBank.BridgeTokenCount(opts) //
require.Nil(t, err) // //tokenCount正确加1
require.Equal(t, tokenCount.Int64(), int64(1)) // tokenCount, err = x2EthContracts.BridgeBank.BridgeTokenCount(opts)
break // require.Nil(t, err)
} // require.Equal(t, tokenCount.Int64(), int64(1))
} // break
// }
///////////newOracleClaim/////////////////////////// // }
balance, _ := sim.BalanceAt(ctx, para.InitValidators[0], nil) //
fmt.Println("InitValidators[0] addr,", para.InitValidators[0].String(), "balance =", balance.String()) // ///////////newOracleClaim///////////////////////////
// balance, _ := sim.BalanceAt(ctx, para.InitValidators[0], nil)
chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt") // fmt.Println("InitValidators[0] addr,", para.InitValidators[0].String(), "balance =", balance.String())
amount := int64(99) //
ethReceiver := para.InitValidators[2] // chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
claimID := crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), logEvent.Token.Bytes(), big.NewInt(amount).Bytes()) // amount := int64(99)
// ethReceiver := para.InitValidators[2]
authOracle, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0]) // claimID := crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), logEvent.Token.Bytes(), big.NewInt(amount).Bytes())
require.Nil(t, err) //
// authOracle, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
signature, err := ethtxs.SignClaim4Eth(claimID, para.ValidatorPriKey[0]) // require.Nil(t, err)
require.Nil(t, err) //
// signature, err := ethtxs.SignClaim4Eth(claimID, para.ValidatorPriKey[0])
bridgeToken, err := generated.NewBridgeToken(logEvent.Token, sim) // require.Nil(t, err)
require.Nil(t, err) //
opts = &bind.CallOpts{ // bridgeToken, err := generated.NewBridgeToken(logEvent.Token, sim)
Pending: true, // require.Nil(t, err)
Context: ctx, // opts = &bind.CallOpts{
} // Pending: true,
// Context: ctx,
balance, err = bridgeToken.BalanceOf(opts, ethReceiver) // }
require.Nil(t, err) //
require.Equal(t, balance.Int64(), int64(0)) // balance, err = bridgeToken.BalanceOf(opts, ethReceiver)
// require.Nil(t, err)
_, err = x2EthContracts.Oracle.NewOracleClaim( // require.Equal(t, balance.Int64(), int64(0))
authOracle, //
events.ClaimTypeLock, // _, err = x2EthContracts.Oracle.NewOracleClaim(
chain33Sender, // authOracle,
ethReceiver, // events.ClaimTypeLock,
logEvent.Token, // chain33Sender,
logEvent.Symbol, // ethReceiver,
big.NewInt(amount), // logEvent.Token,
claimID, // logEvent.Symbol,
signature) // big.NewInt(amount),
require.Nil(t, err) // claimID,
// signature)
sim.Commit() // require.Nil(t, err)
balance, err = bridgeToken.BalanceOf(opts, ethReceiver) //
require.Nil(t, err) // sim.Commit()
require.Equal(t, balance.Int64(), amount) // balance, err = bridgeToken.BalanceOf(opts, ethReceiver)
t.Logf("The minted amount is:%d", balance.Int64()) // require.Nil(t, err)
} // require.Equal(t, balance.Int64(), amount)
// t.Logf("The minted amount is:%d", balance.Int64())
//测试在以太坊上lock数字资产,包括Eth和Erc20 //}
//Bridge deposit locking (deposit erc20/eth assets) //
func TestBridgeDepositLock(t *testing.T) { ////测试在以太坊上lock数字资产,包括Eth和Erc20
ctx := context.Background() ////Bridge deposit locking (deposit erc20/eth assets)
println("TEST:Bridge deposit locking (Erc20/Eth assets)") //func TestBridgeDepositLock(t *testing.T) {
//1st部署相关合约 // ctx := context.Background()
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts() // println("TEST:Bridge deposit locking (Erc20/Eth assets)")
require.NoError(t, err) // //1st部署相关合约
// para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
//创建token // require.NoError(t, err)
operatorAuth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator) //
assert.Nil(t, err) // //创建token
symbol := "USDT" // operatorAuth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
bridgeTokenAddr, _, bridgeTokenInstance, err := generated.DeployBridgeToken(operatorAuth, sim, symbol) // assert.Nil(t, err)
require.Nil(t, err) // symbol := "USDT"
sim.Commit() // bridgeTokenAddr, _, bridgeTokenInstance, err := generated.DeployBridgeToken(operatorAuth, sim, symbol)
t.Logf("The new creaded symbol:%s, address:%s", symbol, bridgeTokenAddr.String()) // require.Nil(t, err)
// sim.Commit()
//创建实例 为userOne铸币 userOne为bridgebank允许allowance设置数额 // t.Logf("The new creaded symbol:%s, address:%s", symbol, bridgeTokenAddr.String())
userOne := para.InitValidators[0] //
callopts := &bind.CallOpts{ // //创建实例 为userOne铸币 userOne为bridgebank允许allowance设置数额
Pending: true, // userOne := para.InitValidators[0]
From: userOne, // callopts := &bind.CallOpts{
Context: ctx, // Pending: true,
} // From: userOne,
symQuery, err := bridgeTokenInstance.Symbol(callopts) // Context: ctx,
assert.Nil(t, err) // }
require.Equal(t, symQuery, symbol) // symQuery, err := bridgeTokenInstance.Symbol(callopts)
t.Logf("symQuery = %s", symQuery) // assert.Nil(t, err)
// require.Equal(t, symQuery, symbol)
isMiner, err := bridgeTokenInstance.IsMinter(callopts, para.Operator) // t.Logf("symQuery = %s", symQuery)
require.Nil(t, err) //
require.Equal(t, isMiner, true) // isMiner, err := bridgeTokenInstance.IsMinter(callopts, para.Operator)
// require.Nil(t, err)
operatorAuth, err = ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator) // require.Equal(t, isMiner, true)
require.Nil(t, err) //
// operatorAuth, err = ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
mintAmount := int64(1000) // require.Nil(t, err)
chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt") //
_, err = bridgeTokenInstance.Mint(operatorAuth, userOne, big.NewInt(mintAmount)) // mintAmount := int64(1000)
require.Nil(t, err) // chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
sim.Commit() // _, err = bridgeTokenInstance.Mint(operatorAuth, userOne, big.NewInt(mintAmount))
// require.Nil(t, err)
userOneAuth, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0]) // sim.Commit()
require.Nil(t, err) //
allowAmount := int64(100) // userOneAuth, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
_, err = bridgeTokenInstance.Approve(userOneAuth, x2EthDeployInfo.BridgeBank.Address, big.NewInt(allowAmount)) // require.Nil(t, err)
require.Nil(t, err) // allowAmount := int64(100)
sim.Commit() // _, err = bridgeTokenInstance.Approve(userOneAuth, x2EthDeployInfo.BridgeBank.Address, big.NewInt(allowAmount))
// require.Nil(t, err)
userOneBalance, err := bridgeTokenInstance.BalanceOf(callopts, userOne) // sim.Commit()
require.Nil(t, err) //
t.Logf("userOneBalance:%d", userOneBalance.Int64()) // userOneBalance, err := bridgeTokenInstance.BalanceOf(callopts, userOne)
require.Equal(t, userOneBalance.Int64(), mintAmount) // require.Nil(t, err)
// t.Logf("userOneBalance:%d", userOneBalance.Int64())
// 测试子项目:should allow users to lock ERC20 tokens // require.Equal(t, userOneBalance.Int64(), mintAmount)
userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0]) //
require.Nil(t, err) // // 测试子项目:should allow users to lock ERC20 tokens
// userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
//lock 100 // require.Nil(t, err)
lockAmount := big.NewInt(100) //
_, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, bridgeTokenAddr, lockAmount) // //lock 100
require.Nil(t, err) // lockAmount := big.NewInt(100)
sim.Commit() // _, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, bridgeTokenAddr, lockAmount)
// require.Nil(t, err)
//balance减少到900 // sim.Commit()
userOneBalance, err = bridgeTokenInstance.BalanceOf(callopts, userOne) //
require.Nil(t, err) // //balance减少到900
expectAmount := int64(900) // userOneBalance, err = bridgeTokenInstance.BalanceOf(callopts, userOne)
require.Equal(t, userOneBalance.Int64(), expectAmount) // require.Nil(t, err)
t.Logf("userOneBalance changes to:%d", userOneBalance.Int64()) // expectAmount := int64(900)
// require.Equal(t, userOneBalance.Int64(), expectAmount)
//bridgebank增加了100 // t.Logf("userOneBalance changes to:%d", userOneBalance.Int64())
bridgeBankBalance, err := bridgeTokenInstance.BalanceOf(callopts, x2EthDeployInfo.BridgeBank.Address) //
require.Nil(t, err) // //bridgebank增加了100
expectAmount = int64(100) // bridgeBankBalance, err := bridgeTokenInstance.BalanceOf(callopts, x2EthDeployInfo.BridgeBank.Address)
require.Equal(t, bridgeBankBalance.Int64(), expectAmount) // require.Nil(t, err)
t.Logf("bridgeBankBalance changes to:%d", bridgeBankBalance.Int64()) // expectAmount = int64(100)
// require.Equal(t, bridgeBankBalance.Int64(), expectAmount)
// 测试子项目:锁定ETH,should allow users to lock Ethereum // t.Logf("bridgeBankBalance changes to:%d", bridgeBankBalance.Int64())
bridgeBankBalance, err = sim.BalanceAt(ctx, x2EthDeployInfo.BridgeBank.Address, nil) //
require.Nil(t, err) // // 测试子项目:锁定ETH,should allow users to lock Ethereum
t.Logf("origin eth bridgeBankBalance is:%d", bridgeBankBalance.Int64()) // bridgeBankBalance, err = sim.BalanceAt(ctx, x2EthDeployInfo.BridgeBank.Address, nil)
// require.Nil(t, err)
userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0]) // t.Logf("origin eth bridgeBankBalance is:%d", bridgeBankBalance.Int64())
require.Nil(t, err) //
ethAmount := big.NewInt(50) // userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
userOneAuth.Value = ethAmount // require.Nil(t, err)
// ethAmount := big.NewInt(50)
//lock 50 eth // userOneAuth.Value = ethAmount
_, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, common.Address{}, ethAmount) //
require.Nil(t, err) // //lock 50 eth
sim.Commit() // _, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, common.Address{}, ethAmount)
// require.Nil(t, err)
bridgeBankBalance, err = sim.BalanceAt(ctx, x2EthDeployInfo.BridgeBank.Address, nil) // sim.Commit()
require.Nil(t, err) //
require.Equal(t, bridgeBankBalance.Int64(), ethAmount.Int64()) // bridgeBankBalance, err = sim.BalanceAt(ctx, x2EthDeployInfo.BridgeBank.Address, nil)
t.Logf("eth bridgeBankBalance changes to:%d", bridgeBankBalance.Int64()) // require.Nil(t, err)
} // require.Equal(t, bridgeBankBalance.Int64(), ethAmount.Int64())
// t.Logf("eth bridgeBankBalance changes to:%d", bridgeBankBalance.Int64())
//测试在以太坊上unlock数字资产,包括Eth和Erc20, //}
//即从chain33取回在eth上发行的的ETH或ERC20数字资产,之前通过lock操作发送到了chain33 //
//现在则通过NewProphecyClaim 的burn操作将数字资产取回 ////测试在以太坊上unlock数字资产,包括Eth和Erc20,
//Ethereum/ERC20 token unlocking (for burned chain33 assets) ////即从chain33取回在eth上发行的的ETH或ERC20数字资产,之前通过lock操作发送到了chain33
func TestBridgeBankUnlock(t *testing.T) { ////现在则通过NewProphecyClaim 的burn操作将数字资产取回
ctx := context.Background() ////Ethereum/ERC20 token unlocking (for burned chain33 assets)
println("TEST:Ethereum/ERC20 token unlocking (for burned chain33 assets)") //func TestBridgeBankUnlock(t *testing.T) {
//1st部署相关合约 // ctx := context.Background()
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts() // println("TEST:Ethereum/ERC20 token unlocking (for burned chain33 assets)")
require.NoError(t, err) // //1st部署相关合约
//1.lockEth资产 // para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
ethAddr := common.Address{} // require.NoError(t, err)
userOneAuth, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0]) // //1.lockEth资产
require.Nil(t, err) // ethAddr := common.Address{}
// userOneAuth, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
ethLockAmount := big.NewInt(150) // require.Nil(t, err)
userOneAuth.Value = ethLockAmount //
chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt") // ethLockAmount := big.NewInt(150)
//lock 150 eth // userOneAuth.Value = ethLockAmount
_, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, common.Address{}, ethLockAmount) // chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
require.Nil(t, err) // //lock 150 eth
sim.Commit() // _, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, common.Address{}, ethLockAmount)
// require.Nil(t, err)
//2.lockErc20资产 // sim.Commit()
//创建token //
operatorAuth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator) // //2.lockErc20资产
assert.Nil(t, err) // //创建token
symbolUsdt := "USDT" // operatorAuth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
bridgeTokenAddr, _, bridgeTokenInstance, err := generated.DeployBridgeToken(operatorAuth, sim, symbolUsdt) // assert.Nil(t, err)
require.Nil(t, err) // symbolUsdt := "USDT"
sim.Commit() // bridgeTokenAddr, _, bridgeTokenInstance, err := generated.DeployBridgeToken(operatorAuth, sim, symbolUsdt)
t.Logf("The new creaded symbolUsdt:%s, address:%s", symbolUsdt, bridgeTokenAddr.String()) // require.Nil(t, err)
// sim.Commit()
//创建实例 // t.Logf("The new creaded symbolUsdt:%s, address:%s", symbolUsdt, bridgeTokenAddr.String())
//为userOne铸币 //
//userOne为bridgebank允许allowance设置数额 // //创建实例
userOne := para.InitValidators[0] // //为userOne铸币
callopts := &bind.CallOpts{ // //userOne为bridgebank允许allowance设置数额
Pending: true, // userOne := para.InitValidators[0]
From: userOne, // callopts := &bind.CallOpts{
Context: ctx, // Pending: true,
} // From: userOne,
symQuery, err := bridgeTokenInstance.Symbol(callopts) // Context: ctx,
assert.Nil(t, err) // }
require.Equal(t, symQuery, symbolUsdt) // symQuery, err := bridgeTokenInstance.Symbol(callopts)
t.Logf("symQuery = %s", symQuery) // assert.Nil(t, err)
// require.Equal(t, symQuery, symbolUsdt)
isMiner, err := bridgeTokenInstance.IsMinter(callopts, para.Operator) // t.Logf("symQuery = %s", symQuery)
require.Nil(t, err) //
require.Equal(t, isMiner, true) // isMiner, err := bridgeTokenInstance.IsMinter(callopts, para.Operator)
// require.Nil(t, err)
operatorAuth, err = ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator) // require.Equal(t, isMiner, true)
assert.Nil(t, err) //
mintAmount := int64(1000) // operatorAuth, err = ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
_, err = bridgeTokenInstance.Mint(operatorAuth, userOne, big.NewInt(mintAmount)) // assert.Nil(t, err)
require.Nil(t, err) // mintAmount := int64(1000)
sim.Commit() // _, err = bridgeTokenInstance.Mint(operatorAuth, userOne, big.NewInt(mintAmount))
// require.Nil(t, err)
userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0]) // sim.Commit()
assert.Nil(t, err) //
allowAmount := int64(100) // userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
_, err = bridgeTokenInstance.Approve(userOneAuth, x2EthDeployInfo.BridgeBank.Address, big.NewInt(allowAmount)) // assert.Nil(t, err)
require.Nil(t, err) // allowAmount := int64(100)
sim.Commit() // _, err = bridgeTokenInstance.Approve(userOneAuth, x2EthDeployInfo.BridgeBank.Address, big.NewInt(allowAmount))
// require.Nil(t, err)
userOneBalance, err := bridgeTokenInstance.BalanceOf(callopts, userOne) // sim.Commit()
require.Nil(t, err) //
t.Logf("userOneBalance:%d", userOneBalance.Int64()) // userOneBalance, err := bridgeTokenInstance.BalanceOf(callopts, userOne)
require.Equal(t, userOneBalance.Int64(), mintAmount) // require.Nil(t, err)
// t.Logf("userOneBalance:%d", userOneBalance.Int64())
//***测试子项目:should allow users to lock ERC20 tokens // require.Equal(t, userOneBalance.Int64(), mintAmount)
userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0]) //
require.Nil(t, err) // //***测试子项目:should allow users to lock ERC20 tokens
// userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
//lock 100 // require.Nil(t, err)
lockAmount := big.NewInt(100) //
_, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, bridgeTokenAddr, lockAmount) // //lock 100
require.Nil(t, err) // lockAmount := big.NewInt(100)
sim.Commit() // _, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, bridgeTokenAddr, lockAmount)
// require.Nil(t, err)
// newOracleClaim // sim.Commit()
newProphecyAmount := int64(55) //
ethReceiver := para.InitValidators[2] // // newOracleClaim
ethSym := "eth" // newProphecyAmount := int64(55)
claimID := crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), ethAddr.Bytes(), big.NewInt(newProphecyAmount).Bytes()) // ethReceiver := para.InitValidators[2]
// ethSym := "eth"
authOracle, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0]) // claimID := crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), ethAddr.Bytes(), big.NewInt(newProphecyAmount).Bytes())
require.Nil(t, err) //
// authOracle, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
signature, err := ethtxs.SignClaim4Eth(claimID, para.ValidatorPriKey[0]) // require.Nil(t, err)
require.Nil(t, err) //
// signature, err := ethtxs.SignClaim4Eth(claimID, para.ValidatorPriKey[0])
_, err = x2EthContracts.Oracle.NewOracleClaim( // require.Nil(t, err)
authOracle, //
events.ClaimTypeBurn, // _, err = x2EthContracts.Oracle.NewOracleClaim(
chain33Sender, // authOracle,
ethReceiver, // events.ClaimTypeBurn,
ethAddr, // chain33Sender,
ethSym, // ethReceiver,
big.NewInt(newProphecyAmount), // ethAddr,
claimID, // ethSym,
signature) // big.NewInt(newProphecyAmount),
require.Nil(t, err) // claimID,
// signature)
userEthbalance, _ := sim.BalanceAt(ctx, ethReceiver, nil) // require.Nil(t, err)
t.Logf("userEthbalance for addr:%s balance=%d", ethReceiver.String(), userEthbalance.Int64()) //
// userEthbalance, _ := sim.BalanceAt(ctx, ethReceiver, nil)
sim.Commit() // t.Logf("userEthbalance for addr:%s balance=%d", ethReceiver.String(), userEthbalance.Int64())
userEthbalanceAfter, _ := sim.BalanceAt(ctx, ethReceiver, nil) //
t.Logf("userEthbalance after ProcessBridgeProphecy for addr:%s balance=%d", ethReceiver.String(), userEthbalanceAfter.Int64()) // sim.Commit()
require.Equal(t, userEthbalance.Int64()+newProphecyAmount, userEthbalanceAfter.Int64()) // userEthbalanceAfter, _ := sim.BalanceAt(ctx, ethReceiver, nil)
// t.Logf("userEthbalance after ProcessBridgeProphecy for addr:%s balance=%d", ethReceiver.String(), userEthbalanceAfter.Int64())
////////////////////////////////////////////////////////////////// // require.Equal(t, userEthbalance.Int64()+newProphecyAmount, userEthbalanceAfter.Int64())
///////should unlock and transfer ERC20 tokens upon the processing of a burn prophecy////// //
////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////
// newOracleClaim // ///////should unlock and transfer ERC20 tokens upon the processing of a burn prophecy//////
newProphecyAmount = int64(100) // //////////////////////////////////////////////////////////////////
ethReceiver = para.InitValidators[2] // // newOracleClaim
claimID = crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), bridgeTokenAddr.Bytes(), big.NewInt(newProphecyAmount).Bytes()) // newProphecyAmount = int64(100)
// ethReceiver = para.InitValidators[2]
authOracle, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0]) // claimID = crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), bridgeTokenAddr.Bytes(), big.NewInt(newProphecyAmount).Bytes())
require.Nil(t, err) //
// authOracle, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
signature, err = ethtxs.SignClaim4Eth(claimID, para.ValidatorPriKey[0]) // require.Nil(t, err)
require.Nil(t, err) //
// signature, err = ethtxs.SignClaim4Eth(claimID, para.ValidatorPriKey[0])
_, err = x2EthContracts.Oracle.NewOracleClaim( // require.Nil(t, err)
authOracle, //
events.ClaimTypeBurn, // _, err = x2EthContracts.Oracle.NewOracleClaim(
chain33Sender, // authOracle,
ethReceiver, // events.ClaimTypeBurn,
bridgeTokenAddr, // chain33Sender,
symbolUsdt, // ethReceiver,
big.NewInt(newProphecyAmount), // bridgeTokenAddr,
claimID, // symbolUsdt,
signature) // big.NewInt(newProphecyAmount),
require.Nil(t, err) // claimID,
// signature)
userUSDTbalance, err := bridgeTokenInstance.BalanceOf(callopts, ethReceiver) // require.Nil(t, err)
require.Nil(t, err) //
t.Logf("userEthbalance for addr:%s balance=%d", ethReceiver.String(), userUSDTbalance.Int64()) // userUSDTbalance, err := bridgeTokenInstance.BalanceOf(callopts, ethReceiver)
require.Equal(t, userUSDTbalance.Int64(), newProphecyAmount) // require.Nil(t, err)
} // t.Logf("userEthbalance for addr:%s balance=%d", ethReceiver.String(), userUSDTbalance.Int64())
// require.Equal(t, userUSDTbalance.Int64(), newProphecyAmount)
//测试在以太坊上多次unlock数字资产Eth //}
//Ethereum/ERC20 token second unlocking (for burned chain33 assets) //
func TestBridgeBankSecondUnlockEth(t *testing.T) { ////测试在以太坊上多次unlock数字资产Eth
ctx := context.Background() ////Ethereum/ERC20 token second unlocking (for burned chain33 assets)
println("TEST:to be unlocked incrementally by successive burn prophecies (for burned chain33 assets)") //func TestBridgeBankSecondUnlockEth(t *testing.T) {
//1st部署相关合约 // ctx := context.Background()
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts() // println("TEST:to be unlocked incrementally by successive burn prophecies (for burned chain33 assets)")
require.NoError(t, err) // //1st部署相关合约
// para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
//1.lockEth资产 // require.NoError(t, err)
ethAddr := common.Address{} //
userOneAuth, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0]) // //1.lockEth资产
require.Nil(t, err) // ethAddr := common.Address{}
// userOneAuth, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
ethLockAmount := big.NewInt(150) // require.Nil(t, err)
userOneAuth.Value = ethLockAmount //
chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt") // ethLockAmount := big.NewInt(150)
//lock 150 eth // userOneAuth.Value = ethLockAmount
_, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, common.Address{}, ethLockAmount) // chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
require.Nil(t, err) // //lock 150 eth
sim.Commit() // _, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, common.Address{}, ethLockAmount)
// require.Nil(t, err)
//2.lockErc20资产 // sim.Commit()
//创建token //
operatorAuth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator) // //2.lockErc20资产
assert.Nil(t, err) // //创建token
symbolUsdt := "USDT" // operatorAuth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
bridgeTokenAddr, _, bridgeTokenInstance, err := generated.DeployBridgeToken(operatorAuth, sim, symbolUsdt) // assert.Nil(t, err)
require.Nil(t, err) // symbolUsdt := "USDT"
sim.Commit() // bridgeTokenAddr, _, bridgeTokenInstance, err := generated.DeployBridgeToken(operatorAuth, sim, symbolUsdt)
t.Logf("The new creaded symbolUsdt:%s, address:%s", symbolUsdt, bridgeTokenAddr.String()) // require.Nil(t, err)
// sim.Commit()
//创建实例 // t.Logf("The new creaded symbolUsdt:%s, address:%s", symbolUsdt, bridgeTokenAddr.String())
//为userOne铸币 //
//userOne为bridgebank允许allowance设置数额 // //创建实例
userOne := para.InitValidators[0] // //为userOne铸币
callopts := &bind.CallOpts{ // //userOne为bridgebank允许allowance设置数额
Pending: true, // userOne := para.InitValidators[0]
From: userOne, // callopts := &bind.CallOpts{
Context: ctx, // Pending: true,
} // From: userOne,
symQuery, err := bridgeTokenInstance.Symbol(callopts) // Context: ctx,
assert.Nil(t, err) // }
require.Equal(t, symQuery, symbolUsdt) // symQuery, err := bridgeTokenInstance.Symbol(callopts)
t.Logf("symQuery = %s", symQuery) // assert.Nil(t, err)
// require.Equal(t, symQuery, symbolUsdt)
isMiner, err := bridgeTokenInstance.IsMinter(callopts, para.Operator) // t.Logf("symQuery = %s", symQuery)
require.Nil(t, err) //
require.Equal(t, isMiner, true) // isMiner, err := bridgeTokenInstance.IsMinter(callopts, para.Operator)
// require.Nil(t, err)
operatorAuth, err = ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator) // require.Equal(t, isMiner, true)
require.Nil(t, err) //
mintAmount := int64(1000) // operatorAuth, err = ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
_, err = bridgeTokenInstance.Mint(operatorAuth, userOne, big.NewInt(mintAmount)) // require.Nil(t, err)
require.Nil(t, err) // mintAmount := int64(1000)
sim.Commit() // _, err = bridgeTokenInstance.Mint(operatorAuth, userOne, big.NewInt(mintAmount))
// require.Nil(t, err)
userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0]) // sim.Commit()
assert.Nil(t, err) //
allowAmount := int64(100) // userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
_, err = bridgeTokenInstance.Approve(userOneAuth, x2EthDeployInfo.BridgeBank.Address, big.NewInt(allowAmount)) // assert.Nil(t, err)
require.Nil(t, err) // allowAmount := int64(100)
sim.Commit() // _, err = bridgeTokenInstance.Approve(userOneAuth, x2EthDeployInfo.BridgeBank.Address, big.NewInt(allowAmount))
// require.Nil(t, err)
userOneBalance, err := bridgeTokenInstance.BalanceOf(callopts, userOne) // sim.Commit()
require.Nil(t, err) //
t.Logf("userOneBalance:%d", userOneBalance.Int64()) // userOneBalance, err := bridgeTokenInstance.BalanceOf(callopts, userOne)
require.Equal(t, userOneBalance.Int64(), mintAmount) // require.Nil(t, err)
// t.Logf("userOneBalance:%d", userOneBalance.Int64())
//***测试子项目:should allow users to lock ERC20 tokens // require.Equal(t, userOneBalance.Int64(), mintAmount)
userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0]) //
require.Nil(t, err) // //***测试子项目:should allow users to lock ERC20 tokens
// userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
//lock 100 // require.Nil(t, err)
lockAmount := big.NewInt(100) //
_, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, bridgeTokenAddr, lockAmount) // //lock 100
require.Nil(t, err) // lockAmount := big.NewInt(100)
sim.Commit() // _, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, bridgeTokenAddr, lockAmount)
// require.Nil(t, err)
// newOracleClaim // sim.Commit()
newProphecyAmount := int64(44) //
ethReceiver := para.InitValidators[2] // // newOracleClaim
ethSym := "eth" // newProphecyAmount := int64(44)
claimID := crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), ethAddr.Bytes(), big.NewInt(newProphecyAmount).Bytes()) // ethReceiver := para.InitValidators[2]
// ethSym := "eth"
authOracle, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0]) // claimID := crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), ethAddr.Bytes(), big.NewInt(newProphecyAmount).Bytes())
require.Nil(t, err) //
// authOracle, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
signature, err := ethtxs.SignClaim4Eth(claimID, para.ValidatorPriKey[0]) // require.Nil(t, err)
require.Nil(t, err) //
// signature, err := ethtxs.SignClaim4Eth(claimID, para.ValidatorPriKey[0])
_, err = x2EthContracts.Oracle.NewOracleClaim( // require.Nil(t, err)
authOracle, //
events.ClaimTypeBurn, // _, err = x2EthContracts.Oracle.NewOracleClaim(
chain33Sender, // authOracle,
ethReceiver, // events.ClaimTypeBurn,
ethAddr, // chain33Sender,
ethSym, // ethReceiver,
big.NewInt(newProphecyAmount), // ethAddr,
claimID, // ethSym,
signature) // big.NewInt(newProphecyAmount),
require.Nil(t, err) // claimID,
// signature)
userEthbalance, _ := sim.BalanceAt(ctx, ethReceiver, nil) // require.Nil(t, err)
t.Logf("userEthbalance for addr:%s balance=%d", ethReceiver.String(), userEthbalance.Int64()) //
// userEthbalance, _ := sim.BalanceAt(ctx, ethReceiver, nil)
sim.Commit() // t.Logf("userEthbalance for addr:%s balance=%d", ethReceiver.String(), userEthbalance.Int64())
//
userEthbalanceAfter, _ := sim.BalanceAt(ctx, ethReceiver, nil) // sim.Commit()
t.Logf("userEthbalance after ProcessBridgeProphecy for addr:%s balance=%d", ethReceiver.String(), userEthbalanceAfter.Int64()) //
require.Equal(t, userEthbalance.Int64()+newProphecyAmount, userEthbalanceAfter.Int64()) // userEthbalanceAfter, _ := sim.BalanceAt(ctx, ethReceiver, nil)
// t.Logf("userEthbalance after ProcessBridgeProphecy for addr:%s balance=%d", ethReceiver.String(), userEthbalanceAfter.Int64())
//第二次 newOracleClaim // require.Equal(t, userEthbalance.Int64()+newProphecyAmount, userEthbalanceAfter.Int64())
newProphecyAmountSecond := int64(33) //
claimID = crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), ethAddr.Bytes(), big.NewInt(newProphecyAmountSecond).Bytes()) // //第二次 newOracleClaim
authOracle, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0]) // newProphecyAmountSecond := int64(33)
require.Nil(t, err) // claimID = crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), ethAddr.Bytes(), big.NewInt(newProphecyAmountSecond).Bytes())
// authOracle, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
signature, err = ethtxs.SignClaim4Eth(claimID, para.ValidatorPriKey[0]) // require.Nil(t, err)
require.Nil(t, err) //
// signature, err = ethtxs.SignClaim4Eth(claimID, para.ValidatorPriKey[0])
_, err = x2EthContracts.Oracle.NewOracleClaim( // require.Nil(t, err)
authOracle, //
events.ClaimTypeBurn, // _, err = x2EthContracts.Oracle.NewOracleClaim(
chain33Sender, // authOracle,
ethReceiver, // events.ClaimTypeBurn,
ethAddr, // chain33Sender,
ethSym, // ethReceiver,
big.NewInt(newProphecyAmountSecond), // ethAddr,
claimID, // ethSym,
signature) // big.NewInt(newProphecyAmountSecond),
require.Nil(t, err) // claimID,
// signature)
userEthbalance, _ = sim.BalanceAt(ctx, ethReceiver, nil) // require.Nil(t, err)
t.Logf("userEthbalance for addr:%s balance=%d", ethReceiver.String(), userEthbalance.Int64()) //
// userEthbalance, _ = sim.BalanceAt(ctx, ethReceiver, nil)
sim.Commit() // t.Logf("userEthbalance for addr:%s balance=%d", ethReceiver.String(), userEthbalance.Int64())
userEthbalanceAfter, _ = sim.BalanceAt(ctx, ethReceiver, nil) //
t.Logf("userEthbalance after ProcessBridgeProphecy for addr:%s balance=%d", ethReceiver.String(), userEthbalanceAfter.Int64()) // sim.Commit()
require.Equal(t, userEthbalance.Int64()+newProphecyAmountSecond, userEthbalanceAfter.Int64()) // userEthbalanceAfter, _ = sim.BalanceAt(ctx, ethReceiver, nil)
} // t.Logf("userEthbalance after ProcessBridgeProphecy for addr:%s balance=%d", ethReceiver.String(), userEthbalanceAfter.Int64())
// require.Equal(t, userEthbalance.Int64()+newProphecyAmountSecond, userEthbalanceAfter.Int64())
//测试在以太坊上多次unlock数字资产Erc20 //}
//Ethereum/ERC20 token unlocking (for burned chain33 assets) //
func TestBridgeBankSedondUnlockErc20(t *testing.T) { ////测试在以太坊上多次unlock数字资产Erc20
ctx := context.Background() ////Ethereum/ERC20 token unlocking (for burned chain33 assets)
println("TEST:ERC20 to be unlocked incrementally by successive burn prophecies (for burned chain33 assets))") //func TestBridgeBankSedondUnlockErc20(t *testing.T) {
//1st部署相关合约 // ctx := context.Background()
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts() // println("TEST:ERC20 to be unlocked incrementally by successive burn prophecies (for burned chain33 assets))")
require.NoError(t, err) // //1st部署相关合约
// para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
//1.lockEth资产 // require.NoError(t, err)
userOneAuth, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0]) //
require.Nil(t, err) // //1.lockEth资产
ethLockAmount := big.NewInt(150) // userOneAuth, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
userOneAuth.Value = ethLockAmount // require.Nil(t, err)
chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt") // ethLockAmount := big.NewInt(150)
//lock 150 eth // userOneAuth.Value = ethLockAmount
_, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, common.Address{}, ethLockAmount) // chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
require.Nil(t, err) // //lock 150 eth
sim.Commit() // _, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, common.Address{}, ethLockAmount)
// require.Nil(t, err)
//2.lockErc20资产 // sim.Commit()
//创建token //
operatorAuth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator) // //2.lockErc20资产
assert.Nil(t, err) // //创建token
symbolUsdt := "USDT" // operatorAuth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
bridgeTokenAddr, _, bridgeTokenInstance, err := generated.DeployBridgeToken(operatorAuth, sim, symbolUsdt) // assert.Nil(t, err)
require.Nil(t, err) // symbolUsdt := "USDT"
sim.Commit() // bridgeTokenAddr, _, bridgeTokenInstance, err := generated.DeployBridgeToken(operatorAuth, sim, symbolUsdt)
t.Logf("The new creaded symbolUsdt:%s, address:%s", symbolUsdt, bridgeTokenAddr.String()) // require.Nil(t, err)
// sim.Commit()
//创建实例 为userOne铸币 userOne为bridgebank允许allowance设置数额 // t.Logf("The new creaded symbolUsdt:%s, address:%s", symbolUsdt, bridgeTokenAddr.String())
userOne := para.InitValidators[0] //
callopts := &bind.CallOpts{ // //创建实例 为userOne铸币 userOne为bridgebank允许allowance设置数额
Pending: true, // userOne := para.InitValidators[0]
From: userOne, // callopts := &bind.CallOpts{
Context: ctx, // Pending: true,
} // From: userOne,
symQuery, err := bridgeTokenInstance.Symbol(callopts) // Context: ctx,
assert.Nil(t, err) // }
require.Equal(t, symQuery, symbolUsdt) // symQuery, err := bridgeTokenInstance.Symbol(callopts)
t.Logf("symQuery = %s", symQuery) // assert.Nil(t, err)
isMiner, err := bridgeTokenInstance.IsMinter(callopts, para.Operator) // require.Equal(t, symQuery, symbolUsdt)
require.Nil(t, err) // t.Logf("symQuery = %s", symQuery)
require.Equal(t, isMiner, true) // isMiner, err := bridgeTokenInstance.IsMinter(callopts, para.Operator)
// require.Nil(t, err)
operatorAuth, err = ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator) // require.Equal(t, isMiner, true)
require.Nil(t, err) //
mintAmount := int64(1000) // operatorAuth, err = ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
_, err = bridgeTokenInstance.Mint(operatorAuth, userOne, big.NewInt(mintAmount)) // require.Nil(t, err)
require.Nil(t, err) // mintAmount := int64(1000)
sim.Commit() // _, err = bridgeTokenInstance.Mint(operatorAuth, userOne, big.NewInt(mintAmount))
// require.Nil(t, err)
userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0]) // sim.Commit()
require.Nil(t, err) //
allowAmount := int64(100) // userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
_, err = bridgeTokenInstance.Approve(userOneAuth, x2EthDeployInfo.BridgeBank.Address, big.NewInt(allowAmount)) // require.Nil(t, err)
require.Nil(t, err) // allowAmount := int64(100)
sim.Commit() // _, err = bridgeTokenInstance.Approve(userOneAuth, x2EthDeployInfo.BridgeBank.Address, big.NewInt(allowAmount))
// require.Nil(t, err)
userOneBalance, err := bridgeTokenInstance.BalanceOf(callopts, userOne) // sim.Commit()
require.Nil(t, err) //
t.Logf("userOneBalance:%d", userOneBalance.Int64()) // userOneBalance, err := bridgeTokenInstance.BalanceOf(callopts, userOne)
require.Equal(t, userOneBalance.Int64(), mintAmount) // require.Nil(t, err)
// t.Logf("userOneBalance:%d", userOneBalance.Int64())
//测试子项目:should allow users to lock ERC20 tokens // require.Equal(t, userOneBalance.Int64(), mintAmount)
userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0]) //
require.Nil(t, err) // //测试子项目:should allow users to lock ERC20 tokens
//lock 100 // userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
lockAmount := big.NewInt(100) // require.Nil(t, err)
_, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, bridgeTokenAddr, lockAmount) // //lock 100
require.Nil(t, err) // lockAmount := big.NewInt(100)
sim.Commit() // _, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, bridgeTokenAddr, lockAmount)
// require.Nil(t, err)
// newOracleClaim // sim.Commit()
newProphecyAmount := int64(33) //
ethReceiver := para.InitValidators[2] // // newOracleClaim
claimID := crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), bridgeTokenAddr.Bytes(), big.NewInt(newProphecyAmount).Bytes()) // newProphecyAmount := int64(33)
// ethReceiver := para.InitValidators[2]
userUSDTbalance0, err := bridgeTokenInstance.BalanceOf(callopts, ethReceiver) // claimID := crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), bridgeTokenAddr.Bytes(), big.NewInt(newProphecyAmount).Bytes())
require.Nil(t, err) //
t.Logf("userEthbalance for addr:%s balance=%d", ethReceiver.String(), userUSDTbalance0.Int64()) // userUSDTbalance0, err := bridgeTokenInstance.BalanceOf(callopts, ethReceiver)
require.Equal(t, userUSDTbalance0.Int64(), int64(0)) // require.Nil(t, err)
// t.Logf("userEthbalance for addr:%s balance=%d", ethReceiver.String(), userUSDTbalance0.Int64())
///////////newOracleClaim/////////////////////////// // require.Equal(t, userUSDTbalance0.Int64(), int64(0))
authOracle, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0]) //
require.Nil(t, err) // ///////////newOracleClaim///////////////////////////
// authOracle, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
signature, err := ethtxs.SignClaim4Eth(claimID, para.ValidatorPriKey[0]) // require.Nil(t, err)
require.Nil(t, err) //
_, err = x2EthContracts.Oracle.NewOracleClaim( // signature, err := ethtxs.SignClaim4Eth(claimID, para.ValidatorPriKey[0])
authOracle, // require.Nil(t, err)
events.ClaimTypeBurn, // _, err = x2EthContracts.Oracle.NewOracleClaim(
chain33Sender, // authOracle,
ethReceiver, // events.ClaimTypeBurn,
bridgeTokenAddr, // chain33Sender,
symbolUsdt, // ethReceiver,
big.NewInt(newProphecyAmount), // bridgeTokenAddr,
claimID, // symbolUsdt,
signature) // big.NewInt(newProphecyAmount),
require.Nil(t, err) // claimID,
// signature)
userUSDTbalance1, err := bridgeTokenInstance.BalanceOf(callopts, ethReceiver) // require.Nil(t, err)
require.Nil(t, err) //
t.Logf("userEthbalance for addr:%s balance=%d", ethReceiver.String(), userUSDTbalance1.Int64()) // userUSDTbalance1, err := bridgeTokenInstance.BalanceOf(callopts, ethReceiver)
require.Equal(t, userUSDTbalance1.Int64(), userUSDTbalance0.Int64()+newProphecyAmount) // require.Nil(t, err)
// t.Logf("userEthbalance for addr:%s balance=%d", ethReceiver.String(), userUSDTbalance1.Int64())
// newOracleClaim // require.Equal(t, userUSDTbalance1.Int64(), userUSDTbalance0.Int64()+newProphecyAmount)
newProphecyAmountSecond := int64(66) //
claimID = crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), bridgeTokenAddr.Bytes(), big.NewInt(newProphecyAmountSecond).Bytes()) // // newOracleClaim
authOracle, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0]) // newProphecyAmountSecond := int64(66)
require.Nil(t, err) // claimID = crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), bridgeTokenAddr.Bytes(), big.NewInt(newProphecyAmountSecond).Bytes())
// authOracle, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
signature, err = ethtxs.SignClaim4Eth(claimID, para.ValidatorPriKey[0]) // require.Nil(t, err)
require.Nil(t, err) //
_, err = x2EthContracts.Oracle.NewOracleClaim( // signature, err = ethtxs.SignClaim4Eth(claimID, para.ValidatorPriKey[0])
authOracle, // require.Nil(t, err)
events.ClaimTypeBurn, // _, err = x2EthContracts.Oracle.NewOracleClaim(
chain33Sender, // authOracle,
ethReceiver, // events.ClaimTypeBurn,
bridgeTokenAddr, // chain33Sender,
symbolUsdt, // ethReceiver,
big.NewInt(newProphecyAmountSecond), // bridgeTokenAddr,
claimID, // symbolUsdt,
signature) // big.NewInt(newProphecyAmountSecond),
require.Nil(t, err) // claimID,
// signature)
userUSDTbalance2, err := bridgeTokenInstance.BalanceOf(callopts, ethReceiver) // require.Nil(t, err)
require.Nil(t, err) //
t.Logf("userEthbalance for addr:%s balance=%d", ethReceiver.String(), userUSDTbalance2.Int64()) // userUSDTbalance2, err := bridgeTokenInstance.BalanceOf(callopts, ethReceiver)
require.Equal(t, userUSDTbalance2.Int64(), userUSDTbalance1.Int64()+newProphecyAmountSecond) // require.Nil(t, err)
} // t.Logf("userEthbalance for addr:%s balance=%d", ethReceiver.String(), userUSDTbalance2.Int64())
// require.Equal(t, userUSDTbalance2.Int64(), userUSDTbalance1.Int64()+newProphecyAmountSecond)
//}
...@@ -34,7 +34,7 @@ func CreateBridgeToken(symbol string, client ethinterface.EthClientSpec, para *O ...@@ -34,7 +34,7 @@ func CreateBridgeToken(symbol string, client ethinterface.EthClientSpec, para *O
//订阅事件 //订阅事件
eventName := "LogNewBridgeToken" eventName := "LogNewBridgeToken"
bridgeBankABI := LoadABI(BridgeBankABI) bridgeBankABI := LoadABI(BridgeBankABI)
logNewBridgeTokenSig := bridgeBankABI.Events[eventName].ID().Hex() logNewBridgeTokenSig := bridgeBankABI.Events[eventName].ID.Hex()
query := ethereum.FilterQuery{ query := ethereum.FilterQuery{
Addresses: []common.Address{x2EthDeployInfo.BridgeBank.Address}, Addresses: []common.Address{x2EthDeployInfo.BridgeBank.Address},
} }
...@@ -90,7 +90,7 @@ func CreateBridgeToken(symbol string, client ethinterface.EthClientSpec, para *O ...@@ -90,7 +90,7 @@ func CreateBridgeToken(symbol string, client ethinterface.EthClientSpec, para *O
if vLog.Topics[0].Hex() == logNewBridgeTokenSig { if vLog.Topics[0].Hex() == logNewBridgeTokenSig {
txslog.Debug("CreateBrigeToken", "Witnessed new event", eventName, "Block number", vLog.BlockNumber) txslog.Debug("CreateBrigeToken", "Witnessed new event", eventName, "Block number", vLog.BlockNumber)
err = bridgeBankABI.Unpack(logEvent, eventName, vLog.Data) err = bridgeBankABI.UnpackIntoInterface(logEvent, eventName, vLog.Data)
if nil != err { if nil != err {
return "", err return "", err
} }
......
package ethtxs package ethtxs
import ( //
"context" //import (
"crypto/ecdsa" // "context"
"fmt" // "crypto/ecdsa"
"math/big" // "fmt"
"strings" // "math/big"
"testing" // "strings"
// "testing"
chain33Types "github.com/33cn/chain33/types" //
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethcontract/generated" // chain33Types "github.com/33cn/chain33/types"
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethinterface" // "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethcontract/generated"
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/events" // "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethinterface"
ebrelayerTypes "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/types" // "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/events"
"github.com/33cn/plugin/plugin/dapp/x2ethereum/types" // ebrelayerTypes "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/types"
x2ethTypes "github.com/33cn/plugin/plugin/dapp/x2ethereum/types" // "github.com/33cn/plugin/plugin/dapp/x2ethereum/types"
"github.com/ethereum/go-ethereum" // x2ethTypes "github.com/33cn/plugin/plugin/dapp/x2ethereum/types"
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends" // "github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/common" // "github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
"github.com/ethereum/go-ethereum/common/hexutil" // "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core" // "github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/crypto" // "github.com/ethereum/go-ethereum/core"
"github.com/stretchr/testify/assert" // "github.com/ethereum/go-ethereum/crypto"
"github.com/stretchr/testify/require" // "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/suite" // "github.com/stretchr/testify/require"
) // "github.com/stretchr/testify/suite"
//)
var ( //
chain33Addr = "14KEKbYtKKQm4wMthSK9J4La4nAiidGozt" //var (
ethAddr = "0x92C8b16aFD6d423652559C6E266cBE1c29Bfd84f" // chain33Addr = "14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
ethTokenAddr = "0x0000000000000000000000000000000000000000" // ethAddr = "0x92C8b16aFD6d423652559C6E266cBE1c29Bfd84f"
) // ethTokenAddr = "0x0000000000000000000000000000000000000000"
//)
type suiteContracts struct { //
suite.Suite //type suiteContracts struct {
para *DeployPara // suite.Suite
sim *ethinterface.SimExtend // para *DeployPara
x2EthContracts *X2EthContracts // sim *ethinterface.SimExtend
x2EthDeployInfo *X2EthDeployInfo // x2EthContracts *X2EthContracts
} // x2EthDeployInfo *X2EthDeployInfo
//}
func TestRunSuiteX2Ethereum(t *testing.T) { //
log := new(suiteContracts) //func TestRunSuiteX2Ethereum(t *testing.T) {
suite.Run(t, log) // log := new(suiteContracts)
} // suite.Run(t, log)
//}
func (c *suiteContracts) SetupSuite() { //
var err error //func (c *suiteContracts) SetupSuite() {
c.para, c.sim, c.x2EthContracts, c.x2EthDeployInfo, err = DeployContracts() // var err error
require.Nil(c.T(), err) // c.para, c.sim, c.x2EthContracts, c.x2EthDeployInfo, err = DeployContracts()
} // require.Nil(c.T(), err)
//}
func (c *suiteContracts) Test_GetOperator() { //
operator, err := GetOperator(c.sim, c.para.InitValidators[0], c.x2EthDeployInfo.BridgeBank.Address) //func (c *suiteContracts) Test_GetOperator() {
require.Nil(c.T(), err) // operator, err := GetOperator(c.sim, c.para.InitValidators[0], c.x2EthDeployInfo.BridgeBank.Address)
assert.Equal(c.T(), operator.String(), c.para.Operator.String()) // require.Nil(c.T(), err)
} // assert.Equal(c.T(), operator.String(), c.para.Operator.String())
//}
func (c *suiteContracts) Test_IsActiveValidator() { //
bret, err := IsActiveValidator(c.para.InitValidators[0], c.x2EthContracts.Valset) //func (c *suiteContracts) Test_IsActiveValidator() {
require.Nil(c.T(), err) // bret, err := IsActiveValidator(c.para.InitValidators[0], c.x2EthContracts.Valset)
assert.Equal(c.T(), bret, true) // require.Nil(c.T(), err)
// assert.Equal(c.T(), bret, true)
key, _ := crypto.GenerateKey() //
addr := crypto.PubkeyToAddress(key.PublicKey) // key, _ := crypto.GenerateKey()
bret, err = IsActiveValidator(addr, c.x2EthContracts.Valset) // addr := crypto.PubkeyToAddress(key.PublicKey)
require.Nil(c.T(), err) // ??? // bret, err = IsActiveValidator(addr, c.x2EthContracts.Valset)
assert.Equal(c.T(), bret, false) // require.Nil(c.T(), err) // ???
} // assert.Equal(c.T(), bret, false)
//}
func (c *suiteContracts) Test_IsProphecyPending() { //
claimID := crypto.Keccak256Hash(big.NewInt(50).Bytes()) //func (c *suiteContracts) Test_IsProphecyPending() {
bret, err := IsProphecyPending(claimID, c.para.InitValidators[0], c.x2EthContracts.Chain33Bridge) // claimID := crypto.Keccak256Hash(big.NewInt(50).Bytes())
require.Nil(c.T(), err) // bret, err := IsProphecyPending(claimID, c.para.InitValidators[0], c.x2EthContracts.Chain33Bridge)
assert.Equal(c.T(), bret, false) // require.Nil(c.T(), err)
} // assert.Equal(c.T(), bret, false)
//}
func (c *suiteContracts) Test_LogLockToEthBridgeClaim() { //
to := common.FromHex(chain33Addr) //func (c *suiteContracts) Test_LogLockToEthBridgeClaim() {
event := &events.LockEvent{ // to := common.FromHex(chain33Addr)
From: c.para.InitValidators[0], // event := &events.LockEvent{
To: to, // From: c.para.InitValidators[0],
Token: common.HexToAddress(ethTokenAddr), // To: to,
Symbol: "eth", // Token: common.HexToAddress(ethTokenAddr),
Value: big.NewInt(10000 * 10000 * 10000), // Symbol: "eth",
Nonce: big.NewInt(1), // Value: big.NewInt(10000 * 10000 * 10000),
} // Nonce: big.NewInt(1),
witnessClaim, err := LogLockToEthBridgeClaim(event, 1, c.x2EthDeployInfo.BridgeBank.Address.String(), 18) // }
require.Nil(c.T(), err) // witnessClaim, err := LogLockToEthBridgeClaim(event, 1, c.x2EthDeployInfo.BridgeBank.Address.String(), 18)
assert.NotEmpty(c.T(), witnessClaim) // require.Nil(c.T(), err)
assert.Equal(c.T(), witnessClaim.EthereumChainID, int64(1)) // assert.NotEmpty(c.T(), witnessClaim)
assert.Equal(c.T(), witnessClaim.BridgeBrankAddr, c.x2EthDeployInfo.BridgeBank.Address.String()) // assert.Equal(c.T(), witnessClaim.EthereumChainID, int64(1))
assert.Equal(c.T(), witnessClaim.TokenAddr, ethTokenAddr) // assert.Equal(c.T(), witnessClaim.BridgeBrankAddr, c.x2EthDeployInfo.BridgeBank.Address.String())
assert.Equal(c.T(), witnessClaim.Symbol, event.Symbol) // assert.Equal(c.T(), witnessClaim.TokenAddr, ethTokenAddr)
assert.Equal(c.T(), witnessClaim.EthereumSender, event.From.String()) // assert.Equal(c.T(), witnessClaim.Symbol, event.Symbol)
assert.Equal(c.T(), witnessClaim.Chain33Receiver, string(event.To)) // assert.Equal(c.T(), witnessClaim.EthereumSender, event.From.String())
assert.Equal(c.T(), witnessClaim.Amount, "100") // assert.Equal(c.T(), witnessClaim.Chain33Receiver, string(event.To))
assert.Equal(c.T(), witnessClaim.Nonce, event.Nonce.Int64()) // assert.Equal(c.T(), witnessClaim.Amount, "100")
assert.Equal(c.T(), witnessClaim.Decimal, int64(18)) // assert.Equal(c.T(), witnessClaim.Nonce, event.Nonce.Int64())
// assert.Equal(c.T(), witnessClaim.Decimal, int64(18))
event.Token = common.HexToAddress("0x0000000000000000000000000000000000000001") //
_, err = LogLockToEthBridgeClaim(event, 1, c.x2EthDeployInfo.BridgeBank.Address.String(), 18) // event.Token = common.HexToAddress("0x0000000000000000000000000000000000000001")
require.NotNil(c.T(), err) // _, err = LogLockToEthBridgeClaim(event, 1, c.x2EthDeployInfo.BridgeBank.Address.String(), 18)
assert.Equal(c.T(), err, ebrelayerTypes.ErrAddress4Eth) // require.NotNil(c.T(), err)
} // assert.Equal(c.T(), err, ebrelayerTypes.ErrAddress4Eth)
//}
func (c *suiteContracts) Test_LogBurnToEthBridgeClaim() { //
to := common.FromHex(chain33Addr) //func (c *suiteContracts) Test_LogBurnToEthBridgeClaim() {
event := &events.BurnEvent{ // to := common.FromHex(chain33Addr)
OwnerFrom: c.para.InitValidators[0], // event := &events.BurnEvent{
Chain33Receiver: to, // OwnerFrom: c.para.InitValidators[0],
Token: common.HexToAddress(ethTokenAddr), // Chain33Receiver: to,
Symbol: "bty", // Token: common.HexToAddress(ethTokenAddr),
Amount: big.NewInt(100), // Symbol: "bty",
Nonce: big.NewInt(2), // Amount: big.NewInt(100),
} // Nonce: big.NewInt(2),
witnessClaim, err := LogBurnToEthBridgeClaim(event, 1, c.x2EthDeployInfo.BridgeBank.Address.String(), 8) // }
require.Nil(c.T(), err) // witnessClaim, err := LogBurnToEthBridgeClaim(event, 1, c.x2EthDeployInfo.BridgeBank.Address.String(), 8)
assert.NotEmpty(c.T(), witnessClaim) // require.Nil(c.T(), err)
assert.Equal(c.T(), witnessClaim.EthereumChainID, int64(1)) // assert.NotEmpty(c.T(), witnessClaim)
assert.Equal(c.T(), witnessClaim.BridgeBrankAddr, c.x2EthDeployInfo.BridgeBank.Address.String()) // assert.Equal(c.T(), witnessClaim.EthereumChainID, int64(1))
assert.Equal(c.T(), witnessClaim.TokenAddr, ethTokenAddr) // assert.Equal(c.T(), witnessClaim.BridgeBrankAddr, c.x2EthDeployInfo.BridgeBank.Address.String())
assert.Equal(c.T(), witnessClaim.Symbol, event.Symbol) // assert.Equal(c.T(), witnessClaim.TokenAddr, ethTokenAddr)
assert.Equal(c.T(), witnessClaim.EthereumSender, event.OwnerFrom.String()) // assert.Equal(c.T(), witnessClaim.Symbol, event.Symbol)
assert.Equal(c.T(), witnessClaim.Chain33Receiver, string(event.Chain33Receiver)) // assert.Equal(c.T(), witnessClaim.EthereumSender, event.OwnerFrom.String())
assert.Equal(c.T(), witnessClaim.Amount, "100") // assert.Equal(c.T(), witnessClaim.Chain33Receiver, string(event.Chain33Receiver))
assert.Equal(c.T(), witnessClaim.Nonce, event.Nonce.Int64()) // assert.Equal(c.T(), witnessClaim.Amount, "100")
assert.Equal(c.T(), witnessClaim.Decimal, int64(8)) // assert.Equal(c.T(), witnessClaim.Nonce, event.Nonce.Int64())
} // assert.Equal(c.T(), witnessClaim.Decimal, int64(8))
//}
func (c *suiteContracts) Test_ParseBurnLockTxReceipt_Chain33MsgToProphecyClaim() { //
claimType := events.MsgBurn //func (c *suiteContracts) Test_ParseBurnLockTxReceipt_Chain33MsgToProphecyClaim() {
chain33ToEth := types.ReceiptChain33ToEth{ // claimType := events.MsgBurn
Chain33Sender: chain33Addr, // chain33ToEth := types.ReceiptChain33ToEth{
EthereumReceiver: ethAddr, // Chain33Sender: chain33Addr,
TokenContract: ethTokenAddr, // EthereumReceiver: ethAddr,
IssuerDotSymbol: "bty", // TokenContract: ethTokenAddr,
Amount: "100", // IssuerDotSymbol: "bty",
Decimals: 8, // Amount: "100",
} // Decimals: 8,
// }
log := &chain33Types.ReceiptLog{ //
Ty: types.TyWithdrawChain33Log, // log := &chain33Types.ReceiptLog{
Log: chain33Types.Encode(&chain33ToEth), // Ty: types.TyWithdrawChain33Log,
} // Log: chain33Types.Encode(&chain33ToEth),
// }
var logs []*chain33Types.ReceiptLog //
logs = append(logs, log) // var logs []*chain33Types.ReceiptLog
// logs = append(logs, log)
receipt := &chain33Types.ReceiptData{ //
Ty: types.TyWithdrawChain33Log, // receipt := &chain33Types.ReceiptData{
Logs: logs, // Ty: types.TyWithdrawChain33Log,
} // Logs: logs,
// }
chain33Msg := ParseBurnLockTxReceipt(claimType, receipt) //
require.NotNil(c.T(), chain33Msg) // chain33Msg := ParseBurnLockTxReceipt(claimType, receipt)
assert.Equal(c.T(), chain33Msg.ClaimType, claimType) // require.NotNil(c.T(), chain33Msg)
assert.Equal(c.T(), chain33Msg.Chain33Sender, []byte(chain33ToEth.Chain33Sender)) // assert.Equal(c.T(), chain33Msg.ClaimType, claimType)
assert.Equal(c.T(), chain33Msg.EthereumReceiver, common.HexToAddress(chain33ToEth.EthereumReceiver)) // assert.Equal(c.T(), chain33Msg.Chain33Sender, []byte(chain33ToEth.Chain33Sender))
assert.Equal(c.T(), chain33Msg.TokenContractAddress, common.HexToAddress(chain33ToEth.TokenContract)) // assert.Equal(c.T(), chain33Msg.EthereumReceiver, common.HexToAddress(chain33ToEth.EthereumReceiver))
assert.Equal(c.T(), chain33Msg.Symbol, chain33ToEth.IssuerDotSymbol) // assert.Equal(c.T(), chain33Msg.TokenContractAddress, common.HexToAddress(chain33ToEth.TokenContract))
assert.Equal(c.T(), chain33Msg.Amount.String(), "100") // assert.Equal(c.T(), chain33Msg.Symbol, chain33ToEth.IssuerDotSymbol)
// assert.Equal(c.T(), chain33Msg.Amount.String(), "100")
prophecyClaim := Chain33MsgToProphecyClaim(*chain33Msg) //
assert.Equal(c.T(), chain33Msg.ClaimType, prophecyClaim.ClaimType) // prophecyClaim := Chain33MsgToProphecyClaim(*chain33Msg)
assert.Equal(c.T(), chain33Msg.Chain33Sender, prophecyClaim.Chain33Sender) // assert.Equal(c.T(), chain33Msg.ClaimType, prophecyClaim.ClaimType)
assert.Equal(c.T(), chain33Msg.EthereumReceiver, prophecyClaim.EthereumReceiver) // assert.Equal(c.T(), chain33Msg.Chain33Sender, prophecyClaim.Chain33Sender)
assert.Equal(c.T(), chain33Msg.TokenContractAddress, prophecyClaim.TokenContractAddress) // assert.Equal(c.T(), chain33Msg.EthereumReceiver, prophecyClaim.EthereumReceiver)
assert.Equal(c.T(), strings.ToLower(chain33Msg.Symbol), prophecyClaim.Symbol) // assert.Equal(c.T(), chain33Msg.TokenContractAddress, prophecyClaim.TokenContractAddress)
assert.Equal(c.T(), chain33Msg.Amount, prophecyClaim.Amount) // assert.Equal(c.T(), strings.ToLower(chain33Msg.Symbol), prophecyClaim.Symbol)
} // assert.Equal(c.T(), chain33Msg.Amount, prophecyClaim.Amount)
//}
func (c *suiteContracts) Test_RecoverContractHandler() { //
_, _, err := RecoverContractHandler(c.sim, c.x2EthDeployInfo.BridgeRegistry.Address, c.x2EthDeployInfo.BridgeRegistry.Address) //func (c *suiteContracts) Test_RecoverContractHandler() {
require.Nil(c.T(), err) // _, _, err := RecoverContractHandler(c.sim, c.x2EthDeployInfo.BridgeRegistry.Address, c.x2EthDeployInfo.BridgeRegistry.Address)
} // require.Nil(c.T(), err)
//}
func (c *suiteContracts) Test_RecoverOracleInstance() { //
oracleInstance, err := RecoverOracleInstance(c.sim, c.x2EthDeployInfo.BridgeRegistry.Address, c.x2EthDeployInfo.BridgeRegistry.Address) //func (c *suiteContracts) Test_RecoverOracleInstance() {
require.Nil(c.T(), err) // oracleInstance, err := RecoverOracleInstance(c.sim, c.x2EthDeployInfo.BridgeRegistry.Address, c.x2EthDeployInfo.BridgeRegistry.Address)
require.NotNil(c.T(), oracleInstance) // require.Nil(c.T(), err)
} // require.NotNil(c.T(), oracleInstance)
//}
func (c *suiteContracts) Test_GetDeployHeight() { //
height, err := GetDeployHeight(c.sim, c.x2EthDeployInfo.BridgeRegistry.Address, c.x2EthDeployInfo.BridgeRegistry.Address) //func (c *suiteContracts) Test_GetDeployHeight() {
require.Nil(c.T(), err) // height, err := GetDeployHeight(c.sim, c.x2EthDeployInfo.BridgeRegistry.Address, c.x2EthDeployInfo.BridgeRegistry.Address)
assert.True(c.T(), height > 0) // require.Nil(c.T(), err)
} // assert.True(c.T(), height > 0)
//}
func (c *suiteContracts) Test_CreateBridgeToken() { //
operatorInfo := &OperatorInfo{ //func (c *suiteContracts) Test_CreateBridgeToken() {
PrivateKey: c.para.DeployPrivateKey, // operatorInfo := &OperatorInfo{
Address: crypto.PubkeyToAddress(c.para.DeployPrivateKey.PublicKey), // PrivateKey: c.para.DeployPrivateKey,
} // Address: crypto.PubkeyToAddress(c.para.DeployPrivateKey.PublicKey),
tokenAddr, err := CreateBridgeToken("bty", c.sim, operatorInfo, c.x2EthDeployInfo, c.x2EthContracts) // }
require.Nil(c.T(), err) // tokenAddr, err := CreateBridgeToken("bty", c.sim, operatorInfo, c.x2EthDeployInfo, c.x2EthContracts)
c.sim.Commit() // require.Nil(c.T(), err)
// c.sim.Commit()
addr, err := GetToken2address(c.x2EthContracts.BridgeBank, "bty") //
require.Nil(c.T(), err) // addr, err := GetToken2address(c.x2EthContracts.BridgeBank, "bty")
assert.Equal(c.T(), addr, tokenAddr) // require.Nil(c.T(), err)
// assert.Equal(c.T(), addr, tokenAddr)
chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt") //
amount := int64(100) // chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
ethReceiver := c.para.InitValidators[2] // amount := int64(100)
claimID := crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), big.NewInt(amount).Bytes()) // ethReceiver := c.para.InitValidators[2]
authOracle, err := PrepareAuth(c.sim, c.para.ValidatorPriKey[0], c.para.InitValidators[0]) // claimID := crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), big.NewInt(amount).Bytes())
require.Nil(c.T(), err) // authOracle, err := PrepareAuth(c.sim, c.para.ValidatorPriKey[0], c.para.InitValidators[0])
signature, err := SignClaim4Eth(claimID, c.para.ValidatorPriKey[0]) // require.Nil(c.T(), err)
require.Nil(c.T(), err) // signature, err := SignClaim4Eth(claimID, c.para.ValidatorPriKey[0])
// require.Nil(c.T(), err)
_, err = c.x2EthContracts.Oracle.NewOracleClaim( //
authOracle, // _, err = c.x2EthContracts.Oracle.NewOracleClaim(
events.ClaimTypeLock, // authOracle,
chain33Sender, // events.ClaimTypeLock,
ethReceiver, // chain33Sender,
common.HexToAddress(tokenAddr), // ethReceiver,
"bty", // common.HexToAddress(tokenAddr),
big.NewInt(amount), // "bty",
claimID, // big.NewInt(amount),
signature) // claimID,
require.Nil(c.T(), err) // signature)
c.sim.Commit() // require.Nil(c.T(), err)
// c.sim.Commit()
balanceNew, err := GetBalance(c.sim, tokenAddr, ethReceiver.String()) //
require.Nil(c.T(), err) // balanceNew, err := GetBalance(c.sim, tokenAddr, ethReceiver.String())
require.Equal(c.T(), balanceNew, "100") // require.Nil(c.T(), err)
// require.Equal(c.T(), balanceNew, "100")
chain33Receiver := "1GTxrmuWiXavhcvsaH5w9whgVxUrWsUMdV" //
{ // chain33Receiver := "1GTxrmuWiXavhcvsaH5w9whgVxUrWsUMdV"
amount := "10" // {
bn := big.NewInt(1) // amount := "10"
bn, _ = bn.SetString(x2ethTypes.TrimZeroAndDot(amount), 10) // bn := big.NewInt(1)
txhash, err := Burn(hexutil.Encode(crypto.FromECDSA(c.para.ValidatorPriKey[2])), tokenAddr, chain33Receiver, c.x2EthDeployInfo.BridgeBank.Address, bn, c.x2EthContracts.BridgeBank, c.sim) // bn, _ = bn.SetString(x2ethTypes.TrimZeroAndDot(amount), 10)
require.NoError(c.T(), err) // txhash, err := Burn(hexutil.Encode(crypto.FromECDSA(c.para.ValidatorPriKey[2])), tokenAddr, chain33Receiver, c.x2EthDeployInfo.BridgeBank.Address, bn, c.x2EthContracts.BridgeBank, c.sim)
c.sim.Commit() // require.NoError(c.T(), err)
// c.sim.Commit()
balanceNew, err = GetBalance(c.sim, tokenAddr, ethReceiver.String()) //
require.Nil(c.T(), err) // balanceNew, err = GetBalance(c.sim, tokenAddr, ethReceiver.String())
require.Equal(c.T(), balanceNew, "90") // require.Nil(c.T(), err)
// require.Equal(c.T(), balanceNew, "90")
status := GetEthTxStatus(c.sim, common.HexToHash(txhash)) //
fmt.Println() // status := GetEthTxStatus(c.sim, common.HexToHash(txhash))
fmt.Println(status) // fmt.Println()
} // fmt.Println(status)
// }
{ //
amount := "10" // {
bn := big.NewInt(1) // amount := "10"
bn, _ = bn.SetString(x2ethTypes.TrimZeroAndDot(amount), 10) // bn := big.NewInt(1)
_, err := ApproveAllowance(hexutil.Encode(crypto.FromECDSA(c.para.ValidatorPriKey[2])), tokenAddr, c.x2EthDeployInfo.BridgeBank.Address, bn, c.sim) // bn, _ = bn.SetString(x2ethTypes.TrimZeroAndDot(amount), 10)
require.Nil(c.T(), err) // _, err := ApproveAllowance(hexutil.Encode(crypto.FromECDSA(c.para.ValidatorPriKey[2])), tokenAddr, c.x2EthDeployInfo.BridgeBank.Address, bn, c.sim)
c.sim.Commit() // require.Nil(c.T(), err)
// c.sim.Commit()
_, err = BurnAsync(hexutil.Encode(crypto.FromECDSA(c.para.ValidatorPriKey[2])), tokenAddr, chain33Receiver, bn, c.x2EthContracts.BridgeBank, c.sim) //
require.Nil(c.T(), err) // _, err = BurnAsync(hexutil.Encode(crypto.FromECDSA(c.para.ValidatorPriKey[2])), tokenAddr, chain33Receiver, bn, c.x2EthContracts.BridgeBank, c.sim)
c.sim.Commit() // require.Nil(c.T(), err)
// c.sim.Commit()
balanceNew, err = GetBalance(c.sim, tokenAddr, ethReceiver.String()) //
require.Nil(c.T(), err) // balanceNew, err = GetBalance(c.sim, tokenAddr, ethReceiver.String())
require.Equal(c.T(), balanceNew, "80") // require.Nil(c.T(), err)
} // require.Equal(c.T(), balanceNew, "80")
} // }
//}
func (c *suiteContracts) Test_CreateERC20Token() { //
operatorInfo := &OperatorInfo{ //func (c *suiteContracts) Test_CreateERC20Token() {
PrivateKey: c.para.DeployPrivateKey, // operatorInfo := &OperatorInfo{
Address: crypto.PubkeyToAddress(c.para.DeployPrivateKey.PublicKey), // PrivateKey: c.para.DeployPrivateKey,
} // Address: crypto.PubkeyToAddress(c.para.DeployPrivateKey.PublicKey),
tokenAddr, err := CreateERC20Token("testc", c.sim, operatorInfo) // }
require.Nil(c.T(), err) // tokenAddr, err := CreateERC20Token("testc", c.sim, operatorInfo)
c.sim.Commit() // require.Nil(c.T(), err)
// c.sim.Commit()
amount := "10000000000000" //
bn := big.NewInt(1) // amount := "10000000000000"
bn, _ = bn.SetString(x2ethTypes.TrimZeroAndDot(amount), 10) // bn := big.NewInt(1)
// bn, _ = bn.SetString(x2ethTypes.TrimZeroAndDot(amount), 10)
_, err = MintERC20Token(tokenAddr, c.para.Deployer.String(), bn, c.sim, operatorInfo) //
require.Nil(c.T(), err) // _, err = MintERC20Token(tokenAddr, c.para.Deployer.String(), bn, c.sim, operatorInfo)
c.sim.Commit() // require.Nil(c.T(), err)
// c.sim.Commit()
balance, err := GetDepositFunds(c.sim, tokenAddr) //
require.Nil(c.T(), err) // balance, err := GetDepositFunds(c.sim, tokenAddr)
assert.Equal(c.T(), balance, amount) // require.Nil(c.T(), err)
// assert.Equal(c.T(), balance, amount)
amount = "100" //
bn = big.NewInt(1) // amount = "100"
bn, _ = bn.SetString(x2ethTypes.TrimZeroAndDot(amount), 10) // bn = big.NewInt(1)
txhash, err := TransferToken(tokenAddr, hexutil.Encode(crypto.FromECDSA(c.para.DeployPrivateKey)), c.para.InitValidators[0].String(), bn, c.sim) // bn, _ = bn.SetString(x2ethTypes.TrimZeroAndDot(amount), 10)
require.Nil(c.T(), err) // txhash, err := TransferToken(tokenAddr, hexutil.Encode(crypto.FromECDSA(c.para.DeployPrivateKey)), c.para.InitValidators[0].String(), bn, c.sim)
c.sim.Commit() // require.Nil(c.T(), err)
// c.sim.Commit()
_, err = c.sim.TransactionReceipt(context.Background(), common.HexToHash(txhash)) //
require.Nil(c.T(), err) // _, err = c.sim.TransactionReceipt(context.Background(), common.HexToHash(txhash))
balance, err = GetBalance(c.sim, tokenAddr, c.para.InitValidators[0].String()) // require.Nil(c.T(), err)
require.Nil(c.T(), err) // balance, err = GetBalance(c.sim, tokenAddr, c.para.InitValidators[0].String())
assert.Equal(c.T(), balance, amount) // require.Nil(c.T(), err)
// assert.Equal(c.T(), balance, amount)
{ //
amount = "100" // {
bn := big.NewInt(1) // amount = "100"
bn, _ = bn.SetString(x2ethTypes.TrimZeroAndDot(amount), 10) // bn := big.NewInt(1)
chain33Receiver := "14KEKbYtKKQm4wMthSK9J4La4nAiidGozt" // bn, _ = bn.SetString(x2ethTypes.TrimZeroAndDot(amount), 10)
_, err = LockEthErc20Asset(hexutil.Encode(crypto.FromECDSA(c.para.DeployPrivateKey)), tokenAddr, chain33Receiver, bn, c.sim, c.x2EthContracts.BridgeBank, c.x2EthDeployInfo.BridgeBank.Address) // chain33Receiver := "14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
require.Nil(c.T(), err) // _, err = LockEthErc20Asset(hexutil.Encode(crypto.FromECDSA(c.para.DeployPrivateKey)), tokenAddr, chain33Receiver, bn, c.sim, c.x2EthContracts.BridgeBank, c.x2EthDeployInfo.BridgeBank.Address)
c.sim.Commit() // require.Nil(c.T(), err)
// c.sim.Commit()
balance, err = GetBalance(c.sim, tokenAddr, c.para.Deployer.String()) //
require.Nil(c.T(), err) // balance, err = GetBalance(c.sim, tokenAddr, c.para.Deployer.String())
fmt.Println(balance) // require.Nil(c.T(), err)
assert.Equal(c.T(), balance, "9999999999800") // fmt.Println(balance)
} // assert.Equal(c.T(), balance, "9999999999800")
// }
{ //
amount := "800" // {
bn := big.NewInt(1) // amount := "800"
bn, _ = bn.SetString(x2ethTypes.TrimZeroAndDot(amount), 10) // bn := big.NewInt(1)
_, err = ApproveAllowance(hexutil.Encode(crypto.FromECDSA(c.para.DeployPrivateKey)), tokenAddr, c.x2EthDeployInfo.BridgeBank.Address, bn, c.sim) // bn, _ = bn.SetString(x2ethTypes.TrimZeroAndDot(amount), 10)
require.Nil(c.T(), err) // _, err = ApproveAllowance(hexutil.Encode(crypto.FromECDSA(c.para.DeployPrivateKey)), tokenAddr, c.x2EthDeployInfo.BridgeBank.Address, bn, c.sim)
c.sim.Commit() // require.Nil(c.T(), err)
// c.sim.Commit()
chain33Receiver := "14KEKbYtKKQm4wMthSK9J4La4nAiidGozt" //
_, err = LockEthErc20AssetAsync(hexutil.Encode(crypto.FromECDSA(c.para.DeployPrivateKey)), tokenAddr, chain33Receiver, bn, c.sim, c.x2EthContracts.BridgeBank) // chain33Receiver := "14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
require.Nil(c.T(), err) // _, err = LockEthErc20AssetAsync(hexutil.Encode(crypto.FromECDSA(c.para.DeployPrivateKey)), tokenAddr, chain33Receiver, bn, c.sim, c.x2EthContracts.BridgeBank)
c.sim.Commit() // require.Nil(c.T(), err)
// c.sim.Commit()
balance, err = GetBalance(c.sim, tokenAddr, c.para.Deployer.String()) //
require.Nil(c.T(), err) // balance, err = GetBalance(c.sim, tokenAddr, c.para.Deployer.String())
fmt.Println(balance) // require.Nil(c.T(), err)
assert.Equal(c.T(), balance, "9999999999000") // fmt.Println(balance)
} // assert.Equal(c.T(), balance, "9999999999000")
} // }
//}
func (c *suiteContracts) Test_GetLockedFunds() { //
balance, err := GetLockedFunds(c.x2EthContracts.BridgeBank, "") //func (c *suiteContracts) Test_GetLockedFunds() {
require.Nil(c.T(), err) // balance, err := GetLockedFunds(c.x2EthContracts.BridgeBank, "")
assert.Equal(c.T(), balance, "0") // require.Nil(c.T(), err)
} // assert.Equal(c.T(), balance, "0")
//}
func PrepareTestEnv() (*ethinterface.SimExtend, *DeployPara) { //
genesiskey, _ := crypto.GenerateKey() //func PrepareTestEnv() (*ethinterface.SimExtend, *DeployPara) {
alloc := make(core.GenesisAlloc) // genesiskey, _ := crypto.GenerateKey()
genesisAddr := crypto.PubkeyToAddress(genesiskey.PublicKey) // alloc := make(core.GenesisAlloc)
genesisAccount := core.GenesisAccount{ // genesisAddr := crypto.PubkeyToAddress(genesiskey.PublicKey)
Balance: big.NewInt(10000000000 * 10000), // genesisAccount := core.GenesisAccount{
PrivateKey: crypto.FromECDSA(genesiskey), // Balance: big.NewInt(10000000000 * 10000),
} // PrivateKey: crypto.FromECDSA(genesiskey),
alloc[genesisAddr] = genesisAccount // }
// alloc[genesisAddr] = genesisAccount
var InitValidators []common.Address //
var ValidatorPriKey []*ecdsa.PrivateKey // var InitValidators []common.Address
for i := 0; i < 4; i++ { // var ValidatorPriKey []*ecdsa.PrivateKey
key, _ := crypto.GenerateKey() // for i := 0; i < 4; i++ {
addr := crypto.PubkeyToAddress(key.PublicKey) // key, _ := crypto.GenerateKey()
InitValidators = append(InitValidators, addr) // addr := crypto.PubkeyToAddress(key.PublicKey)
ValidatorPriKey = append(ValidatorPriKey, key) // InitValidators = append(InitValidators, addr)
// ValidatorPriKey = append(ValidatorPriKey, key)
account := core.GenesisAccount{ //
Balance: big.NewInt(100000000 * 100), // account := core.GenesisAccount{
PrivateKey: crypto.FromECDSA(key), // Balance: big.NewInt(100000000 * 100),
} // PrivateKey: crypto.FromECDSA(key),
alloc[addr] = account // }
} // alloc[addr] = account
gasLimit := uint64(100000000) // }
sim := new(ethinterface.SimExtend) // gasLimit := uint64(100000000)
sim.SimulatedBackend = backends.NewSimulatedBackend(alloc, gasLimit) // sim := new(ethinterface.SimExtend)
// sim.SimulatedBackend = backends.NewSimulatedBackend(alloc, gasLimit)
InitPowers := []*big.Int{big.NewInt(80), big.NewInt(10), big.NewInt(10), big.NewInt(10)} //
para := &DeployPara{ // InitPowers := []*big.Int{big.NewInt(80), big.NewInt(10), big.NewInt(10), big.NewInt(10)}
DeployPrivateKey: genesiskey, // para := &DeployPara{
Deployer: genesisAddr, // DeployPrivateKey: genesiskey,
Operator: genesisAddr, // Deployer: genesisAddr,
InitValidators: InitValidators, // Operator: genesisAddr,
ValidatorPriKey: ValidatorPriKey, // InitValidators: InitValidators,
InitPowers: InitPowers, // ValidatorPriKey: ValidatorPriKey,
} // InitPowers: InitPowers,
// }
return sim, para //
} // return sim, para
//}
func DeployContracts() (*DeployPara, *ethinterface.SimExtend, *X2EthContracts, *X2EthDeployInfo, error) { //
ctx := context.Background() //func DeployContracts() (*DeployPara, *ethinterface.SimExtend, *X2EthContracts, *X2EthDeployInfo, error) {
sim, para := PrepareTestEnv() // ctx := context.Background()
// sim, para := PrepareTestEnv()
callMsg := ethereum.CallMsg{ //
From: para.Deployer, // callMsg := ethereum.CallMsg{
Data: common.FromHex(generated.BridgeBankBin), // From: para.Deployer,
} // Data: common.FromHex(generated.BridgeBankBin),
// }
_, err := sim.EstimateGas(ctx, callMsg) //
if nil != err { // _, err := sim.EstimateGas(ctx, callMsg)
panic("failed to estimate gas due to:" + err.Error()) // if nil != err {
} // panic("failed to estimate gas due to:" + err.Error())
x2EthContracts, x2EthDeployInfo, err := DeployAndInit(sim, para) // }
if nil != err { // x2EthContracts, x2EthDeployInfo, err := DeployAndInit(sim, para)
return nil, nil, nil, nil, err // if nil != err {
} // return nil, nil, nil, nil, err
sim.Commit() // }
// sim.Commit()
return para, sim, x2EthContracts, x2EthDeployInfo, nil //
} // return para, sim, x2EthContracts, x2EthDeployInfo, nil
//}
package ethtxs package ethtxs
import ( //
"context" //import (
"crypto/ecdsa" // "context"
"math/big" // "crypto/ecdsa"
"testing" // "math/big"
// "testing"
chain33Common "github.com/33cn/chain33/common" //
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethcontract/generated" // chain33Common "github.com/33cn/chain33/common"
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethinterface" // "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethcontract/generated"
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/events" // "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethinterface"
"github.com/ethereum/go-ethereum" // "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/events"
"github.com/ethereum/go-ethereum/accounts/abi/bind" // "github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends" // "github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common" // "github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
"github.com/ethereum/go-ethereum/core" // "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto" // "github.com/ethereum/go-ethereum/core"
"github.com/stretchr/testify/assert" // "github.com/ethereum/go-ethereum/crypto"
"github.com/stretchr/testify/require" // "github.com/stretchr/testify/assert"
) // "github.com/stretchr/testify/require"
//)
func Test_LoadABI(t *testing.T) { //
abi1 := LoadABI(Chain33BankABI) //func Test_LoadABI(t *testing.T) {
abi2 := LoadABI(Chain33BridgeABI) // abi1 := LoadABI(Chain33BankABI)
abi3 := LoadABI(EthereumBankABI) // abi2 := LoadABI(Chain33BridgeABI)
assert.NotEmpty(t, abi1, abi2, abi3) // abi3 := LoadABI(EthereumBankABI)
} // assert.NotEmpty(t, abi1, abi2, abi3)
//}
func Test_isWebsocketURL(t *testing.T) { //
bret := isWebsocketURL("ws://127.0.0.1:7545/") //func Test_isWebsocketURL(t *testing.T) {
assert.Equal(t, bret, true) // bret := isWebsocketURL("ws://127.0.0.1:7545/")
// assert.Equal(t, bret, true)
bret = isWebsocketURL("https://127.0.0.1:7545/") //
assert.Equal(t, bret, false) // bret = isWebsocketURL("https://127.0.0.1:7545/")
} // assert.Equal(t, bret, false)
//}
func TestContractRegistry_String(t *testing.T) { //
assert.Equal(t, Valset.String(), "valset") //func TestContractRegistry_String(t *testing.T) {
assert.Equal(t, Oracle.String(), "oracle") // assert.Equal(t, Valset.String(), "valset")
assert.Equal(t, BridgeBank.String(), "bridgebank") // assert.Equal(t, Oracle.String(), "oracle")
assert.Equal(t, Chain33Bridge.String(), "chain33bridge") // assert.Equal(t, BridgeBank.String(), "bridgebank")
} // assert.Equal(t, Chain33Bridge.String(), "chain33bridge")
//}
func Test_GetAddressFromBridgeRegistry(t *testing.T) { //
genesiskey, _ := crypto.GenerateKey() //func Test_GetAddressFromBridgeRegistry(t *testing.T) {
alloc := make(core.GenesisAlloc) // genesiskey, _ := crypto.GenerateKey()
genesisAddr := crypto.PubkeyToAddress(genesiskey.PublicKey) // alloc := make(core.GenesisAlloc)
genesisAccount := core.GenesisAccount{ // genesisAddr := crypto.PubkeyToAddress(genesiskey.PublicKey)
Balance: big.NewInt(10000000000 * 10000), // genesisAccount := core.GenesisAccount{
PrivateKey: crypto.FromECDSA(genesiskey), // Balance: big.NewInt(10000000000 * 10000),
} // PrivateKey: crypto.FromECDSA(genesiskey),
alloc[genesisAddr] = genesisAccount // }
gasLimit := uint64(100000000) // alloc[genesisAddr] = genesisAccount
sim := new(ethinterface.SimExtend) // gasLimit := uint64(100000000)
sim.SimulatedBackend = backends.NewSimulatedBackend(alloc, gasLimit) // sim := new(ethinterface.SimExtend)
// sim.SimulatedBackend = backends.NewSimulatedBackend(alloc, gasLimit)
bridgebankTest := ContractRegistry(5) //
_, err := GetAddressFromBridgeRegistry(sim, genesisAddr, genesisAddr, bridgebankTest) // bridgebankTest := ContractRegistry(5)
require.NotNil(t, err) // _, err := GetAddressFromBridgeRegistry(sim, genesisAddr, genesisAddr, bridgebankTest)
} // require.NotNil(t, err)
//}
func Test_RelayOracleClaimToEthereum(t *testing.T) { //
para, sim, x2EthContracts, _, err := deployContracts() //func Test_RelayOracleClaimToEthereum(t *testing.T) {
require.NoError(t, err) // para, sim, x2EthContracts, _, err := deployContracts()
// require.NoError(t, err)
claimType := events.MsgBurn //
privateKeySlice, err := chain33Common.FromHex("0x3fa21584ae2e4fd74db9b58e2386f5481607dfa4d7ba0617aaa7858e5025dc1e") // claimType := events.MsgBurn
require.Nil(t, err) // privateKeySlice, err := chain33Common.FromHex("0x3fa21584ae2e4fd74db9b58e2386f5481607dfa4d7ba0617aaa7858e5025dc1e")
privateKey, err := crypto.ToECDSA(privateKeySlice) // require.Nil(t, err)
require.Nil(t, err) // privateKey, err := crypto.ToECDSA(privateKeySlice)
// require.Nil(t, err)
prophecyClaim := ProphecyClaim{ //
ClaimType: events.MsgBurn, // prophecyClaim := ProphecyClaim{
Chain33Sender: []byte("12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"), // ClaimType: events.MsgBurn,
EthereumReceiver: common.HexToAddress("0x0C05bA5c230fDaA503b53702aF1962e08D0C60BF"), // Chain33Sender: []byte("12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"),
TokenContractAddress: common.HexToAddress("0x0000000000000000000000000000000000000000"), // EthereumReceiver: common.HexToAddress("0x0C05bA5c230fDaA503b53702aF1962e08D0C60BF"),
Symbol: "eth", // TokenContractAddress: common.HexToAddress("0x0000000000000000000000000000000000000000"),
Amount: big.NewInt(100000000000000000), // Symbol: "eth",
} // Amount: big.NewInt(100000000000000000),
// }
chain33TxHash := common.Hex2Bytes("fd5747c43d1460bb6f8a7a26c66b4ccab5500d05668278efe5c0fd5951dfd909") //
txhash, err := RelayOracleClaimToEthereum(x2EthContracts.Oracle, sim, para.InitValidators[0], claimType, prophecyClaim, privateKey, chain33TxHash) // chain33TxHash := common.Hex2Bytes("fd5747c43d1460bb6f8a7a26c66b4ccab5500d05668278efe5c0fd5951dfd909")
require.Nil(t, err) // txhash, err := RelayOracleClaimToEthereum(x2EthContracts.Oracle, sim, para.InitValidators[0], claimType, prophecyClaim, privateKey, chain33TxHash)
assert.Equal(t, txhash, "0x6fa087c7a2a8a4421f6e269fbc6c0838e99fa59d5760155a71cd7eb1c01aafad") // require.Nil(t, err)
// assert.Equal(t, txhash, "0x6fa087c7a2a8a4421f6e269fbc6c0838e99fa59d5760155a71cd7eb1c01aafad")
//hash := "0xc0c22aa6198fdde0dbe47ddadbe449f736b82ed4a498871de5d5f4ad9ae122a0" //
//status := GetEthTxStatus(sim, common.HexToHash(hash)) // //hash := "0xc0c22aa6198fdde0dbe47ddadbe449f736b82ed4a498871de5d5f4ad9ae122a0"
//assert.Equal(t, status, EthTxPending.String()) // //status := GetEthTxStatus(sim, common.HexToHash(hash))
// //assert.Equal(t, status, EthTxPending.String())
_, err = revokeNonce(para.Operator) //
require.Nil(t, err) // _, err = revokeNonce(para.Operator)
} // require.Nil(t, err)
//}
func Test_revokeNonce(t *testing.T) { //
//func Test_revokeNonce(t *testing.T) {
} //
//}
func deployContracts() (*DeployPara, *ethinterface.SimExtend, *X2EthContracts, *X2EthDeployInfo, error) { //
// 0x8AFDADFC88a1087c9A1D6c0F5Dd04634b87F303a //func deployContracts() (*DeployPara, *ethinterface.SimExtend, *X2EthContracts, *X2EthDeployInfo, error) {
deployerPrivateKey := "8656d2bc732a8a816a461ba5e2d8aac7c7f85c26a813df30d5327210465eb230" // // 0x8AFDADFC88a1087c9A1D6c0F5Dd04634b87F303a
// 0x92C8b16aFD6d423652559C6E266cBE1c29Bfd84f // deployerPrivateKey := "8656d2bc732a8a816a461ba5e2d8aac7c7f85c26a813df30d5327210465eb230"
ethValidatorAddrKeyA := "3fa21584ae2e4fd74db9b58e2386f5481607dfa4d7ba0617aaa7858e5025dc1e" // // 0x92C8b16aFD6d423652559C6E266cBE1c29Bfd84f
ethValidatorAddrKeyB := "a5f3063552f4483cfc20ac4f40f45b798791379862219de9e915c64722c1d400" // ethValidatorAddrKeyA := "3fa21584ae2e4fd74db9b58e2386f5481607dfa4d7ba0617aaa7858e5025dc1e"
ethValidatorAddrKeyC := "bbf5e65539e9af0eb0cfac30bad475111054b09c11d668fc0731d54ea777471e" // ethValidatorAddrKeyB := "a5f3063552f4483cfc20ac4f40f45b798791379862219de9e915c64722c1d400"
ethValidatorAddrKeyD := "c9fa31d7984edf81b8ef3b40c761f1847f6fcd5711ab2462da97dc458f1f896b" // ethValidatorAddrKeyC := "bbf5e65539e9af0eb0cfac30bad475111054b09c11d668fc0731d54ea777471e"
// ethValidatorAddrKeyD := "c9fa31d7984edf81b8ef3b40c761f1847f6fcd5711ab2462da97dc458f1f896b"
ethValidatorAddrKeys := make([]string, 0) //
ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyA) // ethValidatorAddrKeys := make([]string, 0)
ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyB) // ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyA)
ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyC) // ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyB)
ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyD) // ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyC)
// ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyD)
ctx := context.Background() //
//var backend bind.ContractBackend // ctx := context.Background()
backend, para := PrepareTestEnvironment(deployerPrivateKey, ethValidatorAddrKeys) // //var backend bind.ContractBackend
sim := new(ethinterface.SimExtend) // backend, para := PrepareTestEnvironment(deployerPrivateKey, ethValidatorAddrKeys)
sim.SimulatedBackend = backend.(*backends.SimulatedBackend) // sim := new(ethinterface.SimExtend)
// sim.SimulatedBackend = backend.(*backends.SimulatedBackend)
callMsg := ethereum.CallMsg{ //
From: para.Deployer, // callMsg := ethereum.CallMsg{
Data: common.FromHex(generated.BridgeBankBin), // From: para.Deployer,
} // Data: common.FromHex(generated.BridgeBankBin),
// }
_, err := sim.EstimateGas(ctx, callMsg) //
if nil != err { // _, err := sim.EstimateGas(ctx, callMsg)
panic("failed to estimate gas due to:" + err.Error()) // if nil != err {
} // panic("failed to estimate gas due to:" + err.Error())
x2EthContracts, x2EthDeployInfo, err := DeployAndInit(sim, para) // }
if nil != err { // x2EthContracts, x2EthDeployInfo, err := DeployAndInit(sim, para)
return nil, nil, nil, nil, err // if nil != err {
} // return nil, nil, nil, nil, err
sim.Commit() // }
// sim.Commit()
return para, sim, x2EthContracts, x2EthDeployInfo, nil //
} // return para, sim, x2EthContracts, x2EthDeployInfo, nil
//}
func PrepareTestEnvironment(deployerPrivateKey string, ethValidatorAddrKeys []string) (bind.ContractBackend, *DeployPara) { //
genesiskey, _ := crypto.HexToECDSA(deployerPrivateKey) //func PrepareTestEnvironment(deployerPrivateKey string, ethValidatorAddrKeys []string) (bind.ContractBackend, *DeployPara) {
alloc := make(core.GenesisAlloc) // genesiskey, _ := crypto.HexToECDSA(deployerPrivateKey)
genesisAddr := crypto.PubkeyToAddress(genesiskey.PublicKey) // alloc := make(core.GenesisAlloc)
genesisAccount := core.GenesisAccount{ // genesisAddr := crypto.PubkeyToAddress(genesiskey.PublicKey)
Balance: big.NewInt(10000000000 * 10000), // genesisAccount := core.GenesisAccount{
PrivateKey: crypto.FromECDSA(genesiskey), // Balance: big.NewInt(10000000000 * 10000),
} // PrivateKey: crypto.FromECDSA(genesiskey),
alloc[genesisAddr] = genesisAccount // }
// alloc[genesisAddr] = genesisAccount
var InitValidators []common.Address //
var ValidatorPriKey []*ecdsa.PrivateKey // var InitValidators []common.Address
for _, v := range ethValidatorAddrKeys { // var ValidatorPriKey []*ecdsa.PrivateKey
key, _ := crypto.HexToECDSA(v) // for _, v := range ethValidatorAddrKeys {
addr := crypto.PubkeyToAddress(key.PublicKey) // key, _ := crypto.HexToECDSA(v)
InitValidators = append(InitValidators, addr) // addr := crypto.PubkeyToAddress(key.PublicKey)
ValidatorPriKey = append(ValidatorPriKey, key) // InitValidators = append(InitValidators, addr)
// ValidatorPriKey = append(ValidatorPriKey, key)
account := core.GenesisAccount{ //
Balance: big.NewInt(100000000 * 100), // account := core.GenesisAccount{
PrivateKey: crypto.FromECDSA(key), // Balance: big.NewInt(100000000 * 100),
} // PrivateKey: crypto.FromECDSA(key),
alloc[addr] = account // }
} // alloc[addr] = account
// }
gasLimit := uint64(100000000) //
sim := backends.NewSimulatedBackend(alloc, gasLimit) // gasLimit := uint64(100000000)
// sim := backends.NewSimulatedBackend(alloc, gasLimit)
InitPowers := []*big.Int{big.NewInt(80), big.NewInt(10), big.NewInt(10), big.NewInt(10)} //
// InitPowers := []*big.Int{big.NewInt(80), big.NewInt(10), big.NewInt(10), big.NewInt(10)}
para := &DeployPara{ //
DeployPrivateKey: genesiskey, // para := &DeployPara{
Deployer: genesisAddr, // DeployPrivateKey: genesiskey,
Operator: genesisAddr, // Deployer: genesisAddr,
InitValidators: InitValidators, // Operator: genesisAddr,
ValidatorPriKey: ValidatorPriKey, // InitValidators: InitValidators,
InitPowers: InitPowers, // ValidatorPriKey: ValidatorPriKey,
} // InitPowers: InitPowers,
// }
return sim, para //
} // return sim, para
//}
...@@ -8,6 +8,7 @@ import ( ...@@ -8,6 +8,7 @@ import (
"sync" "sync"
"time" "time"
"github.com/33cn/plugin/plugin/dapp/cross2eth/ebrelayer/utils"
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethinterface" "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethinterface"
"github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/accounts/abi/bind"
...@@ -15,7 +16,6 @@ import ( ...@@ -15,7 +16,6 @@ import (
"github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/common/math"
"github.com/ethereum/go-ethereum/crypto/secp256k1" "github.com/ethereum/go-ethereum/crypto/secp256k1"
solsha3 "github.com/miguelmota/go-solidity-sha3"
) )
//EthTxStatus ... //EthTxStatus ...
...@@ -47,7 +47,7 @@ func SignClaim4Eth(hash common.Hash, privateKey *ecdsa.PrivateKey) ([]byte, erro ...@@ -47,7 +47,7 @@ func SignClaim4Eth(hash common.Hash, privateKey *ecdsa.PrivateKey) ([]byte, erro
} }
func prefixMessage(message common.Hash, key *ecdsa.PrivateKey) ([]byte, []byte) { func prefixMessage(message common.Hash, key *ecdsa.PrivateKey) ([]byte, []byte) {
prefixed := solsha3.SoliditySHA3WithPrefix(message[:]) prefixed := utils.SoliditySHA3WithPrefix(message[:])
sig, err := secp256k1.Sign(prefixed, math.PaddedBigBytes(key.D, 32)) sig, err := secp256k1.Sign(prefixed, math.PaddedBigBytes(key.D, 32))
if err != nil { if err != nil {
panic(err) panic(err)
......
...@@ -55,7 +55,7 @@ type LogNewBridgeToken struct { ...@@ -55,7 +55,7 @@ type LogNewBridgeToken struct {
func UnpackLogLock(contractAbi abi.ABI, eventName string, eventData []byte) (lockEvent *LockEvent, err error) { func UnpackLogLock(contractAbi abi.ABI, eventName string, eventData []byte) (lockEvent *LockEvent, err error) {
event := &LockEvent{} event := &LockEvent{}
// Parse the event's attributes as Ethereum network variables // Parse the event's attributes as Ethereum network variables
err = contractAbi.Unpack(event, eventName, eventData) err = contractAbi.UnpackIntoInterface(event, eventName, eventData)
if err != nil { if err != nil {
eventsLog.Error("UnpackLogLock", "Failed to unpack abi due to:", err.Error()) eventsLog.Error("UnpackLogLock", "Failed to unpack abi due to:", err.Error())
return nil, ebrelayerTypes.ErrUnpack return nil, ebrelayerTypes.ErrUnpack
...@@ -72,7 +72,7 @@ func UnpackLogLock(contractAbi abi.ABI, eventName string, eventData []byte) (loc ...@@ -72,7 +72,7 @@ func UnpackLogLock(contractAbi abi.ABI, eventName string, eventData []byte) (loc
func UnpackLogBurn(contractAbi abi.ABI, eventName string, eventData []byte) (burnEvent *BurnEvent, err error) { func UnpackLogBurn(contractAbi abi.ABI, eventName string, eventData []byte) (burnEvent *BurnEvent, err error) {
event := &BurnEvent{} event := &BurnEvent{}
// Parse the event's attributes as Ethereum network variables // Parse the event's attributes as Ethereum network variables
err = contractAbi.Unpack(event, eventName, eventData) err = contractAbi.UnpackIntoInterface(event, eventName, eventData)
if err != nil { if err != nil {
eventsLog.Error("UnpackLogBurn", "Failed to unpack abi due to:", err.Error()) eventsLog.Error("UnpackLogBurn", "Failed to unpack abi due to:", err.Error())
return nil, ebrelayerTypes.ErrUnpack return nil, ebrelayerTypes.ErrUnpack
......
package chain33 package chain33
import ( //
"context" //import (
"encoding/hex" // "context"
"flag" // "encoding/hex"
"fmt" // "flag"
"math/big" // "fmt"
"os" // "math/big"
"os/signal" // "os"
"sync" // "os/signal"
"syscall" // "sync"
"testing" // "syscall"
"time" // "testing"
// "time"
dbm "github.com/33cn/chain33/common/db" //
"github.com/33cn/chain33/types" // dbm "github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/util/testnode" // "github.com/33cn/chain33/types"
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethcontract/generated" // "github.com/33cn/chain33/util/testnode"
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethcontract/test/setup" // "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethcontract/generated"
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethinterface" // "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethcontract/test/setup"
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethtxs" // "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethinterface"
relayerTx "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethtxs" // "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethtxs"
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/events" // relayerTx "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethtxs"
syncTx "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/relayer/chain33/transceiver/sync" // "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/events"
ebTypes "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/types" // syncTx "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/relayer/chain33/transceiver/sync"
relayerTypes "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/types" // ebTypes "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/types"
tml "github.com/BurntSushi/toml" // relayerTypes "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/types"
"github.com/ethereum/go-ethereum" // tml "github.com/BurntSushi/toml"
"github.com/ethereum/go-ethereum/accounts/abi/bind" // "github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends" // "github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common" // "github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
ethTypes "github.com/ethereum/go-ethereum/core/types" // "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto" // ethTypes "github.com/ethereum/go-ethereum/core/types"
"github.com/stretchr/testify/assert" // "github.com/ethereum/go-ethereum/crypto"
"github.com/stretchr/testify/require" // "github.com/stretchr/testify/assert"
// "github.com/stretchr/testify/require"
// 需要显示引用系统插件,以加载系统内置合约 //
"github.com/33cn/chain33/client/mocks" // // 需要显示引用系统插件,以加载系统内置合约
_ "github.com/33cn/chain33/system" // "github.com/33cn/chain33/client/mocks"
"github.com/stretchr/testify/mock" // _ "github.com/33cn/chain33/system"
) // "github.com/stretchr/testify/mock"
//)
var ( //
configPath = flag.String("f", "./../../relayer.toml", "configfile") //var (
privateKeyStr = "0x3fa21584ae2e4fd74db9b58e2386f5481607dfa4d7ba0617aaa7858e5025dc1e" // configPath = flag.String("f", "./../../relayer.toml", "configfile")
accountAddr = "0x92c8b16afd6d423652559c6e266cbe1c29bfd84f" // privateKeyStr = "0x3fa21584ae2e4fd74db9b58e2386f5481607dfa4d7ba0617aaa7858e5025dc1e"
passphrase = "123456hzj" // accountAddr = "0x92c8b16afd6d423652559c6e266cbe1c29bfd84f"
test = "0ac3050aa3020a0a7832657468657265756d126d60671a690a2a3078303030303030303030303030303030303030303030303030303030303030303030303030303030301a2a307830633035626135633233306664616135303362353337303261663139363265303864306336306266220831303030303030302a0365746838121a6e080112210320bbac09528e19c55b0f89cb37ab265e7e856b1a8c388780322dbbfd194b52ba1a473045022100c403d9a6e531292336b44d52e4f4dbb9b8ab1e16335383954583728b909478da022031d8a29efcbcea8df648c4054f3c09ab1ab7a330797cf79fd891a3d9336922e920a08d0628e0f193f60530a1d7ad93e5ebc28e253a22314c7538586d537459765777664e716951336e4e4b33345239466648346b5270425612ce0208021a5e0802125a0a2b10c0d59294bb192222313271796f6361794e46374c7636433971573461767873324537553431664b536676122b10a0c88c94bb192222313271796f6361794e46374c7636433971573461767873324537553431664b5366761a55080f12510a291080ade2042222313271796f6361794e46374c7636433971573461767873324537553431664b53667612242222313271796f6361794e46374c7636433971573461767873324537553431664b5366761a92010867128d010a2a3078303030303030303030303030303030303030303030303030303030303030303030303030303030301222313271796f6361794e46374c7636433971573461767873324537553431664b5366761a2a307830633035626135633233306664616135303362353337303261663139363265303864306336306266220831303030303030302a03657468301220c4092a207a38e1da7de4444f2d34c7488293f3a2e01ce2561e720e9bbef355e83755ad833220e68d8418f69d5f18278a53dca53b101f26f76883337a60a5754d5f6d94e42e3c400148c409" // passphrase = "123456hzj"
// test = "0ac3050aa3020a0a7832657468657265756d126d60671a690a2a3078303030303030303030303030303030303030303030303030303030303030303030303030303030301a2a307830633035626135633233306664616135303362353337303261663139363265303864306336306266220831303030303030302a0365746838121a6e080112210320bbac09528e19c55b0f89cb37ab265e7e856b1a8c388780322dbbfd194b52ba1a473045022100c403d9a6e531292336b44d52e4f4dbb9b8ab1e16335383954583728b909478da022031d8a29efcbcea8df648c4054f3c09ab1ab7a330797cf79fd891a3d9336922e920a08d0628e0f193f60530a1d7ad93e5ebc28e253a22314c7538586d537459765777664e716951336e4e4b33345239466648346b5270425612ce0208021a5e0802125a0a2b10c0d59294bb192222313271796f6361794e46374c7636433971573461767873324537553431664b536676122b10a0c88c94bb192222313271796f6361794e46374c7636433971573461767873324537553431664b5366761a55080f12510a291080ade2042222313271796f6361794e46374c7636433971573461767873324537553431664b53667612242222313271796f6361794e46374c7636433971573461767873324537553431664b5366761a92010867128d010a2a3078303030303030303030303030303030303030303030303030303030303030303030303030303030301222313271796f6361794e46374c7636433971573461767873324537553431664b5366761a2a307830633035626135633233306664616135303362353337303261663139363265303864306336306266220831303030303030302a03657468301220c4092a207a38e1da7de4444f2d34c7488293f3a2e01ce2561e720e9bbef355e83755ad833220e68d8418f69d5f18278a53dca53b101f26f76883337a60a5754d5f6d94e42e3c400148c409"
// 0x8AFDADFC88a1087c9A1D6c0F5Dd04634b87F303a //
deployerPrivateKey = "8656d2bc732a8a816a461ba5e2d8aac7c7f85c26a813df30d5327210465eb230" // // 0x8AFDADFC88a1087c9A1D6c0F5Dd04634b87F303a
// 0x92C8b16aFD6d423652559C6E266cBE1c29Bfd84f // deployerPrivateKey = "8656d2bc732a8a816a461ba5e2d8aac7c7f85c26a813df30d5327210465eb230"
ethValidatorAddrKeyA = "3fa21584ae2e4fd74db9b58e2386f5481607dfa4d7ba0617aaa7858e5025dc1e" // // 0x92C8b16aFD6d423652559C6E266cBE1c29Bfd84f
ethValidatorAddrKeyB = "a5f3063552f4483cfc20ac4f40f45b798791379862219de9e915c64722c1d400" // ethValidatorAddrKeyA = "3fa21584ae2e4fd74db9b58e2386f5481607dfa4d7ba0617aaa7858e5025dc1e"
ethValidatorAddrKeyC = "bbf5e65539e9af0eb0cfac30bad475111054b09c11d668fc0731d54ea777471e" // ethValidatorAddrKeyB = "a5f3063552f4483cfc20ac4f40f45b798791379862219de9e915c64722c1d400"
ethValidatorAddrKeyD = "c9fa31d7984edf81b8ef3b40c761f1847f6fcd5711ab2462da97dc458f1f896b" // ethValidatorAddrKeyC = "bbf5e65539e9af0eb0cfac30bad475111054b09c11d668fc0731d54ea777471e"
) // ethValidatorAddrKeyD = "c9fa31d7984edf81b8ef3b40c761f1847f6fcd5711ab2462da97dc458f1f896b"
//)
func TestAll(t *testing.T) { //
mock33 := newMock33() //func TestAll(t *testing.T) {
defer mock33.Close() // mock33 := newMock33()
test_HandleRequest(t) // defer mock33.Close()
test_ImportPrivateKey(t) // test_HandleRequest(t)
test_Lockbty(t) // test_ImportPrivateKey(t)
test_restorePrivateKeys(t) // test_Lockbty(t)
} // test_restorePrivateKeys(t)
//}
func test_HandleRequest(t *testing.T) { //
_, sim, _, x2EthDeployInfo, err := deployContracts() //func test_HandleRequest(t *testing.T) {
require.NoError(t, err) // _, sim, _, x2EthDeployInfo, err := deployContracts()
chain33Relayer := newChain33Relayer(sim, x2EthDeployInfo, "127.0.0.1:60002", t) // require.NoError(t, err)
_, err = chain33Relayer.ImportPrivateKey(passphrase, privateKeyStr) // chain33Relayer := newChain33Relayer(sim, x2EthDeployInfo, "127.0.0.1:60002", t)
assert.NoError(t, err) // _, err = chain33Relayer.ImportPrivateKey(passphrase, privateKeyStr)
// assert.NoError(t, err)
body, err := hex.DecodeString(test) //
assert.NoError(t, err) // body, err := hex.DecodeString(test)
// assert.NoError(t, err)
chain33Relayer.statusCheckedIndex = 1220 //
err = syncTx.HandleRequest(body) // chain33Relayer.statusCheckedIndex = 1220
assert.NoError(t, err) // err = syncTx.HandleRequest(body)
// assert.NoError(t, err)
time.Sleep(200 * time.Millisecond) //
// time.Sleep(200 * time.Millisecond)
ret := chain33Relayer.QueryTxhashRelay2Eth() //
assert.NotEmpty(t, ret) // ret := chain33Relayer.QueryTxhashRelay2Eth()
// assert.NotEmpty(t, ret)
event := getOracleClaimType(events.MsgLock.String()) //
assert.Equal(t, event, events.Event(events.ClaimTypeLock)) // event := getOracleClaimType(events.MsgLock.String())
} // assert.Equal(t, event, events.Event(events.ClaimTypeLock))
//}
func test_ImportPrivateKey(t *testing.T) { //
_, sim, _, x2EthDeployInfo, err := setup.DeployContracts() //func test_ImportPrivateKey(t *testing.T) {
require.NoError(t, err) // _, sim, _, x2EthDeployInfo, err := setup.DeployContracts()
chain33Relayer := newChain33Relayer(sim, x2EthDeployInfo, "127.0.0.1:60000", t) // require.NoError(t, err)
// chain33Relayer := newChain33Relayer(sim, x2EthDeployInfo, "127.0.0.1:60000", t)
addr, err := chain33Relayer.ImportPrivateKey(passphrase, privateKeyStr) //
assert.NoError(t, err) // addr, err := chain33Relayer.ImportPrivateKey(passphrase, privateKeyStr)
assert.Equal(t, addr, accountAddr) // assert.NoError(t, err)
// assert.Equal(t, addr, accountAddr)
time.Sleep(50 * time.Millisecond) //
// time.Sleep(50 * time.Millisecond)
addr, err = chain33Relayer.GetAccountAddr() //
assert.NoError(t, err) // addr, err = chain33Relayer.GetAccountAddr()
assert.Equal(t, addr, accountAddr) // assert.NoError(t, err)
// assert.Equal(t, addr, accountAddr)
key, _, _ := chain33Relayer.GetAccount("123") //
assert.NotEqual(t, key, privateKeyStr) // key, _, _ := chain33Relayer.GetAccount("123")
// assert.NotEqual(t, key, privateKeyStr)
key, _, _ = chain33Relayer.GetAccount(passphrase) //
assert.Equal(t, key, privateKeyStr) // key, _, _ = chain33Relayer.GetAccount(passphrase)
} // assert.Equal(t, key, privateKeyStr)
//}
func test_Lockbty(t *testing.T) { //
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts() //func test_Lockbty(t *testing.T) {
require.NoError(t, err) // para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
chain33Relayer := newChain33Relayer(sim, x2EthDeployInfo, "127.0.0.1:60001", t) // require.NoError(t, err)
_, err = chain33Relayer.ImportPrivateKey(passphrase, privateKeyStr) // chain33Relayer := newChain33Relayer(sim, x2EthDeployInfo, "127.0.0.1:60001", t)
assert.NoError(t, err) // _, err = chain33Relayer.ImportPrivateKey(passphrase, privateKeyStr)
// assert.NoError(t, err)
//Test_1_ImportPrivateKey() //
ctx := context.Background() // //Test_1_ImportPrivateKey()
// ctx := context.Background()
//2nd:订阅事件 //
eventName := "LogNewBridgeToken" // //2nd:订阅事件
bridgeBankABI := ethtxs.LoadABI(ethtxs.BridgeBankABI) // eventName := "LogNewBridgeToken"
logNewBridgeTokenSig := bridgeBankABI.Events[eventName].ID().Hex() // bridgeBankABI := ethtxs.LoadABI(ethtxs.BridgeBankABI)
query := ethereum.FilterQuery{ // logNewBridgeTokenSig := bridgeBankABI.Events[eventName].ID.Hex()
Addresses: []common.Address{x2EthDeployInfo.BridgeBank.Address}, // query := ethereum.FilterQuery{
} // Addresses: []common.Address{x2EthDeployInfo.BridgeBank.Address},
// We will check logs for new events // }
logs := make(chan ethTypes.Log) // // We will check logs for new events
// Filter by contract and event, write results to logs // logs := make(chan ethTypes.Log)
sub, err := sim.SubscribeFilterLogs(ctx, query, logs) // // Filter by contract and event, write results to logs
assert.Nil(t, err) // sub, err := sim.SubscribeFilterLogs(ctx, query, logs)
//require.Nil(t, err) // assert.Nil(t, err)
// //require.Nil(t, err)
opts := &bind.CallOpts{ //
Pending: true, // opts := &bind.CallOpts{
From: para.Operator, // Pending: true,
Context: ctx, // From: para.Operator,
} // Context: ctx,
// }
tokenCount, err := x2EthContracts.BridgeBank.BridgeTokenCount(opts) //
require.Nil(t, err) // tokenCount, err := x2EthContracts.BridgeBank.BridgeTokenCount(opts)
assert.Equal(t, tokenCount.Int64(), int64(0)) // require.Nil(t, err)
// assert.Equal(t, tokenCount.Int64(), int64(0))
//3rd:创建token //
symbol := "BTY" // //3rd:创建token
auth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator) // symbol := "BTY"
require.Nil(t, err) // auth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
_, err = x2EthContracts.BridgeBank.BridgeBankTransactor.CreateNewBridgeToken(auth, symbol) // require.Nil(t, err)
require.Nil(t, err) // _, err = x2EthContracts.BridgeBank.BridgeBankTransactor.CreateNewBridgeToken(auth, symbol)
sim.Commit() // require.Nil(t, err)
// sim.Commit()
logEvent := &events.LogNewBridgeToken{} //
select { // logEvent := &events.LogNewBridgeToken{}
// Handle any errors // select {
case err := <-sub.Err(): // // Handle any errors
t.Fatalf("sub error:%s", err.Error()) // case err := <-sub.Err():
// vLog is raw event data // t.Fatalf("sub error:%s", err.Error())
case vLog := <-logs: // // vLog is raw event data
// Check if the event is a 'LogLock' event // case vLog := <-logs:
if vLog.Topics[0].Hex() == logNewBridgeTokenSig { // // Check if the event is a 'LogLock' event
err = bridgeBankABI.Unpack(logEvent, eventName, vLog.Data) // if vLog.Topics[0].Hex() == logNewBridgeTokenSig {
require.Nil(t, err) // _, err = bridgeBankABI.Unpack(eventName, vLog.Data)
require.Equal(t, symbol, logEvent.Symbol) // require.Nil(t, err)
// require.Equal(t, symbol, logEvent.Symbol)
//tokenCount正确加1 //
tokenCount, err = x2EthContracts.BridgeBank.BridgeTokenCount(opts) // //tokenCount正确加1
require.Nil(t, err) // tokenCount, err = x2EthContracts.BridgeBank.BridgeTokenCount(opts)
require.Equal(t, tokenCount.Int64(), int64(1)) // require.Nil(t, err)
break // require.Equal(t, tokenCount.Int64(), int64(1))
} // break
} // }
// }
///////////newOracleClaim/////////////////////////// //
balance, _ := sim.BalanceAt(ctx, para.InitValidators[0], nil) // ///////////newOracleClaim///////////////////////////
fmt.Println("InitValidators[0] addr,", para.InitValidators[0].String(), "balance =", balance.String()) // balance, _ := sim.BalanceAt(ctx, para.InitValidators[0], nil)
// fmt.Println("InitValidators[0] addr,", para.InitValidators[0].String(), "balance =", balance.String())
chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt") //
amount := int64(99) // chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
ethReceiver := para.InitValidators[2] // amount := int64(99)
claimID := crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), logEvent.Token.Bytes(), big.NewInt(amount).Bytes()) // ethReceiver := para.InitValidators[2]
// claimID := crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), logEvent.Token.Bytes(), big.NewInt(amount).Bytes())
authOracle, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0]) //
require.Nil(t, err) // authOracle, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
// require.Nil(t, err)
signature, err := ethtxs.SignClaim4Eth(claimID, para.ValidatorPriKey[0]) //
require.Nil(t, err) // signature, err := ethtxs.SignClaim4Eth(claimID, para.ValidatorPriKey[0])
// require.Nil(t, err)
bridgeToken, err := generated.NewBridgeToken(logEvent.Token, sim) //
require.Nil(t, err) // bridgeToken, err := generated.NewBridgeToken(logEvent.Token, sim)
opts = &bind.CallOpts{ // require.Nil(t, err)
Pending: true, // opts = &bind.CallOpts{
Context: ctx, // Pending: true,
} // Context: ctx,
// }
balance, err = bridgeToken.BalanceOf(opts, ethReceiver) //
require.Nil(t, err) // balance, err = bridgeToken.BalanceOf(opts, ethReceiver)
require.Equal(t, balance.Int64(), int64(0)) // require.Nil(t, err)
// require.Equal(t, balance.Int64(), int64(0))
tx, err := x2EthContracts.Oracle.NewOracleClaim( //
authOracle, // tx, err := x2EthContracts.Oracle.NewOracleClaim(
events.ClaimTypeLock, // authOracle,
chain33Sender, // events.ClaimTypeLock,
ethReceiver, // chain33Sender,
logEvent.Token, // ethReceiver,
logEvent.Symbol, // logEvent.Token,
big.NewInt(amount), // logEvent.Symbol,
claimID, // big.NewInt(amount),
signature) // claimID,
require.Nil(t, err) // signature)
// require.Nil(t, err)
sim.Commit() //
balance, err = bridgeToken.BalanceOf(opts, ethReceiver) // sim.Commit()
require.Nil(t, err) // balance, err = bridgeToken.BalanceOf(opts, ethReceiver)
require.Equal(t, balance.Int64(), amount) // require.Nil(t, err)
//t.Logf("The minted amount is:%d", balance.Int64()) // require.Equal(t, balance.Int64(), amount)
// //t.Logf("The minted amount is:%d", balance.Int64())
txhash := tx.Hash().Hex() //
// txhash := tx.Hash().Hex()
chain33Relayer.rwLock.Lock() //
chain33Relayer.statusCheckedIndex = 1 // chain33Relayer.rwLock.Lock()
chain33Relayer.totalTx4Chain33ToEth = 2 // chain33Relayer.statusCheckedIndex = 1
chain33Relayer.rwLock.Unlock() // chain33Relayer.totalTx4Chain33ToEth = 2
_ = chain33Relayer.setLastestRelay2EthTxhash(relayerTx.EthTxPending.String(), txhash, 2) // chain33Relayer.rwLock.Unlock()
// _ = chain33Relayer.setLastestRelay2EthTxhash(relayerTx.EthTxPending.String(), txhash, 2)
time.Sleep(200 * time.Millisecond) //
// time.Sleep(200 * time.Millisecond)
chain33Relayer.rwLock.Lock() //
chain33Relayer.statusCheckedIndex = 9 // chain33Relayer.rwLock.Lock()
chain33Relayer.totalTx4Chain33ToEth = 11 // chain33Relayer.statusCheckedIndex = 9
chain33Relayer.rwLock.Unlock() // chain33Relayer.totalTx4Chain33ToEth = 11
_ = chain33Relayer.setLastestRelay2EthTxhash(relayerTx.EthTxPending.String(), "", 11) // chain33Relayer.rwLock.Unlock()
// _ = chain33Relayer.setLastestRelay2EthTxhash(relayerTx.EthTxPending.String(), "", 11)
time.Sleep(200 * time.Millisecond) //
} // time.Sleep(200 * time.Millisecond)
//}
func test_restorePrivateKeys(t *testing.T) { //
_, sim, _, x2EthDeployInfo, err := setup.DeployContracts() //func test_restorePrivateKeys(t *testing.T) {
require.NoError(t, err) // _, sim, _, x2EthDeployInfo, err := setup.DeployContracts()
chain33Relayer := newChain33Relayer(sim, x2EthDeployInfo, "127.0.0.1:60003", t) // require.NoError(t, err)
_, err = chain33Relayer.ImportPrivateKey(passphrase, privateKeyStr) // chain33Relayer := newChain33Relayer(sim, x2EthDeployInfo, "127.0.0.1:60003", t)
assert.NoError(t, err) // _, err = chain33Relayer.ImportPrivateKey(passphrase, privateKeyStr)
// assert.NoError(t, err)
go func() { //
for range chain33Relayer.unlock { // go func() {
} // for range chain33Relayer.unlock {
}() // }
temp := chain33Relayer.ethSender // }()
// temp := chain33Relayer.ethSender
err = chain33Relayer.RestorePrivateKeys("123") //
assert.NotEqual(t, hex.EncodeToString(temp.Bytes()), hex.EncodeToString(chain33Relayer.ethSender.Bytes())) // err = chain33Relayer.RestorePrivateKeys("123")
assert.NoError(t, err) // assert.NotEqual(t, hex.EncodeToString(temp.Bytes()), hex.EncodeToString(chain33Relayer.ethSender.Bytes()))
// assert.NoError(t, err)
err = chain33Relayer.RestorePrivateKeys(passphrase) //
assert.Equal(t, hex.EncodeToString(temp.Bytes()), hex.EncodeToString(chain33Relayer.ethSender.Bytes())) // err = chain33Relayer.RestorePrivateKeys(passphrase)
assert.NoError(t, err) // assert.Equal(t, hex.EncodeToString(temp.Bytes()), hex.EncodeToString(chain33Relayer.ethSender.Bytes()))
// assert.NoError(t, err)
err = chain33Relayer.StoreAccountWithNewPassphase("new123", passphrase) //
assert.NoError(t, err) // err = chain33Relayer.StoreAccountWithNewPassphase("new123", passphrase)
// assert.NoError(t, err)
err = chain33Relayer.RestorePrivateKeys("new123") //
assert.Equal(t, hex.EncodeToString(temp.Bytes()), hex.EncodeToString(chain33Relayer.ethSender.Bytes())) // err = chain33Relayer.RestorePrivateKeys("new123")
assert.NoError(t, err) // assert.Equal(t, hex.EncodeToString(temp.Bytes()), hex.EncodeToString(chain33Relayer.ethSender.Bytes()))
// assert.NoError(t, err)
time.Sleep(200 * time.Millisecond) //
} // time.Sleep(200 * time.Millisecond)
//}
func newChain33Relayer(sim *ethinterface.SimExtend, x2EthDeployInfo *ethtxs.X2EthDeployInfo, pushBind string, t *testing.T) *Relayer4Chain33 { //
cfg := initCfg(*configPath) //func newChain33Relayer(sim *ethinterface.SimExtend, x2EthDeployInfo *ethtxs.X2EthDeployInfo, pushBind string, t *testing.T) *Relayer4Chain33 {
cfg.SyncTxConfig.Chain33Host = "http://127.0.0.1:8801" // cfg := initCfg(*configPath)
cfg.BridgeRegistry = x2EthDeployInfo.BridgeRegistry.Address.String() // cfg.SyncTxConfig.Chain33Host = "http://127.0.0.1:8801"
cfg.SyncTxConfig.PushBind = pushBind // cfg.BridgeRegistry = x2EthDeployInfo.BridgeRegistry.Address.String()
cfg.SyncTxConfig.FetchHeightPeriodMs = 50 // cfg.SyncTxConfig.PushBind = pushBind
cfg.SyncTxConfig.Dbdriver = "memdb" // cfg.SyncTxConfig.FetchHeightPeriodMs = 50
// cfg.SyncTxConfig.Dbdriver = "memdb"
db := dbm.NewDB("relayer_db_service", cfg.SyncTxConfig.Dbdriver, cfg.SyncTxConfig.DbPath, cfg.SyncTxConfig.DbCache) //
ctx, cancel := context.WithCancel(context.Background()) // db := dbm.NewDB("relayer_db_service", cfg.SyncTxConfig.Dbdriver, cfg.SyncTxConfig.DbPath, cfg.SyncTxConfig.DbCache)
var wg sync.WaitGroup // ctx, cancel := context.WithCancel(context.Background())
// var wg sync.WaitGroup
relayer := &Relayer4Chain33{ //
rpcLaddr: cfg.SyncTxConfig.Chain33Host, // relayer := &Relayer4Chain33{
fetchHeightPeriodMs: cfg.SyncTxConfig.FetchHeightPeriodMs, // rpcLaddr: cfg.SyncTxConfig.Chain33Host,
unlock: make(chan int), // fetchHeightPeriodMs: cfg.SyncTxConfig.FetchHeightPeriodMs,
db: db, // unlock: make(chan int),
ctx: ctx, // db: db,
bridgeRegistryAddr: x2EthDeployInfo.BridgeRegistry.Address, // ctx: ctx,
} // bridgeRegistryAddr: x2EthDeployInfo.BridgeRegistry.Address,
err := relayer.setStatusCheckedIndex(1) // }
assert.NoError(t, err) // err := relayer.setStatusCheckedIndex(1)
// assert.NoError(t, err)
relayer.ethClient = sim //
relayer.totalTx4Chain33ToEth = relayer.getTotalTxAmount2Eth() // relayer.ethClient = sim
relayer.statusCheckedIndex = relayer.getStatusCheckedIndex() // relayer.totalTx4Chain33ToEth = relayer.getTotalTxAmount2Eth()
assert.Equal(t, relayer.statusCheckedIndex, int64(1)) // relayer.statusCheckedIndex = relayer.getStatusCheckedIndex()
// assert.Equal(t, relayer.statusCheckedIndex, int64(1))
syncCfg := &ebTypes.SyncTxReceiptConfig{ //
Chain33Host: cfg.SyncTxConfig.Chain33Host, // syncCfg := &ebTypes.SyncTxReceiptConfig{
PushHost: cfg.SyncTxConfig.PushHost, // Chain33Host: cfg.SyncTxConfig.Chain33Host,
PushName: cfg.SyncTxConfig.PushName, // PushHost: cfg.SyncTxConfig.PushHost,
PushBind: pushBind, // PushName: cfg.SyncTxConfig.PushName,
StartSyncHeight: cfg.SyncTxConfig.StartSyncHeight, // PushBind: pushBind,
StartSyncSequence: cfg.SyncTxConfig.StartSyncSequence, // StartSyncHeight: cfg.SyncTxConfig.StartSyncHeight,
StartSyncHash: cfg.SyncTxConfig.StartSyncHash, // StartSyncSequence: cfg.SyncTxConfig.StartSyncSequence,
} // StartSyncHash: cfg.SyncTxConfig.StartSyncHash,
go relayer.syncProc(syncCfg) // }
// go relayer.syncProc(syncCfg)
ch := make(chan os.Signal, 1) //
signal.Notify(ch, syscall.SIGTERM) // ch := make(chan os.Signal, 1)
go func() { // signal.Notify(ch, syscall.SIGTERM)
<-ch // go func() {
cancel() // <-ch
wg.Wait() // cancel()
os.Exit(0) // wg.Wait()
}() // os.Exit(0)
return relayer // }()
} // return relayer
//}
func deployContracts() (*ethtxs.DeployPara, *ethinterface.SimExtend, *ethtxs.X2EthContracts, *ethtxs.X2EthDeployInfo, error) { //
ethValidatorAddrKeys := make([]string, 0) //func deployContracts() (*ethtxs.DeployPara, *ethinterface.SimExtend, *ethtxs.X2EthContracts, *ethtxs.X2EthDeployInfo, error) {
ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyA) // ethValidatorAddrKeys := make([]string, 0)
ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyB) // ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyA)
ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyC) // ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyB)
ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyD) // ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyC)
// ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyD)
ctx := context.Background() //
//var backend bind.ContractBackend // ctx := context.Background()
backend, para := setup.PrepareTestEnvironment(deployerPrivateKey, ethValidatorAddrKeys) // //var backend bind.ContractBackend
sim := new(ethinterface.SimExtend) // backend, para := setup.PrepareTestEnvironment(deployerPrivateKey, ethValidatorAddrKeys)
sim.SimulatedBackend = backend.(*backends.SimulatedBackend) // sim := new(ethinterface.SimExtend)
// sim.SimulatedBackend = backend.(*backends.SimulatedBackend)
callMsg := ethereum.CallMsg{ //
From: para.Deployer, // callMsg := ethereum.CallMsg{
Data: common.FromHex(generated.BridgeBankBin), // From: para.Deployer,
} // Data: common.FromHex(generated.BridgeBankBin),
// }
_, err := sim.EstimateGas(ctx, callMsg) //
if nil != err { // _, err := sim.EstimateGas(ctx, callMsg)
panic("failed to estimate gas due to:" + err.Error()) // if nil != err {
} // panic("failed to estimate gas due to:" + err.Error())
x2EthContracts, x2EthDeployInfo, err := ethtxs.DeployAndInit(sim, para) // }
if nil != err { // x2EthContracts, x2EthDeployInfo, err := ethtxs.DeployAndInit(sim, para)
return nil, nil, nil, nil, err // if nil != err {
} // return nil, nil, nil, nil, err
sim.Commit() // }
// sim.Commit()
return para, sim, x2EthContracts, x2EthDeployInfo, nil //
} // return para, sim, x2EthContracts, x2EthDeployInfo, nil
//}
func initCfg(path string) *relayerTypes.RelayerConfig { //
var cfg relayerTypes.RelayerConfig //func initCfg(path string) *relayerTypes.RelayerConfig {
if _, err := tml.DecodeFile(path, &cfg); err != nil { // var cfg relayerTypes.RelayerConfig
fmt.Println(err) // if _, err := tml.DecodeFile(path, &cfg); err != nil {
os.Exit(-1) // fmt.Println(err)
} // os.Exit(-1)
return &cfg // }
} // return &cfg
//}
func newMock33() *testnode.Chain33Mock { //
var ret = types.ReplySubscribePush{IsOk: true, Msg: ""} //func newMock33() *testnode.Chain33Mock {
var he = types.Header{Height: 10000} // var ret = types.ReplySubscribePush{IsOk: true, Msg: ""}
// var he = types.Header{Height: 10000}
mockapi := &mocks.QueueProtocolAPI{} //
// 这里对需要mock的方法打桩,Close是必须的,其它方法根据需要 // mockapi := &mocks.QueueProtocolAPI{}
mockapi.On("Close").Return() // // 这里对需要mock的方法打桩,Close是必须的,其它方法根据需要
mockapi.On("AddPushSubscribe", mock.Anything).Return(&ret, nil) // mockapi.On("Close").Return()
mockapi.On("GetLastHeader", mock.Anything).Return(&he, nil) // mockapi.On("AddPushSubscribe", mock.Anything).Return(&ret, nil)
// mockapi.On("GetLastHeader", mock.Anything).Return(&he, nil)
mock33 := testnode.New("", mockapi) //
//defer mock33.Close() // mock33 := testnode.New("", mockapi)
rpcCfg := mock33.GetCfg().RPC // //defer mock33.Close()
// 这里必须设置监听端口,默认的是无效值 // rpcCfg := mock33.GetCfg().RPC
rpcCfg.JrpcBindAddr = "127.0.0.1:8801" // // 这里必须设置监听端口,默认的是无效值
mock33.GetRPC().Listen() // rpcCfg.JrpcBindAddr = "127.0.0.1:8801"
// mock33.GetRPC().Listen()
return mock33 //
} // return mock33
//}
...@@ -607,9 +607,9 @@ func (ethRelayer *Relayer4Ethereum) prePareSubscribeEvent() { ...@@ -607,9 +607,9 @@ func (ethRelayer *Relayer4Ethereum) prePareSubscribeEvent() {
contactAbi := ethtxs.LoadABI(ethtxs.BridgeBankABI) contactAbi := ethtxs.LoadABI(ethtxs.BridgeBankABI)
ethRelayer.bridgeBankAbi = contactAbi ethRelayer.bridgeBankAbi = contactAbi
eventName = events.LogLock.String() eventName = events.LogLock.String()
ethRelayer.bridgeBankEventLockSig = contactAbi.Events[eventName].ID().Hex() ethRelayer.bridgeBankEventLockSig = contactAbi.Events[eventName].ID.Hex()
eventName = events.LogChain33TokenBurn.String() eventName = events.LogChain33TokenBurn.String()
ethRelayer.bridgeBankEventBurnSig = contactAbi.Events[eventName].ID().Hex() ethRelayer.bridgeBankEventBurnSig = contactAbi.Events[eventName].ID.Hex()
ethRelayer.bridgeBankAddr = ethRelayer.x2EthDeployInfo.BridgeBank.Address ethRelayer.bridgeBankAddr = ethRelayer.x2EthDeployInfo.BridgeBank.Address
} }
......
package ethereum package ethereum
import ( //
"context" //import (
"encoding/hex" // "context"
"flag" // "encoding/hex"
"fmt" // "flag"
"math/big" // "fmt"
"os" // "math/big"
"testing" // "os"
"time" // "testing"
// "time"
"github.com/33cn/chain33/client/mocks" //
dbm "github.com/33cn/chain33/common/db" // "github.com/33cn/chain33/client/mocks"
_ "github.com/33cn/chain33/system" // dbm "github.com/33cn/chain33/common/db"
chain33Types "github.com/33cn/chain33/types" // _ "github.com/33cn/chain33/system"
"github.com/33cn/chain33/util/testnode" // chain33Types "github.com/33cn/chain33/types"
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethcontract/generated" // "github.com/33cn/chain33/util/testnode"
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethcontract/test/setup" // "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethcontract/generated"
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethinterface" // "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethcontract/test/setup"
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethtxs" // "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethinterface"
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/events" // "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethtxs"
ebTypes "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/types" // "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/events"
relayerTypes "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/types" // ebTypes "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/types"
tml "github.com/BurntSushi/toml" // relayerTypes "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/types"
"github.com/ethereum/go-ethereum" // tml "github.com/BurntSushi/toml"
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends" // "github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/common" // "github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
"github.com/ethereum/go-ethereum/common/hexutil" // "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto" // "github.com/ethereum/go-ethereum/common/hexutil"
"github.com/stretchr/testify/assert" // "github.com/ethereum/go-ethereum/crypto"
"github.com/stretchr/testify/mock" // "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" // "github.com/stretchr/testify/mock"
) // "github.com/stretchr/testify/require"
//)
var ( //
configPath = flag.String("f", "./../../relayer.toml", "configfile") //var (
chain33PrivateKeyStr = "0xd627968e445f2a41c92173225791bae1ba42126ae96c32f28f97ff8f226e5c68" // configPath = flag.String("f", "./../../relayer.toml", "configfile")
chain33AccountAddr = "1GTxrmuWiXavhcvsaH5w9whgVxUrWsUMdV" // chain33PrivateKeyStr = "0xd627968e445f2a41c92173225791bae1ba42126ae96c32f28f97ff8f226e5c68"
passphrase = "123456hzj" // chain33AccountAddr = "1GTxrmuWiXavhcvsaH5w9whgVxUrWsUMdV"
chainTestCfg = chain33Types.NewChain33Config(chain33Types.GetDefaultCfgstring()) // passphrase = "123456hzj"
// chainTestCfg = chain33Types.NewChain33Config(chain33Types.GetDefaultCfgstring())
// 0x8AFDADFC88a1087c9A1D6c0F5Dd04634b87F303a //
deployerPrivateKey = "8656d2bc732a8a816a461ba5e2d8aac7c7f85c26a813df30d5327210465eb230" // // 0x8AFDADFC88a1087c9A1D6c0F5Dd04634b87F303a
// 0x92C8b16aFD6d423652559C6E266cBE1c29Bfd84f // deployerPrivateKey = "8656d2bc732a8a816a461ba5e2d8aac7c7f85c26a813df30d5327210465eb230"
ethValidatorAddrKeyA = "3fa21584ae2e4fd74db9b58e2386f5481607dfa4d7ba0617aaa7858e5025dc1e" // // 0x92C8b16aFD6d423652559C6E266cBE1c29Bfd84f
ethValidatorAddrKeyB = "a5f3063552f4483cfc20ac4f40f45b798791379862219de9e915c64722c1d400" // ethValidatorAddrKeyA = "3fa21584ae2e4fd74db9b58e2386f5481607dfa4d7ba0617aaa7858e5025dc1e"
ethValidatorAddrKeyC = "bbf5e65539e9af0eb0cfac30bad475111054b09c11d668fc0731d54ea777471e" // ethValidatorAddrKeyB = "a5f3063552f4483cfc20ac4f40f45b798791379862219de9e915c64722c1d400"
ethValidatorAddrKeyD = "c9fa31d7984edf81b8ef3b40c761f1847f6fcd5711ab2462da97dc458f1f896b" // ethValidatorAddrKeyC = "bbf5e65539e9af0eb0cfac30bad475111054b09c11d668fc0731d54ea777471e"
) // ethValidatorAddrKeyD = "c9fa31d7984edf81b8ef3b40c761f1847f6fcd5711ab2462da97dc458f1f896b"
//)
func Test_LockAndBurn(t *testing.T) { //
var tx chain33Types.Transaction //func Test_LockAndBurn(t *testing.T) {
var ret chain33Types.Reply // var tx chain33Types.Transaction
ret.IsOk = true // var ret chain33Types.Reply
// ret.IsOk = true
mockapi := &mocks.QueueProtocolAPI{} //
// 这里对需要mock的方法打桩,Close是必须的,其它方法根据需要 // mockapi := &mocks.QueueProtocolAPI{}
mockapi.On("Close").Return() // // 这里对需要mock的方法打桩,Close是必须的,其它方法根据需要
mockapi.On("AddPushSubscribe", mock.Anything).Return(&ret, nil) // mockapi.On("Close").Return()
mockapi.On("CreateTransaction", mock.Anything).Return(&tx, nil) // mockapi.On("AddPushSubscribe", mock.Anything).Return(&ret, nil)
mockapi.On("SendTx", mock.Anything).Return(&ret, nil) // mockapi.On("CreateTransaction", mock.Anything).Return(&tx, nil)
mockapi.On("SendTransaction", mock.Anything).Return(&ret, nil) // mockapi.On("SendTx", mock.Anything).Return(&ret, nil)
mockapi.On("GetConfig", mock.Anything).Return(chainTestCfg, nil) // mockapi.On("SendTransaction", mock.Anything).Return(&ret, nil)
// mockapi.On("GetConfig", mock.Anything).Return(chainTestCfg, nil)
mock33 := testnode.New("", mockapi) //
defer mock33.Close() // mock33 := testnode.New("", mockapi)
rpcCfg := mock33.GetCfg().RPC // defer mock33.Close()
// 这里必须设置监听端口,默认的是无效值 // rpcCfg := mock33.GetCfg().RPC
rpcCfg.JrpcBindAddr = "127.0.0.1:8801" // // 这里必须设置监听端口,默认的是无效值
mock33.GetRPC().Listen() // rpcCfg.JrpcBindAddr = "127.0.0.1:8801"
// mock33.GetRPC().Listen()
fmt.Println("======================= testLockEth =======================") //
testLockEth(t) // fmt.Println("======================= testLockEth =======================")
fmt.Println("======================= testCreateERC20Token =======================") // testLockEth(t)
testCreateERC20Token(t) // fmt.Println("======================= testCreateERC20Token =======================")
fmt.Println("======================= testBurnBty =======================") // testCreateERC20Token(t)
testBurnBty(t) // fmt.Println("======================= testBurnBty =======================")
} // testBurnBty(t)
//}
func Test_GetValidatorAddr(t *testing.T) { //
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts() //func Test_GetValidatorAddr(t *testing.T) {
require.NoError(t, err) // para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo) // require.NoError(t, err)
_ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr) // ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond) // _ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr)
// time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
_, _, err = ethRelayer.NewAccount("123") //
require.Nil(t, err) // _, _, err = ethRelayer.NewAccount("123")
// require.Nil(t, err)
privateKey, _, err := ethRelayer.GetAccount("123") //
require.Nil(t, err) // privateKey, _, err := ethRelayer.GetAccount("123")
assert.NotEqual(t, privateKey, chain33PrivateKeyStr) // require.Nil(t, err)
// assert.NotEqual(t, privateKey, chain33PrivateKeyStr)
privateKey, addr, err := ethRelayer.GetAccount(passphrase) //
require.Nil(t, err) // privateKey, addr, err := ethRelayer.GetAccount(passphrase)
assert.Equal(t, privateKey, chain33PrivateKeyStr) // require.Nil(t, err)
assert.Equal(t, addr, chain33AccountAddr) // assert.Equal(t, privateKey, chain33PrivateKeyStr)
// assert.Equal(t, addr, chain33AccountAddr)
validators, err := ethRelayer.GetValidatorAddr() //
require.Nil(t, err) // validators, err := ethRelayer.GetValidatorAddr()
assert.Equal(t, validators.Chain33Validator, chain33AccountAddr) // require.Nil(t, err)
} // assert.Equal(t, validators.Chain33Validator, chain33AccountAddr)
//}
func Test_IsValidatorActive(t *testing.T) { //
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts() //func Test_IsValidatorActive(t *testing.T) {
require.NoError(t, err) // para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo) // require.NoError(t, err)
_ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr) // ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond) // _ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr)
// time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
is, err := ethRelayer.IsValidatorActive(para.InitValidators[0].String()) //
assert.Equal(t, is, true) // is, err := ethRelayer.IsValidatorActive(para.InitValidators[0].String())
require.Nil(t, err) // assert.Equal(t, is, true)
// require.Nil(t, err)
is, err = ethRelayer.IsValidatorActive("0x0C05bA5c230fDaA503b53702aF1962e08D0C60BF") //
assert.Equal(t, is, false) // is, err = ethRelayer.IsValidatorActive("0x0C05bA5c230fDaA503b53702aF1962e08D0C60BF")
require.Nil(t, err) // assert.Equal(t, is, false)
// require.Nil(t, err)
_, err = ethRelayer.IsValidatorActive("123") //
require.Error(t, err) // _, err = ethRelayer.IsValidatorActive("123")
} // require.Error(t, err)
//}
func Test_ShowAddr(t *testing.T) { //
{ //func Test_ShowAddr(t *testing.T) {
cfg := initCfg(*configPath) // {
relayer := &Relayer4Ethereum{ // cfg := initCfg(*configPath)
provider: cfg.EthProvider, // relayer := &Relayer4Ethereum{
unlockchan: make(chan int, 2), // provider: cfg.EthProvider,
rpcURL2Chain33: cfg.SyncTxConfig.Chain33Host, // unlockchan: make(chan int, 2),
maturityDegree: cfg.EthMaturityDegree, // rpcURL2Chain33: cfg.SyncTxConfig.Chain33Host,
fetchHeightPeriodMs: cfg.EthBlockFetchPeriod, // maturityDegree: cfg.EthMaturityDegree,
} // fetchHeightPeriodMs: cfg.EthBlockFetchPeriod,
_, err := relayer.ShowBridgeBankAddr() // }
require.Error(t, err) // _, err := relayer.ShowBridgeBankAddr()
// require.Error(t, err)
_, err = relayer.ShowBridgeRegistryAddr() //
require.Error(t, err) // _, err = relayer.ShowBridgeRegistryAddr()
} // require.Error(t, err)
// }
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts() //
require.NoError(t, err) // para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo) // require.NoError(t, err)
_ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr) // ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond) // _ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr)
// time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
ethRelayer.prePareSubscribeEvent() //
// ethRelayer.prePareSubscribeEvent()
addr, err := ethRelayer.ShowBridgeBankAddr() //
require.Nil(t, err) // addr, err := ethRelayer.ShowBridgeBankAddr()
assert.Equal(t, addr, x2EthDeployInfo.BridgeBank.Address.String()) // require.Nil(t, err)
// assert.Equal(t, addr, x2EthDeployInfo.BridgeBank.Address.String())
addr, err = ethRelayer.ShowBridgeRegistryAddr() //
require.Nil(t, err) // addr, err = ethRelayer.ShowBridgeRegistryAddr()
assert.Equal(t, addr, x2EthDeployInfo.BridgeRegistry.Address.String()) // require.Nil(t, err)
// assert.Equal(t, addr, x2EthDeployInfo.BridgeRegistry.Address.String())
addr, err = ethRelayer.ShowOperator() //
require.Nil(t, err) // addr, err = ethRelayer.ShowOperator()
assert.Equal(t, addr, para.Operator.String()) // require.Nil(t, err)
} // assert.Equal(t, addr, para.Operator.String())
//}
func Test_DeployContrcts(t *testing.T) { //
_, sim, _, _ := deployContracts() //func Test_DeployContrcts(t *testing.T) {
cfg := initCfg(*configPath) // _, sim, _, _ := deployContracts()
cfg.SyncTxConfig.Dbdriver = "memdb" // cfg := initCfg(*configPath)
// cfg.SyncTxConfig.Dbdriver = "memdb"
db := dbm.NewDB("relayer_db_service", cfg.SyncTxConfig.Dbdriver, cfg.SyncTxConfig.DbPath, cfg.SyncTxConfig.DbCache) //
// db := dbm.NewDB("relayer_db_service", cfg.SyncTxConfig.Dbdriver, cfg.SyncTxConfig.DbPath, cfg.SyncTxConfig.DbCache)
relayer := &Relayer4Ethereum{ //
provider: cfg.EthProvider, // relayer := &Relayer4Ethereum{
db: db, // provider: cfg.EthProvider,
unlockchan: make(chan int, 2), // db: db,
rpcURL2Chain33: cfg.SyncTxConfig.Chain33Host, // unlockchan: make(chan int, 2),
maturityDegree: cfg.EthMaturityDegree, // rpcURL2Chain33: cfg.SyncTxConfig.Chain33Host,
fetchHeightPeriodMs: cfg.EthBlockFetchPeriod, // maturityDegree: cfg.EthMaturityDegree,
deployInfo: cfg.Deploy, // fetchHeightPeriodMs: cfg.EthBlockFetchPeriod,
} // deployInfo: cfg.Deploy,
relayer.clientSpec = sim // }
relayer.clientChainID = big.NewInt(1) // relayer.clientSpec = sim
// relayer.clientChainID = big.NewInt(1)
deployPrivateKey, _ := crypto.ToECDSA(common.FromHex(relayer.deployInfo.DeployerPrivateKey)) //
deployerAddr := crypto.PubkeyToAddress(deployPrivateKey.PublicKey) // deployPrivateKey, _ := crypto.ToECDSA(common.FromHex(relayer.deployInfo.DeployerPrivateKey))
relayer.operatorInfo = &ethtxs.OperatorInfo{ // deployerAddr := crypto.PubkeyToAddress(deployPrivateKey.PublicKey)
PrivateKey: deployPrivateKey, // relayer.operatorInfo = &ethtxs.OperatorInfo{
Address: deployerAddr, // PrivateKey: deployPrivateKey,
} // Address: deployerAddr,
// }
_, err := relayer.DeployContrcts() //
require.NoError(t, err) // _, err := relayer.DeployContrcts()
} // require.NoError(t, err)
//}
func Test_SetBridgeRegistryAddr(t *testing.T) { //
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts() //func Test_SetBridgeRegistryAddr(t *testing.T) {
require.NoError(t, err) // para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo) // require.NoError(t, err)
_ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr) // ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond) // _ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr)
// time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
_ = ethRelayer.setBridgeRegistryAddr(x2EthDeployInfo.BridgeRegistry.Address.String()) //
registrAddrInDB, err := ethRelayer.getBridgeRegistryAddr() // _ = ethRelayer.setBridgeRegistryAddr(x2EthDeployInfo.BridgeRegistry.Address.String())
require.Nil(t, err) // registrAddrInDB, err := ethRelayer.getBridgeRegistryAddr()
assert.Equal(t, registrAddrInDB, x2EthDeployInfo.BridgeRegistry.Address.String()) // require.Nil(t, err)
} // assert.Equal(t, registrAddrInDB, x2EthDeployInfo.BridgeRegistry.Address.String())
//}
func Test_CreateBridgeToken(t *testing.T) { //
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts() //func Test_CreateBridgeToken(t *testing.T) {
require.NoError(t, err) // para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo) // require.NoError(t, err)
_ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr) // ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond) // _ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr)
// time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
balance, err := ethRelayer.GetBalance("", para.InitValidators[0].String()) //
require.Nil(t, err) // balance, err := ethRelayer.GetBalance("", para.InitValidators[0].String())
assert.Equal(t, balance, "10000000000") // require.Nil(t, err)
// assert.Equal(t, balance, "10000000000")
tokenAddrbty, err := ethRelayer.CreateBridgeToken("BTY") //
require.Nil(t, err) // tokenAddrbty, err := ethRelayer.CreateBridgeToken("BTY")
require.NotEmpty(t, tokenAddrbty) // require.Nil(t, err)
sim.Commit() // require.NotEmpty(t, tokenAddrbty)
// sim.Commit()
addr, err := ethRelayer.ShowTokenAddrBySymbol("BTY") //
require.Nil(t, err) // addr, err := ethRelayer.ShowTokenAddrBySymbol("BTY")
assert.Equal(t, addr, tokenAddrbty) // require.Nil(t, err)
// assert.Equal(t, addr, tokenAddrbty)
decimals, err := ethRelayer.GetDecimals(tokenAddrbty) //
require.Nil(t, err) // decimals, err := ethRelayer.GetDecimals(tokenAddrbty)
assert.Equal(t, decimals, uint8(8)) // require.Nil(t, err)
// assert.Equal(t, decimals, uint8(8))
_, err = ethRelayer.Burn(para.InitValidators[0].String(), tokenAddrbty, chain33AccountAddr, "10") //
require.Error(t, err) // _, err = ethRelayer.Burn(para.InitValidators[0].String(), tokenAddrbty, chain33AccountAddr, "10")
// require.Error(t, err)
_, err = ethRelayer.BurnAsync(para.InitValidators[0].String(), tokenAddrbty, chain33AccountAddr, "10") //
require.Error(t, err) // _, err = ethRelayer.BurnAsync(para.InitValidators[0].String(), tokenAddrbty, chain33AccountAddr, "10")
} // require.Error(t, err)
//}
func testLockEth(t *testing.T) { //
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts() //func testLockEth(t *testing.T) {
require.NoError(t, err) // para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo) // require.NoError(t, err)
_ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr) // ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond) // _ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr)
// time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
ctx := context.Background() //
bridgeBankBalance, err := sim.BalanceAt(ctx, x2EthDeployInfo.BridgeBank.Address, nil) // ctx := context.Background()
require.Nil(t, err) // bridgeBankBalance, err := sim.BalanceAt(ctx, x2EthDeployInfo.BridgeBank.Address, nil)
assert.Equal(t, bridgeBankBalance.Int64(), int64(0)) // require.Nil(t, err)
// assert.Equal(t, bridgeBankBalance.Int64(), int64(0))
userOneAuth, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0]) //
require.Nil(t, err) // userOneAuth, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
// require.Nil(t, err)
//lock 50 eth //
chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt") // //lock 50 eth
ethAmount := big.NewInt(50) // chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
userOneAuth.Value = ethAmount // ethAmount := big.NewInt(50)
_, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, common.Address{}, ethAmount) // userOneAuth.Value = ethAmount
require.Nil(t, err) // _, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, common.Address{}, ethAmount)
sim.Commit() // require.Nil(t, err)
// sim.Commit()
bridgeBankBalance, err = sim.BalanceAt(ctx, x2EthDeployInfo.BridgeBank.Address, nil) //
require.Nil(t, err) // bridgeBankBalance, err = sim.BalanceAt(ctx, x2EthDeployInfo.BridgeBank.Address, nil)
assert.Equal(t, bridgeBankBalance.Int64(), ethAmount.Int64()) // require.Nil(t, err)
// assert.Equal(t, bridgeBankBalance.Int64(), ethAmount.Int64())
for i := 0; i < 11; i++ { //
sim.Commit() // for i := 0; i < 11; i++ {
} // sim.Commit()
// }
time.Sleep(time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond) //
// time.Sleep(time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
balance, err := ethRelayer.ShowLockStatics("") //
require.Nil(t, err) // balance, err := ethRelayer.ShowLockStatics("")
assert.Equal(t, balance, "50") // require.Nil(t, err)
// assert.Equal(t, balance, "50")
time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond) //
} // time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
//}
func testCreateERC20Token(t *testing.T) { //
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts() //func testCreateERC20Token(t *testing.T) {
require.NoError(t, err) // para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo) // require.NoError(t, err)
_ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr) // ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond) // _ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr)
// time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
tokenErc20Addr, err := ethRelayer.CreateERC20Token("testcc") //
require.Nil(t, err) // tokenErc20Addr, err := ethRelayer.CreateERC20Token("testcc")
require.NotEmpty(t, tokenErc20Addr) // require.Nil(t, err)
sim.Commit() // require.NotEmpty(t, tokenErc20Addr)
// sim.Commit()
_, err = ethRelayer.MintERC20Token(tokenErc20Addr, para.Deployer.String(), "20000000000000") //
require.Nil(t, err) // _, err = ethRelayer.MintERC20Token(tokenErc20Addr, para.Deployer.String(), "20000000000000")
sim.Commit() // require.Nil(t, err)
// sim.Commit()
balance, err := ethRelayer.ShowDepositStatics(tokenErc20Addr) //
require.Nil(t, err) // balance, err := ethRelayer.ShowDepositStatics(tokenErc20Addr)
assert.Equal(t, balance, "20000000000000") // require.Nil(t, err)
// assert.Equal(t, balance, "20000000000000")
claimID := crypto.Keccak256Hash(big.NewInt(50).Bytes()) //
bret, err := ethRelayer.IsProphecyPending(claimID) // claimID := crypto.Keccak256Hash(big.NewInt(50).Bytes())
require.Nil(t, err) // bret, err := ethRelayer.IsProphecyPending(claimID)
assert.Equal(t, bret, false) // require.Nil(t, err)
// assert.Equal(t, bret, false)
txhash, err := ethRelayer.TransferToken(tokenErc20Addr, hexutil.Encode(crypto.FromECDSA(para.DeployPrivateKey)), ethRelayer.deployInfo.ValidatorsAddr[0], "100") //
require.Nil(t, err) // txhash, err := ethRelayer.TransferToken(tokenErc20Addr, hexutil.Encode(crypto.FromECDSA(para.DeployPrivateKey)), ethRelayer.deployInfo.ValidatorsAddr[0], "100")
sim.Commit() // require.Nil(t, err)
// sim.Commit()
_, err = ethRelayer.ShowTxReceipt(txhash) //
require.Nil(t, err) // _, err = ethRelayer.ShowTxReceipt(txhash)
// require.Nil(t, err)
balance, err = ethRelayer.GetBalance(tokenErc20Addr, ethRelayer.deployInfo.ValidatorsAddr[0]) //
require.Nil(t, err) // balance, err = ethRelayer.GetBalance(tokenErc20Addr, ethRelayer.deployInfo.ValidatorsAddr[0])
assert.Equal(t, balance, "100") // require.Nil(t, err)
// assert.Equal(t, balance, "100")
balance, err = ethRelayer.GetBalance(tokenErc20Addr, para.Deployer.String()) //
require.Nil(t, err) // balance, err = ethRelayer.GetBalance(tokenErc20Addr, para.Deployer.String())
assert.Equal(t, balance, "19999999999900") // require.Nil(t, err)
// assert.Equal(t, balance, "19999999999900")
tx1 := ethRelayer.QueryTxhashRelay2Eth() //
require.Empty(t, tx1) // tx1 := ethRelayer.QueryTxhashRelay2Eth()
// require.Empty(t, tx1)
tx2 := ethRelayer.QueryTxhashRelay2Chain33() //
require.Empty(t, tx2) // tx2 := ethRelayer.QueryTxhashRelay2Chain33()
// require.Empty(t, tx2)
tokenErc20Addrtestc, err := ethRelayer.CreateERC20Token("testc") //
require.Nil(t, err) // tokenErc20Addrtestc, err := ethRelayer.CreateERC20Token("testc")
require.NotEmpty(t, tokenErc20Addrtestc) // require.Nil(t, err)
sim.Commit() // require.NotEmpty(t, tokenErc20Addrtestc)
// sim.Commit()
_, err = ethRelayer.MintERC20Token(tokenErc20Addrtestc, para.Deployer.String(), "10000000000000") //
require.Nil(t, err) // _, err = ethRelayer.MintERC20Token(tokenErc20Addrtestc, para.Deployer.String(), "10000000000000")
sim.Commit() // require.Nil(t, err)
// sim.Commit()
balance, err = ethRelayer.ShowDepositStatics(tokenErc20Addrtestc) //
require.Nil(t, err) // balance, err = ethRelayer.ShowDepositStatics(tokenErc20Addrtestc)
assert.Equal(t, balance, "10000000000000") // require.Nil(t, err)
// assert.Equal(t, balance, "10000000000000")
chain33Receiver := "14KEKbYtKKQm4wMthSK9J4La4nAiidGozt" //
_, err = ethRelayer.LockEthErc20Asset(hexutil.Encode(crypto.FromECDSA(para.DeployPrivateKey)), tokenErc20Addrtestc, "100", chain33Receiver) // chain33Receiver := "14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
require.Nil(t, err) // _, err = ethRelayer.LockEthErc20Asset(hexutil.Encode(crypto.FromECDSA(para.DeployPrivateKey)), tokenErc20Addrtestc, "100", chain33Receiver)
sim.Commit() // require.Nil(t, err)
// sim.Commit()
balance, err = ethRelayer.GetBalance(tokenErc20Addrtestc, para.Deployer.String()) //
require.Nil(t, err) // balance, err = ethRelayer.GetBalance(tokenErc20Addrtestc, para.Deployer.String())
assert.Equal(t, balance, "9999999999900") // require.Nil(t, err)
// assert.Equal(t, balance, "9999999999900")
_, err = ethRelayer.ApproveAllowance(hexutil.Encode(crypto.FromECDSA(para.DeployPrivateKey)), tokenErc20Addrtestc, "500") //
require.Nil(t, err) // _, err = ethRelayer.ApproveAllowance(hexutil.Encode(crypto.FromECDSA(para.DeployPrivateKey)), tokenErc20Addrtestc, "500")
sim.Commit() // require.Nil(t, err)
// sim.Commit()
_, err = ethRelayer.LockEthErc20AssetAsync(hexutil.Encode(crypto.FromECDSA(para.DeployPrivateKey)), tokenErc20Addrtestc, "100", chain33Receiver) //
require.Nil(t, err) // _, err = ethRelayer.LockEthErc20AssetAsync(hexutil.Encode(crypto.FromECDSA(para.DeployPrivateKey)), tokenErc20Addrtestc, "100", chain33Receiver)
sim.Commit() // require.Nil(t, err)
// sim.Commit()
balance, err = ethRelayer.GetBalance(tokenErc20Addrtestc, para.Deployer.String()) //
require.Nil(t, err) // balance, err = ethRelayer.GetBalance(tokenErc20Addrtestc, para.Deployer.String())
assert.Equal(t, balance, "9999999999800") // require.Nil(t, err)
// assert.Equal(t, balance, "9999999999800")
for i := 0; i < 11; i++ { //
sim.Commit() // for i := 0; i < 11; i++ {
} // sim.Commit()
time.Sleep(time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond) // }
} // time.Sleep(time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
//}
func testBurnBty(t *testing.T) { //
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts() //func testBurnBty(t *testing.T) {
require.NoError(t, err) // para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo) // require.NoError(t, err)
_ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr) // ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond) // _ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr)
// time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
tokenAddrbty, err := ethRelayer.CreateBridgeToken("bty") //
require.Nil(t, err) // tokenAddrbty, err := ethRelayer.CreateBridgeToken("bty")
require.NotEmpty(t, tokenAddrbty) // require.Nil(t, err)
sim.Commit() // require.NotEmpty(t, tokenAddrbty)
// sim.Commit()
chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt") //
amount := int64(100) // chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
ethReceiver := para.InitValidators[2] // amount := int64(100)
claimID := crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), big.NewInt(amount).Bytes()) // ethReceiver := para.InitValidators[2]
authOracle, err := ethtxs.PrepareAuth(ethRelayer.clientSpec, para.ValidatorPriKey[0], para.InitValidators[0]) // claimID := crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), big.NewInt(amount).Bytes())
require.Nil(t, err) // authOracle, err := ethtxs.PrepareAuth(ethRelayer.clientSpec, para.ValidatorPriKey[0], para.InitValidators[0])
signature, err := ethtxs.SignClaim4Eth(claimID, para.ValidatorPriKey[0]) // require.Nil(t, err)
require.Nil(t, err) // signature, err := ethtxs.SignClaim4Eth(claimID, para.ValidatorPriKey[0])
// require.Nil(t, err)
_, err = x2EthContracts.Oracle.NewOracleClaim( //
authOracle, // _, err = x2EthContracts.Oracle.NewOracleClaim(
events.ClaimTypeLock, // authOracle,
chain33Sender, // events.ClaimTypeLock,
ethReceiver, // chain33Sender,
common.HexToAddress(tokenAddrbty), // ethReceiver,
"bty", // common.HexToAddress(tokenAddrbty),
big.NewInt(amount), // "bty",
claimID, // big.NewInt(amount),
signature) // claimID,
require.Nil(t, err) // signature)
sim.Commit() // require.Nil(t, err)
// sim.Commit()
balanceNew, err := ethRelayer.GetBalance(tokenAddrbty, ethReceiver.String()) //
require.Nil(t, err) // balanceNew, err := ethRelayer.GetBalance(tokenAddrbty, ethReceiver.String())
require.Equal(t, balanceNew, "100") // require.Nil(t, err)
// require.Equal(t, balanceNew, "100")
_, err = ethRelayer.Burn(hexutil.Encode(crypto.FromECDSA(para.ValidatorPriKey[2])), tokenAddrbty, chain33AccountAddr, "10") //
require.NoError(t, err) // _, err = ethRelayer.Burn(hexutil.Encode(crypto.FromECDSA(para.ValidatorPriKey[2])), tokenAddrbty, chain33AccountAddr, "10")
sim.Commit() // require.NoError(t, err)
// sim.Commit()
balanceNew, err = ethRelayer.GetBalance(tokenAddrbty, ethReceiver.String()) //
require.Nil(t, err) // balanceNew, err = ethRelayer.GetBalance(tokenAddrbty, ethReceiver.String())
require.Equal(t, balanceNew, "90") // require.Nil(t, err)
// require.Equal(t, balanceNew, "90")
_, err = ethRelayer.ApproveAllowance(hexutil.Encode(crypto.FromECDSA(para.ValidatorPriKey[2])), tokenAddrbty, "10") //
require.Nil(t, err) // _, err = ethRelayer.ApproveAllowance(hexutil.Encode(crypto.FromECDSA(para.ValidatorPriKey[2])), tokenAddrbty, "10")
sim.Commit() // require.Nil(t, err)
// sim.Commit()
_, err = ethRelayer.BurnAsync(hexutil.Encode(crypto.FromECDSA(para.ValidatorPriKey[2])), tokenAddrbty, chain33AccountAddr, "10") //
require.NoError(t, err) // _, err = ethRelayer.BurnAsync(hexutil.Encode(crypto.FromECDSA(para.ValidatorPriKey[2])), tokenAddrbty, chain33AccountAddr, "10")
sim.Commit() // require.NoError(t, err)
// sim.Commit()
balanceNew, err = ethRelayer.GetBalance(tokenAddrbty, ethReceiver.String()) //
require.Nil(t, err) // balanceNew, err = ethRelayer.GetBalance(tokenAddrbty, ethReceiver.String())
require.Equal(t, balanceNew, "80") // require.Nil(t, err)
// require.Equal(t, balanceNew, "80")
fetchCnt := int32(10) //
logs, err := ethRelayer.getNextValidEthTxEventLogs(ethRelayer.eventLogIndex.Height, ethRelayer.eventLogIndex.Index, fetchCnt) // fetchCnt := int32(10)
require.NoError(t, err) // logs, err := ethRelayer.getNextValidEthTxEventLogs(ethRelayer.eventLogIndex.Height, ethRelayer.eventLogIndex.Index, fetchCnt)
// require.NoError(t, err)
for _, vLog := range logs { //
ethRelayer.procBridgeBankLogs(*vLog) // for _, vLog := range logs {
} // ethRelayer.procBridgeBankLogs(*vLog)
// }
time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond) //
} // time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
//}
func Test_RestorePrivateKeys(t *testing.T) { //
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts() //func Test_RestorePrivateKeys(t *testing.T) {
require.NoError(t, err) // para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo) // require.NoError(t, err)
_ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr) // ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond) // _ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr)
// time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
go func() { //
for range ethRelayer.unlockchan { // go func() {
} // for range ethRelayer.unlockchan {
}() // }
ethRelayer.rwLock.RLock() // }()
temp := ethRelayer.privateKey4Chain33 // ethRelayer.rwLock.RLock()
ethRelayer.rwLock.RUnlock() // temp := ethRelayer.privateKey4Chain33
// ethRelayer.rwLock.RUnlock()
err = ethRelayer.RestorePrivateKeys("123") //
ethRelayer.rwLock.RLock() // err = ethRelayer.RestorePrivateKeys("123")
assert.NotEqual(t, hex.EncodeToString(temp.Bytes()), hex.EncodeToString(ethRelayer.privateKey4Chain33.Bytes())) // ethRelayer.rwLock.RLock()
ethRelayer.rwLock.RUnlock() // assert.NotEqual(t, hex.EncodeToString(temp.Bytes()), hex.EncodeToString(ethRelayer.privateKey4Chain33.Bytes()))
require.Nil(t, err) // ethRelayer.rwLock.RUnlock()
// require.Nil(t, err)
err = ethRelayer.RestorePrivateKeys(passphrase) //
ethRelayer.rwLock.RLock() // err = ethRelayer.RestorePrivateKeys(passphrase)
assert.Equal(t, hex.EncodeToString(temp.Bytes()), hex.EncodeToString(ethRelayer.privateKey4Chain33.Bytes())) // ethRelayer.rwLock.RLock()
ethRelayer.rwLock.RUnlock() // assert.Equal(t, hex.EncodeToString(temp.Bytes()), hex.EncodeToString(ethRelayer.privateKey4Chain33.Bytes()))
require.Nil(t, err) // ethRelayer.rwLock.RUnlock()
// require.Nil(t, err)
err = ethRelayer.StoreAccountWithNewPassphase("new123", passphrase) //
require.Nil(t, err) // err = ethRelayer.StoreAccountWithNewPassphase("new123", passphrase)
// require.Nil(t, err)
err = ethRelayer.RestorePrivateKeys("new123") //
ethRelayer.rwLock.RLock() // err = ethRelayer.RestorePrivateKeys("new123")
assert.Equal(t, hex.EncodeToString(temp.Bytes()), hex.EncodeToString(ethRelayer.privateKey4Chain33.Bytes())) // ethRelayer.rwLock.RLock()
ethRelayer.rwLock.RUnlock() // assert.Equal(t, hex.EncodeToString(temp.Bytes()), hex.EncodeToString(ethRelayer.privateKey4Chain33.Bytes()))
require.Nil(t, err) // ethRelayer.rwLock.RUnlock()
} // require.Nil(t, err)
//}
func newEthRelayer(para *ethtxs.DeployPara, sim *ethinterface.SimExtend, x2EthContracts *ethtxs.X2EthContracts, x2EthDeployInfo *ethtxs.X2EthDeployInfo) *Relayer4Ethereum { //
cfg := initCfg(*configPath) //func newEthRelayer(para *ethtxs.DeployPara, sim *ethinterface.SimExtend, x2EthContracts *ethtxs.X2EthContracts, x2EthDeployInfo *ethtxs.X2EthDeployInfo) *Relayer4Ethereum {
cfg.SyncTxConfig.Chain33Host = "http://127.0.0.1:8801" // cfg := initCfg(*configPath)
cfg.BridgeRegistry = x2EthDeployInfo.BridgeRegistry.Address.String() // cfg.SyncTxConfig.Chain33Host = "http://127.0.0.1:8801"
cfg.SyncTxConfig.PushBind = "127.0.0.1:60000" // cfg.BridgeRegistry = x2EthDeployInfo.BridgeRegistry.Address.String()
cfg.SyncTxConfig.FetchHeightPeriodMs = 50 // cfg.SyncTxConfig.PushBind = "127.0.0.1:60000"
cfg.SyncTxConfig.Dbdriver = "memdb" // cfg.SyncTxConfig.FetchHeightPeriodMs = 50
cfg.SyncTxConfig.DbPath = "datadirEth" // cfg.SyncTxConfig.Dbdriver = "memdb"
// cfg.SyncTxConfig.DbPath = "datadirEth"
db := dbm.NewDB("relayer_db_service", cfg.SyncTxConfig.Dbdriver, cfg.SyncTxConfig.DbPath, cfg.SyncTxConfig.DbCache) //
// db := dbm.NewDB("relayer_db_service", cfg.SyncTxConfig.Dbdriver, cfg.SyncTxConfig.DbPath, cfg.SyncTxConfig.DbCache)
relayer := &Relayer4Ethereum{ //
provider: cfg.EthProvider, // relayer := &Relayer4Ethereum{
db: db, // provider: cfg.EthProvider,
unlockchan: make(chan int, 2), // db: db,
rpcURL2Chain33: cfg.SyncTxConfig.Chain33Host, // unlockchan: make(chan int, 2),
bridgeRegistryAddr: x2EthDeployInfo.BridgeRegistry.Address, // rpcURL2Chain33: cfg.SyncTxConfig.Chain33Host,
maturityDegree: cfg.EthMaturityDegree, // bridgeRegistryAddr: x2EthDeployInfo.BridgeRegistry.Address,
fetchHeightPeriodMs: cfg.EthBlockFetchPeriod, // maturityDegree: cfg.EthMaturityDegree,
//deployInfo: cfg.Deploy, // fetchHeightPeriodMs: cfg.EthBlockFetchPeriod,
} // //deployInfo: cfg.Deploy,
// }
relayer.deployInfo = &ebTypes.Deploy{} //
relayer.deployInfo.DeployerPrivateKey = hexutil.Encode(crypto.FromECDSA(para.DeployPrivateKey)) // relayer.deployInfo = &ebTypes.Deploy{}
relayer.deployInfo.OperatorAddr = para.Operator.String() // relayer.deployInfo.DeployerPrivateKey = hexutil.Encode(crypto.FromECDSA(para.DeployPrivateKey))
for _, v := range para.InitValidators { // relayer.deployInfo.OperatorAddr = para.Operator.String()
relayer.deployInfo.ValidatorsAddr = append(relayer.deployInfo.ValidatorsAddr, v.String()) // for _, v := range para.InitValidators {
} // relayer.deployInfo.ValidatorsAddr = append(relayer.deployInfo.ValidatorsAddr, v.String())
for _, v := range para.InitPowers { // }
relayer.deployInfo.InitPowers = append(relayer.deployInfo.InitPowers, v.Int64()) // for _, v := range para.InitPowers {
} // relayer.deployInfo.InitPowers = append(relayer.deployInfo.InitPowers, v.Int64())
// }
relayer.eventLogIndex = relayer.getLastBridgeBankProcessedHeight() //
relayer.initBridgeBankTx() // relayer.eventLogIndex = relayer.getLastBridgeBankProcessedHeight()
relayer.clientSpec = sim // relayer.initBridgeBankTx()
relayer.clientChainID = big.NewInt(1) // relayer.clientSpec = sim
// relayer.clientChainID = big.NewInt(1)
deployPrivateKey, _ := crypto.ToECDSA(common.FromHex(relayer.deployInfo.DeployerPrivateKey)) //
deployerAddr := crypto.PubkeyToAddress(deployPrivateKey.PublicKey) // deployPrivateKey, _ := crypto.ToECDSA(common.FromHex(relayer.deployInfo.DeployerPrivateKey))
relayer.rwLock.Lock() // deployerAddr := crypto.PubkeyToAddress(deployPrivateKey.PublicKey)
relayer.operatorInfo = &ethtxs.OperatorInfo{ // relayer.rwLock.Lock()
PrivateKey: deployPrivateKey, // relayer.operatorInfo = &ethtxs.OperatorInfo{
Address: deployerAddr, // PrivateKey: deployPrivateKey,
} // Address: deployerAddr,
relayer.deployPara = para // }
relayer.x2EthContracts = x2EthContracts // relayer.deployPara = para
relayer.x2EthDeployInfo = x2EthDeployInfo // relayer.x2EthContracts = x2EthContracts
relayer.rwLock.Unlock() // relayer.x2EthDeployInfo = x2EthDeployInfo
// relayer.rwLock.Unlock()
go relayer.proc() //
return relayer // go relayer.proc()
} // return relayer
//}
func deployContracts() (*ethtxs.DeployPara, *ethinterface.SimExtend, *ethtxs.X2EthContracts, *ethtxs.X2EthDeployInfo) { //
ethValidatorAddrKeys := make([]string, 0) //func deployContracts() (*ethtxs.DeployPara, *ethinterface.SimExtend, *ethtxs.X2EthContracts, *ethtxs.X2EthDeployInfo) {
ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyA) // ethValidatorAddrKeys := make([]string, 0)
ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyB) // ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyA)
ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyC) // ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyB)
ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyD) // ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyC)
// ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyD)
ctx := context.Background() //
//var backend bind.ContractBackend // ctx := context.Background()
backend, para := setup.PrepareTestEnvironment(deployerPrivateKey, ethValidatorAddrKeys) // //var backend bind.ContractBackend
sim := new(ethinterface.SimExtend) // backend, para := setup.PrepareTestEnvironment(deployerPrivateKey, ethValidatorAddrKeys)
sim.SimulatedBackend = backend.(*backends.SimulatedBackend) // sim := new(ethinterface.SimExtend)
// sim.SimulatedBackend = backend.(*backends.SimulatedBackend)
callMsg := ethereum.CallMsg{ //
From: para.Deployer, // callMsg := ethereum.CallMsg{
Data: common.FromHex(generated.BridgeBankBin), // From: para.Deployer,
} // Data: common.FromHex(generated.BridgeBankBin),
// }
_, _ = sim.EstimateGas(ctx, callMsg) //
x2EthContracts, x2EthDeployInfo, _ := ethtxs.DeployAndInit(sim, para) // _, _ = sim.EstimateGas(ctx, callMsg)
sim.Commit() // x2EthContracts, x2EthDeployInfo, _ := ethtxs.DeployAndInit(sim, para)
// sim.Commit()
return para, sim, x2EthContracts, x2EthDeployInfo //
} // return para, sim, x2EthContracts, x2EthDeployInfo
//}
func initCfg(path string) *relayerTypes.RelayerConfig { //
var cfg relayerTypes.RelayerConfig //func initCfg(path string) *relayerTypes.RelayerConfig {
if _, err := tml.DecodeFile(path, &cfg); err != nil { // var cfg relayerTypes.RelayerConfig
//fmt.Println(err) // if _, err := tml.DecodeFile(path, &cfg); err != nil {
os.Exit(-1) // //fmt.Println(err)
} // os.Exit(-1)
return &cfg // }
} // return &cfg
//}
...@@ -159,12 +159,11 @@ func (a *action) procChain33ToEth_lock(msgLock *x2eTy.Chain33ToEth) (*types.Rece ...@@ -159,12 +159,11 @@ func (a *action) procChain33ToEth_lock(msgLock *x2eTy.Chain33ToEth) (*types.Rece
var accDB *account.DB var accDB *account.DB
exec, symbol, _ := x2eTy.DivideDot(msgLock.IssuerDotSymbol) exec, symbol, _ := x2eTy.DivideDot(msgLock.IssuerDotSymbol)
cfg := a.api.GetConfig() if exec == "coins" {
if exec == cfg.GetCoinExec() { accDB = account.NewCoinsAccount(a.api.GetConfig())
accDB = account.NewCoinsAccount(cfg)
accDB.SetDB(a.db) accDB.SetDB(a.db)
} else { } else {
accDB, err = account.NewAccountDB(cfg, exec, strings.ToLower(symbol), a.db) accDB, err = account.NewAccountDB(a.api.GetConfig(), exec, strings.ToLower(symbol), a.db)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "newAccountDB") return nil, errors.Wrap(err, "newAccountDB")
} }
...@@ -234,12 +233,11 @@ func (a *action) procEth2Chain33_burn(withdrawEth *x2eTy.Eth2Chain33) (*types.Re ...@@ -234,12 +233,11 @@ func (a *action) procEth2Chain33_burn(withdrawEth *x2eTy.Eth2Chain33) (*types.Re
var accDB *account.DB var accDB *account.DB
exec, symbol, _ := x2eTy.DivideDot(withdrawEth.IssuerDotSymbol) exec, symbol, _ := x2eTy.DivideDot(withdrawEth.IssuerDotSymbol)
cfg := a.api.GetConfig() if exec == "coins" {
if exec == cfg.GetCoinExec() { accDB = account.NewCoinsAccount(a.api.GetConfig())
accDB = account.NewCoinsAccount(cfg)
accDB.SetDB(a.db) accDB.SetDB(a.db)
} else { } else {
accDB, err = account.NewAccountDB(cfg, exec, strings.ToLower(symbol), a.db) accDB, err = account.NewAccountDB(a.api.GetConfig(), exec, strings.ToLower(symbol), a.db)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "newAccountDB") return nil, errors.Wrap(err, "newAccountDB")
} }
......
...@@ -6,11 +6,10 @@ package types ...@@ -6,11 +6,10 @@ package types
import ( import (
context "context" context "context"
fmt "fmt" fmt "fmt"
math "math"
types "github.com/33cn/chain33/types" types "github.com/33cn/chain33/types"
proto "github.com/golang/protobuf/proto" proto "github.com/golang/protobuf/proto"
grpc "google.golang.org/grpc" grpc "google.golang.org/grpc"
math "math"
) )
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment