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

update ethereum to 1.10

parent bba7112c
......@@ -17,13 +17,13 @@ require (
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f // indirect
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect
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/glog v0.0.0-20160126235308-23def4e6c14b
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/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/miguelmota/go-solidity-sha3 v0.1.0
github.com/mr-tron/base58 v1.2.0
......@@ -31,12 +31,11 @@ require (
github.com/perlin-network/life v0.0.0-20191203030451-05c0e0f7eaea
github.com/phoreproject/bls v0.0.0-20200525203911-a88a5ae26844
github.com/pkg/errors v0.9.1
github.com/prometheus/client_golang v0.9.2 // indirect
github.com/prometheus/common v0.4.1
github.com/prometheus/common v0.6.0
github.com/prometheus/procfs v0.0.3 // indirect
github.com/robertkrimen/otto v0.0.0-20180617131154-15f95af6e78d
github.com/rs/cors v1.6.0
github.com/spf13/cobra v0.0.5
github.com/rs/cors v1.7.0
github.com/spf13/cobra v1.1.1
github.com/stretchr/testify v1.7.0
github.com/tjfoc/gmsm v1.3.2
github.com/valyala/fasthttp v1.5.0
......@@ -46,5 +45,6 @@ require (
golang.org/x/sys v0.0.0-20210426080607-c94f62235c83
golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0 // indirect
google.golang.org/grpc v1.33.2
gopkg.in/sourcemap.v1 v1.0.5 // indirect
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
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.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/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/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=
......@@ -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/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
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/NebulousLabs/Sia v1.3.7 h1:gYfYnXVyeaEzyyVwjpQjszBcENNZ8DPIJc/pgOiLuGA=
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
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/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/go.mod h1:KcL6D/4RZ8RAYzQ5gKI0odcdWUmCVlbQTOlWrhP71CY=
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/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/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/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/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/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/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/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.3 h1:vkLuvpK4fmtSCuo60+yC63p7y0BmQ8gm5ZXGuBCJyXg=
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 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/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/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/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/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=
......@@ -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/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/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/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
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+
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/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/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/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.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/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
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
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-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/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/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
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/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 v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
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
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/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-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA=
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/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/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/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 v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw=
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
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/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.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/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/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/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/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
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
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/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-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/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/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
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.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/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/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.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
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=
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/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/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-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/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
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.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.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc=
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
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/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 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.3.0/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=
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-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/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM=
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
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-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/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/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/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 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/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.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
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-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc=
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.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
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/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/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.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
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.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.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.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/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/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw=
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 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.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/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/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.7.9 h1:uSeBTNO4rBkbp1Be5FKRsAmglM9nlx25TzVQRQt1An4=
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.2/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
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/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/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/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/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.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.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/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/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/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.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
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/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/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/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
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/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/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
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=
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/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.2 h1:7cWK5cdA5x72jX0g8iLrQWm5TRJZ6CzGdPEhWj7plWU=
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
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/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-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
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
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-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.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
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
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/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/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
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/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.28/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
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/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-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/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=
......@@ -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.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
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/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA=
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
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/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.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
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/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 v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g=
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/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/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/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/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.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
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/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.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/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-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/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
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-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/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-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-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/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/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/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/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho=
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/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/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/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/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/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/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/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=
......@@ -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/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo=
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/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/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=
......@@ -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/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/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/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/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
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.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
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/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
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/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.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
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
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/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.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.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/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/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/go.mod h1:NoCfSFWosfqMqmmD7hApkirIK9ozpHjxRnRxs1l413A=
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:
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/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/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees=
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/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/yuin/goldmark v1.1.27/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.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.2/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=
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/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.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk=
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
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/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.14.1/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
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-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-20181203042331-505ab145d0a9/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
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-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-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-20191219195013-becbf705a915/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
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/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-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-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-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-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-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/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.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.20191209134235-331c550502dd/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/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
......@@ -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-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-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-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-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-20190213061140-3a22650c66bd/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
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-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-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-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-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-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-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
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
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-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/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=
......@@ -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-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
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-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-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-20181107165924-66b7b1311ac8/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
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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-20210309074719-68d13333faf2/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
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/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-20180917221912-90fa682c2a6e/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
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-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-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-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-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-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-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-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-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-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-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-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
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
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/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-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
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.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.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/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-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-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-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-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-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/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
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
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.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.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.28.1/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
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=
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/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/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/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/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/go.mod h1:2RlvNNSMglmRrcvhfuzp4hQHwOtjxlbjX7UPY/GXb78=
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
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/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.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.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
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.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
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-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.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM=
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/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
......
......@@ -34,5 +34,4 @@ import (
_ "github.com/33cn/plugin/plugin/dapp/valnode" //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/x2ethereum" //auto gen
)
......@@ -5,25 +5,26 @@ strpwd=$(pwd)
strcmd=${strpwd##*dapp/}
strapp=${strcmd%/cmd*}
SRC_EBCLI=github.com/33cn/plugin/plugin/dapp/x2ethereum/ebcli
SRC_EBRELAYER=github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer
OUT_DIR="${1}/$strapp"
FLAG=$2
# shellcheck disable=SC2086,1072
go build ${FLAG} -v -o "${OUT_DIR}/ebrelayer" "${SRC_EBRELAYER}"
# shellcheck disable=SC2086,1072
go build ${FLAG} -v -o "${OUT_DIR}/ebcli_A" "${SRC_EBCLI}"
# shellcheck disable=SC2086,1072
go build ${FLAG} -v -o "${OUT_DIR}/ebcli_B" -ldflags "-X ${SRC_EBCLI}/buildflags.RPCAddr=http://localhost:9902" "${SRC_EBCLI}"
# shellcheck disable=SC2086,1072
go build ${FLAG} -v -o "${OUT_DIR}/ebcli_C" -ldflags "-X ${SRC_EBCLI}/buildflags.RPCAddr=http://localhost:9903" "${SRC_EBCLI}"
# shellcheck disable=SC2086,1072
go build ${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 ./build/* "${OUT_DIR}"
#SRC_EBCLI=github.com/33cn/plugin/plugin/dapp/x2ethereum/ebcli
#SRC_EBRELAYER=github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer
#OUT_DIR="${1}/$strapp"
#FLAG=$2
#
## shellcheck disable=SC2086,1072
#go build -i ${FLAG} -v -o "${OUT_DIR}/ebrelayer" "${SRC_EBRELAYER}"
## shellcheck disable=SC2086,1072
#go build -i ${FLAG} -v -o "${OUT_DIR}/ebcli_A" "${SRC_EBCLI}"
## shellcheck disable=SC2086,1072
#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
#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
#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 ./build/* "${OUT_DIR}"
OUT_TESTDIR="${1}/dapptest/$strapp"
mkdir -p "${OUT_TESTDIR}"
cp ./test/* "${OUT_TESTDIR}"
#!/usr/bin/env bash
#shellcheck disable=SC2128
#shellcheck source=/dev/null
set -x
source ../dapp-test-common.sh
source "../x2ethereum/publicTest.sh"
sendAddress="12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
sendPriKey="0x4257d8692ef7fe13c68b65d6a52f03933db2fa5ce8faf210b5b8b80c721ced01"
MAIN_HTTP=""
chain33SenderAddr="14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
# validatorsAddr=["0x92c8b16afd6d423652559c6e266cbe1c29bfd84f", "0x0df9a824699bc5878232c9e612fe1a5346a5a368", "0xcb074cb21cdddf3ce9c3c0a7ac4497d633c9d9f1", "0xd9dab021e74ecf475788ed7b61356056b2095830"]
ethValidatorAddrKeyA="3fa21584ae2e4fd74db9b58e2386f5481607dfa4d7ba0617aaa7858e5025dc1e"
ethValidatorAddrKeyB="a5f3063552f4483cfc20ac4f40f45b798791379862219de9e915c64722c1d400"
ethValidatorAddrKeyC="bbf5e65539e9af0eb0cfac30bad475111054b09c11d668fc0731d54ea777471e"
ethValidatorAddrKeyD="c9fa31d7984edf81b8ef3b40c761f1847f6fcd5711ab2462da97dc458f1f896b"
# 新增地址 chain33 需要导入地址 转入 10 bty当收费费
chain33Validator1="1H4zzzQEQQR2FxXwppiMRXcvqLvqzxK2nv"
chain33Validator2="1Nq5AhTgVNvYaWQqih8ZQQEaRk3CFhTDHp"
chain33Validator3="16nmxjF58z5oKK9m44cGy241zMSJWPN1Ty"
chain33Validator4="182nAEMxF1JWWxEWdu4jvd68aZhQumS97H"
chain33ValidatorKey1="0x260124d9c619b0088241ffe2f1d7dc56b0b6100c88c342040387cd62b8ba35a3"
chain33ValidatorKey2="0x7812f8c688048943f1c168f8f2f76f44912de1f0ff8b12358b213118081869b2"
chain33ValidatorKey3="0xd44c8f3d8cac5d9c7fef7b0a0bf7be0909372ec6368064f742193de0bddeb2d1"
chain33ValidatorKey4="0xaad36689ca332026d4a4ceee62c8a91bac7bc100906b25a181a7f28b8552b53e"
ethReceiverAddr1="0xa4ea64a583f6e51c3799335b28a8f0529570a635"
ethReceiverAddrKey1="355b876d7cbcb930d5dfab767f66336ce327e082cbaa1877210c1bae89b1df71"
ethReceiverAddr2="0x0c05ba5c230fdaa503b53702af1962e08d0c60bf"
#ethReceiverAddrKey2="9dc6df3a8ab139a54d8a984f54958ae0661f880229bf3bdbb886b87d58b56a08"
maturityDegree=5
#portRelayer=19999
ethUrl=""
CLIA_HTTP=""
CLIB_HTTP=""
CLIC_HTTP=""
CLID_HTTP=""
# $1 sendAddress, $2 balance
function queryExecBalance() {
local resp=""
chain33_QueryExecBalance "${1}" "x2ethereum" "$MAIN_HTTP"
# shellcheck disable=SC2155
local balance=$(echo "$resp" | jq -r ".result" | jq ".[].balance")
if [ "${balance}" != "${2}" ]; then
echo_rst "queryExecBalance" "1" "${balance} != ${2}"
fi
}
# $1 chain33Address, $2 balance
function queryChain33Balance() {
local resp=""
chain33_QueryBalance "${1}" "${MAIN_HTTP}"
# shellcheck disable=SC2155
local balance=$(echo $resp | jq -r ".result.execAccount" | jq ".[].account.balance")
if [ "${balance}" != "${2}" ]; then
echo_rst "queryChain33Balance" "1" "${balance} != ${2}"
fi
}
# $1 req , $2 balance
function queryRelayerBalance() {
chain33_Http "${1}" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "GetBalance" ".result.balance"
if [ "${RETURN_RESP}" != "${2}" ]; then
echo_rst "queryRelayerBalance" "1" "${RETURN_RESP} != ${2}"
copyErrLogs
fi
}
# $1 req , $2 balance
function queryChain33X2ethBalance() {
chain33_Http "${req}" ${MAIN_HTTP} '(.error|not) and (.result != null)' "GetBalance" ".result"
# shellcheck disable=SC2155
local balance=$(echo "${RETURN_RESP}" | jq -r ".res" | jq ".[].balance" | sed 's/\"//g')
if [ "${balance}" != "${2}" ]; then
echo_rst "queryChain33X2ethBalance" "1" "${balance} != ${2}"
fi
}
function start_ebrelayerA() {
docker cp "./x2ethereum/relayer.toml" "${dockerNamePrefix}_ebrelayera_rpc_1":/root/relayer.toml
start_docker_ebrelayer "${dockerNamePrefix}_ebrelayera_rpc_1" "/root/ebrelayer" "./x2ethereum/ebrelayera.log"
sleep 5
}
function StartRelayerAndDeploy() {
echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}"
cp ../x2ethereum/* ./x2ethereum/
for dockerName in ganachetest ebrelayera ebrelayerb ebrelayerc ebrelayerd; do
line=$(delete_line_show "./x2ethereum/docker-compose-x2ethereum.yml" "${dockerName}:")
sed -i ''"${line}"' a \ \ '${dockerName}'_rpc:' "./x2ethereum/docker-compose-x2ethereum.yml"
done
docker-compose -f ./x2ethereum/docker-compose-x2ethereum.yml up --build -d
sleep 5
# change EthProvider url
dockerAddr=$(get_docker_addr "${dockerNamePrefix}_ganachetest_rpc_1")
ethUrl="http://${dockerAddr}:8545"
# 修改 relayer.toml 配置文件
updata_relayer_a_toml "${dockerAddr}" "${dockerNamePrefix}_ebrelayera_rpc_1" "./x2ethereum/relayer.toml"
line=$(delete_line_show "./x2ethereum/relayer.toml" "localhost:9901")
sed -i ''"${line}"' a JrpcBindAddr=":9901"' "./x2ethereum/relayer.toml"
# start ebrelayer A
start_ebrelayerA
ebrelayeraRpcHost=$(get_docker_addr "${dockerNamePrefix}_ebrelayera_rpc_1")
if [[ ${ebrelayeraRpcHost} == "" ]]; then
echo -e "${RED}ebrelayeraRpcHost a is empty${NOC}"
fi
CLIA_HTTP="http://${ebrelayeraRpcHost}:9901"
# 部署合约
InitAndDeploy
# 获取 BridgeRegistry 地址
local req='{"method":"Manager.ShowBridgeRegistryAddr","params":[{}]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "$FUNCNAME" ".result.addr"
local BridgeRegistry="$RETURN_RESP"
# kill ebrelayer A
kill_docker_ebrelayer "${dockerNamePrefix}_ebrelayera_rpc_1"
sleep 1
# 修改 relayer.toml 配置文件
updata_relayer_toml "${BridgeRegistry}" ${maturityDegree} "./x2ethereum/relayer.toml"
# 重启
start_ebrelayerA
# start ebrelayer B C D
for name in b c d; do
local file="./x2ethereum/relayer$name.toml"
cp './x2ethereum/relayer.toml' "${file}"
# 删除配置文件中不需要的字段
for deleteName in "deployerPrivateKey" "operatorAddr" "validatorsAddr" "initPowers" "deployerPrivateKey" "deploy"; do
delete_line "${file}" "${deleteName}"
done
sed -i 's/x2ethereum/x2ethereum'${name}'/g' "${file}"
pushHost=$(get_docker_addr "${dockerNamePrefix}_ebrelayer${name}_rpc_1")
line=$(delete_line_show "${file}" "pushHost")
sed -i ''"${line}"' a pushHost="http://'"${pushHost}"':20000"' "${file}"
line=$(delete_line_show "${file}" "pushBind")
sed -i ''"${line}"' a pushBind="'"${pushHost}"':20000"' "${file}"
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"
done
sleep 5
ebrelayeraRpcHost=$(get_docker_addr "${dockerNamePrefix}_ebrelayera_rpc_1")
CLIA_HTTP="http://${ebrelayeraRpcHost}:9901"
ebrelayeraRpcHost=$(get_docker_addr "${dockerNamePrefix}_ebrelayerb_rpc_1")
CLIB_HTTP="http://${ebrelayeraRpcHost}:9901"
ebrelayeraRpcHost=$(get_docker_addr "${dockerNamePrefix}_ebrelayerc_rpc_1")
CLIC_HTTP="http://${ebrelayeraRpcHost}:9901"
ebrelayeraRpcHost=$(get_docker_addr "${dockerNamePrefix}_ebrelayerd_rpc_1")
CLID_HTTP="http://${ebrelayeraRpcHost}:9901"
docker ps -a
echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}"
}
function InitAndDeploy() {
echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}"
local req='{"method":"Manager.SetPassphase","params":[{"Passphase":"123456hzj"}]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "SetPassphase" ".result"
local req='{"method":"Manager.Unlock","params":["123456hzj"]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "Unlock" ".result"
local req='{"method":"Manager.DeployContrcts","params":[{}]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "$FUNCNAME" ".result"
echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}"
}
# chian33 添加验证着及权重
function InitChain33Vilators() {
echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}"
# 导入 chain33Validators 私钥生成地址
chain33_ImportPrivkey "${chain33ValidatorKey1}" "${chain33Validator1}" "tokenAddr" "${MAIN_HTTP}"
chain33_ImportPrivkey "${chain33ValidatorKey2}" "${chain33Validator2}" "tokenAddr" "${MAIN_HTTP}"
chain33_ImportPrivkey "${chain33ValidatorKey3}" "${chain33Validator3}" "tokenAddr" "${MAIN_HTTP}"
chain33_ImportPrivkey "${chain33ValidatorKey4}" "${chain33Validator4}" "tokenAddr" "${MAIN_HTTP}"
# SetConsensusThreshold
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"
# add a validator
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"
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"
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"
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"
# query Validators
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
echo -e "${RED}=========== GetTotalPower err: TotalPower = $RETURN_RESP ===========${NOC}"
fi
# cions 转帐到 x2ethereum 合约地址
x2eth_addr=$(curl -ksd '{"method":"Chain33.ConvertExectoAddr","params":[{"execname":"x2ethereum"}]}' ${MAIN_HTTP} | jq -r ".result")
chain33_SendToAddress "${sendAddress}" "${x2eth_addr}" 20000000000 "${MAIN_HTTP}"
queryExecBalance "${sendAddress}" "20000000000"
# chain33Validator 要有手续费
chain33_applyCoins "${chain33Validator1}" 1000000000 "${MAIN_HTTP}"
queryChain33Balance "${chain33Validator1}" "1000000000"
chain33_applyCoins "${chain33Validator2}" 1000000000 "${MAIN_HTTP}"
queryChain33Balance "${chain33Validator2}" "1000000000"
chain33_applyCoins "${chain33Validator3}" 1000000000 "${MAIN_HTTP}"
queryChain33Balance "${chain33Validator3}" "1000000000"
chain33_applyCoins "${chain33Validator4}" 1000000000 "${MAIN_HTTP}"
queryChain33Balance "${chain33Validator4}" "1000000000"
echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}"
}
function EthImportKey() {
echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}"
# 解锁
local req='{"method":"Manager.SetPassphase","params":[{"Passphase":"123456hzj"}]}'
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" "${CLID_HTTP}" '(.error|not) and (.result != null)' "SetPassphase" ".result"
req='{"method":"Manager.Unlock","params":["123456hzj"]}'
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" "${CLIC_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}'"]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "ImportChain33PrivateKey4EthRelayer" ".result"
req='{"method":"Manager.ImportChain33PrivateKey4EthRelayer","params":["'${chain33ValidatorKey2}'"]}'
chain33_Http "$req" "${CLIB_HTTP}" '(.error|not) and (.result != null)' "ImportChain33PrivateKey4EthRelayer" ".result"
req='{"method":"Manager.ImportChain33PrivateKey4EthRelayer","params":["'${chain33ValidatorKey3}'"]}'
chain33_Http "$req" "${CLIC_HTTP}" '(.error|not) and (.result != null)' "ImportChain33PrivateKey4EthRelayer" ".result"
req='{"method":"Manager.ImportChain33PrivateKey4EthRelayer","params":["'${chain33ValidatorKey4}'"]}'
chain33_Http "$req" "${CLID_HTTP}" '(.error|not) and (.result != null)' "ImportChain33PrivateKey4EthRelayer" ".result"
req='{"method":"Manager.ImportChain33RelayerPrivateKey","params":[{"privateKey":"'${ethValidatorAddrKeyA}'"}]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "ImportChain33RelayerPrivateKey" ".result"
req='{"method":"Manager.ImportChain33RelayerPrivateKey","params":[{"privateKey":"'${ethValidatorAddrKeyB}'"}]}'
chain33_Http "$req" "${CLIB_HTTP}" '(.error|not) and (.result != null)' "ImportChain33RelayerPrivateKey" ".result"
req='{"method":"Manager.ImportChain33RelayerPrivateKey","params":[{"privateKey":"'${ethValidatorAddrKeyC}'"}]}'
chain33_Http "$req" "${CLIC_HTTP}" '(.error|not) and (.result != null)' "ImportChain33RelayerPrivateKey" ".result"
req='{"method":"Manager.ImportChain33RelayerPrivateKey","params":[{"privateKey":"'${ethValidatorAddrKeyD}'"}]}'
chain33_Http "$req" "${CLID_HTTP}" '(.error|not) and (.result != null)' "ImportChain33RelayerPrivateKey" ".result"
echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}"
}
function TestChain33ToEthAssets() {
echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}"
# token4chain33 在 以太坊 上先有 bty
local req='{"method":"Manager.CreateBridgeToken","params":["coins.bty"]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "CreateBridgeToken" ".result.addr"
tokenAddrBty=${RETURN_RESP}
req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr1}'","tokenAddr":"'${tokenAddrBty}'"}]}'
queryRelayerBalance "$req" "0"
# chain33 lock bty
#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")
chain33_SignAndSendTxWait "$tx" "$sendPriKey" ${MAIN_HTTP} "Chain33ToEthLock"
queryExecBalance "${sendAddress}" "19500000000"
eth_block_wait $((maturityDegree + 2)) "${ethUrl}"
req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr1}'","tokenAddr":"'${tokenAddrBty}'"}]}'
queryRelayerBalance "$req" "5"
# eth burn
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"
req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr1}'","tokenAddr":"'${tokenAddrBty}'"}]}'
queryRelayerBalance "$req" "0"
# eth 等待 10 个区块
eth_block_wait $((maturityDegree + 2)) "${ethUrl}"
queryExecBalance "${chain33SenderAddr}" "500000000"
echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}"
}
# eth to chain33
# 在以太坊上锁定资产,然后在 chain33 上铸币,针对 eth 资产
function TestETH2Chain33Assets() {
echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}"
local req='{"method":"Manager.ShowBridgeBankAddr","params":[{}]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "ShowBridgeBankAddr" ".result.addr"
bridgeBankAddr="${RETURN_RESP}"
req='{"method":"Manager.GetBalance","params":[{"owner":"'${bridgeBankAddr}'","tokenAddr":""}]}'
queryRelayerBalance "$req" "0"
# eth lock 0.1
req='{"method":"Manager.LockEthErc20Asset","params":[{"ownerKey":"'${ethReceiverAddrKey1}'","tokenAddr":"","amount":"100000000000000000","chain33Receiver":"'${sendAddress}'"}]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "LockEthErc20Asset" ".result"
req='{"method":"Manager.GetBalance","params":[{"owner":"'${bridgeBankAddr}'","tokenAddr":""}]}'
queryRelayerBalance "$req" "0.1"
# eth 等待 10 个区块
eth_block_wait $((maturityDegree + 2)) "${ethUrl}"
req='{"method":"Chain33.Query","params":[{"execer":"x2ethereum","funcName":"GetRelayerBalance","payload":{"tokenSymbol":"eth","address":"'${sendAddress}'","tokenAddr":"0x0000000000000000000000000000000000000000"}}]}'
queryChain33X2ethBalance "${req}" "0.1"
req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr2}'","tokenAddr":""}]}'
chain33_Http "${req}" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "GetBalance" ".result.balance"
local balance=${RETURN_RESP}
# 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")
chain33_SignAndSendTxWait "$tx" "$sendPriKey" ${MAIN_HTTP} "Chain33ToEthBurn"
req='{"method":"Chain33.Query","params":[{"execer":"x2ethereum","funcName":"GetRelayerBalance","payload":{"tokenSymbol":"eth","address":"'${sendAddress}'","tokenAddr":"0x0000000000000000000000000000000000000000"}}]}'
queryChain33X2ethBalance "${req}" "0"
eth_block_wait $((maturityDegree + 2)) "${ethUrl}"
req='{"method":"Manager.GetBalance","params":[{"owner":"'${bridgeBankAddr}'","tokenAddr":""}]}'
queryRelayerBalance "$req" "0"
req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr2}'","tokenAddr":""}]}'
#queryRelayerBalance "$req" "$(echo "${balance}+0.1" | bc)"
queryRelayerBalance "$req" "100.1"
echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}"
}
function TestETH2Chain33Erc20() {
echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}"
# token4erc20 在 chain33 上先有 token,同时 mint
local req='{"method":"Manager.CreateERC20Token","params":["testc"]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "CreateERC20Token" ".result.addr"
tokenAddr="${RETURN_RESP}"
# 先铸币 1000
req='{"method":"Manager.MintErc20","params":[{"owner":"'${ethReceiverAddr1}'","tokenAddr":"'${tokenAddr}'","amount":"100000000000"}]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "MintErc20" ".result.addr"
req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr1}'","tokenAddr":"'${tokenAddr}'"}]}'
queryRelayerBalance "$req" "1000"
local req='{"method":"Manager.ShowBridgeBankAddr","params":[{}]}'
chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "ShowBridgeBankAddr" ".result.addr"
bridgeBankAddr="${RETURN_RESP}"
req='{"method":"Manager.GetBalance","params":[{"owner":"'${bridgeBankAddr}'","tokenAddr":"'${tokenAddr}'"}]}'
queryRelayerBalance "$req" "0"
# lock 100
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"
req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr1}'","tokenAddr":"'${tokenAddr}'"}]}'
queryRelayerBalance "$req" "900"
req='{"method":"Manager.GetBalance","params":[{"owner":"'${bridgeBankAddr}'","tokenAddr":"'${tokenAddr}'"}]}'
queryRelayerBalance "$req" "100"
# eth 等待 10 个区块
eth_block_wait $((maturityDegree + 2)) "${ethUrl}"
req='{"method":"Chain33.Query","params":[{"execer":"x2ethereum","funcName":"GetRelayerBalance","payload":{"tokenSymbol":"testc","address":"'${chain33Validator1}'","tokenAddr":"'${tokenAddr}'"}}]}'
queryChain33X2ethBalance "${req}" "100"
# chain33 burn 100
#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")
chain33_SignAndSendTxWait "$tx" "$chain33ValidatorKey1" ${MAIN_HTTP} "Chain33ToEthBurn"
req='{"method":"Chain33.Query","params":[{"execer":"x2ethereum","funcName":"GetRelayerBalance","payload":{"tokenSymbol":"testc","address":"'${chain33Validator1}'","tokenAddr":"'${tokenAddr}'"}}]}'
queryChain33X2ethBalance "${req}" "0"
eth_block_wait $((maturityDegree + 2)) "${ethUrl}"
req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr2}'","tokenAddr":"'${tokenAddr}'"}]}'
queryRelayerBalance "$req" "100"
req='{"method":"Manager.GetBalance","params":[{"owner":"'${bridgeBankAddr}'","tokenAddr":"'${tokenAddr}'"}]}'
queryRelayerBalance "$req" "0"
echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}"
}
##shellcheck disable=SC2128
##shellcheck source=/dev/null
#set -x
#source ../dapp-test-common.sh
#source "../x2ethereum/publicTest.sh"
#
#sendAddress="12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
#sendPriKey="0x4257d8692ef7fe13c68b65d6a52f03933db2fa5ce8faf210b5b8b80c721ced01"
#MAIN_HTTP=""
#chain33SenderAddr="14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
## validatorsAddr=["0x92c8b16afd6d423652559c6e266cbe1c29bfd84f", "0x0df9a824699bc5878232c9e612fe1a5346a5a368", "0xcb074cb21cdddf3ce9c3c0a7ac4497d633c9d9f1", "0xd9dab021e74ecf475788ed7b61356056b2095830"]
#ethValidatorAddrKeyA="3fa21584ae2e4fd74db9b58e2386f5481607dfa4d7ba0617aaa7858e5025dc1e"
#ethValidatorAddrKeyB="a5f3063552f4483cfc20ac4f40f45b798791379862219de9e915c64722c1d400"
#ethValidatorAddrKeyC="bbf5e65539e9af0eb0cfac30bad475111054b09c11d668fc0731d54ea777471e"
#ethValidatorAddrKeyD="c9fa31d7984edf81b8ef3b40c761f1847f6fcd5711ab2462da97dc458f1f896b"
## 新增地址 chain33 需要导入地址 转入 10 bty当收费费
#chain33Validator1="1H4zzzQEQQR2FxXwppiMRXcvqLvqzxK2nv"
#chain33Validator2="1Nq5AhTgVNvYaWQqih8ZQQEaRk3CFhTDHp"
#chain33Validator3="16nmxjF58z5oKK9m44cGy241zMSJWPN1Ty"
#chain33Validator4="182nAEMxF1JWWxEWdu4jvd68aZhQumS97H"
#chain33ValidatorKey1="0x260124d9c619b0088241ffe2f1d7dc56b0b6100c88c342040387cd62b8ba35a3"
#chain33ValidatorKey2="0x7812f8c688048943f1c168f8f2f76f44912de1f0ff8b12358b213118081869b2"
#chain33ValidatorKey3="0xd44c8f3d8cac5d9c7fef7b0a0bf7be0909372ec6368064f742193de0bddeb2d1"
#chain33ValidatorKey4="0xaad36689ca332026d4a4ceee62c8a91bac7bc100906b25a181a7f28b8552b53e"
#ethReceiverAddr1="0xa4ea64a583f6e51c3799335b28a8f0529570a635"
#ethReceiverAddrKey1="355b876d7cbcb930d5dfab767f66336ce327e082cbaa1877210c1bae89b1df71"
#ethReceiverAddr2="0x0c05ba5c230fdaa503b53702af1962e08d0c60bf"
##ethReceiverAddrKey2="9dc6df3a8ab139a54d8a984f54958ae0661f880229bf3bdbb886b87d58b56a08"
#maturityDegree=5
##portRelayer=19999
#ethUrl=""
#
#CLIA_HTTP=""
#CLIB_HTTP=""
#CLIC_HTTP=""
#CLID_HTTP=""
#
## $1 sendAddress, $2 balance
#function queryExecBalance() {
# local resp=""
# chain33_QueryExecBalance "${1}" "x2ethereum" "$MAIN_HTTP"
# # shellcheck disable=SC2155
# local balance=$(echo "$resp" | jq -r ".result" | jq ".[].balance")
# if [ "${balance}" != "${2}" ]; then
# echo_rst "queryExecBalance" "1" "${balance} != ${2}"
# fi
#}
#
## $1 chain33Address, $2 balance
#function queryChain33Balance() {
# local resp=""
# chain33_QueryBalance "${1}" "${MAIN_HTTP}"
# # shellcheck disable=SC2155
# local balance=$(echo $resp | jq -r ".result.execAccount" | jq ".[].account.balance")
# if [ "${balance}" != "${2}" ]; then
# echo_rst "queryChain33Balance" "1" "${balance} != ${2}"
# fi
#}
#
## $1 req , $2 balance
#function queryRelayerBalance() {
# chain33_Http "${1}" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "GetBalance" ".result.balance"
# if [ "${RETURN_RESP}" != "${2}" ]; then
# echo_rst "queryRelayerBalance" "1" "${RETURN_RESP} != ${2}"
# copyErrLogs
# fi
#}
#
## $1 req , $2 balance
#function queryChain33X2ethBalance() {
# chain33_Http "${req}" ${MAIN_HTTP} '(.error|not) and (.result != null)' "GetBalance" ".result"
# # shellcheck disable=SC2155
# local balance=$(echo "${RETURN_RESP}" | jq -r ".res" | jq ".[].balance" | sed 's/\"//g')
# if [ "${balance}" != "${2}" ]; then
# echo_rst "queryChain33X2ethBalance" "1" "${balance} != ${2}"
# fi
#}
#
#function start_ebrelayerA() {
# docker cp "./x2ethereum/relayer.toml" "${dockerNamePrefix}_ebrelayera_rpc_1":/root/relayer.toml
# start_docker_ebrelayer "${dockerNamePrefix}_ebrelayera_rpc_1" "/root/ebrelayer" "./x2ethereum/ebrelayera.log"
# sleep 5
#}
#
#function StartRelayerAndDeploy() {
# echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}"
#
# cp ../x2ethereum/* ./x2ethereum/
# for dockerName in ganachetest ebrelayera ebrelayerb ebrelayerc ebrelayerd; do
# line=$(delete_line_show "./x2ethereum/docker-compose-x2ethereum.yml" "${dockerName}:")
# sed -i ''"${line}"' a \ \ '${dockerName}'_rpc:' "./x2ethereum/docker-compose-x2ethereum.yml"
# done
#
# docker-compose -f ./x2ethereum/docker-compose-x2ethereum.yml up --build -d
# sleep 5
#
# # change EthProvider url
# dockerAddr=$(get_docker_addr "${dockerNamePrefix}_ganachetest_rpc_1")
# ethUrl="http://${dockerAddr}:8545"
#
# # 修改 relayer.toml 配置文件
# updata_relayer_a_toml "${dockerAddr}" "${dockerNamePrefix}_ebrelayera_rpc_1" "./x2ethereum/relayer.toml"
#
# line=$(delete_line_show "./x2ethereum/relayer.toml" "localhost:9901")
# sed -i ''"${line}"' a JrpcBindAddr=":9901"' "./x2ethereum/relayer.toml"
# # start ebrelayer A
# start_ebrelayerA
#
# ebrelayeraRpcHost=$(get_docker_addr "${dockerNamePrefix}_ebrelayera_rpc_1")
# if [[ ${ebrelayeraRpcHost} == "" ]]; then
# echo -e "${RED}ebrelayeraRpcHost a is empty${NOC}"
# fi
# CLIA_HTTP="http://${ebrelayeraRpcHost}:9901"
#
# # 部署合约
# InitAndDeploy
#
# # 获取 BridgeRegistry 地址
# local req='{"method":"Manager.ShowBridgeRegistryAddr","params":[{}]}'
# chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "$FUNCNAME" ".result.addr"
# local BridgeRegistry="$RETURN_RESP"
#
# # kill ebrelayer A
# kill_docker_ebrelayer "${dockerNamePrefix}_ebrelayera_rpc_1"
# sleep 1
#
# # 修改 relayer.toml 配置文件
# updata_relayer_toml "${BridgeRegistry}" ${maturityDegree} "./x2ethereum/relayer.toml"
# # 重启
# start_ebrelayerA
#
# # start ebrelayer B C D
# for name in b c d; do
# local file="./x2ethereum/relayer$name.toml"
# cp './x2ethereum/relayer.toml' "${file}"
#
# # 删除配置文件中不需要的字段
# for deleteName in "deployerPrivateKey" "operatorAddr" "validatorsAddr" "initPowers" "deployerPrivateKey" "deploy"; do
# delete_line "${file}" "${deleteName}"
# done
#
# sed -i 's/x2ethereum/x2ethereum'${name}'/g' "${file}"
#
# pushHost=$(get_docker_addr "${dockerNamePrefix}_ebrelayer${name}_rpc_1")
# line=$(delete_line_show "${file}" "pushHost")
# sed -i ''"${line}"' a pushHost="http://'"${pushHost}"':20000"' "${file}"
#
# line=$(delete_line_show "${file}" "pushBind")
# sed -i ''"${line}"' a pushBind="'"${pushHost}"':20000"' "${file}"
#
# 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"
# done
# sleep 5
#
# ebrelayeraRpcHost=$(get_docker_addr "${dockerNamePrefix}_ebrelayera_rpc_1")
# CLIA_HTTP="http://${ebrelayeraRpcHost}:9901"
# ebrelayeraRpcHost=$(get_docker_addr "${dockerNamePrefix}_ebrelayerb_rpc_1")
# CLIB_HTTP="http://${ebrelayeraRpcHost}:9901"
# ebrelayeraRpcHost=$(get_docker_addr "${dockerNamePrefix}_ebrelayerc_rpc_1")
# CLIC_HTTP="http://${ebrelayeraRpcHost}:9901"
# ebrelayeraRpcHost=$(get_docker_addr "${dockerNamePrefix}_ebrelayerd_rpc_1")
# CLID_HTTP="http://${ebrelayeraRpcHost}:9901"
#
# docker ps -a
#
# echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}"
#}
#
#function InitAndDeploy() {
# echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}"
# local req='{"method":"Manager.SetPassphase","params":[{"Passphase":"123456hzj"}]}'
# chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "SetPassphase" ".result"
#
# local req='{"method":"Manager.Unlock","params":["123456hzj"]}'
# chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "Unlock" ".result"
#
# local req='{"method":"Manager.DeployContrcts","params":[{}]}'
# chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "$FUNCNAME" ".result"
# echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}"
#}
#
## chian33 添加验证着及权重
#function InitChain33Vilators() {
# echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}"
# # 导入 chain33Validators 私钥生成地址
# chain33_ImportPrivkey "${chain33ValidatorKey1}" "${chain33Validator1}" "tokenAddr" "${MAIN_HTTP}"
# chain33_ImportPrivkey "${chain33ValidatorKey2}" "${chain33Validator2}" "tokenAddr" "${MAIN_HTTP}"
# chain33_ImportPrivkey "${chain33ValidatorKey3}" "${chain33Validator3}" "tokenAddr" "${MAIN_HTTP}"
# chain33_ImportPrivkey "${chain33ValidatorKey4}" "${chain33Validator4}" "tokenAddr" "${MAIN_HTTP}"
#
# # SetConsensusThreshold
# 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"
#
# # add a validator
# 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"
# 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"
# 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"
# 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"
#
# # query Validators
# 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
# echo -e "${RED}=========== GetTotalPower err: TotalPower = $RETURN_RESP ===========${NOC}"
# fi
#
# # cions 转帐到 x2ethereum 合约地址
# x2eth_addr=$(curl -ksd '{"method":"Chain33.ConvertExectoAddr","params":[{"execname":"x2ethereum"}]}' ${MAIN_HTTP} | jq -r ".result")
# chain33_SendToAddress "${sendAddress}" "${x2eth_addr}" 20000000000 "${MAIN_HTTP}"
# queryExecBalance "${sendAddress}" "20000000000"
#
# # chain33Validator 要有手续费
# chain33_applyCoins "${chain33Validator1}" 1000000000 "${MAIN_HTTP}"
# queryChain33Balance "${chain33Validator1}" "1000000000"
# chain33_applyCoins "${chain33Validator2}" 1000000000 "${MAIN_HTTP}"
# queryChain33Balance "${chain33Validator2}" "1000000000"
# chain33_applyCoins "${chain33Validator3}" 1000000000 "${MAIN_HTTP}"
# queryChain33Balance "${chain33Validator3}" "1000000000"
# chain33_applyCoins "${chain33Validator4}" 1000000000 "${MAIN_HTTP}"
# queryChain33Balance "${chain33Validator4}" "1000000000"
# echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}"
#}
#
#function EthImportKey() {
# echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}"
#
# # 解锁
# local req='{"method":"Manager.SetPassphase","params":[{"Passphase":"123456hzj"}]}'
# 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" "${CLID_HTTP}" '(.error|not) and (.result != null)' "SetPassphase" ".result"
# req='{"method":"Manager.Unlock","params":["123456hzj"]}'
# 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" "${CLIC_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}'"]}'
# chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "ImportChain33PrivateKey4EthRelayer" ".result"
# req='{"method":"Manager.ImportChain33PrivateKey4EthRelayer","params":["'${chain33ValidatorKey2}'"]}'
# chain33_Http "$req" "${CLIB_HTTP}" '(.error|not) and (.result != null)' "ImportChain33PrivateKey4EthRelayer" ".result"
# req='{"method":"Manager.ImportChain33PrivateKey4EthRelayer","params":["'${chain33ValidatorKey3}'"]}'
# chain33_Http "$req" "${CLIC_HTTP}" '(.error|not) and (.result != null)' "ImportChain33PrivateKey4EthRelayer" ".result"
# req='{"method":"Manager.ImportChain33PrivateKey4EthRelayer","params":["'${chain33ValidatorKey4}'"]}'
# chain33_Http "$req" "${CLID_HTTP}" '(.error|not) and (.result != null)' "ImportChain33PrivateKey4EthRelayer" ".result"
#
# req='{"method":"Manager.ImportChain33RelayerPrivateKey","params":[{"privateKey":"'${ethValidatorAddrKeyA}'"}]}'
# chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "ImportChain33RelayerPrivateKey" ".result"
# req='{"method":"Manager.ImportChain33RelayerPrivateKey","params":[{"privateKey":"'${ethValidatorAddrKeyB}'"}]}'
# chain33_Http "$req" "${CLIB_HTTP}" '(.error|not) and (.result != null)' "ImportChain33RelayerPrivateKey" ".result"
# req='{"method":"Manager.ImportChain33RelayerPrivateKey","params":[{"privateKey":"'${ethValidatorAddrKeyC}'"}]}'
# chain33_Http "$req" "${CLIC_HTTP}" '(.error|not) and (.result != null)' "ImportChain33RelayerPrivateKey" ".result"
# req='{"method":"Manager.ImportChain33RelayerPrivateKey","params":[{"privateKey":"'${ethValidatorAddrKeyD}'"}]}'
# chain33_Http "$req" "${CLID_HTTP}" '(.error|not) and (.result != null)' "ImportChain33RelayerPrivateKey" ".result"
#
# echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}"
#}
#
#function TestChain33ToEthAssets() {
# echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}"
# # token4chain33 在 以太坊 上先有 bty
# local req='{"method":"Manager.CreateBridgeToken","params":["coins.bty"]}'
# chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "CreateBridgeToken" ".result.addr"
# tokenAddrBty=${RETURN_RESP}
#
# req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr1}'","tokenAddr":"'${tokenAddrBty}'"}]}'
# queryRelayerBalance "$req" "0"
#
# # chain33 lock bty
# #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")
# chain33_SignAndSendTxWait "$tx" "$sendPriKey" ${MAIN_HTTP} "Chain33ToEthLock"
#
# queryExecBalance "${sendAddress}" "19500000000"
#
# eth_block_wait $((maturityDegree + 2)) "${ethUrl}"
#
# req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr1}'","tokenAddr":"'${tokenAddrBty}'"}]}'
# queryRelayerBalance "$req" "5"
#
# # eth burn
# 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"
#
# req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr1}'","tokenAddr":"'${tokenAddrBty}'"}]}'
# queryRelayerBalance "$req" "0"
#
# # eth 等待 10 个区块
# eth_block_wait $((maturityDegree + 2)) "${ethUrl}"
#
# queryExecBalance "${chain33SenderAddr}" "500000000"
#
# echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}"
#}
#
## eth to chain33
## 在以太坊上锁定资产,然后在 chain33 上铸币,针对 eth 资产
#function TestETH2Chain33Assets() {
# echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}"
# local req='{"method":"Manager.ShowBridgeBankAddr","params":[{}]}'
# chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "ShowBridgeBankAddr" ".result.addr"
# bridgeBankAddr="${RETURN_RESP}"
#
# req='{"method":"Manager.GetBalance","params":[{"owner":"'${bridgeBankAddr}'","tokenAddr":""}]}'
# queryRelayerBalance "$req" "0"
#
# # eth lock 0.1
# req='{"method":"Manager.LockEthErc20Asset","params":[{"ownerKey":"'${ethReceiverAddrKey1}'","tokenAddr":"","amount":"100000000000000000","chain33Receiver":"'${sendAddress}'"}]}'
# chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "LockEthErc20Asset" ".result"
#
# req='{"method":"Manager.GetBalance","params":[{"owner":"'${bridgeBankAddr}'","tokenAddr":""}]}'
# queryRelayerBalance "$req" "0.1"
#
# # eth 等待 10 个区块
# eth_block_wait $((maturityDegree + 2)) "${ethUrl}"
#
# req='{"method":"Chain33.Query","params":[{"execer":"x2ethereum","funcName":"GetRelayerBalance","payload":{"tokenSymbol":"eth","address":"'${sendAddress}'","tokenAddr":"0x0000000000000000000000000000000000000000"}}]}'
# queryChain33X2ethBalance "${req}" "0.1"
#
# req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr2}'","tokenAddr":""}]}'
# chain33_Http "${req}" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "GetBalance" ".result.balance"
# local balance=${RETURN_RESP}
#
# # 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")
# chain33_SignAndSendTxWait "$tx" "$sendPriKey" ${MAIN_HTTP} "Chain33ToEthBurn"
#
# req='{"method":"Chain33.Query","params":[{"execer":"x2ethereum","funcName":"GetRelayerBalance","payload":{"tokenSymbol":"eth","address":"'${sendAddress}'","tokenAddr":"0x0000000000000000000000000000000000000000"}}]}'
# queryChain33X2ethBalance "${req}" "0"
#
# eth_block_wait $((maturityDegree + 2)) "${ethUrl}"
#
# req='{"method":"Manager.GetBalance","params":[{"owner":"'${bridgeBankAddr}'","tokenAddr":""}]}'
# queryRelayerBalance "$req" "0"
#
# req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr2}'","tokenAddr":""}]}'
# #queryRelayerBalance "$req" "$(echo "${balance}+0.1" | bc)"
# queryRelayerBalance "$req" "100.1"
#
# echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}"
#}
#
#function TestETH2Chain33Erc20() {
# echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}"
# # token4erc20 在 chain33 上先有 token,同时 mint
# local req='{"method":"Manager.CreateERC20Token","params":["testc"]}'
# chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "CreateERC20Token" ".result.addr"
# tokenAddr="${RETURN_RESP}"
#
# # 先铸币 1000
# req='{"method":"Manager.MintErc20","params":[{"owner":"'${ethReceiverAddr1}'","tokenAddr":"'${tokenAddr}'","amount":"100000000000"}]}'
# chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "MintErc20" ".result.addr"
#
# req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr1}'","tokenAddr":"'${tokenAddr}'"}]}'
# queryRelayerBalance "$req" "1000"
#
# local req='{"method":"Manager.ShowBridgeBankAddr","params":[{}]}'
# chain33_Http "$req" "${CLIA_HTTP}" '(.error|not) and (.result != null)' "ShowBridgeBankAddr" ".result.addr"
# bridgeBankAddr="${RETURN_RESP}"
#
# req='{"method":"Manager.GetBalance","params":[{"owner":"'${bridgeBankAddr}'","tokenAddr":"'${tokenAddr}'"}]}'
# queryRelayerBalance "$req" "0"
#
# # lock 100
# 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"
#
# req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr1}'","tokenAddr":"'${tokenAddr}'"}]}'
# queryRelayerBalance "$req" "900"
#
# req='{"method":"Manager.GetBalance","params":[{"owner":"'${bridgeBankAddr}'","tokenAddr":"'${tokenAddr}'"}]}'
# queryRelayerBalance "$req" "100"
#
# # eth 等待 10 个区块
# eth_block_wait $((maturityDegree + 2)) "${ethUrl}"
#
# req='{"method":"Chain33.Query","params":[{"execer":"x2ethereum","funcName":"GetRelayerBalance","payload":{"tokenSymbol":"testc","address":"'${chain33Validator1}'","tokenAddr":"'${tokenAddr}'"}}]}'
# queryChain33X2ethBalance "${req}" "100"
#
# # chain33 burn 100
# #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")
# chain33_SignAndSendTxWait "$tx" "$chain33ValidatorKey1" ${MAIN_HTTP} "Chain33ToEthBurn"
#
# req='{"method":"Chain33.Query","params":[{"execer":"x2ethereum","funcName":"GetRelayerBalance","payload":{"tokenSymbol":"testc","address":"'${chain33Validator1}'","tokenAddr":"'${tokenAddr}'"}}]}'
# queryChain33X2ethBalance "${req}" "0"
#
# eth_block_wait $((maturityDegree + 2)) "${ethUrl}"
#
# req='{"method":"Manager.GetBalance","params":[{"owner":"'${ethReceiverAddr2}'","tokenAddr":"'${tokenAddr}'"}]}'
# queryRelayerBalance "$req" "100"
#
# req='{"method":"Manager.GetBalance","params":[{"owner":"'${bridgeBankAddr}'","tokenAddr":"'${tokenAddr}'"}]}'
# queryRelayerBalance "$req" "0"
#
# echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}"
#}
#
function rpc_test() {
set +e
set -x
# set +e
# set -x
chain33_RpcTestBegin x2ethereum
MAIN_HTTP="$1"
dockerNamePrefix="$2"
echo "main_ip=$MAIN_HTTP"
ispara=$(echo '"'"${MAIN_HTTP}"'"' | jq '.|contains("8901")')
if [ "$ispara" == false ]; then
# init
StartRelayerAndDeploy
InitChain33Vilators
EthImportKey
# test
TestChain33ToEthAssets
TestETH2Chain33Assets
TestETH2Chain33Erc20
copyErrLogs
docker-compose -f ./x2ethereum/docker-compose-x2ethereum.yml down
fi
# MAIN_HTTP="$1"
# dockerNamePrefix="$2"
# echo "main_ip=$MAIN_HTTP"
#
## ispara=$(echo '"'"${MAIN_HTTP}"'"' | jq '.|contains("8901")')
## if [ "$ispara" == false ]; then
## # init
## StartRelayerAndDeploy
## InitChain33Vilators
## EthImportKey
##
## # test
## TestChain33ToEthAssets
## TestETH2Chain33Assets
## TestETH2Chain33Erc20
##
## copyErrLogs
##
## docker-compose -f ./x2ethereum/docker-compose-x2ethereum.yml down
## fi
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 {
ShowEthereumTxsHashCmd(),
IsValidatorActiveCmd(),
ShowOperatorCmd(),
DeployContrctsCmd(),
DeployContrcts2Chain33Cmd(),
DeployContrcts2EthCmd(),
ShowTxReceiptCmd(),
//////auxiliary///////
CreateBridgeTokenCmd(),
......@@ -209,11 +210,20 @@ func ShowOperator(cmd *cobra.Command, args []string) {
ctx.Run()
}
func DeployContrcts2Chain33Cmd() *cobra.Command {
cmd := &cobra.Command{
Use: "deploy2chain33",
Short: "deploy contracts to chain33",
Run: DeployContrcts2Chain33,
}
return cmd
}
//DeployContrctsCmd ...
func DeployContrctsCmd() *cobra.Command {
func DeployContrcts2EthCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "deploy",
Short: "deploy the corresponding Ethereum contracts",
Use: "deploy2eth",
Short: "deploy contracts to ethereum",
Run: DeployContrcts,
}
return cmd
......@@ -227,6 +237,13 @@ func DeployContrcts(cmd *cobra.Command, args []string) {
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 ...
func ShowTxReceiptCmd() *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 (
_ = big.NewInt
_ = strings.NewReader
_ = ethereum.NotFound
_ = abi.U256
_ = bind.Bind
_ = common.Big1
_ = types.BloomLookup
......@@ -28,7 +27,7 @@ var (
)
// 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.
var BridgeRegistryFuncSigs = map[string]string{
......@@ -40,7 +39,7 @@ var BridgeRegistryFuncSigs = map[string]string{
}
// 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.
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
// sets the output to result. The result type might be a single field for simple
// returns, a slice of interfaces for anonymous returns and a struct for named
// returns.
func (_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...)
}
......@@ -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
// returns, a slice of interfaces for anonymous returns and a struct for named
// 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...)
}
......@@ -200,130 +199,155 @@ func (_BridgeRegistry *BridgeRegistryTransactorRaw) Transact(opts *bind.Transact
// 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) {
var (
ret0 = new(common.Address)
)
out := ret0
err := _BridgeRegistry.contract.Call(opts, out, "bridgeBank")
return *ret0, err
var out []interface{}
err := _BridgeRegistry.contract.Call(opts, &out, "bridgeBank")
if err != nil {
return *new(common.Address), 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.
//
// Solidity: function bridgeBank() constant returns(address)
// Solidity: function bridgeBank() view returns(address)
func (_BridgeRegistry *BridgeRegistrySession) BridgeBank() (common.Address, error) {
return _BridgeRegistry.Contract.BridgeBank(&_BridgeRegistry.CallOpts)
}
// 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) {
return _BridgeRegistry.Contract.BridgeBank(&_BridgeRegistry.CallOpts)
}
// 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) {
var (
ret0 = new(common.Address)
)
out := ret0
err := _BridgeRegistry.contract.Call(opts, out, "chain33Bridge")
return *ret0, err
var out []interface{}
err := _BridgeRegistry.contract.Call(opts, &out, "chain33Bridge")
if err != nil {
return *new(common.Address), 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.
//
// Solidity: function chain33Bridge() constant returns(address)
// Solidity: function chain33Bridge() view returns(address)
func (_BridgeRegistry *BridgeRegistrySession) Chain33Bridge() (common.Address, error) {
return _BridgeRegistry.Contract.Chain33Bridge(&_BridgeRegistry.CallOpts)
}
// 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) {
return _BridgeRegistry.Contract.Chain33Bridge(&_BridgeRegistry.CallOpts)
}
// 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) {
var (
ret0 = new(*big.Int)
)
out := ret0
err := _BridgeRegistry.contract.Call(opts, out, "deployHeight")
return *ret0, err
var out []interface{}
err := _BridgeRegistry.contract.Call(opts, &out, "deployHeight")
if err != nil {
return *new(*big.Int), 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.
//
// Solidity: function deployHeight() constant returns(uint256)
// Solidity: function deployHeight() view returns(uint256)
func (_BridgeRegistry *BridgeRegistrySession) DeployHeight() (*big.Int, error) {
return _BridgeRegistry.Contract.DeployHeight(&_BridgeRegistry.CallOpts)
}
// 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) {
return _BridgeRegistry.Contract.DeployHeight(&_BridgeRegistry.CallOpts)
}
// 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) {
var (
ret0 = new(common.Address)
)
out := ret0
err := _BridgeRegistry.contract.Call(opts, out, "oracle")
return *ret0, err
var out []interface{}
err := _BridgeRegistry.contract.Call(opts, &out, "oracle")
if err != nil {
return *new(common.Address), 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.
//
// Solidity: function oracle() constant returns(address)
// Solidity: function oracle() view returns(address)
func (_BridgeRegistry *BridgeRegistrySession) Oracle() (common.Address, error) {
return _BridgeRegistry.Contract.Oracle(&_BridgeRegistry.CallOpts)
}
// 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) {
return _BridgeRegistry.Contract.Oracle(&_BridgeRegistry.CallOpts)
}
// 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) {
var (
ret0 = new(common.Address)
)
out := ret0
err := _BridgeRegistry.contract.Call(opts, out, "valset")
return *ret0, err
var out []interface{}
err := _BridgeRegistry.contract.Call(opts, &out, "valset")
if err != nil {
return *new(common.Address), 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.
//
// Solidity: function valset() constant returns(address)
// Solidity: function valset() view returns(address)
func (_BridgeRegistry *BridgeRegistrySession) Valset() (common.Address, error) {
return _BridgeRegistry.Contract.Valset(&_BridgeRegistry.CallOpts)
}
// 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) {
return _BridgeRegistry.Contract.Valset(&_BridgeRegistry.CallOpts)
}
......@@ -461,5 +485,6 @@ func (_BridgeRegistry *BridgeRegistryFilterer) ParseLogContractsRegistered(log t
if err := _BridgeRegistry.contract.UnpackLog(event, "LogContractsRegistered", log); err != nil {
return nil, err
}
event.Raw = log
return event, nil
}
package test
import (
"encoding/hex"
"fmt"
"math/big"
"strings"
"testing"
"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"}]`
abi, err := abi.JSON(strings.NewReader(abiJSON))
if err != nil {
t.Fatal(err)
}
const hexdata = `000000000000000000000000376c47978271565f56deb45495afa69e59c16ab200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000158`
data, err := hex.DecodeString(hexdata)
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))
}
type ReceivedEvent struct {
Sender common.Address
Amount *big.Int
Memo []byte
}
var ev ReceivedEvent
err = abi.Unpack(&ev, "received", data)
if err != nil {
t.Error(err)
}
fmt.Printf("\nReceivedEvent sender:%s", ev.Sender.String())
type ReceivedAddrEvent struct {
Sender common.Address
}
var receivedAddrEv ReceivedAddrEvent
err = abi.Unpack(&receivedAddrEv, "receivedAddr", data)
if err != nil {
t.Error(err)
}
fmt.Printf("\nreceivedAddrEv=%s\n\n\n", receivedAddrEv.Sender.String())
}
//
//import (
// "encoding/hex"
// "fmt"
// "math/big"
// "strings"
// "testing"
//
// "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"}]`
// abiData, err := abi.JSON(strings.NewReader(abiJSON))
// if err != nil {
// t.Fatal(err)
// }
//
// const hexdata = `000000000000000000000000376c47978271565f56deb45495afa69e59c16ab200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000158`
// data, err := hex.DecodeString(hexdata)
// 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))
// }
//
// type ReceivedEvent struct {
// Sender common.Address
// Amount *big.Int
// Memo []byte
// }
// var ev ReceivedEvent
//
// ret, err := abiData.Unpack("received", data)
// if err != nil {
// t.Error(err)
// }
// fmt.Println(ret)
//
// fmt.Printf("\nReceivedEvent sender:%s", ev.Sender.String())
//
// type ReceivedAddrEvent struct {
// Sender common.Address
// }
// var receivedAddrEv ReceivedAddrEvent
// ret2, err := abiData.Unpack("receivedAddr", data)
// if err != nil {
// t.Error(err)
// }
// fmt.Println(ret2)
// fmt.Printf("\nreceivedAddrEv=%s\n\n\n", receivedAddrEv.Sender.String())
//}
package test
import (
"context"
"fmt"
"math/big"
"testing"
"time"
"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/ethtxs"
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/events"
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/stretchr/testify/require"
)
//"BridgeToken creation (Chain33 assets)"
func TestBrigeTokenCreat(t *testing.T) {
ctx := context.Background()
println("TEST:BridgeToken creation (Chain33 assets)")
//1st部署相关合约
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
require.NoError(t, err)
//2nd:订阅事件
eventName := "LogNewBridgeToken"
bridgeBankABI := ethtxs.LoadABI(ethtxs.BridgeBankABI)
logNewBridgeTokenSig := bridgeBankABI.Events[eventName].ID().Hex()
query := ethereum.FilterQuery{
Addresses: []common.Address{x2EthDeployInfo.BridgeBank.Address},
}
// We will check logs for new events
logs := make(chan types.Log)
// Filter by contract and event, write results to logs
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)
require.Nil(t, err)
opts := &bind.CallOpts{
Pending: true,
From: para.Operator,
Context: ctx,
}
BridgeBankAddr, err := x2EthContracts.BridgeRegistry.BridgeBank(opts)
require.Nil(t, err)
t.Logf("BridgeBankAddr is:%s", BridgeBankAddr.String())
tokenCount, err := bridgeBank.BridgeBankCaller.BridgeTokenCount(opts)
require.Nil(t, err)
require.Equal(t, tokenCount.Int64(), int64(0))
//3rd:创建token
auth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
if nil != err {
t.Fatalf("PrepareAuth failed due to:%s", err.Error())
}
symbol := "BTY"
_, err = x2EthContracts.BridgeBank.BridgeBankTransactor.CreateNewBridgeToken(auth, symbol)
if nil != err {
t.Fatalf("CreateNewBridgeToken failed due to:%s", err.Error())
}
sim.Commit()
timer := time.NewTimer(30 * time.Second)
for {
select {
case <-timer.C:
t.Fatal("failed due to timeout")
// Handle any errors
case err := <-sub.Err():
t.Fatalf("sub error:%s", err.Error())
// vLog is raw event data
case vLog := <-logs:
// Check if the event is a 'LogLock' event
if vLog.Topics[0].Hex() == logNewBridgeTokenSig {
t.Logf("Witnessed new event:%s, Block number:%d, Tx hash:%s", eventName,
vLog.BlockNumber, vLog.TxHash.Hex())
logEvent := &events.LogNewBridgeToken{}
err = bridgeBankABI.Unpack(logEvent, eventName, vLog.Data)
require.Nil(t, err)
t.Logf("token addr:%s, symbol:%s", logEvent.Token.String(), logEvent.Symbol)
require.Equal(t, symbol, logEvent.Symbol)
//tokenCount正确加1
tokenCount, err := x2EthContracts.BridgeBank.BridgeTokenCount(opts)
require.Nil(t, err)
require.Equal(t, tokenCount.Int64(), int64(1))
return
}
}
}
}
//测试在chain33上锁定资产,然后在以太坊上铸币
//发行token="BTY"
//铸币NewOracleClaim
//铸币成功
//Bridge token minting (for locked chain33 assets)
func TestBrigeTokenMint(t *testing.T) {
ctx := context.Background()
println("TEST:BridgeToken creation (Chain33 assets)")
//1st部署相关合约
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
require.NoError(t, err)
//2nd:订阅事件
eventName := "LogNewBridgeToken"
bridgeBankABI := ethtxs.LoadABI(ethtxs.BridgeBankABI)
logNewBridgeTokenSig := bridgeBankABI.Events[eventName].ID().Hex()
query := ethereum.FilterQuery{
Addresses: []common.Address{x2EthDeployInfo.BridgeBank.Address},
}
// We will check logs for new events
logs := make(chan types.Log)
// Filter by contract and event, write results to logs
sub, err := sim.SubscribeFilterLogs(ctx, query, logs)
require.Nil(t, err)
opts := &bind.CallOpts{
Pending: true,
From: para.Operator,
Context: ctx,
}
tokenCount, err := x2EthContracts.BridgeBank.BridgeTokenCount(opts)
require.Nil(t, err)
require.Equal(t, tokenCount.Int64(), int64(0))
//3rd:创建token
symbol := "BTY"
auth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
if nil != err {
t.Fatalf("PrepareAuth failed due to:%s", err.Error())
}
_, err = x2EthContracts.BridgeBank.BridgeBankTransactor.CreateNewBridgeToken(auth, symbol)
if nil != err {
t.Fatalf("CreateNewBridgeToken failed due to:%s", err.Error())
}
sim.Commit()
logEvent := &events.LogNewBridgeToken{}
select {
// Handle any errors
case err := <-sub.Err():
t.Fatalf("sub error:%s", err.Error())
// vLog is raw event data
case vLog := <-logs:
// Check if the event is a 'LogLock' event
if vLog.Topics[0].Hex() == logNewBridgeTokenSig {
t.Logf("Witnessed new event:%s, Block number:%d, Tx hash:%s", eventName,
vLog.BlockNumber, vLog.TxHash.Hex())
err = bridgeBankABI.Unpack(logEvent, eventName, vLog.Data)
require.Nil(t, err)
t.Logf("token addr:%s, symbol:%s", logEvent.Token.String(), logEvent.Symbol)
require.Equal(t, symbol, logEvent.Symbol)
//tokenCount正确加1
tokenCount, err = x2EthContracts.BridgeBank.BridgeTokenCount(opts)
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())
chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
amount := int64(99)
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)
signature, err := ethtxs.SignClaim4Eth(claimID, para.ValidatorPriKey[0])
require.Nil(t, err)
bridgeToken, err := generated.NewBridgeToken(logEvent.Token, sim)
require.Nil(t, err)
opts = &bind.CallOpts{
Pending: true,
Context: ctx,
}
balance, err = bridgeToken.BalanceOf(opts, ethReceiver)
require.Nil(t, err)
require.Equal(t, balance.Int64(), int64(0))
_, err = x2EthContracts.Oracle.NewOracleClaim(
authOracle,
events.ClaimTypeLock,
chain33Sender,
ethReceiver,
logEvent.Token,
logEvent.Symbol,
big.NewInt(amount),
claimID,
signature)
require.Nil(t, err)
sim.Commit()
balance, err = bridgeToken.BalanceOf(opts, ethReceiver)
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) {
ctx := context.Background()
println("TEST:Bridge deposit locking (Erc20/Eth assets)")
//1st部署相关合约
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
require.NoError(t, err)
//创建token
operatorAuth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
assert.Nil(t, err)
symbol := "USDT"
bridgeTokenAddr, _, bridgeTokenInstance, err := generated.DeployBridgeToken(operatorAuth, sim, symbol)
require.Nil(t, err)
sim.Commit()
t.Logf("The new creaded symbol:%s, address:%s", symbol, bridgeTokenAddr.String())
//创建实例 为userOne铸币 userOne为bridgebank允许allowance设置数额
userOne := para.InitValidators[0]
callopts := &bind.CallOpts{
Pending: true,
From: userOne,
Context: ctx,
}
symQuery, err := bridgeTokenInstance.Symbol(callopts)
assert.Nil(t, err)
require.Equal(t, symQuery, symbol)
t.Logf("symQuery = %s", symQuery)
isMiner, err := bridgeTokenInstance.IsMinter(callopts, para.Operator)
require.Nil(t, err)
require.Equal(t, isMiner, true)
operatorAuth, err = ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
require.Nil(t, err)
mintAmount := int64(1000)
chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
_, err = bridgeTokenInstance.Mint(operatorAuth, userOne, big.NewInt(mintAmount))
require.Nil(t, err)
sim.Commit()
userOneAuth, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
require.Nil(t, err)
allowAmount := int64(100)
_, err = bridgeTokenInstance.Approve(userOneAuth, x2EthDeployInfo.BridgeBank.Address, big.NewInt(allowAmount))
require.Nil(t, err)
sim.Commit()
userOneBalance, err := bridgeTokenInstance.BalanceOf(callopts, userOne)
require.Nil(t, err)
t.Logf("userOneBalance:%d", userOneBalance.Int64())
require.Equal(t, userOneBalance.Int64(), mintAmount)
// 测试子项目:should allow users to lock ERC20 tokens
userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
require.Nil(t, err)
//lock 100
lockAmount := big.NewInt(100)
_, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, bridgeTokenAddr, lockAmount)
require.Nil(t, err)
sim.Commit()
//balance减少到900
userOneBalance, err = bridgeTokenInstance.BalanceOf(callopts, userOne)
require.Nil(t, err)
expectAmount := int64(900)
require.Equal(t, userOneBalance.Int64(), expectAmount)
t.Logf("userOneBalance changes to:%d", userOneBalance.Int64())
//bridgebank增加了100
bridgeBankBalance, err := bridgeTokenInstance.BalanceOf(callopts, x2EthDeployInfo.BridgeBank.Address)
require.Nil(t, err)
expectAmount = int64(100)
require.Equal(t, bridgeBankBalance.Int64(), expectAmount)
t.Logf("bridgeBankBalance changes to:%d", bridgeBankBalance.Int64())
// 测试子项目:锁定ETH,should allow users to lock Ethereum
bridgeBankBalance, err = sim.BalanceAt(ctx, x2EthDeployInfo.BridgeBank.Address, nil)
require.Nil(t, err)
t.Logf("origin eth bridgeBankBalance is:%d", bridgeBankBalance.Int64())
userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
require.Nil(t, err)
ethAmount := big.NewInt(50)
userOneAuth.Value = ethAmount
//lock 50 eth
_, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, common.Address{}, ethAmount)
require.Nil(t, err)
sim.Commit()
bridgeBankBalance, err = sim.BalanceAt(ctx, x2EthDeployInfo.BridgeBank.Address, nil)
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操作将数字资产取回
//Ethereum/ERC20 token unlocking (for burned chain33 assets)
func TestBridgeBankUnlock(t *testing.T) {
ctx := context.Background()
println("TEST:Ethereum/ERC20 token unlocking (for burned chain33 assets)")
//1st部署相关合约
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
require.NoError(t, err)
//1.lockEth资产
ethAddr := common.Address{}
userOneAuth, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
require.Nil(t, err)
ethLockAmount := big.NewInt(150)
userOneAuth.Value = ethLockAmount
chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
//lock 150 eth
_, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, common.Address{}, ethLockAmount)
require.Nil(t, err)
sim.Commit()
//2.lockErc20资产
//创建token
operatorAuth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
assert.Nil(t, err)
symbolUsdt := "USDT"
bridgeTokenAddr, _, bridgeTokenInstance, err := generated.DeployBridgeToken(operatorAuth, sim, symbolUsdt)
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]
callopts := &bind.CallOpts{
Pending: true,
From: userOne,
Context: ctx,
}
symQuery, err := bridgeTokenInstance.Symbol(callopts)
assert.Nil(t, err)
require.Equal(t, symQuery, symbolUsdt)
t.Logf("symQuery = %s", symQuery)
isMiner, err := bridgeTokenInstance.IsMinter(callopts, para.Operator)
require.Nil(t, err)
require.Equal(t, isMiner, true)
operatorAuth, err = ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
assert.Nil(t, err)
mintAmount := int64(1000)
_, err = bridgeTokenInstance.Mint(operatorAuth, userOne, big.NewInt(mintAmount))
require.Nil(t, err)
sim.Commit()
userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
assert.Nil(t, err)
allowAmount := int64(100)
_, err = bridgeTokenInstance.Approve(userOneAuth, x2EthDeployInfo.BridgeBank.Address, big.NewInt(allowAmount))
require.Nil(t, err)
sim.Commit()
userOneBalance, err := bridgeTokenInstance.BalanceOf(callopts, userOne)
require.Nil(t, err)
t.Logf("userOneBalance:%d", userOneBalance.Int64())
require.Equal(t, userOneBalance.Int64(), mintAmount)
//***测试子项目:should allow users to lock ERC20 tokens
userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
require.Nil(t, err)
//lock 100
lockAmount := big.NewInt(100)
_, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, bridgeTokenAddr, lockAmount)
require.Nil(t, err)
sim.Commit()
// newOracleClaim
newProphecyAmount := int64(55)
ethReceiver := para.InitValidators[2]
ethSym := "eth"
claimID := crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), ethAddr.Bytes(), big.NewInt(newProphecyAmount).Bytes())
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)
_, err = x2EthContracts.Oracle.NewOracleClaim(
authOracle,
events.ClaimTypeBurn,
chain33Sender,
ethReceiver,
ethAddr,
ethSym,
big.NewInt(newProphecyAmount),
claimID,
signature)
require.Nil(t, err)
userEthbalance, _ := sim.BalanceAt(ctx, ethReceiver, nil)
t.Logf("userEthbalance for addr:%s balance=%d", ethReceiver.String(), userEthbalance.Int64())
sim.Commit()
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
newProphecyAmount = int64(100)
ethReceiver = para.InitValidators[2]
claimID = crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), bridgeTokenAddr.Bytes(), big.NewInt(newProphecyAmount).Bytes())
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)
_, err = x2EthContracts.Oracle.NewOracleClaim(
authOracle,
events.ClaimTypeBurn,
chain33Sender,
ethReceiver,
bridgeTokenAddr,
symbolUsdt,
big.NewInt(newProphecyAmount),
claimID,
signature)
require.Nil(t, err)
userUSDTbalance, err := bridgeTokenInstance.BalanceOf(callopts, ethReceiver)
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) {
ctx := context.Background()
println("TEST:to be unlocked incrementally by successive burn prophecies (for burned chain33 assets)")
//1st部署相关合约
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
require.NoError(t, err)
//1.lockEth资产
ethAddr := common.Address{}
userOneAuth, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
require.Nil(t, err)
ethLockAmount := big.NewInt(150)
userOneAuth.Value = ethLockAmount
chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
//lock 150 eth
_, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, common.Address{}, ethLockAmount)
require.Nil(t, err)
sim.Commit()
//2.lockErc20资产
//创建token
operatorAuth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
assert.Nil(t, err)
symbolUsdt := "USDT"
bridgeTokenAddr, _, bridgeTokenInstance, err := generated.DeployBridgeToken(operatorAuth, sim, symbolUsdt)
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]
callopts := &bind.CallOpts{
Pending: true,
From: userOne,
Context: ctx,
}
symQuery, err := bridgeTokenInstance.Symbol(callopts)
assert.Nil(t, err)
require.Equal(t, symQuery, symbolUsdt)
t.Logf("symQuery = %s", symQuery)
isMiner, err := bridgeTokenInstance.IsMinter(callopts, para.Operator)
require.Nil(t, err)
require.Equal(t, isMiner, true)
operatorAuth, err = ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
require.Nil(t, err)
mintAmount := int64(1000)
_, err = bridgeTokenInstance.Mint(operatorAuth, userOne, big.NewInt(mintAmount))
require.Nil(t, err)
sim.Commit()
userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
assert.Nil(t, err)
allowAmount := int64(100)
_, err = bridgeTokenInstance.Approve(userOneAuth, x2EthDeployInfo.BridgeBank.Address, big.NewInt(allowAmount))
require.Nil(t, err)
sim.Commit()
userOneBalance, err := bridgeTokenInstance.BalanceOf(callopts, userOne)
require.Nil(t, err)
t.Logf("userOneBalance:%d", userOneBalance.Int64())
require.Equal(t, userOneBalance.Int64(), mintAmount)
//***测试子项目:should allow users to lock ERC20 tokens
userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
require.Nil(t, err)
//lock 100
lockAmount := big.NewInt(100)
_, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, bridgeTokenAddr, lockAmount)
require.Nil(t, err)
sim.Commit()
// newOracleClaim
newProphecyAmount := int64(44)
ethReceiver := para.InitValidators[2]
ethSym := "eth"
claimID := crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), ethAddr.Bytes(), big.NewInt(newProphecyAmount).Bytes())
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)
_, err = x2EthContracts.Oracle.NewOracleClaim(
authOracle,
events.ClaimTypeBurn,
chain33Sender,
ethReceiver,
ethAddr,
ethSym,
big.NewInt(newProphecyAmount),
claimID,
signature)
require.Nil(t, err)
userEthbalance, _ := sim.BalanceAt(ctx, ethReceiver, nil)
t.Logf("userEthbalance for addr:%s balance=%d", ethReceiver.String(), userEthbalance.Int64())
sim.Commit()
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())
//第二次 newOracleClaim
newProphecyAmountSecond := int64(33)
claimID = crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), ethAddr.Bytes(), big.NewInt(newProphecyAmountSecond).Bytes())
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)
_, err = x2EthContracts.Oracle.NewOracleClaim(
authOracle,
events.ClaimTypeBurn,
chain33Sender,
ethReceiver,
ethAddr,
ethSym,
big.NewInt(newProphecyAmountSecond),
claimID,
signature)
require.Nil(t, err)
userEthbalance, _ = sim.BalanceAt(ctx, ethReceiver, nil)
t.Logf("userEthbalance for addr:%s balance=%d", ethReceiver.String(), userEthbalance.Int64())
sim.Commit()
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) {
ctx := context.Background()
println("TEST:ERC20 to be unlocked incrementally by successive burn prophecies (for burned chain33 assets))")
//1st部署相关合约
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
require.NoError(t, err)
//1.lockEth资产
userOneAuth, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
require.Nil(t, err)
ethLockAmount := big.NewInt(150)
userOneAuth.Value = ethLockAmount
chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
//lock 150 eth
_, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, common.Address{}, ethLockAmount)
require.Nil(t, err)
sim.Commit()
//2.lockErc20资产
//创建token
operatorAuth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
assert.Nil(t, err)
symbolUsdt := "USDT"
bridgeTokenAddr, _, bridgeTokenInstance, err := generated.DeployBridgeToken(operatorAuth, sim, symbolUsdt)
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]
callopts := &bind.CallOpts{
Pending: true,
From: userOne,
Context: ctx,
}
symQuery, err := bridgeTokenInstance.Symbol(callopts)
assert.Nil(t, err)
require.Equal(t, symQuery, symbolUsdt)
t.Logf("symQuery = %s", symQuery)
isMiner, err := bridgeTokenInstance.IsMinter(callopts, para.Operator)
require.Nil(t, err)
require.Equal(t, isMiner, true)
operatorAuth, err = ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
require.Nil(t, err)
mintAmount := int64(1000)
_, err = bridgeTokenInstance.Mint(operatorAuth, userOne, big.NewInt(mintAmount))
require.Nil(t, err)
sim.Commit()
userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
require.Nil(t, err)
allowAmount := int64(100)
_, err = bridgeTokenInstance.Approve(userOneAuth, x2EthDeployInfo.BridgeBank.Address, big.NewInt(allowAmount))
require.Nil(t, err)
sim.Commit()
userOneBalance, err := bridgeTokenInstance.BalanceOf(callopts, userOne)
require.Nil(t, err)
t.Logf("userOneBalance:%d", userOneBalance.Int64())
require.Equal(t, userOneBalance.Int64(), mintAmount)
//测试子项目:should allow users to lock ERC20 tokens
userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
require.Nil(t, err)
//lock 100
lockAmount := big.NewInt(100)
_, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, bridgeTokenAddr, lockAmount)
require.Nil(t, err)
sim.Commit()
// newOracleClaim
newProphecyAmount := int64(33)
ethReceiver := para.InitValidators[2]
claimID := crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), bridgeTokenAddr.Bytes(), big.NewInt(newProphecyAmount).Bytes())
userUSDTbalance0, err := bridgeTokenInstance.BalanceOf(callopts, ethReceiver)
require.Nil(t, err)
t.Logf("userEthbalance for addr:%s balance=%d", ethReceiver.String(), userUSDTbalance0.Int64())
require.Equal(t, userUSDTbalance0.Int64(), int64(0))
///////////newOracleClaim///////////////////////////
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)
_, err = x2EthContracts.Oracle.NewOracleClaim(
authOracle,
events.ClaimTypeBurn,
chain33Sender,
ethReceiver,
bridgeTokenAddr,
symbolUsdt,
big.NewInt(newProphecyAmount),
claimID,
signature)
require.Nil(t, err)
userUSDTbalance1, err := bridgeTokenInstance.BalanceOf(callopts, ethReceiver)
require.Nil(t, err)
t.Logf("userEthbalance for addr:%s balance=%d", ethReceiver.String(), userUSDTbalance1.Int64())
require.Equal(t, userUSDTbalance1.Int64(), userUSDTbalance0.Int64()+newProphecyAmount)
// newOracleClaim
newProphecyAmountSecond := int64(66)
claimID = crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), bridgeTokenAddr.Bytes(), big.NewInt(newProphecyAmountSecond).Bytes())
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)
_, err = x2EthContracts.Oracle.NewOracleClaim(
authOracle,
events.ClaimTypeBurn,
chain33Sender,
ethReceiver,
bridgeTokenAddr,
symbolUsdt,
big.NewInt(newProphecyAmountSecond),
claimID,
signature)
require.Nil(t, err)
userUSDTbalance2, err := bridgeTokenInstance.BalanceOf(callopts, ethReceiver)
require.Nil(t, err)
t.Logf("userEthbalance for addr:%s balance=%d", ethReceiver.String(), userUSDTbalance2.Int64())
require.Equal(t, userUSDTbalance2.Int64(), userUSDTbalance1.Int64()+newProphecyAmountSecond)
}
//
//import (
// "context"
// "fmt"
// "math/big"
// "testing"
// "time"
//
// "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/ethtxs"
// "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/events"
// "github.com/ethereum/go-ethereum"
// "github.com/ethereum/go-ethereum/accounts/abi/bind"
// "github.com/ethereum/go-ethereum/common"
// "github.com/ethereum/go-ethereum/core/types"
// "github.com/ethereum/go-ethereum/crypto"
// "github.com/stretchr/testify/require"
//)
//
////"BridgeToken creation (Chain33 assets)"
//func TestBrigeTokenCreat(t *testing.T) {
// ctx := context.Background()
// println("TEST:BridgeToken creation (Chain33 assets)")
// //1st部署相关合约
// para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
// require.NoError(t, err)
//
// //2nd:订阅事件
// eventName := "LogNewBridgeToken"
// bridgeBankABI := ethtxs.LoadABI(ethtxs.BridgeBankABI)
// logNewBridgeTokenSig := bridgeBankABI.Events[eventName].ID.Hex()
// query := ethereum.FilterQuery{
// Addresses: []common.Address{x2EthDeployInfo.BridgeBank.Address},
// }
// // We will check logs for new events
// logs := make(chan types.Log)
// // Filter by contract and event, write results to logs
// 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)
// require.Nil(t, err)
//
// opts := &bind.CallOpts{
// Pending: true,
// From: para.Operator,
// Context: ctx,
// }
// BridgeBankAddr, err := x2EthContracts.BridgeRegistry.BridgeBank(opts)
// require.Nil(t, err)
// t.Logf("BridgeBankAddr is:%s", BridgeBankAddr.String())
//
// tokenCount, err := bridgeBank.BridgeBankCaller.BridgeTokenCount(opts)
// require.Nil(t, err)
// require.Equal(t, tokenCount.Int64(), int64(0))
//
// //3rd:创建token
// auth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
// if nil != err {
// t.Fatalf("PrepareAuth failed due to:%s", err.Error())
// }
// symbol := "BTY"
// _, err = x2EthContracts.BridgeBank.BridgeBankTransactor.CreateNewBridgeToken(auth, symbol)
// if nil != err {
// t.Fatalf("CreateNewBridgeToken failed due to:%s", err.Error())
// }
// sim.Commit()
//
// timer := time.NewTimer(30 * time.Second)
// for {
// select {
// case <-timer.C:
// t.Fatal("failed due to timeout")
// // Handle any errors
// case err := <-sub.Err():
// t.Fatalf("sub error:%s", err.Error())
// // vLog is raw event data
// case vLog := <-logs:
// // Check if the event is a 'LogLock' event
// if vLog.Topics[0].Hex() == logNewBridgeTokenSig {
// t.Logf("Witnessed new event:%s, Block number:%d, Tx hash:%s", eventName,
// vLog.BlockNumber, vLog.TxHash.Hex())
// logEvent := &events.LogNewBridgeToken{}
// //err = bridgeBankABI.Unpack(logEvent, eventName, vLog.Data)
// _, err = bridgeBankABI.Unpack(eventName, vLog.Data)
// require.Nil(t, err)
// t.Logf("token addr:%s, symbol:%s", logEvent.Token.String(), logEvent.Symbol)
// require.Equal(t, symbol, logEvent.Symbol)
//
// //tokenCount正确加1
// tokenCount, err := x2EthContracts.BridgeBank.BridgeTokenCount(opts)
// require.Nil(t, err)
// require.Equal(t, tokenCount.Int64(), int64(1))
//
// return
// }
// }
// }
//}
//
////测试在chain33上锁定资产,然后在以太坊上铸币
////发行token="BTY"
////铸币NewOracleClaim
////铸币成功
////Bridge token minting (for locked chain33 assets)
//func TestBrigeTokenMint(t *testing.T) {
// ctx := context.Background()
// println("TEST:BridgeToken creation (Chain33 assets)")
// //1st部署相关合约
// para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
// require.NoError(t, err)
//
// //2nd:订阅事件
// eventName := "LogNewBridgeToken"
// bridgeBankABI := ethtxs.LoadABI(ethtxs.BridgeBankABI)
// logNewBridgeTokenSig := bridgeBankABI.Events[eventName].ID.Hex()
// query := ethereum.FilterQuery{
// Addresses: []common.Address{x2EthDeployInfo.BridgeBank.Address},
// }
// // We will check logs for new events
// logs := make(chan types.Log)
// // Filter by contract and event, write results to logs
// sub, err := sim.SubscribeFilterLogs(ctx, query, logs)
// require.Nil(t, err)
//
// opts := &bind.CallOpts{
// Pending: true,
// From: para.Operator,
// Context: ctx,
// }
//
// tokenCount, err := x2EthContracts.BridgeBank.BridgeTokenCount(opts)
// require.Nil(t, err)
// require.Equal(t, tokenCount.Int64(), int64(0))
//
// //3rd:创建token
// symbol := "BTY"
// auth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
// if nil != err {
// t.Fatalf("PrepareAuth failed due to:%s", err.Error())
// }
// _, err = x2EthContracts.BridgeBank.BridgeBankTransactor.CreateNewBridgeToken(auth, symbol)
// if nil != err {
// t.Fatalf("CreateNewBridgeToken failed due to:%s", err.Error())
// }
// sim.Commit()
//
// logEvent := &events.LogNewBridgeToken{}
// select {
// // Handle any errors
// case err := <-sub.Err():
// t.Fatalf("sub error:%s", err.Error())
// // vLog is raw event data
// case vLog := <-logs:
// // Check if the event is a 'LogLock' event
// if vLog.Topics[0].Hex() == logNewBridgeTokenSig {
// t.Logf("Witnessed new event:%s, Block number:%d, Tx hash:%s", eventName,
// vLog.BlockNumber, vLog.TxHash.Hex())
//
// _, err = bridgeBankABI.Unpack(eventName, vLog.Data)
// require.Nil(t, err)
// t.Logf("token addr:%s, symbol:%s", logEvent.Token.String(), logEvent.Symbol)
// require.Equal(t, symbol, logEvent.Symbol)
//
// //tokenCount正确加1
// tokenCount, err = x2EthContracts.BridgeBank.BridgeTokenCount(opts)
// 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())
//
// chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
// amount := int64(99)
// 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)
//
// signature, err := ethtxs.SignClaim4Eth(claimID, para.ValidatorPriKey[0])
// require.Nil(t, err)
//
// bridgeToken, err := generated.NewBridgeToken(logEvent.Token, sim)
// require.Nil(t, err)
// opts = &bind.CallOpts{
// Pending: true,
// Context: ctx,
// }
//
// balance, err = bridgeToken.BalanceOf(opts, ethReceiver)
// require.Nil(t, err)
// require.Equal(t, balance.Int64(), int64(0))
//
// _, err = x2EthContracts.Oracle.NewOracleClaim(
// authOracle,
// events.ClaimTypeLock,
// chain33Sender,
// ethReceiver,
// logEvent.Token,
// logEvent.Symbol,
// big.NewInt(amount),
// claimID,
// signature)
// require.Nil(t, err)
//
// sim.Commit()
// balance, err = bridgeToken.BalanceOf(opts, ethReceiver)
// 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) {
// ctx := context.Background()
// println("TEST:Bridge deposit locking (Erc20/Eth assets)")
// //1st部署相关合约
// para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
// require.NoError(t, err)
//
// //创建token
// operatorAuth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
// assert.Nil(t, err)
// symbol := "USDT"
// bridgeTokenAddr, _, bridgeTokenInstance, err := generated.DeployBridgeToken(operatorAuth, sim, symbol)
// require.Nil(t, err)
// sim.Commit()
// t.Logf("The new creaded symbol:%s, address:%s", symbol, bridgeTokenAddr.String())
//
// //创建实例 为userOne铸币 userOne为bridgebank允许allowance设置数额
// userOne := para.InitValidators[0]
// callopts := &bind.CallOpts{
// Pending: true,
// From: userOne,
// Context: ctx,
// }
// symQuery, err := bridgeTokenInstance.Symbol(callopts)
// assert.Nil(t, err)
// require.Equal(t, symQuery, symbol)
// t.Logf("symQuery = %s", symQuery)
//
// isMiner, err := bridgeTokenInstance.IsMinter(callopts, para.Operator)
// require.Nil(t, err)
// require.Equal(t, isMiner, true)
//
// operatorAuth, err = ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
// require.Nil(t, err)
//
// mintAmount := int64(1000)
// chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
// _, err = bridgeTokenInstance.Mint(operatorAuth, userOne, big.NewInt(mintAmount))
// require.Nil(t, err)
// sim.Commit()
//
// userOneAuth, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
// require.Nil(t, err)
// allowAmount := int64(100)
// _, err = bridgeTokenInstance.Approve(userOneAuth, x2EthDeployInfo.BridgeBank.Address, big.NewInt(allowAmount))
// require.Nil(t, err)
// sim.Commit()
//
// userOneBalance, err := bridgeTokenInstance.BalanceOf(callopts, userOne)
// require.Nil(t, err)
// t.Logf("userOneBalance:%d", userOneBalance.Int64())
// require.Equal(t, userOneBalance.Int64(), mintAmount)
//
// // 测试子项目:should allow users to lock ERC20 tokens
// userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
// require.Nil(t, err)
//
// //lock 100
// lockAmount := big.NewInt(100)
// _, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, bridgeTokenAddr, lockAmount)
// require.Nil(t, err)
// sim.Commit()
//
// //balance减少到900
// userOneBalance, err = bridgeTokenInstance.BalanceOf(callopts, userOne)
// require.Nil(t, err)
// expectAmount := int64(900)
// require.Equal(t, userOneBalance.Int64(), expectAmount)
// t.Logf("userOneBalance changes to:%d", userOneBalance.Int64())
//
// //bridgebank增加了100
// bridgeBankBalance, err := bridgeTokenInstance.BalanceOf(callopts, x2EthDeployInfo.BridgeBank.Address)
// require.Nil(t, err)
// expectAmount = int64(100)
// require.Equal(t, bridgeBankBalance.Int64(), expectAmount)
// t.Logf("bridgeBankBalance changes to:%d", bridgeBankBalance.Int64())
//
// // 测试子项目:锁定ETH,should allow users to lock Ethereum
// bridgeBankBalance, err = sim.BalanceAt(ctx, x2EthDeployInfo.BridgeBank.Address, nil)
// require.Nil(t, err)
// t.Logf("origin eth bridgeBankBalance is:%d", bridgeBankBalance.Int64())
//
// userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
// require.Nil(t, err)
// ethAmount := big.NewInt(50)
// userOneAuth.Value = ethAmount
//
// //lock 50 eth
// _, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, common.Address{}, ethAmount)
// require.Nil(t, err)
// sim.Commit()
//
// bridgeBankBalance, err = sim.BalanceAt(ctx, x2EthDeployInfo.BridgeBank.Address, nil)
// 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操作将数字资产取回
////Ethereum/ERC20 token unlocking (for burned chain33 assets)
//func TestBridgeBankUnlock(t *testing.T) {
// ctx := context.Background()
// println("TEST:Ethereum/ERC20 token unlocking (for burned chain33 assets)")
// //1st部署相关合约
// para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
// require.NoError(t, err)
// //1.lockEth资产
// ethAddr := common.Address{}
// userOneAuth, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
// require.Nil(t, err)
//
// ethLockAmount := big.NewInt(150)
// userOneAuth.Value = ethLockAmount
// chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
// //lock 150 eth
// _, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, common.Address{}, ethLockAmount)
// require.Nil(t, err)
// sim.Commit()
//
// //2.lockErc20资产
// //创建token
// operatorAuth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
// assert.Nil(t, err)
// symbolUsdt := "USDT"
// bridgeTokenAddr, _, bridgeTokenInstance, err := generated.DeployBridgeToken(operatorAuth, sim, symbolUsdt)
// 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]
// callopts := &bind.CallOpts{
// Pending: true,
// From: userOne,
// Context: ctx,
// }
// symQuery, err := bridgeTokenInstance.Symbol(callopts)
// assert.Nil(t, err)
// require.Equal(t, symQuery, symbolUsdt)
// t.Logf("symQuery = %s", symQuery)
//
// isMiner, err := bridgeTokenInstance.IsMinter(callopts, para.Operator)
// require.Nil(t, err)
// require.Equal(t, isMiner, true)
//
// operatorAuth, err = ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
// assert.Nil(t, err)
// mintAmount := int64(1000)
// _, err = bridgeTokenInstance.Mint(operatorAuth, userOne, big.NewInt(mintAmount))
// require.Nil(t, err)
// sim.Commit()
//
// userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
// assert.Nil(t, err)
// allowAmount := int64(100)
// _, err = bridgeTokenInstance.Approve(userOneAuth, x2EthDeployInfo.BridgeBank.Address, big.NewInt(allowAmount))
// require.Nil(t, err)
// sim.Commit()
//
// userOneBalance, err := bridgeTokenInstance.BalanceOf(callopts, userOne)
// require.Nil(t, err)
// t.Logf("userOneBalance:%d", userOneBalance.Int64())
// require.Equal(t, userOneBalance.Int64(), mintAmount)
//
// //***测试子项目:should allow users to lock ERC20 tokens
// userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
// require.Nil(t, err)
//
// //lock 100
// lockAmount := big.NewInt(100)
// _, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, bridgeTokenAddr, lockAmount)
// require.Nil(t, err)
// sim.Commit()
//
// // newOracleClaim
// newProphecyAmount := int64(55)
// ethReceiver := para.InitValidators[2]
// ethSym := "eth"
// claimID := crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), ethAddr.Bytes(), big.NewInt(newProphecyAmount).Bytes())
//
// 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)
//
// _, err = x2EthContracts.Oracle.NewOracleClaim(
// authOracle,
// events.ClaimTypeBurn,
// chain33Sender,
// ethReceiver,
// ethAddr,
// ethSym,
// big.NewInt(newProphecyAmount),
// claimID,
// signature)
// require.Nil(t, err)
//
// userEthbalance, _ := sim.BalanceAt(ctx, ethReceiver, nil)
// t.Logf("userEthbalance for addr:%s balance=%d", ethReceiver.String(), userEthbalance.Int64())
//
// sim.Commit()
// 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
// newProphecyAmount = int64(100)
// ethReceiver = para.InitValidators[2]
// claimID = crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), bridgeTokenAddr.Bytes(), big.NewInt(newProphecyAmount).Bytes())
//
// 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)
//
// _, err = x2EthContracts.Oracle.NewOracleClaim(
// authOracle,
// events.ClaimTypeBurn,
// chain33Sender,
// ethReceiver,
// bridgeTokenAddr,
// symbolUsdt,
// big.NewInt(newProphecyAmount),
// claimID,
// signature)
// require.Nil(t, err)
//
// userUSDTbalance, err := bridgeTokenInstance.BalanceOf(callopts, ethReceiver)
// 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) {
// ctx := context.Background()
// println("TEST:to be unlocked incrementally by successive burn prophecies (for burned chain33 assets)")
// //1st部署相关合约
// para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
// require.NoError(t, err)
//
// //1.lockEth资产
// ethAddr := common.Address{}
// userOneAuth, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
// require.Nil(t, err)
//
// ethLockAmount := big.NewInt(150)
// userOneAuth.Value = ethLockAmount
// chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
// //lock 150 eth
// _, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, common.Address{}, ethLockAmount)
// require.Nil(t, err)
// sim.Commit()
//
// //2.lockErc20资产
// //创建token
// operatorAuth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
// assert.Nil(t, err)
// symbolUsdt := "USDT"
// bridgeTokenAddr, _, bridgeTokenInstance, err := generated.DeployBridgeToken(operatorAuth, sim, symbolUsdt)
// 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]
// callopts := &bind.CallOpts{
// Pending: true,
// From: userOne,
// Context: ctx,
// }
// symQuery, err := bridgeTokenInstance.Symbol(callopts)
// assert.Nil(t, err)
// require.Equal(t, symQuery, symbolUsdt)
// t.Logf("symQuery = %s", symQuery)
//
// isMiner, err := bridgeTokenInstance.IsMinter(callopts, para.Operator)
// require.Nil(t, err)
// require.Equal(t, isMiner, true)
//
// operatorAuth, err = ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
// require.Nil(t, err)
// mintAmount := int64(1000)
// _, err = bridgeTokenInstance.Mint(operatorAuth, userOne, big.NewInt(mintAmount))
// require.Nil(t, err)
// sim.Commit()
//
// userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
// assert.Nil(t, err)
// allowAmount := int64(100)
// _, err = bridgeTokenInstance.Approve(userOneAuth, x2EthDeployInfo.BridgeBank.Address, big.NewInt(allowAmount))
// require.Nil(t, err)
// sim.Commit()
//
// userOneBalance, err := bridgeTokenInstance.BalanceOf(callopts, userOne)
// require.Nil(t, err)
// t.Logf("userOneBalance:%d", userOneBalance.Int64())
// require.Equal(t, userOneBalance.Int64(), mintAmount)
//
// //***测试子项目:should allow users to lock ERC20 tokens
// userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
// require.Nil(t, err)
//
// //lock 100
// lockAmount := big.NewInt(100)
// _, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, bridgeTokenAddr, lockAmount)
// require.Nil(t, err)
// sim.Commit()
//
// // newOracleClaim
// newProphecyAmount := int64(44)
// ethReceiver := para.InitValidators[2]
// ethSym := "eth"
// claimID := crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), ethAddr.Bytes(), big.NewInt(newProphecyAmount).Bytes())
//
// 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)
//
// _, err = x2EthContracts.Oracle.NewOracleClaim(
// authOracle,
// events.ClaimTypeBurn,
// chain33Sender,
// ethReceiver,
// ethAddr,
// ethSym,
// big.NewInt(newProphecyAmount),
// claimID,
// signature)
// require.Nil(t, err)
//
// userEthbalance, _ := sim.BalanceAt(ctx, ethReceiver, nil)
// t.Logf("userEthbalance for addr:%s balance=%d", ethReceiver.String(), userEthbalance.Int64())
//
// sim.Commit()
//
// 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())
//
// //第二次 newOracleClaim
// newProphecyAmountSecond := int64(33)
// claimID = crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), ethAddr.Bytes(), big.NewInt(newProphecyAmountSecond).Bytes())
// 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)
//
// _, err = x2EthContracts.Oracle.NewOracleClaim(
// authOracle,
// events.ClaimTypeBurn,
// chain33Sender,
// ethReceiver,
// ethAddr,
// ethSym,
// big.NewInt(newProphecyAmountSecond),
// claimID,
// signature)
// require.Nil(t, err)
//
// userEthbalance, _ = sim.BalanceAt(ctx, ethReceiver, nil)
// t.Logf("userEthbalance for addr:%s balance=%d", ethReceiver.String(), userEthbalance.Int64())
//
// sim.Commit()
// 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) {
// ctx := context.Background()
// println("TEST:ERC20 to be unlocked incrementally by successive burn prophecies (for burned chain33 assets))")
// //1st部署相关合约
// para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
// require.NoError(t, err)
//
// //1.lockEth资产
// userOneAuth, err := ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
// require.Nil(t, err)
// ethLockAmount := big.NewInt(150)
// userOneAuth.Value = ethLockAmount
// chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
// //lock 150 eth
// _, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, common.Address{}, ethLockAmount)
// require.Nil(t, err)
// sim.Commit()
//
// //2.lockErc20资产
// //创建token
// operatorAuth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
// assert.Nil(t, err)
// symbolUsdt := "USDT"
// bridgeTokenAddr, _, bridgeTokenInstance, err := generated.DeployBridgeToken(operatorAuth, sim, symbolUsdt)
// 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]
// callopts := &bind.CallOpts{
// Pending: true,
// From: userOne,
// Context: ctx,
// }
// symQuery, err := bridgeTokenInstance.Symbol(callopts)
// assert.Nil(t, err)
// require.Equal(t, symQuery, symbolUsdt)
// t.Logf("symQuery = %s", symQuery)
// isMiner, err := bridgeTokenInstance.IsMinter(callopts, para.Operator)
// require.Nil(t, err)
// require.Equal(t, isMiner, true)
//
// operatorAuth, err = ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
// require.Nil(t, err)
// mintAmount := int64(1000)
// _, err = bridgeTokenInstance.Mint(operatorAuth, userOne, big.NewInt(mintAmount))
// require.Nil(t, err)
// sim.Commit()
//
// userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
// require.Nil(t, err)
// allowAmount := int64(100)
// _, err = bridgeTokenInstance.Approve(userOneAuth, x2EthDeployInfo.BridgeBank.Address, big.NewInt(allowAmount))
// require.Nil(t, err)
// sim.Commit()
//
// userOneBalance, err := bridgeTokenInstance.BalanceOf(callopts, userOne)
// require.Nil(t, err)
// t.Logf("userOneBalance:%d", userOneBalance.Int64())
// require.Equal(t, userOneBalance.Int64(), mintAmount)
//
// //测试子项目:should allow users to lock ERC20 tokens
// userOneAuth, err = ethtxs.PrepareAuth(sim, para.ValidatorPriKey[0], para.InitValidators[0])
// require.Nil(t, err)
// //lock 100
// lockAmount := big.NewInt(100)
// _, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, bridgeTokenAddr, lockAmount)
// require.Nil(t, err)
// sim.Commit()
//
// // newOracleClaim
// newProphecyAmount := int64(33)
// ethReceiver := para.InitValidators[2]
// claimID := crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), bridgeTokenAddr.Bytes(), big.NewInt(newProphecyAmount).Bytes())
//
// userUSDTbalance0, err := bridgeTokenInstance.BalanceOf(callopts, ethReceiver)
// require.Nil(t, err)
// t.Logf("userEthbalance for addr:%s balance=%d", ethReceiver.String(), userUSDTbalance0.Int64())
// require.Equal(t, userUSDTbalance0.Int64(), int64(0))
//
// ///////////newOracleClaim///////////////////////////
// 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)
// _, err = x2EthContracts.Oracle.NewOracleClaim(
// authOracle,
// events.ClaimTypeBurn,
// chain33Sender,
// ethReceiver,
// bridgeTokenAddr,
// symbolUsdt,
// big.NewInt(newProphecyAmount),
// claimID,
// signature)
// require.Nil(t, err)
//
// userUSDTbalance1, err := bridgeTokenInstance.BalanceOf(callopts, ethReceiver)
// require.Nil(t, err)
// t.Logf("userEthbalance for addr:%s balance=%d", ethReceiver.String(), userUSDTbalance1.Int64())
// require.Equal(t, userUSDTbalance1.Int64(), userUSDTbalance0.Int64()+newProphecyAmount)
//
// // newOracleClaim
// newProphecyAmountSecond := int64(66)
// claimID = crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), bridgeTokenAddr.Bytes(), big.NewInt(newProphecyAmountSecond).Bytes())
// 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)
// _, err = x2EthContracts.Oracle.NewOracleClaim(
// authOracle,
// events.ClaimTypeBurn,
// chain33Sender,
// ethReceiver,
// bridgeTokenAddr,
// symbolUsdt,
// big.NewInt(newProphecyAmountSecond),
// claimID,
// signature)
// require.Nil(t, err)
//
// userUSDTbalance2, err := bridgeTokenInstance.BalanceOf(callopts, ethReceiver)
// 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
//订阅事件
eventName := "LogNewBridgeToken"
bridgeBankABI := LoadABI(BridgeBankABI)
logNewBridgeTokenSig := bridgeBankABI.Events[eventName].ID().Hex()
logNewBridgeTokenSig := bridgeBankABI.Events[eventName].ID.Hex()
query := ethereum.FilterQuery{
Addresses: []common.Address{x2EthDeployInfo.BridgeBank.Address},
}
......@@ -90,7 +90,7 @@ func CreateBridgeToken(symbol string, client ethinterface.EthClientSpec, para *O
if vLog.Topics[0].Hex() == logNewBridgeTokenSig {
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 {
return "", err
}
......
package ethtxs
import (
"context"
"crypto/ecdsa"
"fmt"
"math/big"
"strings"
"testing"
chain33Types "github.com/33cn/chain33/types"
"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/events"
ebrelayerTypes "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/types"
"github.com/33cn/plugin/plugin/dapp/x2ethereum/types"
x2ethTypes "github.com/33cn/plugin/plugin/dapp/x2ethereum/types"
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/crypto"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/suite"
)
var (
chain33Addr = "14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
ethAddr = "0x92C8b16aFD6d423652559C6E266cBE1c29Bfd84f"
ethTokenAddr = "0x0000000000000000000000000000000000000000"
)
type suiteContracts struct {
suite.Suite
para *DeployPara
sim *ethinterface.SimExtend
x2EthContracts *X2EthContracts
x2EthDeployInfo *X2EthDeployInfo
}
func TestRunSuiteX2Ethereum(t *testing.T) {
log := new(suiteContracts)
suite.Run(t, log)
}
func (c *suiteContracts) SetupSuite() {
var err error
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)
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)
require.Nil(c.T(), err)
assert.Equal(c.T(), bret, true)
key, _ := crypto.GenerateKey()
addr := crypto.PubkeyToAddress(key.PublicKey)
bret, err = IsActiveValidator(addr, c.x2EthContracts.Valset)
require.Nil(c.T(), err) // ???
assert.Equal(c.T(), bret, false)
}
func (c *suiteContracts) Test_IsProphecyPending() {
claimID := crypto.Keccak256Hash(big.NewInt(50).Bytes())
bret, err := IsProphecyPending(claimID, c.para.InitValidators[0], c.x2EthContracts.Chain33Bridge)
require.Nil(c.T(), err)
assert.Equal(c.T(), bret, false)
}
func (c *suiteContracts) Test_LogLockToEthBridgeClaim() {
to := common.FromHex(chain33Addr)
event := &events.LockEvent{
From: c.para.InitValidators[0],
To: to,
Token: common.HexToAddress(ethTokenAddr),
Symbol: "eth",
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)
assert.NotEmpty(c.T(), witnessClaim)
assert.Equal(c.T(), witnessClaim.EthereumChainID, int64(1))
assert.Equal(c.T(), witnessClaim.BridgeBrankAddr, c.x2EthDeployInfo.BridgeBank.Address.String())
assert.Equal(c.T(), witnessClaim.TokenAddr, ethTokenAddr)
assert.Equal(c.T(), witnessClaim.Symbol, event.Symbol)
assert.Equal(c.T(), witnessClaim.EthereumSender, event.From.String())
assert.Equal(c.T(), witnessClaim.Chain33Receiver, string(event.To))
assert.Equal(c.T(), witnessClaim.Amount, "100")
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)
require.NotNil(c.T(), err)
assert.Equal(c.T(), err, ebrelayerTypes.ErrAddress4Eth)
}
func (c *suiteContracts) Test_LogBurnToEthBridgeClaim() {
to := common.FromHex(chain33Addr)
event := &events.BurnEvent{
OwnerFrom: c.para.InitValidators[0],
Chain33Receiver: to,
Token: common.HexToAddress(ethTokenAddr),
Symbol: "bty",
Amount: big.NewInt(100),
Nonce: big.NewInt(2),
}
witnessClaim, err := LogBurnToEthBridgeClaim(event, 1, c.x2EthDeployInfo.BridgeBank.Address.String(), 8)
require.Nil(c.T(), err)
assert.NotEmpty(c.T(), witnessClaim)
assert.Equal(c.T(), witnessClaim.EthereumChainID, int64(1))
assert.Equal(c.T(), witnessClaim.BridgeBrankAddr, c.x2EthDeployInfo.BridgeBank.Address.String())
assert.Equal(c.T(), witnessClaim.TokenAddr, ethTokenAddr)
assert.Equal(c.T(), witnessClaim.Symbol, event.Symbol)
assert.Equal(c.T(), witnessClaim.EthereumSender, event.OwnerFrom.String())
assert.Equal(c.T(), witnessClaim.Chain33Receiver, string(event.Chain33Receiver))
assert.Equal(c.T(), witnessClaim.Amount, "100")
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
chain33ToEth := types.ReceiptChain33ToEth{
Chain33Sender: chain33Addr,
EthereumReceiver: ethAddr,
TokenContract: ethTokenAddr,
IssuerDotSymbol: "bty",
Amount: "100",
Decimals: 8,
}
log := &chain33Types.ReceiptLog{
Ty: types.TyWithdrawChain33Log,
Log: chain33Types.Encode(&chain33ToEth),
}
var logs []*chain33Types.ReceiptLog
logs = append(logs, log)
receipt := &chain33Types.ReceiptData{
Ty: types.TyWithdrawChain33Log,
Logs: logs,
}
chain33Msg := ParseBurnLockTxReceipt(claimType, receipt)
require.NotNil(c.T(), chain33Msg)
assert.Equal(c.T(), chain33Msg.ClaimType, claimType)
assert.Equal(c.T(), chain33Msg.Chain33Sender, []byte(chain33ToEth.Chain33Sender))
assert.Equal(c.T(), chain33Msg.EthereumReceiver, common.HexToAddress(chain33ToEth.EthereumReceiver))
assert.Equal(c.T(), chain33Msg.TokenContractAddress, common.HexToAddress(chain33ToEth.TokenContract))
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)
assert.Equal(c.T(), chain33Msg.Chain33Sender, prophecyClaim.Chain33Sender)
assert.Equal(c.T(), chain33Msg.EthereumReceiver, prophecyClaim.EthereumReceiver)
assert.Equal(c.T(), chain33Msg.TokenContractAddress, prophecyClaim.TokenContractAddress)
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)
require.Nil(c.T(), err)
}
func (c *suiteContracts) Test_RecoverOracleInstance() {
oracleInstance, err := RecoverOracleInstance(c.sim, c.x2EthDeployInfo.BridgeRegistry.Address, c.x2EthDeployInfo.BridgeRegistry.Address)
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)
require.Nil(c.T(), err)
assert.True(c.T(), height > 0)
}
func (c *suiteContracts) Test_CreateBridgeToken() {
operatorInfo := &OperatorInfo{
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)
c.sim.Commit()
addr, err := GetToken2address(c.x2EthContracts.BridgeBank, "bty")
require.Nil(c.T(), err)
assert.Equal(c.T(), addr, tokenAddr)
chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
amount := int64(100)
ethReceiver := c.para.InitValidators[2]
claimID := crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), big.NewInt(amount).Bytes())
authOracle, err := PrepareAuth(c.sim, c.para.ValidatorPriKey[0], c.para.InitValidators[0])
require.Nil(c.T(), err)
signature, err := SignClaim4Eth(claimID, c.para.ValidatorPriKey[0])
require.Nil(c.T(), err)
_, err = c.x2EthContracts.Oracle.NewOracleClaim(
authOracle,
events.ClaimTypeLock,
chain33Sender,
ethReceiver,
common.HexToAddress(tokenAddr),
"bty",
big.NewInt(amount),
claimID,
signature)
require.Nil(c.T(), err)
c.sim.Commit()
balanceNew, err := GetBalance(c.sim, tokenAddr, ethReceiver.String())
require.Nil(c.T(), err)
require.Equal(c.T(), balanceNew, "100")
chain33Receiver := "1GTxrmuWiXavhcvsaH5w9whgVxUrWsUMdV"
{
amount := "10"
bn := big.NewInt(1)
bn, _ = bn.SetString(x2ethTypes.TrimZeroAndDot(amount), 10)
txhash, err := Burn(hexutil.Encode(crypto.FromECDSA(c.para.ValidatorPriKey[2])), tokenAddr, chain33Receiver, c.x2EthDeployInfo.BridgeBank.Address, bn, c.x2EthContracts.BridgeBank, c.sim)
require.NoError(c.T(), err)
c.sim.Commit()
balanceNew, err = GetBalance(c.sim, tokenAddr, ethReceiver.String())
require.Nil(c.T(), err)
require.Equal(c.T(), balanceNew, "90")
status := GetEthTxStatus(c.sim, common.HexToHash(txhash))
fmt.Println()
fmt.Println(status)
}
{
amount := "10"
bn := big.NewInt(1)
bn, _ = bn.SetString(x2ethTypes.TrimZeroAndDot(amount), 10)
_, err := ApproveAllowance(hexutil.Encode(crypto.FromECDSA(c.para.ValidatorPriKey[2])), tokenAddr, c.x2EthDeployInfo.BridgeBank.Address, bn, c.sim)
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)
c.sim.Commit()
balanceNew, err = GetBalance(c.sim, tokenAddr, ethReceiver.String())
require.Nil(c.T(), err)
require.Equal(c.T(), balanceNew, "80")
}
}
func (c *suiteContracts) Test_CreateERC20Token() {
operatorInfo := &OperatorInfo{
PrivateKey: c.para.DeployPrivateKey,
Address: crypto.PubkeyToAddress(c.para.DeployPrivateKey.PublicKey),
}
tokenAddr, err := CreateERC20Token("testc", c.sim, operatorInfo)
require.Nil(c.T(), err)
c.sim.Commit()
amount := "10000000000000"
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)
c.sim.Commit()
balance, err := GetDepositFunds(c.sim, tokenAddr)
require.Nil(c.T(), err)
assert.Equal(c.T(), balance, amount)
amount = "100"
bn = big.NewInt(1)
bn, _ = bn.SetString(x2ethTypes.TrimZeroAndDot(amount), 10)
txhash, err := TransferToken(tokenAddr, hexutil.Encode(crypto.FromECDSA(c.para.DeployPrivateKey)), c.para.InitValidators[0].String(), bn, c.sim)
require.Nil(c.T(), err)
c.sim.Commit()
_, err = c.sim.TransactionReceipt(context.Background(), common.HexToHash(txhash))
require.Nil(c.T(), err)
balance, err = GetBalance(c.sim, tokenAddr, c.para.InitValidators[0].String())
require.Nil(c.T(), err)
assert.Equal(c.T(), balance, amount)
{
amount = "100"
bn := big.NewInt(1)
bn, _ = bn.SetString(x2ethTypes.TrimZeroAndDot(amount), 10)
chain33Receiver := "14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
_, err = LockEthErc20Asset(hexutil.Encode(crypto.FromECDSA(c.para.DeployPrivateKey)), tokenAddr, chain33Receiver, bn, c.sim, c.x2EthContracts.BridgeBank, c.x2EthDeployInfo.BridgeBank.Address)
require.Nil(c.T(), err)
c.sim.Commit()
balance, err = GetBalance(c.sim, tokenAddr, c.para.Deployer.String())
require.Nil(c.T(), err)
fmt.Println(balance)
assert.Equal(c.T(), balance, "9999999999800")
}
{
amount := "800"
bn := big.NewInt(1)
bn, _ = bn.SetString(x2ethTypes.TrimZeroAndDot(amount), 10)
_, err = ApproveAllowance(hexutil.Encode(crypto.FromECDSA(c.para.DeployPrivateKey)), tokenAddr, c.x2EthDeployInfo.BridgeBank.Address, bn, c.sim)
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)
require.Nil(c.T(), err)
c.sim.Commit()
balance, err = GetBalance(c.sim, tokenAddr, c.para.Deployer.String())
require.Nil(c.T(), err)
fmt.Println(balance)
assert.Equal(c.T(), balance, "9999999999000")
}
}
func (c *suiteContracts) Test_GetLockedFunds() {
balance, err := GetLockedFunds(c.x2EthContracts.BridgeBank, "")
require.Nil(c.T(), err)
assert.Equal(c.T(), balance, "0")
}
func PrepareTestEnv() (*ethinterface.SimExtend, *DeployPara) {
genesiskey, _ := crypto.GenerateKey()
alloc := make(core.GenesisAlloc)
genesisAddr := crypto.PubkeyToAddress(genesiskey.PublicKey)
genesisAccount := core.GenesisAccount{
Balance: big.NewInt(10000000000 * 10000),
PrivateKey: crypto.FromECDSA(genesiskey),
}
alloc[genesisAddr] = genesisAccount
var InitValidators []common.Address
var ValidatorPriKey []*ecdsa.PrivateKey
for i := 0; i < 4; i++ {
key, _ := crypto.GenerateKey()
addr := crypto.PubkeyToAddress(key.PublicKey)
InitValidators = append(InitValidators, addr)
ValidatorPriKey = append(ValidatorPriKey, key)
account := core.GenesisAccount{
Balance: big.NewInt(100000000 * 100),
PrivateKey: crypto.FromECDSA(key),
}
alloc[addr] = account
}
gasLimit := uint64(100000000)
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{
DeployPrivateKey: genesiskey,
Deployer: genesisAddr,
Operator: genesisAddr,
InitValidators: InitValidators,
ValidatorPriKey: ValidatorPriKey,
InitPowers: InitPowers,
}
return sim, para
}
func DeployContracts() (*DeployPara, *ethinterface.SimExtend, *X2EthContracts, *X2EthDeployInfo, error) {
ctx := context.Background()
sim, para := PrepareTestEnv()
callMsg := ethereum.CallMsg{
From: para.Deployer,
Data: common.FromHex(generated.BridgeBankBin),
}
_, err := sim.EstimateGas(ctx, callMsg)
if nil != err {
panic("failed to estimate gas due to:" + err.Error())
}
x2EthContracts, x2EthDeployInfo, err := DeployAndInit(sim, para)
if nil != err {
return nil, nil, nil, nil, err
}
sim.Commit()
return para, sim, x2EthContracts, x2EthDeployInfo, nil
}
//
//import (
// "context"
// "crypto/ecdsa"
// "fmt"
// "math/big"
// "strings"
// "testing"
//
// chain33Types "github.com/33cn/chain33/types"
// "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/events"
// ebrelayerTypes "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/types"
// "github.com/33cn/plugin/plugin/dapp/x2ethereum/types"
// x2ethTypes "github.com/33cn/plugin/plugin/dapp/x2ethereum/types"
// "github.com/ethereum/go-ethereum"
// "github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
// "github.com/ethereum/go-ethereum/common"
// "github.com/ethereum/go-ethereum/common/hexutil"
// "github.com/ethereum/go-ethereum/core"
// "github.com/ethereum/go-ethereum/crypto"
// "github.com/stretchr/testify/assert"
// "github.com/stretchr/testify/require"
// "github.com/stretchr/testify/suite"
//)
//
//var (
// chain33Addr = "14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
// ethAddr = "0x92C8b16aFD6d423652559C6E266cBE1c29Bfd84f"
// ethTokenAddr = "0x0000000000000000000000000000000000000000"
//)
//
//type suiteContracts struct {
// suite.Suite
// para *DeployPara
// sim *ethinterface.SimExtend
// x2EthContracts *X2EthContracts
// x2EthDeployInfo *X2EthDeployInfo
//}
//
//func TestRunSuiteX2Ethereum(t *testing.T) {
// log := new(suiteContracts)
// suite.Run(t, log)
//}
//
//func (c *suiteContracts) SetupSuite() {
// var err error
// 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)
// 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)
// require.Nil(c.T(), err)
// assert.Equal(c.T(), bret, true)
//
// key, _ := crypto.GenerateKey()
// addr := crypto.PubkeyToAddress(key.PublicKey)
// bret, err = IsActiveValidator(addr, c.x2EthContracts.Valset)
// require.Nil(c.T(), err) // ???
// assert.Equal(c.T(), bret, false)
//}
//
//func (c *suiteContracts) Test_IsProphecyPending() {
// claimID := crypto.Keccak256Hash(big.NewInt(50).Bytes())
// bret, err := IsProphecyPending(claimID, c.para.InitValidators[0], c.x2EthContracts.Chain33Bridge)
// require.Nil(c.T(), err)
// assert.Equal(c.T(), bret, false)
//}
//
//func (c *suiteContracts) Test_LogLockToEthBridgeClaim() {
// to := common.FromHex(chain33Addr)
// event := &events.LockEvent{
// From: c.para.InitValidators[0],
// To: to,
// Token: common.HexToAddress(ethTokenAddr),
// Symbol: "eth",
// 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)
// assert.NotEmpty(c.T(), witnessClaim)
// assert.Equal(c.T(), witnessClaim.EthereumChainID, int64(1))
// assert.Equal(c.T(), witnessClaim.BridgeBrankAddr, c.x2EthDeployInfo.BridgeBank.Address.String())
// assert.Equal(c.T(), witnessClaim.TokenAddr, ethTokenAddr)
// assert.Equal(c.T(), witnessClaim.Symbol, event.Symbol)
// assert.Equal(c.T(), witnessClaim.EthereumSender, event.From.String())
// assert.Equal(c.T(), witnessClaim.Chain33Receiver, string(event.To))
// assert.Equal(c.T(), witnessClaim.Amount, "100")
// 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)
// require.NotNil(c.T(), err)
// assert.Equal(c.T(), err, ebrelayerTypes.ErrAddress4Eth)
//}
//
//func (c *suiteContracts) Test_LogBurnToEthBridgeClaim() {
// to := common.FromHex(chain33Addr)
// event := &events.BurnEvent{
// OwnerFrom: c.para.InitValidators[0],
// Chain33Receiver: to,
// Token: common.HexToAddress(ethTokenAddr),
// Symbol: "bty",
// Amount: big.NewInt(100),
// Nonce: big.NewInt(2),
// }
// witnessClaim, err := LogBurnToEthBridgeClaim(event, 1, c.x2EthDeployInfo.BridgeBank.Address.String(), 8)
// require.Nil(c.T(), err)
// assert.NotEmpty(c.T(), witnessClaim)
// assert.Equal(c.T(), witnessClaim.EthereumChainID, int64(1))
// assert.Equal(c.T(), witnessClaim.BridgeBrankAddr, c.x2EthDeployInfo.BridgeBank.Address.String())
// assert.Equal(c.T(), witnessClaim.TokenAddr, ethTokenAddr)
// assert.Equal(c.T(), witnessClaim.Symbol, event.Symbol)
// assert.Equal(c.T(), witnessClaim.EthereumSender, event.OwnerFrom.String())
// assert.Equal(c.T(), witnessClaim.Chain33Receiver, string(event.Chain33Receiver))
// assert.Equal(c.T(), witnessClaim.Amount, "100")
// 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
// chain33ToEth := types.ReceiptChain33ToEth{
// Chain33Sender: chain33Addr,
// EthereumReceiver: ethAddr,
// TokenContract: ethTokenAddr,
// IssuerDotSymbol: "bty",
// Amount: "100",
// Decimals: 8,
// }
//
// log := &chain33Types.ReceiptLog{
// Ty: types.TyWithdrawChain33Log,
// Log: chain33Types.Encode(&chain33ToEth),
// }
//
// var logs []*chain33Types.ReceiptLog
// logs = append(logs, log)
//
// receipt := &chain33Types.ReceiptData{
// Ty: types.TyWithdrawChain33Log,
// Logs: logs,
// }
//
// chain33Msg := ParseBurnLockTxReceipt(claimType, receipt)
// require.NotNil(c.T(), chain33Msg)
// assert.Equal(c.T(), chain33Msg.ClaimType, claimType)
// assert.Equal(c.T(), chain33Msg.Chain33Sender, []byte(chain33ToEth.Chain33Sender))
// assert.Equal(c.T(), chain33Msg.EthereumReceiver, common.HexToAddress(chain33ToEth.EthereumReceiver))
// assert.Equal(c.T(), chain33Msg.TokenContractAddress, common.HexToAddress(chain33ToEth.TokenContract))
// 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)
// assert.Equal(c.T(), chain33Msg.Chain33Sender, prophecyClaim.Chain33Sender)
// assert.Equal(c.T(), chain33Msg.EthereumReceiver, prophecyClaim.EthereumReceiver)
// assert.Equal(c.T(), chain33Msg.TokenContractAddress, prophecyClaim.TokenContractAddress)
// 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)
// require.Nil(c.T(), err)
//}
//
//func (c *suiteContracts) Test_RecoverOracleInstance() {
// oracleInstance, err := RecoverOracleInstance(c.sim, c.x2EthDeployInfo.BridgeRegistry.Address, c.x2EthDeployInfo.BridgeRegistry.Address)
// 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)
// require.Nil(c.T(), err)
// assert.True(c.T(), height > 0)
//}
//
//func (c *suiteContracts) Test_CreateBridgeToken() {
// operatorInfo := &OperatorInfo{
// 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)
// c.sim.Commit()
//
// addr, err := GetToken2address(c.x2EthContracts.BridgeBank, "bty")
// require.Nil(c.T(), err)
// assert.Equal(c.T(), addr, tokenAddr)
//
// chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
// amount := int64(100)
// ethReceiver := c.para.InitValidators[2]
// claimID := crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), big.NewInt(amount).Bytes())
// authOracle, err := PrepareAuth(c.sim, c.para.ValidatorPriKey[0], c.para.InitValidators[0])
// require.Nil(c.T(), err)
// signature, err := SignClaim4Eth(claimID, c.para.ValidatorPriKey[0])
// require.Nil(c.T(), err)
//
// _, err = c.x2EthContracts.Oracle.NewOracleClaim(
// authOracle,
// events.ClaimTypeLock,
// chain33Sender,
// ethReceiver,
// common.HexToAddress(tokenAddr),
// "bty",
// big.NewInt(amount),
// claimID,
// signature)
// require.Nil(c.T(), err)
// c.sim.Commit()
//
// balanceNew, err := GetBalance(c.sim, tokenAddr, ethReceiver.String())
// require.Nil(c.T(), err)
// require.Equal(c.T(), balanceNew, "100")
//
// chain33Receiver := "1GTxrmuWiXavhcvsaH5w9whgVxUrWsUMdV"
// {
// amount := "10"
// bn := big.NewInt(1)
// bn, _ = bn.SetString(x2ethTypes.TrimZeroAndDot(amount), 10)
// txhash, err := Burn(hexutil.Encode(crypto.FromECDSA(c.para.ValidatorPriKey[2])), tokenAddr, chain33Receiver, c.x2EthDeployInfo.BridgeBank.Address, bn, c.x2EthContracts.BridgeBank, c.sim)
// require.NoError(c.T(), err)
// c.sim.Commit()
//
// balanceNew, err = GetBalance(c.sim, tokenAddr, ethReceiver.String())
// require.Nil(c.T(), err)
// require.Equal(c.T(), balanceNew, "90")
//
// status := GetEthTxStatus(c.sim, common.HexToHash(txhash))
// fmt.Println()
// fmt.Println(status)
// }
//
// {
// amount := "10"
// bn := big.NewInt(1)
// bn, _ = bn.SetString(x2ethTypes.TrimZeroAndDot(amount), 10)
// _, err := ApproveAllowance(hexutil.Encode(crypto.FromECDSA(c.para.ValidatorPriKey[2])), tokenAddr, c.x2EthDeployInfo.BridgeBank.Address, bn, c.sim)
// 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)
// c.sim.Commit()
//
// balanceNew, err = GetBalance(c.sim, tokenAddr, ethReceiver.String())
// require.Nil(c.T(), err)
// require.Equal(c.T(), balanceNew, "80")
// }
//}
//
//func (c *suiteContracts) Test_CreateERC20Token() {
// operatorInfo := &OperatorInfo{
// PrivateKey: c.para.DeployPrivateKey,
// Address: crypto.PubkeyToAddress(c.para.DeployPrivateKey.PublicKey),
// }
// tokenAddr, err := CreateERC20Token("testc", c.sim, operatorInfo)
// require.Nil(c.T(), err)
// c.sim.Commit()
//
// amount := "10000000000000"
// 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)
// c.sim.Commit()
//
// balance, err := GetDepositFunds(c.sim, tokenAddr)
// require.Nil(c.T(), err)
// assert.Equal(c.T(), balance, amount)
//
// amount = "100"
// bn = big.NewInt(1)
// bn, _ = bn.SetString(x2ethTypes.TrimZeroAndDot(amount), 10)
// txhash, err := TransferToken(tokenAddr, hexutil.Encode(crypto.FromECDSA(c.para.DeployPrivateKey)), c.para.InitValidators[0].String(), bn, c.sim)
// require.Nil(c.T(), err)
// c.sim.Commit()
//
// _, err = c.sim.TransactionReceipt(context.Background(), common.HexToHash(txhash))
// require.Nil(c.T(), err)
// balance, err = GetBalance(c.sim, tokenAddr, c.para.InitValidators[0].String())
// require.Nil(c.T(), err)
// assert.Equal(c.T(), balance, amount)
//
// {
// amount = "100"
// bn := big.NewInt(1)
// bn, _ = bn.SetString(x2ethTypes.TrimZeroAndDot(amount), 10)
// chain33Receiver := "14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
// _, err = LockEthErc20Asset(hexutil.Encode(crypto.FromECDSA(c.para.DeployPrivateKey)), tokenAddr, chain33Receiver, bn, c.sim, c.x2EthContracts.BridgeBank, c.x2EthDeployInfo.BridgeBank.Address)
// require.Nil(c.T(), err)
// c.sim.Commit()
//
// balance, err = GetBalance(c.sim, tokenAddr, c.para.Deployer.String())
// require.Nil(c.T(), err)
// fmt.Println(balance)
// assert.Equal(c.T(), balance, "9999999999800")
// }
//
// {
// amount := "800"
// bn := big.NewInt(1)
// bn, _ = bn.SetString(x2ethTypes.TrimZeroAndDot(amount), 10)
// _, err = ApproveAllowance(hexutil.Encode(crypto.FromECDSA(c.para.DeployPrivateKey)), tokenAddr, c.x2EthDeployInfo.BridgeBank.Address, bn, c.sim)
// 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)
// require.Nil(c.T(), err)
// c.sim.Commit()
//
// balance, err = GetBalance(c.sim, tokenAddr, c.para.Deployer.String())
// require.Nil(c.T(), err)
// fmt.Println(balance)
// assert.Equal(c.T(), balance, "9999999999000")
// }
//}
//
//func (c *suiteContracts) Test_GetLockedFunds() {
// balance, err := GetLockedFunds(c.x2EthContracts.BridgeBank, "")
// require.Nil(c.T(), err)
// assert.Equal(c.T(), balance, "0")
//}
//
//func PrepareTestEnv() (*ethinterface.SimExtend, *DeployPara) {
// genesiskey, _ := crypto.GenerateKey()
// alloc := make(core.GenesisAlloc)
// genesisAddr := crypto.PubkeyToAddress(genesiskey.PublicKey)
// genesisAccount := core.GenesisAccount{
// Balance: big.NewInt(10000000000 * 10000),
// PrivateKey: crypto.FromECDSA(genesiskey),
// }
// alloc[genesisAddr] = genesisAccount
//
// var InitValidators []common.Address
// var ValidatorPriKey []*ecdsa.PrivateKey
// for i := 0; i < 4; i++ {
// key, _ := crypto.GenerateKey()
// addr := crypto.PubkeyToAddress(key.PublicKey)
// InitValidators = append(InitValidators, addr)
// ValidatorPriKey = append(ValidatorPriKey, key)
//
// account := core.GenesisAccount{
// Balance: big.NewInt(100000000 * 100),
// PrivateKey: crypto.FromECDSA(key),
// }
// alloc[addr] = account
// }
// gasLimit := uint64(100000000)
// 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{
// DeployPrivateKey: genesiskey,
// Deployer: genesisAddr,
// Operator: genesisAddr,
// InitValidators: InitValidators,
// ValidatorPriKey: ValidatorPriKey,
// InitPowers: InitPowers,
// }
//
// return sim, para
//}
//
//func DeployContracts() (*DeployPara, *ethinterface.SimExtend, *X2EthContracts, *X2EthDeployInfo, error) {
// ctx := context.Background()
// sim, para := PrepareTestEnv()
//
// callMsg := ethereum.CallMsg{
// From: para.Deployer,
// Data: common.FromHex(generated.BridgeBankBin),
// }
//
// _, err := sim.EstimateGas(ctx, callMsg)
// if nil != err {
// panic("failed to estimate gas due to:" + err.Error())
// }
// x2EthContracts, x2EthDeployInfo, err := DeployAndInit(sim, para)
// if nil != err {
// return nil, nil, nil, nil, err
// }
// sim.Commit()
//
// return para, sim, x2EthContracts, x2EthDeployInfo, nil
//}
package ethtxs
import (
"context"
"crypto/ecdsa"
"math/big"
"testing"
chain33Common "github.com/33cn/chain33/common"
"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/events"
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/crypto"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func Test_LoadABI(t *testing.T) {
abi1 := LoadABI(Chain33BankABI)
abi2 := LoadABI(Chain33BridgeABI)
abi3 := LoadABI(EthereumBankABI)
assert.NotEmpty(t, abi1, abi2, abi3)
}
func Test_isWebsocketURL(t *testing.T) {
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)
}
func TestContractRegistry_String(t *testing.T) {
assert.Equal(t, Valset.String(), "valset")
assert.Equal(t, Oracle.String(), "oracle")
assert.Equal(t, BridgeBank.String(), "bridgebank")
assert.Equal(t, Chain33Bridge.String(), "chain33bridge")
}
func Test_GetAddressFromBridgeRegistry(t *testing.T) {
genesiskey, _ := crypto.GenerateKey()
alloc := make(core.GenesisAlloc)
genesisAddr := crypto.PubkeyToAddress(genesiskey.PublicKey)
genesisAccount := core.GenesisAccount{
Balance: big.NewInt(10000000000 * 10000),
PrivateKey: crypto.FromECDSA(genesiskey),
}
alloc[genesisAddr] = genesisAccount
gasLimit := uint64(100000000)
sim := new(ethinterface.SimExtend)
sim.SimulatedBackend = backends.NewSimulatedBackend(alloc, gasLimit)
bridgebankTest := ContractRegistry(5)
_, err := GetAddressFromBridgeRegistry(sim, genesisAddr, genesisAddr, bridgebankTest)
require.NotNil(t, err)
}
func Test_RelayOracleClaimToEthereum(t *testing.T) {
para, sim, x2EthContracts, _, err := deployContracts()
require.NoError(t, err)
claimType := events.MsgBurn
privateKeySlice, err := chain33Common.FromHex("0x3fa21584ae2e4fd74db9b58e2386f5481607dfa4d7ba0617aaa7858e5025dc1e")
require.Nil(t, err)
privateKey, err := crypto.ToECDSA(privateKeySlice)
require.Nil(t, err)
prophecyClaim := ProphecyClaim{
ClaimType: events.MsgBurn,
Chain33Sender: []byte("12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"),
EthereumReceiver: common.HexToAddress("0x0C05bA5c230fDaA503b53702aF1962e08D0C60BF"),
TokenContractAddress: common.HexToAddress("0x0000000000000000000000000000000000000000"),
Symbol: "eth",
Amount: big.NewInt(100000000000000000),
}
chain33TxHash := common.Hex2Bytes("fd5747c43d1460bb6f8a7a26c66b4ccab5500d05668278efe5c0fd5951dfd909")
txhash, err := RelayOracleClaimToEthereum(x2EthContracts.Oracle, sim, para.InitValidators[0], claimType, prophecyClaim, privateKey, chain33TxHash)
require.Nil(t, err)
assert.Equal(t, txhash, "0x6fa087c7a2a8a4421f6e269fbc6c0838e99fa59d5760155a71cd7eb1c01aafad")
//hash := "0xc0c22aa6198fdde0dbe47ddadbe449f736b82ed4a498871de5d5f4ad9ae122a0"
//status := GetEthTxStatus(sim, common.HexToHash(hash))
//assert.Equal(t, status, EthTxPending.String())
_, err = revokeNonce(para.Operator)
require.Nil(t, err)
}
func Test_revokeNonce(t *testing.T) {
}
func deployContracts() (*DeployPara, *ethinterface.SimExtend, *X2EthContracts, *X2EthDeployInfo, error) {
// 0x8AFDADFC88a1087c9A1D6c0F5Dd04634b87F303a
deployerPrivateKey := "8656d2bc732a8a816a461ba5e2d8aac7c7f85c26a813df30d5327210465eb230"
// 0x92C8b16aFD6d423652559C6E266cBE1c29Bfd84f
ethValidatorAddrKeyA := "3fa21584ae2e4fd74db9b58e2386f5481607dfa4d7ba0617aaa7858e5025dc1e"
ethValidatorAddrKeyB := "a5f3063552f4483cfc20ac4f40f45b798791379862219de9e915c64722c1d400"
ethValidatorAddrKeyC := "bbf5e65539e9af0eb0cfac30bad475111054b09c11d668fc0731d54ea777471e"
ethValidatorAddrKeyD := "c9fa31d7984edf81b8ef3b40c761f1847f6fcd5711ab2462da97dc458f1f896b"
ethValidatorAddrKeys := make([]string, 0)
ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyA)
ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyB)
ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyC)
ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyD)
ctx := context.Background()
//var backend bind.ContractBackend
backend, para := PrepareTestEnvironment(deployerPrivateKey, ethValidatorAddrKeys)
sim := new(ethinterface.SimExtend)
sim.SimulatedBackend = backend.(*backends.SimulatedBackend)
callMsg := ethereum.CallMsg{
From: para.Deployer,
Data: common.FromHex(generated.BridgeBankBin),
}
_, err := sim.EstimateGas(ctx, callMsg)
if nil != err {
panic("failed to estimate gas due to:" + err.Error())
}
x2EthContracts, x2EthDeployInfo, err := DeployAndInit(sim, para)
if nil != err {
return nil, nil, nil, nil, err
}
sim.Commit()
return para, sim, x2EthContracts, x2EthDeployInfo, nil
}
func PrepareTestEnvironment(deployerPrivateKey string, ethValidatorAddrKeys []string) (bind.ContractBackend, *DeployPara) {
genesiskey, _ := crypto.HexToECDSA(deployerPrivateKey)
alloc := make(core.GenesisAlloc)
genesisAddr := crypto.PubkeyToAddress(genesiskey.PublicKey)
genesisAccount := core.GenesisAccount{
Balance: big.NewInt(10000000000 * 10000),
PrivateKey: crypto.FromECDSA(genesiskey),
}
alloc[genesisAddr] = genesisAccount
var InitValidators []common.Address
var ValidatorPriKey []*ecdsa.PrivateKey
for _, v := range ethValidatorAddrKeys {
key, _ := crypto.HexToECDSA(v)
addr := crypto.PubkeyToAddress(key.PublicKey)
InitValidators = append(InitValidators, addr)
ValidatorPriKey = append(ValidatorPriKey, key)
account := core.GenesisAccount{
Balance: big.NewInt(100000000 * 100),
PrivateKey: crypto.FromECDSA(key),
}
alloc[addr] = account
}
gasLimit := uint64(100000000)
sim := backends.NewSimulatedBackend(alloc, gasLimit)
InitPowers := []*big.Int{big.NewInt(80), big.NewInt(10), big.NewInt(10), big.NewInt(10)}
para := &DeployPara{
DeployPrivateKey: genesiskey,
Deployer: genesisAddr,
Operator: genesisAddr,
InitValidators: InitValidators,
ValidatorPriKey: ValidatorPriKey,
InitPowers: InitPowers,
}
return sim, para
}
//
//import (
// "context"
// "crypto/ecdsa"
// "math/big"
// "testing"
//
// chain33Common "github.com/33cn/chain33/common"
// "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/events"
// "github.com/ethereum/go-ethereum"
// "github.com/ethereum/go-ethereum/accounts/abi/bind"
// "github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
// "github.com/ethereum/go-ethereum/common"
// "github.com/ethereum/go-ethereum/core"
// "github.com/ethereum/go-ethereum/crypto"
// "github.com/stretchr/testify/assert"
// "github.com/stretchr/testify/require"
//)
//
//func Test_LoadABI(t *testing.T) {
// abi1 := LoadABI(Chain33BankABI)
// abi2 := LoadABI(Chain33BridgeABI)
// abi3 := LoadABI(EthereumBankABI)
// assert.NotEmpty(t, abi1, abi2, abi3)
//}
//
//func Test_isWebsocketURL(t *testing.T) {
// 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)
//}
//
//func TestContractRegistry_String(t *testing.T) {
// assert.Equal(t, Valset.String(), "valset")
// assert.Equal(t, Oracle.String(), "oracle")
// assert.Equal(t, BridgeBank.String(), "bridgebank")
// assert.Equal(t, Chain33Bridge.String(), "chain33bridge")
//}
//
//func Test_GetAddressFromBridgeRegistry(t *testing.T) {
// genesiskey, _ := crypto.GenerateKey()
// alloc := make(core.GenesisAlloc)
// genesisAddr := crypto.PubkeyToAddress(genesiskey.PublicKey)
// genesisAccount := core.GenesisAccount{
// Balance: big.NewInt(10000000000 * 10000),
// PrivateKey: crypto.FromECDSA(genesiskey),
// }
// alloc[genesisAddr] = genesisAccount
// gasLimit := uint64(100000000)
// sim := new(ethinterface.SimExtend)
// sim.SimulatedBackend = backends.NewSimulatedBackend(alloc, gasLimit)
//
// bridgebankTest := ContractRegistry(5)
// _, err := GetAddressFromBridgeRegistry(sim, genesisAddr, genesisAddr, bridgebankTest)
// require.NotNil(t, err)
//}
//
//func Test_RelayOracleClaimToEthereum(t *testing.T) {
// para, sim, x2EthContracts, _, err := deployContracts()
// require.NoError(t, err)
//
// claimType := events.MsgBurn
// privateKeySlice, err := chain33Common.FromHex("0x3fa21584ae2e4fd74db9b58e2386f5481607dfa4d7ba0617aaa7858e5025dc1e")
// require.Nil(t, err)
// privateKey, err := crypto.ToECDSA(privateKeySlice)
// require.Nil(t, err)
//
// prophecyClaim := ProphecyClaim{
// ClaimType: events.MsgBurn,
// Chain33Sender: []byte("12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"),
// EthereumReceiver: common.HexToAddress("0x0C05bA5c230fDaA503b53702aF1962e08D0C60BF"),
// TokenContractAddress: common.HexToAddress("0x0000000000000000000000000000000000000000"),
// Symbol: "eth",
// Amount: big.NewInt(100000000000000000),
// }
//
// chain33TxHash := common.Hex2Bytes("fd5747c43d1460bb6f8a7a26c66b4ccab5500d05668278efe5c0fd5951dfd909")
// txhash, err := RelayOracleClaimToEthereum(x2EthContracts.Oracle, sim, para.InitValidators[0], claimType, prophecyClaim, privateKey, chain33TxHash)
// require.Nil(t, err)
// assert.Equal(t, txhash, "0x6fa087c7a2a8a4421f6e269fbc6c0838e99fa59d5760155a71cd7eb1c01aafad")
//
// //hash := "0xc0c22aa6198fdde0dbe47ddadbe449f736b82ed4a498871de5d5f4ad9ae122a0"
// //status := GetEthTxStatus(sim, common.HexToHash(hash))
// //assert.Equal(t, status, EthTxPending.String())
//
// _, err = revokeNonce(para.Operator)
// require.Nil(t, err)
//}
//
//func Test_revokeNonce(t *testing.T) {
//
//}
//
//func deployContracts() (*DeployPara, *ethinterface.SimExtend, *X2EthContracts, *X2EthDeployInfo, error) {
// // 0x8AFDADFC88a1087c9A1D6c0F5Dd04634b87F303a
// deployerPrivateKey := "8656d2bc732a8a816a461ba5e2d8aac7c7f85c26a813df30d5327210465eb230"
// // 0x92C8b16aFD6d423652559C6E266cBE1c29Bfd84f
// ethValidatorAddrKeyA := "3fa21584ae2e4fd74db9b58e2386f5481607dfa4d7ba0617aaa7858e5025dc1e"
// ethValidatorAddrKeyB := "a5f3063552f4483cfc20ac4f40f45b798791379862219de9e915c64722c1d400"
// ethValidatorAddrKeyC := "bbf5e65539e9af0eb0cfac30bad475111054b09c11d668fc0731d54ea777471e"
// ethValidatorAddrKeyD := "c9fa31d7984edf81b8ef3b40c761f1847f6fcd5711ab2462da97dc458f1f896b"
//
// ethValidatorAddrKeys := make([]string, 0)
// ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyA)
// ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyB)
// ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyC)
// ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyD)
//
// ctx := context.Background()
// //var backend bind.ContractBackend
// backend, para := PrepareTestEnvironment(deployerPrivateKey, ethValidatorAddrKeys)
// sim := new(ethinterface.SimExtend)
// sim.SimulatedBackend = backend.(*backends.SimulatedBackend)
//
// callMsg := ethereum.CallMsg{
// From: para.Deployer,
// Data: common.FromHex(generated.BridgeBankBin),
// }
//
// _, err := sim.EstimateGas(ctx, callMsg)
// if nil != err {
// panic("failed to estimate gas due to:" + err.Error())
// }
// x2EthContracts, x2EthDeployInfo, err := DeployAndInit(sim, para)
// if nil != err {
// return nil, nil, nil, nil, err
// }
// sim.Commit()
//
// return para, sim, x2EthContracts, x2EthDeployInfo, nil
//}
//
//func PrepareTestEnvironment(deployerPrivateKey string, ethValidatorAddrKeys []string) (bind.ContractBackend, *DeployPara) {
// genesiskey, _ := crypto.HexToECDSA(deployerPrivateKey)
// alloc := make(core.GenesisAlloc)
// genesisAddr := crypto.PubkeyToAddress(genesiskey.PublicKey)
// genesisAccount := core.GenesisAccount{
// Balance: big.NewInt(10000000000 * 10000),
// PrivateKey: crypto.FromECDSA(genesiskey),
// }
// alloc[genesisAddr] = genesisAccount
//
// var InitValidators []common.Address
// var ValidatorPriKey []*ecdsa.PrivateKey
// for _, v := range ethValidatorAddrKeys {
// key, _ := crypto.HexToECDSA(v)
// addr := crypto.PubkeyToAddress(key.PublicKey)
// InitValidators = append(InitValidators, addr)
// ValidatorPriKey = append(ValidatorPriKey, key)
//
// account := core.GenesisAccount{
// Balance: big.NewInt(100000000 * 100),
// PrivateKey: crypto.FromECDSA(key),
// }
// alloc[addr] = account
// }
//
// gasLimit := uint64(100000000)
// sim := backends.NewSimulatedBackend(alloc, gasLimit)
//
// InitPowers := []*big.Int{big.NewInt(80), big.NewInt(10), big.NewInt(10), big.NewInt(10)}
//
// para := &DeployPara{
// DeployPrivateKey: genesiskey,
// Deployer: genesisAddr,
// Operator: genesisAddr,
// InitValidators: InitValidators,
// ValidatorPriKey: ValidatorPriKey,
// InitPowers: InitPowers,
// }
//
// return sim, para
//}
......@@ -8,6 +8,7 @@ import (
"sync"
"time"
"github.com/33cn/plugin/plugin/dapp/cross2eth/ebrelayer/utils"
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethinterface"
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
......@@ -15,7 +16,6 @@ import (
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/common/math"
"github.com/ethereum/go-ethereum/crypto/secp256k1"
solsha3 "github.com/miguelmota/go-solidity-sha3"
)
//EthTxStatus ...
......@@ -47,7 +47,7 @@ func SignClaim4Eth(hash common.Hash, privateKey *ecdsa.PrivateKey) ([]byte, erro
}
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))
if err != nil {
panic(err)
......
......@@ -55,7 +55,7 @@ type LogNewBridgeToken struct {
func UnpackLogLock(contractAbi abi.ABI, eventName string, eventData []byte) (lockEvent *LockEvent, err error) {
event := &LockEvent{}
// Parse the event's attributes as Ethereum network variables
err = contractAbi.Unpack(event, eventName, eventData)
err = contractAbi.UnpackIntoInterface(event, eventName, eventData)
if err != nil {
eventsLog.Error("UnpackLogLock", "Failed to unpack abi due to:", err.Error())
return nil, ebrelayerTypes.ErrUnpack
......@@ -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) {
event := &BurnEvent{}
// Parse the event's attributes as Ethereum network variables
err = contractAbi.Unpack(event, eventName, eventData)
err = contractAbi.UnpackIntoInterface(event, eventName, eventData)
if err != nil {
eventsLog.Error("UnpackLogBurn", "Failed to unpack abi due to:", err.Error())
return nil, ebrelayerTypes.ErrUnpack
......
package chain33
import (
"context"
"encoding/hex"
"flag"
"fmt"
"math/big"
"os"
"os/signal"
"sync"
"syscall"
"testing"
"time"
dbm "github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/types"
"github.com/33cn/chain33/util/testnode"
"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/ethinterface"
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethtxs"
relayerTx "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethtxs"
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/events"
syncTx "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/relayer/chain33/transceiver/sync"
ebTypes "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/types"
relayerTypes "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/types"
tml "github.com/BurntSushi/toml"
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
"github.com/ethereum/go-ethereum/common"
ethTypes "github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
// 需要显示引用系统插件,以加载系统内置合约
"github.com/33cn/chain33/client/mocks"
_ "github.com/33cn/chain33/system"
"github.com/stretchr/testify/mock"
)
var (
configPath = flag.String("f", "./../../relayer.toml", "configfile")
privateKeyStr = "0x3fa21584ae2e4fd74db9b58e2386f5481607dfa4d7ba0617aaa7858e5025dc1e"
accountAddr = "0x92c8b16afd6d423652559c6e266cbe1c29bfd84f"
passphrase = "123456hzj"
test = "0ac3050aa3020a0a7832657468657265756d126d60671a690a2a3078303030303030303030303030303030303030303030303030303030303030303030303030303030301a2a307830633035626135633233306664616135303362353337303261663139363265303864306336306266220831303030303030302a0365746838121a6e080112210320bbac09528e19c55b0f89cb37ab265e7e856b1a8c388780322dbbfd194b52ba1a473045022100c403d9a6e531292336b44d52e4f4dbb9b8ab1e16335383954583728b909478da022031d8a29efcbcea8df648c4054f3c09ab1ab7a330797cf79fd891a3d9336922e920a08d0628e0f193f60530a1d7ad93e5ebc28e253a22314c7538586d537459765777664e716951336e4e4b33345239466648346b5270425612ce0208021a5e0802125a0a2b10c0d59294bb192222313271796f6361794e46374c7636433971573461767873324537553431664b536676122b10a0c88c94bb192222313271796f6361794e46374c7636433971573461767873324537553431664b5366761a55080f12510a291080ade2042222313271796f6361794e46374c7636433971573461767873324537553431664b53667612242222313271796f6361794e46374c7636433971573461767873324537553431664b5366761a92010867128d010a2a3078303030303030303030303030303030303030303030303030303030303030303030303030303030301222313271796f6361794e46374c7636433971573461767873324537553431664b5366761a2a307830633035626135633233306664616135303362353337303261663139363265303864306336306266220831303030303030302a03657468301220c4092a207a38e1da7de4444f2d34c7488293f3a2e01ce2561e720e9bbef355e83755ad833220e68d8418f69d5f18278a53dca53b101f26f76883337a60a5754d5f6d94e42e3c400148c409"
// 0x8AFDADFC88a1087c9A1D6c0F5Dd04634b87F303a
deployerPrivateKey = "8656d2bc732a8a816a461ba5e2d8aac7c7f85c26a813df30d5327210465eb230"
// 0x92C8b16aFD6d423652559C6E266cBE1c29Bfd84f
ethValidatorAddrKeyA = "3fa21584ae2e4fd74db9b58e2386f5481607dfa4d7ba0617aaa7858e5025dc1e"
ethValidatorAddrKeyB = "a5f3063552f4483cfc20ac4f40f45b798791379862219de9e915c64722c1d400"
ethValidatorAddrKeyC = "bbf5e65539e9af0eb0cfac30bad475111054b09c11d668fc0731d54ea777471e"
ethValidatorAddrKeyD = "c9fa31d7984edf81b8ef3b40c761f1847f6fcd5711ab2462da97dc458f1f896b"
)
func TestAll(t *testing.T) {
mock33 := newMock33()
defer mock33.Close()
test_HandleRequest(t)
test_ImportPrivateKey(t)
test_Lockbty(t)
test_restorePrivateKeys(t)
}
func test_HandleRequest(t *testing.T) {
_, sim, _, x2EthDeployInfo, err := deployContracts()
require.NoError(t, err)
chain33Relayer := newChain33Relayer(sim, x2EthDeployInfo, "127.0.0.1:60002", t)
_, err = chain33Relayer.ImportPrivateKey(passphrase, privateKeyStr)
assert.NoError(t, err)
body, err := hex.DecodeString(test)
assert.NoError(t, err)
chain33Relayer.statusCheckedIndex = 1220
err = syncTx.HandleRequest(body)
assert.NoError(t, err)
time.Sleep(200 * time.Millisecond)
ret := chain33Relayer.QueryTxhashRelay2Eth()
assert.NotEmpty(t, ret)
event := getOracleClaimType(events.MsgLock.String())
assert.Equal(t, event, events.Event(events.ClaimTypeLock))
}
func test_ImportPrivateKey(t *testing.T) {
_, sim, _, x2EthDeployInfo, err := setup.DeployContracts()
require.NoError(t, err)
chain33Relayer := newChain33Relayer(sim, x2EthDeployInfo, "127.0.0.1:60000", t)
addr, err := chain33Relayer.ImportPrivateKey(passphrase, privateKeyStr)
assert.NoError(t, err)
assert.Equal(t, addr, accountAddr)
time.Sleep(50 * time.Millisecond)
addr, err = chain33Relayer.GetAccountAddr()
assert.NoError(t, err)
assert.Equal(t, addr, accountAddr)
key, _, _ := chain33Relayer.GetAccount("123")
assert.NotEqual(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()
require.NoError(t, err)
chain33Relayer := newChain33Relayer(sim, x2EthDeployInfo, "127.0.0.1:60001", t)
_, err = chain33Relayer.ImportPrivateKey(passphrase, privateKeyStr)
assert.NoError(t, err)
//Test_1_ImportPrivateKey()
ctx := context.Background()
//2nd:订阅事件
eventName := "LogNewBridgeToken"
bridgeBankABI := ethtxs.LoadABI(ethtxs.BridgeBankABI)
logNewBridgeTokenSig := bridgeBankABI.Events[eventName].ID().Hex()
query := ethereum.FilterQuery{
Addresses: []common.Address{x2EthDeployInfo.BridgeBank.Address},
}
// We will check logs for new events
logs := make(chan ethTypes.Log)
// Filter by contract and event, write results to logs
sub, err := sim.SubscribeFilterLogs(ctx, query, logs)
assert.Nil(t, err)
//require.Nil(t, err)
opts := &bind.CallOpts{
Pending: true,
From: para.Operator,
Context: ctx,
}
tokenCount, err := x2EthContracts.BridgeBank.BridgeTokenCount(opts)
require.Nil(t, err)
assert.Equal(t, tokenCount.Int64(), int64(0))
//3rd:创建token
symbol := "BTY"
auth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
require.Nil(t, err)
_, err = x2EthContracts.BridgeBank.BridgeBankTransactor.CreateNewBridgeToken(auth, symbol)
require.Nil(t, err)
sim.Commit()
logEvent := &events.LogNewBridgeToken{}
select {
// Handle any errors
case err := <-sub.Err():
t.Fatalf("sub error:%s", err.Error())
// vLog is raw event data
case vLog := <-logs:
// Check if the event is a 'LogLock' event
if vLog.Topics[0].Hex() == logNewBridgeTokenSig {
err = bridgeBankABI.Unpack(logEvent, eventName, vLog.Data)
require.Nil(t, err)
require.Equal(t, symbol, logEvent.Symbol)
//tokenCount正确加1
tokenCount, err = x2EthContracts.BridgeBank.BridgeTokenCount(opts)
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())
chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
amount := int64(99)
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)
signature, err := ethtxs.SignClaim4Eth(claimID, para.ValidatorPriKey[0])
require.Nil(t, err)
bridgeToken, err := generated.NewBridgeToken(logEvent.Token, sim)
require.Nil(t, err)
opts = &bind.CallOpts{
Pending: true,
Context: ctx,
}
balance, err = bridgeToken.BalanceOf(opts, ethReceiver)
require.Nil(t, err)
require.Equal(t, balance.Int64(), int64(0))
tx, err := x2EthContracts.Oracle.NewOracleClaim(
authOracle,
events.ClaimTypeLock,
chain33Sender,
ethReceiver,
logEvent.Token,
logEvent.Symbol,
big.NewInt(amount),
claimID,
signature)
require.Nil(t, err)
sim.Commit()
balance, err = bridgeToken.BalanceOf(opts, ethReceiver)
require.Nil(t, err)
require.Equal(t, balance.Int64(), amount)
//t.Logf("The minted amount is:%d", balance.Int64())
txhash := tx.Hash().Hex()
chain33Relayer.rwLock.Lock()
chain33Relayer.statusCheckedIndex = 1
chain33Relayer.totalTx4Chain33ToEth = 2
chain33Relayer.rwLock.Unlock()
_ = chain33Relayer.setLastestRelay2EthTxhash(relayerTx.EthTxPending.String(), txhash, 2)
time.Sleep(200 * time.Millisecond)
chain33Relayer.rwLock.Lock()
chain33Relayer.statusCheckedIndex = 9
chain33Relayer.totalTx4Chain33ToEth = 11
chain33Relayer.rwLock.Unlock()
_ = chain33Relayer.setLastestRelay2EthTxhash(relayerTx.EthTxPending.String(), "", 11)
time.Sleep(200 * time.Millisecond)
}
func test_restorePrivateKeys(t *testing.T) {
_, sim, _, x2EthDeployInfo, err := setup.DeployContracts()
require.NoError(t, err)
chain33Relayer := newChain33Relayer(sim, x2EthDeployInfo, "127.0.0.1:60003", t)
_, err = chain33Relayer.ImportPrivateKey(passphrase, privateKeyStr)
assert.NoError(t, err)
go func() {
for range chain33Relayer.unlock {
}
}()
temp := chain33Relayer.ethSender
err = chain33Relayer.RestorePrivateKeys("123")
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()))
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()))
assert.NoError(t, err)
time.Sleep(200 * time.Millisecond)
}
func newChain33Relayer(sim *ethinterface.SimExtend, x2EthDeployInfo *ethtxs.X2EthDeployInfo, pushBind string, t *testing.T) *Relayer4Chain33 {
cfg := initCfg(*configPath)
cfg.SyncTxConfig.Chain33Host = "http://127.0.0.1:8801"
cfg.BridgeRegistry = x2EthDeployInfo.BridgeRegistry.Address.String()
cfg.SyncTxConfig.PushBind = pushBind
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())
var wg sync.WaitGroup
relayer := &Relayer4Chain33{
rpcLaddr: cfg.SyncTxConfig.Chain33Host,
fetchHeightPeriodMs: cfg.SyncTxConfig.FetchHeightPeriodMs,
unlock: make(chan int),
db: db,
ctx: ctx,
bridgeRegistryAddr: x2EthDeployInfo.BridgeRegistry.Address,
}
err := relayer.setStatusCheckedIndex(1)
assert.NoError(t, err)
relayer.ethClient = sim
relayer.totalTx4Chain33ToEth = relayer.getTotalTxAmount2Eth()
relayer.statusCheckedIndex = relayer.getStatusCheckedIndex()
assert.Equal(t, relayer.statusCheckedIndex, int64(1))
syncCfg := &ebTypes.SyncTxReceiptConfig{
Chain33Host: cfg.SyncTxConfig.Chain33Host,
PushHost: cfg.SyncTxConfig.PushHost,
PushName: cfg.SyncTxConfig.PushName,
PushBind: pushBind,
StartSyncHeight: cfg.SyncTxConfig.StartSyncHeight,
StartSyncSequence: cfg.SyncTxConfig.StartSyncSequence,
StartSyncHash: cfg.SyncTxConfig.StartSyncHash,
}
go relayer.syncProc(syncCfg)
ch := make(chan os.Signal, 1)
signal.Notify(ch, syscall.SIGTERM)
go func() {
<-ch
cancel()
wg.Wait()
os.Exit(0)
}()
return relayer
}
func deployContracts() (*ethtxs.DeployPara, *ethinterface.SimExtend, *ethtxs.X2EthContracts, *ethtxs.X2EthDeployInfo, error) {
ethValidatorAddrKeys := make([]string, 0)
ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyA)
ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyB)
ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyC)
ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyD)
ctx := context.Background()
//var backend bind.ContractBackend
backend, para := setup.PrepareTestEnvironment(deployerPrivateKey, ethValidatorAddrKeys)
sim := new(ethinterface.SimExtend)
sim.SimulatedBackend = backend.(*backends.SimulatedBackend)
callMsg := ethereum.CallMsg{
From: para.Deployer,
Data: common.FromHex(generated.BridgeBankBin),
}
_, err := sim.EstimateGas(ctx, callMsg)
if nil != err {
panic("failed to estimate gas due to:" + err.Error())
}
x2EthContracts, x2EthDeployInfo, err := ethtxs.DeployAndInit(sim, para)
if nil != err {
return nil, nil, nil, nil, err
}
sim.Commit()
return para, sim, x2EthContracts, x2EthDeployInfo, nil
}
func initCfg(path string) *relayerTypes.RelayerConfig {
var cfg relayerTypes.RelayerConfig
if _, err := tml.DecodeFile(path, &cfg); err != nil {
fmt.Println(err)
os.Exit(-1)
}
return &cfg
}
func newMock33() *testnode.Chain33Mock {
var ret = types.ReplySubscribePush{IsOk: true, Msg: ""}
var he = types.Header{Height: 10000}
mockapi := &mocks.QueueProtocolAPI{}
// 这里对需要mock的方法打桩,Close是必须的,其它方法根据需要
mockapi.On("Close").Return()
mockapi.On("AddPushSubscribe", mock.Anything).Return(&ret, nil)
mockapi.On("GetLastHeader", mock.Anything).Return(&he, nil)
mock33 := testnode.New("", mockapi)
//defer mock33.Close()
rpcCfg := mock33.GetCfg().RPC
// 这里必须设置监听端口,默认的是无效值
rpcCfg.JrpcBindAddr = "127.0.0.1:8801"
mock33.GetRPC().Listen()
return mock33
}
//
//import (
// "context"
// "encoding/hex"
// "flag"
// "fmt"
// "math/big"
// "os"
// "os/signal"
// "sync"
// "syscall"
// "testing"
// "time"
//
// dbm "github.com/33cn/chain33/common/db"
// "github.com/33cn/chain33/types"
// "github.com/33cn/chain33/util/testnode"
// "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/ethinterface"
// "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethtxs"
// relayerTx "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethtxs"
// "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/events"
// syncTx "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/relayer/chain33/transceiver/sync"
// ebTypes "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/types"
// relayerTypes "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/types"
// tml "github.com/BurntSushi/toml"
// "github.com/ethereum/go-ethereum"
// "github.com/ethereum/go-ethereum/accounts/abi/bind"
// "github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
// "github.com/ethereum/go-ethereum/common"
// ethTypes "github.com/ethereum/go-ethereum/core/types"
// "github.com/ethereum/go-ethereum/crypto"
// "github.com/stretchr/testify/assert"
// "github.com/stretchr/testify/require"
//
// // 需要显示引用系统插件,以加载系统内置合约
// "github.com/33cn/chain33/client/mocks"
// _ "github.com/33cn/chain33/system"
// "github.com/stretchr/testify/mock"
//)
//
//var (
// configPath = flag.String("f", "./../../relayer.toml", "configfile")
// privateKeyStr = "0x3fa21584ae2e4fd74db9b58e2386f5481607dfa4d7ba0617aaa7858e5025dc1e"
// accountAddr = "0x92c8b16afd6d423652559c6e266cbe1c29bfd84f"
// passphrase = "123456hzj"
// test = "0ac3050aa3020a0a7832657468657265756d126d60671a690a2a3078303030303030303030303030303030303030303030303030303030303030303030303030303030301a2a307830633035626135633233306664616135303362353337303261663139363265303864306336306266220831303030303030302a0365746838121a6e080112210320bbac09528e19c55b0f89cb37ab265e7e856b1a8c388780322dbbfd194b52ba1a473045022100c403d9a6e531292336b44d52e4f4dbb9b8ab1e16335383954583728b909478da022031d8a29efcbcea8df648c4054f3c09ab1ab7a330797cf79fd891a3d9336922e920a08d0628e0f193f60530a1d7ad93e5ebc28e253a22314c7538586d537459765777664e716951336e4e4b33345239466648346b5270425612ce0208021a5e0802125a0a2b10c0d59294bb192222313271796f6361794e46374c7636433971573461767873324537553431664b536676122b10a0c88c94bb192222313271796f6361794e46374c7636433971573461767873324537553431664b5366761a55080f12510a291080ade2042222313271796f6361794e46374c7636433971573461767873324537553431664b53667612242222313271796f6361794e46374c7636433971573461767873324537553431664b5366761a92010867128d010a2a3078303030303030303030303030303030303030303030303030303030303030303030303030303030301222313271796f6361794e46374c7636433971573461767873324537553431664b5366761a2a307830633035626135633233306664616135303362353337303261663139363265303864306336306266220831303030303030302a03657468301220c4092a207a38e1da7de4444f2d34c7488293f3a2e01ce2561e720e9bbef355e83755ad833220e68d8418f69d5f18278a53dca53b101f26f76883337a60a5754d5f6d94e42e3c400148c409"
//
// // 0x8AFDADFC88a1087c9A1D6c0F5Dd04634b87F303a
// deployerPrivateKey = "8656d2bc732a8a816a461ba5e2d8aac7c7f85c26a813df30d5327210465eb230"
// // 0x92C8b16aFD6d423652559C6E266cBE1c29Bfd84f
// ethValidatorAddrKeyA = "3fa21584ae2e4fd74db9b58e2386f5481607dfa4d7ba0617aaa7858e5025dc1e"
// ethValidatorAddrKeyB = "a5f3063552f4483cfc20ac4f40f45b798791379862219de9e915c64722c1d400"
// ethValidatorAddrKeyC = "bbf5e65539e9af0eb0cfac30bad475111054b09c11d668fc0731d54ea777471e"
// ethValidatorAddrKeyD = "c9fa31d7984edf81b8ef3b40c761f1847f6fcd5711ab2462da97dc458f1f896b"
//)
//
//func TestAll(t *testing.T) {
// mock33 := newMock33()
// defer mock33.Close()
// test_HandleRequest(t)
// test_ImportPrivateKey(t)
// test_Lockbty(t)
// test_restorePrivateKeys(t)
//}
//
//func test_HandleRequest(t *testing.T) {
// _, sim, _, x2EthDeployInfo, err := deployContracts()
// require.NoError(t, err)
// chain33Relayer := newChain33Relayer(sim, x2EthDeployInfo, "127.0.0.1:60002", t)
// _, err = chain33Relayer.ImportPrivateKey(passphrase, privateKeyStr)
// assert.NoError(t, err)
//
// body, err := hex.DecodeString(test)
// assert.NoError(t, err)
//
// chain33Relayer.statusCheckedIndex = 1220
// err = syncTx.HandleRequest(body)
// assert.NoError(t, err)
//
// time.Sleep(200 * time.Millisecond)
//
// ret := chain33Relayer.QueryTxhashRelay2Eth()
// assert.NotEmpty(t, ret)
//
// event := getOracleClaimType(events.MsgLock.String())
// assert.Equal(t, event, events.Event(events.ClaimTypeLock))
//}
//
//func test_ImportPrivateKey(t *testing.T) {
// _, sim, _, x2EthDeployInfo, err := setup.DeployContracts()
// require.NoError(t, err)
// chain33Relayer := newChain33Relayer(sim, x2EthDeployInfo, "127.0.0.1:60000", t)
//
// addr, err := chain33Relayer.ImportPrivateKey(passphrase, privateKeyStr)
// assert.NoError(t, err)
// assert.Equal(t, addr, accountAddr)
//
// time.Sleep(50 * time.Millisecond)
//
// addr, err = chain33Relayer.GetAccountAddr()
// assert.NoError(t, err)
// assert.Equal(t, addr, accountAddr)
//
// key, _, _ := chain33Relayer.GetAccount("123")
// assert.NotEqual(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()
// require.NoError(t, err)
// chain33Relayer := newChain33Relayer(sim, x2EthDeployInfo, "127.0.0.1:60001", t)
// _, err = chain33Relayer.ImportPrivateKey(passphrase, privateKeyStr)
// assert.NoError(t, err)
//
// //Test_1_ImportPrivateKey()
// ctx := context.Background()
//
// //2nd:订阅事件
// eventName := "LogNewBridgeToken"
// bridgeBankABI := ethtxs.LoadABI(ethtxs.BridgeBankABI)
// logNewBridgeTokenSig := bridgeBankABI.Events[eventName].ID.Hex()
// query := ethereum.FilterQuery{
// Addresses: []common.Address{x2EthDeployInfo.BridgeBank.Address},
// }
// // We will check logs for new events
// logs := make(chan ethTypes.Log)
// // Filter by contract and event, write results to logs
// sub, err := sim.SubscribeFilterLogs(ctx, query, logs)
// assert.Nil(t, err)
// //require.Nil(t, err)
//
// opts := &bind.CallOpts{
// Pending: true,
// From: para.Operator,
// Context: ctx,
// }
//
// tokenCount, err := x2EthContracts.BridgeBank.BridgeTokenCount(opts)
// require.Nil(t, err)
// assert.Equal(t, tokenCount.Int64(), int64(0))
//
// //3rd:创建token
// symbol := "BTY"
// auth, err := ethtxs.PrepareAuth(sim, para.DeployPrivateKey, para.Operator)
// require.Nil(t, err)
// _, err = x2EthContracts.BridgeBank.BridgeBankTransactor.CreateNewBridgeToken(auth, symbol)
// require.Nil(t, err)
// sim.Commit()
//
// logEvent := &events.LogNewBridgeToken{}
// select {
// // Handle any errors
// case err := <-sub.Err():
// t.Fatalf("sub error:%s", err.Error())
// // vLog is raw event data
// case vLog := <-logs:
// // Check if the event is a 'LogLock' event
// if vLog.Topics[0].Hex() == logNewBridgeTokenSig {
// _, err = bridgeBankABI.Unpack(eventName, vLog.Data)
// require.Nil(t, err)
// require.Equal(t, symbol, logEvent.Symbol)
//
// //tokenCount正确加1
// tokenCount, err = x2EthContracts.BridgeBank.BridgeTokenCount(opts)
// 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())
//
// chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
// amount := int64(99)
// 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)
//
// signature, err := ethtxs.SignClaim4Eth(claimID, para.ValidatorPriKey[0])
// require.Nil(t, err)
//
// bridgeToken, err := generated.NewBridgeToken(logEvent.Token, sim)
// require.Nil(t, err)
// opts = &bind.CallOpts{
// Pending: true,
// Context: ctx,
// }
//
// balance, err = bridgeToken.BalanceOf(opts, ethReceiver)
// require.Nil(t, err)
// require.Equal(t, balance.Int64(), int64(0))
//
// tx, err := x2EthContracts.Oracle.NewOracleClaim(
// authOracle,
// events.ClaimTypeLock,
// chain33Sender,
// ethReceiver,
// logEvent.Token,
// logEvent.Symbol,
// big.NewInt(amount),
// claimID,
// signature)
// require.Nil(t, err)
//
// sim.Commit()
// balance, err = bridgeToken.BalanceOf(opts, ethReceiver)
// require.Nil(t, err)
// require.Equal(t, balance.Int64(), amount)
// //t.Logf("The minted amount is:%d", balance.Int64())
//
// txhash := tx.Hash().Hex()
//
// chain33Relayer.rwLock.Lock()
// chain33Relayer.statusCheckedIndex = 1
// chain33Relayer.totalTx4Chain33ToEth = 2
// chain33Relayer.rwLock.Unlock()
// _ = chain33Relayer.setLastestRelay2EthTxhash(relayerTx.EthTxPending.String(), txhash, 2)
//
// time.Sleep(200 * time.Millisecond)
//
// chain33Relayer.rwLock.Lock()
// chain33Relayer.statusCheckedIndex = 9
// chain33Relayer.totalTx4Chain33ToEth = 11
// chain33Relayer.rwLock.Unlock()
// _ = chain33Relayer.setLastestRelay2EthTxhash(relayerTx.EthTxPending.String(), "", 11)
//
// time.Sleep(200 * time.Millisecond)
//}
//
//func test_restorePrivateKeys(t *testing.T) {
// _, sim, _, x2EthDeployInfo, err := setup.DeployContracts()
// require.NoError(t, err)
// chain33Relayer := newChain33Relayer(sim, x2EthDeployInfo, "127.0.0.1:60003", t)
// _, err = chain33Relayer.ImportPrivateKey(passphrase, privateKeyStr)
// assert.NoError(t, err)
//
// go func() {
// for range chain33Relayer.unlock {
// }
// }()
// temp := chain33Relayer.ethSender
//
// err = chain33Relayer.RestorePrivateKeys("123")
// 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()))
// 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()))
// assert.NoError(t, err)
//
// time.Sleep(200 * time.Millisecond)
//}
//
//func newChain33Relayer(sim *ethinterface.SimExtend, x2EthDeployInfo *ethtxs.X2EthDeployInfo, pushBind string, t *testing.T) *Relayer4Chain33 {
// cfg := initCfg(*configPath)
// cfg.SyncTxConfig.Chain33Host = "http://127.0.0.1:8801"
// cfg.BridgeRegistry = x2EthDeployInfo.BridgeRegistry.Address.String()
// cfg.SyncTxConfig.PushBind = pushBind
// 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())
// var wg sync.WaitGroup
//
// relayer := &Relayer4Chain33{
// rpcLaddr: cfg.SyncTxConfig.Chain33Host,
// fetchHeightPeriodMs: cfg.SyncTxConfig.FetchHeightPeriodMs,
// unlock: make(chan int),
// db: db,
// ctx: ctx,
// bridgeRegistryAddr: x2EthDeployInfo.BridgeRegistry.Address,
// }
// err := relayer.setStatusCheckedIndex(1)
// assert.NoError(t, err)
//
// relayer.ethClient = sim
// relayer.totalTx4Chain33ToEth = relayer.getTotalTxAmount2Eth()
// relayer.statusCheckedIndex = relayer.getStatusCheckedIndex()
// assert.Equal(t, relayer.statusCheckedIndex, int64(1))
//
// syncCfg := &ebTypes.SyncTxReceiptConfig{
// Chain33Host: cfg.SyncTxConfig.Chain33Host,
// PushHost: cfg.SyncTxConfig.PushHost,
// PushName: cfg.SyncTxConfig.PushName,
// PushBind: pushBind,
// StartSyncHeight: cfg.SyncTxConfig.StartSyncHeight,
// StartSyncSequence: cfg.SyncTxConfig.StartSyncSequence,
// StartSyncHash: cfg.SyncTxConfig.StartSyncHash,
// }
// go relayer.syncProc(syncCfg)
//
// ch := make(chan os.Signal, 1)
// signal.Notify(ch, syscall.SIGTERM)
// go func() {
// <-ch
// cancel()
// wg.Wait()
// os.Exit(0)
// }()
// return relayer
//}
//
//func deployContracts() (*ethtxs.DeployPara, *ethinterface.SimExtend, *ethtxs.X2EthContracts, *ethtxs.X2EthDeployInfo, error) {
// ethValidatorAddrKeys := make([]string, 0)
// ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyA)
// ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyB)
// ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyC)
// ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyD)
//
// ctx := context.Background()
// //var backend bind.ContractBackend
// backend, para := setup.PrepareTestEnvironment(deployerPrivateKey, ethValidatorAddrKeys)
// sim := new(ethinterface.SimExtend)
// sim.SimulatedBackend = backend.(*backends.SimulatedBackend)
//
// callMsg := ethereum.CallMsg{
// From: para.Deployer,
// Data: common.FromHex(generated.BridgeBankBin),
// }
//
// _, err := sim.EstimateGas(ctx, callMsg)
// if nil != err {
// panic("failed to estimate gas due to:" + err.Error())
// }
// x2EthContracts, x2EthDeployInfo, err := ethtxs.DeployAndInit(sim, para)
// if nil != err {
// return nil, nil, nil, nil, err
// }
// sim.Commit()
//
// return para, sim, x2EthContracts, x2EthDeployInfo, nil
//}
//
//func initCfg(path string) *relayerTypes.RelayerConfig {
// var cfg relayerTypes.RelayerConfig
// if _, err := tml.DecodeFile(path, &cfg); err != nil {
// fmt.Println(err)
// os.Exit(-1)
// }
// return &cfg
//}
//
//func newMock33() *testnode.Chain33Mock {
// var ret = types.ReplySubscribePush{IsOk: true, Msg: ""}
// var he = types.Header{Height: 10000}
//
// mockapi := &mocks.QueueProtocolAPI{}
// // 这里对需要mock的方法打桩,Close是必须的,其它方法根据需要
// mockapi.On("Close").Return()
// mockapi.On("AddPushSubscribe", mock.Anything).Return(&ret, nil)
// mockapi.On("GetLastHeader", mock.Anything).Return(&he, nil)
//
// mock33 := testnode.New("", mockapi)
// //defer mock33.Close()
// rpcCfg := mock33.GetCfg().RPC
// // 这里必须设置监听端口,默认的是无效值
// rpcCfg.JrpcBindAddr = "127.0.0.1:8801"
// mock33.GetRPC().Listen()
//
// return mock33
//}
......@@ -607,9 +607,9 @@ func (ethRelayer *Relayer4Ethereum) prePareSubscribeEvent() {
contactAbi := ethtxs.LoadABI(ethtxs.BridgeBankABI)
ethRelayer.bridgeBankAbi = contactAbi
eventName = events.LogLock.String()
ethRelayer.bridgeBankEventLockSig = contactAbi.Events[eventName].ID().Hex()
ethRelayer.bridgeBankEventLockSig = contactAbi.Events[eventName].ID.Hex()
eventName = events.LogChain33TokenBurn.String()
ethRelayer.bridgeBankEventBurnSig = contactAbi.Events[eventName].ID().Hex()
ethRelayer.bridgeBankEventBurnSig = contactAbi.Events[eventName].ID.Hex()
ethRelayer.bridgeBankAddr = ethRelayer.x2EthDeployInfo.BridgeBank.Address
}
......
package ethereum
import (
"context"
"encoding/hex"
"flag"
"fmt"
"math/big"
"os"
"testing"
"time"
"github.com/33cn/chain33/client/mocks"
dbm "github.com/33cn/chain33/common/db"
_ "github.com/33cn/chain33/system"
chain33Types "github.com/33cn/chain33/types"
"github.com/33cn/chain33/util/testnode"
"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/ethinterface"
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethtxs"
"github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/events"
ebTypes "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/types"
relayerTypes "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/types"
tml "github.com/BurntSushi/toml"
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/crypto"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
)
var (
configPath = flag.String("f", "./../../relayer.toml", "configfile")
chain33PrivateKeyStr = "0xd627968e445f2a41c92173225791bae1ba42126ae96c32f28f97ff8f226e5c68"
chain33AccountAddr = "1GTxrmuWiXavhcvsaH5w9whgVxUrWsUMdV"
passphrase = "123456hzj"
chainTestCfg = chain33Types.NewChain33Config(chain33Types.GetDefaultCfgstring())
// 0x8AFDADFC88a1087c9A1D6c0F5Dd04634b87F303a
deployerPrivateKey = "8656d2bc732a8a816a461ba5e2d8aac7c7f85c26a813df30d5327210465eb230"
// 0x92C8b16aFD6d423652559C6E266cBE1c29Bfd84f
ethValidatorAddrKeyA = "3fa21584ae2e4fd74db9b58e2386f5481607dfa4d7ba0617aaa7858e5025dc1e"
ethValidatorAddrKeyB = "a5f3063552f4483cfc20ac4f40f45b798791379862219de9e915c64722c1d400"
ethValidatorAddrKeyC = "bbf5e65539e9af0eb0cfac30bad475111054b09c11d668fc0731d54ea777471e"
ethValidatorAddrKeyD = "c9fa31d7984edf81b8ef3b40c761f1847f6fcd5711ab2462da97dc458f1f896b"
)
func Test_LockAndBurn(t *testing.T) {
var tx chain33Types.Transaction
var ret chain33Types.Reply
ret.IsOk = true
mockapi := &mocks.QueueProtocolAPI{}
// 这里对需要mock的方法打桩,Close是必须的,其它方法根据需要
mockapi.On("Close").Return()
mockapi.On("AddPushSubscribe", mock.Anything).Return(&ret, nil)
mockapi.On("CreateTransaction", mock.Anything).Return(&tx, nil)
mockapi.On("SendTx", mock.Anything).Return(&ret, nil)
mockapi.On("SendTransaction", mock.Anything).Return(&ret, nil)
mockapi.On("GetConfig", mock.Anything).Return(chainTestCfg, nil)
mock33 := testnode.New("", mockapi)
defer mock33.Close()
rpcCfg := mock33.GetCfg().RPC
// 这里必须设置监听端口,默认的是无效值
rpcCfg.JrpcBindAddr = "127.0.0.1:8801"
mock33.GetRPC().Listen()
fmt.Println("======================= testLockEth =======================")
testLockEth(t)
fmt.Println("======================= testCreateERC20Token =======================")
testCreateERC20Token(t)
fmt.Println("======================= testBurnBty =======================")
testBurnBty(t)
}
func Test_GetValidatorAddr(t *testing.T) {
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
require.NoError(t, err)
ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
_ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr)
time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
_, _, err = ethRelayer.NewAccount("123")
require.Nil(t, err)
privateKey, _, err := ethRelayer.GetAccount("123")
require.Nil(t, err)
assert.NotEqual(t, privateKey, chain33PrivateKeyStr)
privateKey, addr, err := ethRelayer.GetAccount(passphrase)
require.Nil(t, err)
assert.Equal(t, privateKey, chain33PrivateKeyStr)
assert.Equal(t, addr, chain33AccountAddr)
validators, err := ethRelayer.GetValidatorAddr()
require.Nil(t, err)
assert.Equal(t, validators.Chain33Validator, chain33AccountAddr)
}
func Test_IsValidatorActive(t *testing.T) {
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
require.NoError(t, err)
ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
_ = 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)
require.Nil(t, err)
is, err = ethRelayer.IsValidatorActive("0x0C05bA5c230fDaA503b53702aF1962e08D0C60BF")
assert.Equal(t, is, false)
require.Nil(t, err)
_, err = ethRelayer.IsValidatorActive("123")
require.Error(t, err)
}
func Test_ShowAddr(t *testing.T) {
{
cfg := initCfg(*configPath)
relayer := &Relayer4Ethereum{
provider: cfg.EthProvider,
unlockchan: make(chan int, 2),
rpcURL2Chain33: cfg.SyncTxConfig.Chain33Host,
maturityDegree: cfg.EthMaturityDegree,
fetchHeightPeriodMs: cfg.EthBlockFetchPeriod,
}
_, err := relayer.ShowBridgeBankAddr()
require.Error(t, err)
_, err = relayer.ShowBridgeRegistryAddr()
require.Error(t, err)
}
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
require.NoError(t, err)
ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
_ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr)
time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
ethRelayer.prePareSubscribeEvent()
addr, err := ethRelayer.ShowBridgeBankAddr()
require.Nil(t, err)
assert.Equal(t, addr, x2EthDeployInfo.BridgeBank.Address.String())
addr, err = ethRelayer.ShowBridgeRegistryAddr()
require.Nil(t, err)
assert.Equal(t, addr, x2EthDeployInfo.BridgeRegistry.Address.String())
addr, err = ethRelayer.ShowOperator()
require.Nil(t, err)
assert.Equal(t, addr, para.Operator.String())
}
func Test_DeployContrcts(t *testing.T) {
_, sim, _, _ := deployContracts()
cfg := initCfg(*configPath)
cfg.SyncTxConfig.Dbdriver = "memdb"
db := dbm.NewDB("relayer_db_service", cfg.SyncTxConfig.Dbdriver, cfg.SyncTxConfig.DbPath, cfg.SyncTxConfig.DbCache)
relayer := &Relayer4Ethereum{
provider: cfg.EthProvider,
db: db,
unlockchan: make(chan int, 2),
rpcURL2Chain33: cfg.SyncTxConfig.Chain33Host,
maturityDegree: cfg.EthMaturityDegree,
fetchHeightPeriodMs: cfg.EthBlockFetchPeriod,
deployInfo: cfg.Deploy,
}
relayer.clientSpec = sim
relayer.clientChainID = big.NewInt(1)
deployPrivateKey, _ := crypto.ToECDSA(common.FromHex(relayer.deployInfo.DeployerPrivateKey))
deployerAddr := crypto.PubkeyToAddress(deployPrivateKey.PublicKey)
relayer.operatorInfo = &ethtxs.OperatorInfo{
PrivateKey: deployPrivateKey,
Address: deployerAddr,
}
_, err := relayer.DeployContrcts()
require.NoError(t, err)
}
func Test_SetBridgeRegistryAddr(t *testing.T) {
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
require.NoError(t, err)
ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
_ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr)
time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
_ = ethRelayer.setBridgeRegistryAddr(x2EthDeployInfo.BridgeRegistry.Address.String())
registrAddrInDB, err := ethRelayer.getBridgeRegistryAddr()
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()
require.NoError(t, err)
ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
_ = 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)
assert.Equal(t, balance, "10000000000")
tokenAddrbty, err := ethRelayer.CreateBridgeToken("BTY")
require.Nil(t, err)
require.NotEmpty(t, tokenAddrbty)
sim.Commit()
addr, err := ethRelayer.ShowTokenAddrBySymbol("BTY")
require.Nil(t, err)
assert.Equal(t, addr, tokenAddrbty)
decimals, err := ethRelayer.GetDecimals(tokenAddrbty)
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.BurnAsync(para.InitValidators[0].String(), tokenAddrbty, chain33AccountAddr, "10")
require.Error(t, err)
}
func testLockEth(t *testing.T) {
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
require.NoError(t, err)
ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
_ = 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)
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)
//lock 50 eth
chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
ethAmount := big.NewInt(50)
userOneAuth.Value = ethAmount
_, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, common.Address{}, ethAmount)
require.Nil(t, err)
sim.Commit()
bridgeBankBalance, err = sim.BalanceAt(ctx, x2EthDeployInfo.BridgeBank.Address, nil)
require.Nil(t, err)
assert.Equal(t, bridgeBankBalance.Int64(), ethAmount.Int64())
for i := 0; i < 11; i++ {
sim.Commit()
}
time.Sleep(time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
balance, err := ethRelayer.ShowLockStatics("")
require.Nil(t, err)
assert.Equal(t, balance, "50")
time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
}
func testCreateERC20Token(t *testing.T) {
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
require.NoError(t, err)
ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
_ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr)
time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
tokenErc20Addr, err := ethRelayer.CreateERC20Token("testcc")
require.Nil(t, err)
require.NotEmpty(t, tokenErc20Addr)
sim.Commit()
_, err = ethRelayer.MintERC20Token(tokenErc20Addr, para.Deployer.String(), "20000000000000")
require.Nil(t, err)
sim.Commit()
balance, err := ethRelayer.ShowDepositStatics(tokenErc20Addr)
require.Nil(t, err)
assert.Equal(t, balance, "20000000000000")
claimID := crypto.Keccak256Hash(big.NewInt(50).Bytes())
bret, err := ethRelayer.IsProphecyPending(claimID)
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)
sim.Commit()
_, err = ethRelayer.ShowTxReceipt(txhash)
require.Nil(t, err)
balance, err = ethRelayer.GetBalance(tokenErc20Addr, ethRelayer.deployInfo.ValidatorsAddr[0])
require.Nil(t, err)
assert.Equal(t, balance, "100")
balance, err = ethRelayer.GetBalance(tokenErc20Addr, para.Deployer.String())
require.Nil(t, err)
assert.Equal(t, balance, "19999999999900")
tx1 := ethRelayer.QueryTxhashRelay2Eth()
require.Empty(t, tx1)
tx2 := ethRelayer.QueryTxhashRelay2Chain33()
require.Empty(t, tx2)
tokenErc20Addrtestc, err := ethRelayer.CreateERC20Token("testc")
require.Nil(t, err)
require.NotEmpty(t, tokenErc20Addrtestc)
sim.Commit()
_, err = ethRelayer.MintERC20Token(tokenErc20Addrtestc, para.Deployer.String(), "10000000000000")
require.Nil(t, err)
sim.Commit()
balance, err = ethRelayer.ShowDepositStatics(tokenErc20Addrtestc)
require.Nil(t, err)
assert.Equal(t, balance, "10000000000000")
chain33Receiver := "14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
_, err = ethRelayer.LockEthErc20Asset(hexutil.Encode(crypto.FromECDSA(para.DeployPrivateKey)), tokenErc20Addrtestc, "100", chain33Receiver)
require.Nil(t, err)
sim.Commit()
balance, err = ethRelayer.GetBalance(tokenErc20Addrtestc, para.Deployer.String())
require.Nil(t, err)
assert.Equal(t, balance, "9999999999900")
_, err = ethRelayer.ApproveAllowance(hexutil.Encode(crypto.FromECDSA(para.DeployPrivateKey)), tokenErc20Addrtestc, "500")
require.Nil(t, err)
sim.Commit()
_, err = ethRelayer.LockEthErc20AssetAsync(hexutil.Encode(crypto.FromECDSA(para.DeployPrivateKey)), tokenErc20Addrtestc, "100", chain33Receiver)
require.Nil(t, err)
sim.Commit()
balance, err = ethRelayer.GetBalance(tokenErc20Addrtestc, para.Deployer.String())
require.Nil(t, err)
assert.Equal(t, balance, "9999999999800")
for i := 0; i < 11; i++ {
sim.Commit()
}
time.Sleep(time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
}
func testBurnBty(t *testing.T) {
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
require.NoError(t, err)
ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
_ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr)
time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
tokenAddrbty, err := ethRelayer.CreateBridgeToken("bty")
require.Nil(t, err)
require.NotEmpty(t, tokenAddrbty)
sim.Commit()
chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
amount := int64(100)
ethReceiver := para.InitValidators[2]
claimID := crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), big.NewInt(amount).Bytes())
authOracle, err := ethtxs.PrepareAuth(ethRelayer.clientSpec, para.ValidatorPriKey[0], para.InitValidators[0])
require.Nil(t, err)
signature, err := ethtxs.SignClaim4Eth(claimID, para.ValidatorPriKey[0])
require.Nil(t, err)
_, err = x2EthContracts.Oracle.NewOracleClaim(
authOracle,
events.ClaimTypeLock,
chain33Sender,
ethReceiver,
common.HexToAddress(tokenAddrbty),
"bty",
big.NewInt(amount),
claimID,
signature)
require.Nil(t, err)
sim.Commit()
balanceNew, err := ethRelayer.GetBalance(tokenAddrbty, ethReceiver.String())
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)
sim.Commit()
balanceNew, err = ethRelayer.GetBalance(tokenAddrbty, ethReceiver.String())
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)
sim.Commit()
_, err = ethRelayer.BurnAsync(hexutil.Encode(crypto.FromECDSA(para.ValidatorPriKey[2])), tokenAddrbty, chain33AccountAddr, "10")
require.NoError(t, err)
sim.Commit()
balanceNew, err = ethRelayer.GetBalance(tokenAddrbty, ethReceiver.String())
require.Nil(t, err)
require.Equal(t, balanceNew, "80")
fetchCnt := int32(10)
logs, err := ethRelayer.getNextValidEthTxEventLogs(ethRelayer.eventLogIndex.Height, ethRelayer.eventLogIndex.Index, fetchCnt)
require.NoError(t, err)
for _, vLog := range logs {
ethRelayer.procBridgeBankLogs(*vLog)
}
time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
}
func Test_RestorePrivateKeys(t *testing.T) {
para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
require.NoError(t, err)
ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
_ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr)
time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
go func() {
for range ethRelayer.unlockchan {
}
}()
ethRelayer.rwLock.RLock()
temp := ethRelayer.privateKey4Chain33
ethRelayer.rwLock.RUnlock()
err = ethRelayer.RestorePrivateKeys("123")
ethRelayer.rwLock.RLock()
assert.NotEqual(t, hex.EncodeToString(temp.Bytes()), hex.EncodeToString(ethRelayer.privateKey4Chain33.Bytes()))
ethRelayer.rwLock.RUnlock()
require.Nil(t, err)
err = ethRelayer.RestorePrivateKeys(passphrase)
ethRelayer.rwLock.RLock()
assert.Equal(t, hex.EncodeToString(temp.Bytes()), hex.EncodeToString(ethRelayer.privateKey4Chain33.Bytes()))
ethRelayer.rwLock.RUnlock()
require.Nil(t, err)
err = ethRelayer.StoreAccountWithNewPassphase("new123", passphrase)
require.Nil(t, err)
err = ethRelayer.RestorePrivateKeys("new123")
ethRelayer.rwLock.RLock()
assert.Equal(t, hex.EncodeToString(temp.Bytes()), hex.EncodeToString(ethRelayer.privateKey4Chain33.Bytes()))
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)
cfg.SyncTxConfig.Chain33Host = "http://127.0.0.1:8801"
cfg.BridgeRegistry = x2EthDeployInfo.BridgeRegistry.Address.String()
cfg.SyncTxConfig.PushBind = "127.0.0.1:60000"
cfg.SyncTxConfig.FetchHeightPeriodMs = 50
cfg.SyncTxConfig.Dbdriver = "memdb"
cfg.SyncTxConfig.DbPath = "datadirEth"
db := dbm.NewDB("relayer_db_service", cfg.SyncTxConfig.Dbdriver, cfg.SyncTxConfig.DbPath, cfg.SyncTxConfig.DbCache)
relayer := &Relayer4Ethereum{
provider: cfg.EthProvider,
db: db,
unlockchan: make(chan int, 2),
rpcURL2Chain33: cfg.SyncTxConfig.Chain33Host,
bridgeRegistryAddr: x2EthDeployInfo.BridgeRegistry.Address,
maturityDegree: cfg.EthMaturityDegree,
fetchHeightPeriodMs: cfg.EthBlockFetchPeriod,
//deployInfo: cfg.Deploy,
}
relayer.deployInfo = &ebTypes.Deploy{}
relayer.deployInfo.DeployerPrivateKey = hexutil.Encode(crypto.FromECDSA(para.DeployPrivateKey))
relayer.deployInfo.OperatorAddr = para.Operator.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())
}
relayer.eventLogIndex = relayer.getLastBridgeBankProcessedHeight()
relayer.initBridgeBankTx()
relayer.clientSpec = sim
relayer.clientChainID = big.NewInt(1)
deployPrivateKey, _ := crypto.ToECDSA(common.FromHex(relayer.deployInfo.DeployerPrivateKey))
deployerAddr := crypto.PubkeyToAddress(deployPrivateKey.PublicKey)
relayer.rwLock.Lock()
relayer.operatorInfo = &ethtxs.OperatorInfo{
PrivateKey: deployPrivateKey,
Address: deployerAddr,
}
relayer.deployPara = para
relayer.x2EthContracts = x2EthContracts
relayer.x2EthDeployInfo = x2EthDeployInfo
relayer.rwLock.Unlock()
go relayer.proc()
return relayer
}
func deployContracts() (*ethtxs.DeployPara, *ethinterface.SimExtend, *ethtxs.X2EthContracts, *ethtxs.X2EthDeployInfo) {
ethValidatorAddrKeys := make([]string, 0)
ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyA)
ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyB)
ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyC)
ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyD)
ctx := context.Background()
//var backend bind.ContractBackend
backend, para := setup.PrepareTestEnvironment(deployerPrivateKey, ethValidatorAddrKeys)
sim := new(ethinterface.SimExtend)
sim.SimulatedBackend = backend.(*backends.SimulatedBackend)
callMsg := ethereum.CallMsg{
From: para.Deployer,
Data: common.FromHex(generated.BridgeBankBin),
}
_, _ = sim.EstimateGas(ctx, callMsg)
x2EthContracts, x2EthDeployInfo, _ := ethtxs.DeployAndInit(sim, para)
sim.Commit()
return para, sim, x2EthContracts, x2EthDeployInfo
}
func initCfg(path string) *relayerTypes.RelayerConfig {
var cfg relayerTypes.RelayerConfig
if _, err := tml.DecodeFile(path, &cfg); err != nil {
//fmt.Println(err)
os.Exit(-1)
}
return &cfg
}
//
//import (
// "context"
// "encoding/hex"
// "flag"
// "fmt"
// "math/big"
// "os"
// "testing"
// "time"
//
// "github.com/33cn/chain33/client/mocks"
// dbm "github.com/33cn/chain33/common/db"
// _ "github.com/33cn/chain33/system"
// chain33Types "github.com/33cn/chain33/types"
// "github.com/33cn/chain33/util/testnode"
// "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/ethinterface"
// "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/ethtxs"
// "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/events"
// ebTypes "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/types"
// relayerTypes "github.com/33cn/plugin/plugin/dapp/x2ethereum/ebrelayer/types"
// tml "github.com/BurntSushi/toml"
// "github.com/ethereum/go-ethereum"
// "github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
// "github.com/ethereum/go-ethereum/common"
// "github.com/ethereum/go-ethereum/common/hexutil"
// "github.com/ethereum/go-ethereum/crypto"
// "github.com/stretchr/testify/assert"
// "github.com/stretchr/testify/mock"
// "github.com/stretchr/testify/require"
//)
//
//var (
// configPath = flag.String("f", "./../../relayer.toml", "configfile")
// chain33PrivateKeyStr = "0xd627968e445f2a41c92173225791bae1ba42126ae96c32f28f97ff8f226e5c68"
// chain33AccountAddr = "1GTxrmuWiXavhcvsaH5w9whgVxUrWsUMdV"
// passphrase = "123456hzj"
// chainTestCfg = chain33Types.NewChain33Config(chain33Types.GetDefaultCfgstring())
//
// // 0x8AFDADFC88a1087c9A1D6c0F5Dd04634b87F303a
// deployerPrivateKey = "8656d2bc732a8a816a461ba5e2d8aac7c7f85c26a813df30d5327210465eb230"
// // 0x92C8b16aFD6d423652559C6E266cBE1c29Bfd84f
// ethValidatorAddrKeyA = "3fa21584ae2e4fd74db9b58e2386f5481607dfa4d7ba0617aaa7858e5025dc1e"
// ethValidatorAddrKeyB = "a5f3063552f4483cfc20ac4f40f45b798791379862219de9e915c64722c1d400"
// ethValidatorAddrKeyC = "bbf5e65539e9af0eb0cfac30bad475111054b09c11d668fc0731d54ea777471e"
// ethValidatorAddrKeyD = "c9fa31d7984edf81b8ef3b40c761f1847f6fcd5711ab2462da97dc458f1f896b"
//)
//
//func Test_LockAndBurn(t *testing.T) {
// var tx chain33Types.Transaction
// var ret chain33Types.Reply
// ret.IsOk = true
//
// mockapi := &mocks.QueueProtocolAPI{}
// // 这里对需要mock的方法打桩,Close是必须的,其它方法根据需要
// mockapi.On("Close").Return()
// mockapi.On("AddPushSubscribe", mock.Anything).Return(&ret, nil)
// mockapi.On("CreateTransaction", mock.Anything).Return(&tx, nil)
// mockapi.On("SendTx", mock.Anything).Return(&ret, nil)
// mockapi.On("SendTransaction", mock.Anything).Return(&ret, nil)
// mockapi.On("GetConfig", mock.Anything).Return(chainTestCfg, nil)
//
// mock33 := testnode.New("", mockapi)
// defer mock33.Close()
// rpcCfg := mock33.GetCfg().RPC
// // 这里必须设置监听端口,默认的是无效值
// rpcCfg.JrpcBindAddr = "127.0.0.1:8801"
// mock33.GetRPC().Listen()
//
// fmt.Println("======================= testLockEth =======================")
// testLockEth(t)
// fmt.Println("======================= testCreateERC20Token =======================")
// testCreateERC20Token(t)
// fmt.Println("======================= testBurnBty =======================")
// testBurnBty(t)
//}
//
//func Test_GetValidatorAddr(t *testing.T) {
// para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
// require.NoError(t, err)
// ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
// _ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr)
// time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
//
// _, _, err = ethRelayer.NewAccount("123")
// require.Nil(t, err)
//
// privateKey, _, err := ethRelayer.GetAccount("123")
// require.Nil(t, err)
// assert.NotEqual(t, privateKey, chain33PrivateKeyStr)
//
// privateKey, addr, err := ethRelayer.GetAccount(passphrase)
// require.Nil(t, err)
// assert.Equal(t, privateKey, chain33PrivateKeyStr)
// assert.Equal(t, addr, chain33AccountAddr)
//
// validators, err := ethRelayer.GetValidatorAddr()
// require.Nil(t, err)
// assert.Equal(t, validators.Chain33Validator, chain33AccountAddr)
//}
//
//func Test_IsValidatorActive(t *testing.T) {
// para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
// require.NoError(t, err)
// ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
// _ = 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)
// require.Nil(t, err)
//
// is, err = ethRelayer.IsValidatorActive("0x0C05bA5c230fDaA503b53702aF1962e08D0C60BF")
// assert.Equal(t, is, false)
// require.Nil(t, err)
//
// _, err = ethRelayer.IsValidatorActive("123")
// require.Error(t, err)
//}
//
//func Test_ShowAddr(t *testing.T) {
// {
// cfg := initCfg(*configPath)
// relayer := &Relayer4Ethereum{
// provider: cfg.EthProvider,
// unlockchan: make(chan int, 2),
// rpcURL2Chain33: cfg.SyncTxConfig.Chain33Host,
// maturityDegree: cfg.EthMaturityDegree,
// fetchHeightPeriodMs: cfg.EthBlockFetchPeriod,
// }
// _, err := relayer.ShowBridgeBankAddr()
// require.Error(t, err)
//
// _, err = relayer.ShowBridgeRegistryAddr()
// require.Error(t, err)
// }
//
// para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
// require.NoError(t, err)
// ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
// _ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr)
// time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
//
// ethRelayer.prePareSubscribeEvent()
//
// addr, err := ethRelayer.ShowBridgeBankAddr()
// require.Nil(t, err)
// assert.Equal(t, addr, x2EthDeployInfo.BridgeBank.Address.String())
//
// addr, err = ethRelayer.ShowBridgeRegistryAddr()
// require.Nil(t, err)
// assert.Equal(t, addr, x2EthDeployInfo.BridgeRegistry.Address.String())
//
// addr, err = ethRelayer.ShowOperator()
// require.Nil(t, err)
// assert.Equal(t, addr, para.Operator.String())
//}
//
//func Test_DeployContrcts(t *testing.T) {
// _, sim, _, _ := deployContracts()
// cfg := initCfg(*configPath)
// cfg.SyncTxConfig.Dbdriver = "memdb"
//
// db := dbm.NewDB("relayer_db_service", cfg.SyncTxConfig.Dbdriver, cfg.SyncTxConfig.DbPath, cfg.SyncTxConfig.DbCache)
//
// relayer := &Relayer4Ethereum{
// provider: cfg.EthProvider,
// db: db,
// unlockchan: make(chan int, 2),
// rpcURL2Chain33: cfg.SyncTxConfig.Chain33Host,
// maturityDegree: cfg.EthMaturityDegree,
// fetchHeightPeriodMs: cfg.EthBlockFetchPeriod,
// deployInfo: cfg.Deploy,
// }
// relayer.clientSpec = sim
// relayer.clientChainID = big.NewInt(1)
//
// deployPrivateKey, _ := crypto.ToECDSA(common.FromHex(relayer.deployInfo.DeployerPrivateKey))
// deployerAddr := crypto.PubkeyToAddress(deployPrivateKey.PublicKey)
// relayer.operatorInfo = &ethtxs.OperatorInfo{
// PrivateKey: deployPrivateKey,
// Address: deployerAddr,
// }
//
// _, err := relayer.DeployContrcts()
// require.NoError(t, err)
//}
//
//func Test_SetBridgeRegistryAddr(t *testing.T) {
// para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
// require.NoError(t, err)
// ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
// _ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr)
// time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
//
// _ = ethRelayer.setBridgeRegistryAddr(x2EthDeployInfo.BridgeRegistry.Address.String())
// registrAddrInDB, err := ethRelayer.getBridgeRegistryAddr()
// 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()
// require.NoError(t, err)
// ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
// _ = 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)
// assert.Equal(t, balance, "10000000000")
//
// tokenAddrbty, err := ethRelayer.CreateBridgeToken("BTY")
// require.Nil(t, err)
// require.NotEmpty(t, tokenAddrbty)
// sim.Commit()
//
// addr, err := ethRelayer.ShowTokenAddrBySymbol("BTY")
// require.Nil(t, err)
// assert.Equal(t, addr, tokenAddrbty)
//
// decimals, err := ethRelayer.GetDecimals(tokenAddrbty)
// 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.BurnAsync(para.InitValidators[0].String(), tokenAddrbty, chain33AccountAddr, "10")
// require.Error(t, err)
//}
//
//func testLockEth(t *testing.T) {
// para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
// require.NoError(t, err)
// ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
// _ = 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)
// 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)
//
// //lock 50 eth
// chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
// ethAmount := big.NewInt(50)
// userOneAuth.Value = ethAmount
// _, err = x2EthContracts.BridgeBank.Lock(userOneAuth, chain33Sender, common.Address{}, ethAmount)
// require.Nil(t, err)
// sim.Commit()
//
// bridgeBankBalance, err = sim.BalanceAt(ctx, x2EthDeployInfo.BridgeBank.Address, nil)
// require.Nil(t, err)
// assert.Equal(t, bridgeBankBalance.Int64(), ethAmount.Int64())
//
// for i := 0; i < 11; i++ {
// sim.Commit()
// }
//
// time.Sleep(time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
//
// balance, err := ethRelayer.ShowLockStatics("")
// require.Nil(t, err)
// assert.Equal(t, balance, "50")
//
// time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
//}
//
//func testCreateERC20Token(t *testing.T) {
// para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
// require.NoError(t, err)
// ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
// _ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr)
// time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
//
// tokenErc20Addr, err := ethRelayer.CreateERC20Token("testcc")
// require.Nil(t, err)
// require.NotEmpty(t, tokenErc20Addr)
// sim.Commit()
//
// _, err = ethRelayer.MintERC20Token(tokenErc20Addr, para.Deployer.String(), "20000000000000")
// require.Nil(t, err)
// sim.Commit()
//
// balance, err := ethRelayer.ShowDepositStatics(tokenErc20Addr)
// require.Nil(t, err)
// assert.Equal(t, balance, "20000000000000")
//
// claimID := crypto.Keccak256Hash(big.NewInt(50).Bytes())
// bret, err := ethRelayer.IsProphecyPending(claimID)
// 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)
// sim.Commit()
//
// _, err = ethRelayer.ShowTxReceipt(txhash)
// require.Nil(t, err)
//
// balance, err = ethRelayer.GetBalance(tokenErc20Addr, ethRelayer.deployInfo.ValidatorsAddr[0])
// require.Nil(t, err)
// assert.Equal(t, balance, "100")
//
// balance, err = ethRelayer.GetBalance(tokenErc20Addr, para.Deployer.String())
// require.Nil(t, err)
// assert.Equal(t, balance, "19999999999900")
//
// tx1 := ethRelayer.QueryTxhashRelay2Eth()
// require.Empty(t, tx1)
//
// tx2 := ethRelayer.QueryTxhashRelay2Chain33()
// require.Empty(t, tx2)
//
// tokenErc20Addrtestc, err := ethRelayer.CreateERC20Token("testc")
// require.Nil(t, err)
// require.NotEmpty(t, tokenErc20Addrtestc)
// sim.Commit()
//
// _, err = ethRelayer.MintERC20Token(tokenErc20Addrtestc, para.Deployer.String(), "10000000000000")
// require.Nil(t, err)
// sim.Commit()
//
// balance, err = ethRelayer.ShowDepositStatics(tokenErc20Addrtestc)
// require.Nil(t, err)
// assert.Equal(t, balance, "10000000000000")
//
// chain33Receiver := "14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
// _, err = ethRelayer.LockEthErc20Asset(hexutil.Encode(crypto.FromECDSA(para.DeployPrivateKey)), tokenErc20Addrtestc, "100", chain33Receiver)
// require.Nil(t, err)
// sim.Commit()
//
// balance, err = ethRelayer.GetBalance(tokenErc20Addrtestc, para.Deployer.String())
// require.Nil(t, err)
// assert.Equal(t, balance, "9999999999900")
//
// _, err = ethRelayer.ApproveAllowance(hexutil.Encode(crypto.FromECDSA(para.DeployPrivateKey)), tokenErc20Addrtestc, "500")
// require.Nil(t, err)
// sim.Commit()
//
// _, err = ethRelayer.LockEthErc20AssetAsync(hexutil.Encode(crypto.FromECDSA(para.DeployPrivateKey)), tokenErc20Addrtestc, "100", chain33Receiver)
// require.Nil(t, err)
// sim.Commit()
//
// balance, err = ethRelayer.GetBalance(tokenErc20Addrtestc, para.Deployer.String())
// require.Nil(t, err)
// assert.Equal(t, balance, "9999999999800")
//
// for i := 0; i < 11; i++ {
// sim.Commit()
// }
// time.Sleep(time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
//}
//
//func testBurnBty(t *testing.T) {
// para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
// require.NoError(t, err)
// ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
// _ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr)
// time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
//
// tokenAddrbty, err := ethRelayer.CreateBridgeToken("bty")
// require.Nil(t, err)
// require.NotEmpty(t, tokenAddrbty)
// sim.Commit()
//
// chain33Sender := []byte("14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")
// amount := int64(100)
// ethReceiver := para.InitValidators[2]
// claimID := crypto.Keccak256Hash(chain33Sender, ethReceiver.Bytes(), big.NewInt(amount).Bytes())
// authOracle, err := ethtxs.PrepareAuth(ethRelayer.clientSpec, para.ValidatorPriKey[0], para.InitValidators[0])
// require.Nil(t, err)
// signature, err := ethtxs.SignClaim4Eth(claimID, para.ValidatorPriKey[0])
// require.Nil(t, err)
//
// _, err = x2EthContracts.Oracle.NewOracleClaim(
// authOracle,
// events.ClaimTypeLock,
// chain33Sender,
// ethReceiver,
// common.HexToAddress(tokenAddrbty),
// "bty",
// big.NewInt(amount),
// claimID,
// signature)
// require.Nil(t, err)
// sim.Commit()
//
// balanceNew, err := ethRelayer.GetBalance(tokenAddrbty, ethReceiver.String())
// 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)
// sim.Commit()
//
// balanceNew, err = ethRelayer.GetBalance(tokenAddrbty, ethReceiver.String())
// 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)
// sim.Commit()
//
// _, err = ethRelayer.BurnAsync(hexutil.Encode(crypto.FromECDSA(para.ValidatorPriKey[2])), tokenAddrbty, chain33AccountAddr, "10")
// require.NoError(t, err)
// sim.Commit()
//
// balanceNew, err = ethRelayer.GetBalance(tokenAddrbty, ethReceiver.String())
// require.Nil(t, err)
// require.Equal(t, balanceNew, "80")
//
// fetchCnt := int32(10)
// logs, err := ethRelayer.getNextValidEthTxEventLogs(ethRelayer.eventLogIndex.Height, ethRelayer.eventLogIndex.Index, fetchCnt)
// require.NoError(t, err)
//
// for _, vLog := range logs {
// ethRelayer.procBridgeBankLogs(*vLog)
// }
//
// time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
//}
//
//func Test_RestorePrivateKeys(t *testing.T) {
// para, sim, x2EthContracts, x2EthDeployInfo, err := setup.DeployContracts()
// require.NoError(t, err)
// ethRelayer := newEthRelayer(para, sim, x2EthContracts, x2EthDeployInfo)
// _ = ethRelayer.ImportChain33PrivateKey(passphrase, chain33PrivateKeyStr)
// time.Sleep(4 * time.Duration(ethRelayer.fetchHeightPeriodMs) * time.Millisecond)
//
// go func() {
// for range ethRelayer.unlockchan {
// }
// }()
// ethRelayer.rwLock.RLock()
// temp := ethRelayer.privateKey4Chain33
// ethRelayer.rwLock.RUnlock()
//
// err = ethRelayer.RestorePrivateKeys("123")
// ethRelayer.rwLock.RLock()
// assert.NotEqual(t, hex.EncodeToString(temp.Bytes()), hex.EncodeToString(ethRelayer.privateKey4Chain33.Bytes()))
// ethRelayer.rwLock.RUnlock()
// require.Nil(t, err)
//
// err = ethRelayer.RestorePrivateKeys(passphrase)
// ethRelayer.rwLock.RLock()
// assert.Equal(t, hex.EncodeToString(temp.Bytes()), hex.EncodeToString(ethRelayer.privateKey4Chain33.Bytes()))
// ethRelayer.rwLock.RUnlock()
// require.Nil(t, err)
//
// err = ethRelayer.StoreAccountWithNewPassphase("new123", passphrase)
// require.Nil(t, err)
//
// err = ethRelayer.RestorePrivateKeys("new123")
// ethRelayer.rwLock.RLock()
// assert.Equal(t, hex.EncodeToString(temp.Bytes()), hex.EncodeToString(ethRelayer.privateKey4Chain33.Bytes()))
// 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)
// cfg.SyncTxConfig.Chain33Host = "http://127.0.0.1:8801"
// cfg.BridgeRegistry = x2EthDeployInfo.BridgeRegistry.Address.String()
// cfg.SyncTxConfig.PushBind = "127.0.0.1:60000"
// cfg.SyncTxConfig.FetchHeightPeriodMs = 50
// cfg.SyncTxConfig.Dbdriver = "memdb"
// cfg.SyncTxConfig.DbPath = "datadirEth"
//
// db := dbm.NewDB("relayer_db_service", cfg.SyncTxConfig.Dbdriver, cfg.SyncTxConfig.DbPath, cfg.SyncTxConfig.DbCache)
//
// relayer := &Relayer4Ethereum{
// provider: cfg.EthProvider,
// db: db,
// unlockchan: make(chan int, 2),
// rpcURL2Chain33: cfg.SyncTxConfig.Chain33Host,
// bridgeRegistryAddr: x2EthDeployInfo.BridgeRegistry.Address,
// maturityDegree: cfg.EthMaturityDegree,
// fetchHeightPeriodMs: cfg.EthBlockFetchPeriod,
// //deployInfo: cfg.Deploy,
// }
//
// relayer.deployInfo = &ebTypes.Deploy{}
// relayer.deployInfo.DeployerPrivateKey = hexutil.Encode(crypto.FromECDSA(para.DeployPrivateKey))
// relayer.deployInfo.OperatorAddr = para.Operator.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())
// }
//
// relayer.eventLogIndex = relayer.getLastBridgeBankProcessedHeight()
// relayer.initBridgeBankTx()
// relayer.clientSpec = sim
// relayer.clientChainID = big.NewInt(1)
//
// deployPrivateKey, _ := crypto.ToECDSA(common.FromHex(relayer.deployInfo.DeployerPrivateKey))
// deployerAddr := crypto.PubkeyToAddress(deployPrivateKey.PublicKey)
// relayer.rwLock.Lock()
// relayer.operatorInfo = &ethtxs.OperatorInfo{
// PrivateKey: deployPrivateKey,
// Address: deployerAddr,
// }
// relayer.deployPara = para
// relayer.x2EthContracts = x2EthContracts
// relayer.x2EthDeployInfo = x2EthDeployInfo
// relayer.rwLock.Unlock()
//
// go relayer.proc()
// return relayer
//}
//
//func deployContracts() (*ethtxs.DeployPara, *ethinterface.SimExtend, *ethtxs.X2EthContracts, *ethtxs.X2EthDeployInfo) {
// ethValidatorAddrKeys := make([]string, 0)
// ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyA)
// ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyB)
// ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyC)
// ethValidatorAddrKeys = append(ethValidatorAddrKeys, ethValidatorAddrKeyD)
//
// ctx := context.Background()
// //var backend bind.ContractBackend
// backend, para := setup.PrepareTestEnvironment(deployerPrivateKey, ethValidatorAddrKeys)
// sim := new(ethinterface.SimExtend)
// sim.SimulatedBackend = backend.(*backends.SimulatedBackend)
//
// callMsg := ethereum.CallMsg{
// From: para.Deployer,
// Data: common.FromHex(generated.BridgeBankBin),
// }
//
// _, _ = sim.EstimateGas(ctx, callMsg)
// x2EthContracts, x2EthDeployInfo, _ := ethtxs.DeployAndInit(sim, para)
// sim.Commit()
//
// return para, sim, x2EthContracts, x2EthDeployInfo
//}
//
//func initCfg(path string) *relayerTypes.RelayerConfig {
// var cfg relayerTypes.RelayerConfig
// if _, err := tml.DecodeFile(path, &cfg); err != nil {
// //fmt.Println(err)
// os.Exit(-1)
// }
// return &cfg
//}
......@@ -159,12 +159,11 @@ func (a *action) procChain33ToEth_lock(msgLock *x2eTy.Chain33ToEth) (*types.Rece
var accDB *account.DB
exec, symbol, _ := x2eTy.DivideDot(msgLock.IssuerDotSymbol)
cfg := a.api.GetConfig()
if exec == cfg.GetCoinExec() {
accDB = account.NewCoinsAccount(cfg)
if exec == "coins" {
accDB = account.NewCoinsAccount(a.api.GetConfig())
accDB.SetDB(a.db)
} 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 {
return nil, errors.Wrap(err, "newAccountDB")
}
......@@ -234,12 +233,11 @@ func (a *action) procEth2Chain33_burn(withdrawEth *x2eTy.Eth2Chain33) (*types.Re
var accDB *account.DB
exec, symbol, _ := x2eTy.DivideDot(withdrawEth.IssuerDotSymbol)
cfg := a.api.GetConfig()
if exec == cfg.GetCoinExec() {
accDB = account.NewCoinsAccount(cfg)
if exec == "coins" {
accDB = account.NewCoinsAccount(a.api.GetConfig())
accDB.SetDB(a.db)
} 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 {
return nil, errors.Wrap(err, "newAccountDB")
}
......
......@@ -6,11 +6,10 @@ package types
import (
context "context"
fmt "fmt"
math "math"
types "github.com/33cn/chain33/types"
proto "github.com/golang/protobuf/proto"
grpc "google.golang.org/grpc"
math "math"
)
// 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