From 89899841af25ca084001711f04c0326a4e71a696 Mon Sep 17 00:00:00 2001 From: Jaz Gulati Date: Mon, 28 Sep 2020 13:29:53 +1000 Subject: [PATCH 01/19] cmd/lightnode: add support for terra --- cmd/lightnode/lightnode.go | 6 ++++ go.mod | 6 ++-- go.sum | 56 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 3 deletions(-) diff --git a/cmd/lightnode/lightnode.go b/cmd/lightnode/lightnode.go index 40e1ffd4..e69c0317 100644 --- a/cmd/lightnode/lightnode.go +++ b/cmd/lightnode/lightnode.go @@ -177,6 +177,12 @@ func parseOptions() lightnode.Options { }, } } + if os.Getenv("RPC_TERRA") != "" { + chains[multichain.Terra] = txenginebindings.ChainOptions{ + RPC: pack.String(os.Getenv("RPC_TERRA")), + Confirmations: pack.U64(parseInt(os.Getenv("CONFIRMATIONS_TERRA"))), + } + } if os.Getenv("RPC_ZCASH") != "" { chains[multichain.Zcash] = txenginebindings.ChainOptions{ RPC: pack.String(os.Getenv("RPC_ZCASH")), diff --git a/go.mod b/go.mod index 946b4614..296d9134 100644 --- a/go.mod +++ b/go.mod @@ -27,11 +27,11 @@ require ( github.com/pierrec/xxHash v0.1.5 // indirect github.com/prometheus/tsdb v0.10.0 // indirect github.com/renproject/aw v0.4.0-9 - github.com/renproject/darknode v0.5.3-0.20200918070337-74df8570503e + github.com/renproject/darknode v0.5.3-0.20200927234247-ff2e27c43fbc github.com/renproject/id v0.4.2 github.com/renproject/kv v1.1.2 - github.com/renproject/multichain v0.2.8-0.20200916021910-91ea4fc0ab1a - github.com/renproject/pack v0.2.3 + github.com/renproject/multichain v0.2.8-0.20200925032440-5124db1cabf0 + github.com/renproject/pack v0.2.5 github.com/renproject/phi v0.1.0 github.com/rjeczalik/notify v0.9.2 // indirect github.com/sirupsen/logrus v1.6.0 diff --git a/go.sum b/go.sum index d1ced675..2d0668b3 100644 --- a/go.sum +++ b/go.sum @@ -31,7 +31,9 @@ dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBr 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= git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= +github.com/99designs/keyring v1.1.3 h1:mEV3iyZWjkxQ7R8ia8GcG97vCX5zQQ7n4o8R2BylwQY= github.com/99designs/keyring v1.1.3/go.mod h1:657DQuMrBZRtuL/voxVyiyb6zpMehlm5vLB9Qwrv904= github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9 h1:HD8gA2tkByhMAwYaFAX9w2l7vxvBQ5NMoxDrkhqhtn4= @@ -54,6 +56,7 @@ github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbt 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/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= @@ -112,6 +115,7 @@ github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpi github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.32.11/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/bartekn/go-bip39 v0.0.0-20171116152956-a05967ea095d h1:1aAija9gr0Hyv4KfQcRcwlmFIrhkDmIj2dz5bkg/s/8= github.com/bartekn/go-bip39 v0.0.0-20171116152956-a05967ea095d/go.mod h1:icNx/6QdFblhsEjZehARqbNumymUT/ydwlLojFdv7Sk= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= github.com/benbjohnson/clock v1.0.1/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= @@ -119,7 +123,9 @@ github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiU 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 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/briandowns/spinner v1.11.1/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX3FScO+3/ZPQ= @@ -192,9 +198,12 @@ github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+ github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/cosmos-sdk v0.37.14/go.mod h1:qKU3AzVJ0GGWARqImZj24CIX35Q4nJEE+WrXVU/CzFo= +github.com/cosmos/cosmos-sdk v0.39.1 h1:vhjf9PZh9ph8btAj9aBpHoVITgVVjNBpM3x5Gl/Vwac= github.com/cosmos/cosmos-sdk v0.39.1/go.mod h1:ry2ROl5n+f2/QXpKJo3rdWNJwll00z7KhIVcxNcl16M= github.com/cosmos/go-bip39 v0.0.0-20180618194314-52158e4697b8/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= +github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d h1:49RLWk1j44Xu4fjHb6JFYmeUnDORVwHNkDxaQ0ctCVU= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= +github.com/cosmos/ledger-go v0.9.2 h1:Nnao/dLwaVTk1Q5U9THldpUMMXU94BOTWPddSmVB6pI= github.com/cosmos/ledger-go v0.9.2/go.mod h1:oZJ2hHAZROdlHiwTg4t7kP+GKIIkBT+o6c9QWFanOyI= github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= @@ -207,6 +216,7 @@ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7Do github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= github.com/daaku/go.zipexe v1.0.0 h1:VSOgZtH418pH9L16hC/JrgSNJbbAL26pj7lmD1+CGdY= github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E= +github.com/danieljoos/wincred v1.0.2 h1:zf4bhty2iLuwgjgpraD2E9UbvO+fe54XXGJbOwe23fU= github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= github.com/dave/jennifer v1.4.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -253,6 +263,7 @@ github.com/drand/kyber-bls12381 v0.1.0/go.mod h1:N1emiHpm+jj7kMlxEbu3MUyOiooTgNy github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 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/dvsekhvalnov/jose2go v0.0.0-20180829124132-7f401d37b68a h1:mq+R6XEM6lJX5VlLyZIrUSP8tSuJp82xTK89hvBwJbU= github.com/dvsekhvalnov/jose2go v0.0.0-20180829124132-7f401d37b68a/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= @@ -444,6 +455,7 @@ github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LB 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/godbus/dbus v0.0.0-20190402143921-271e53dc4968/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= @@ -499,6 +511,7 @@ github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/golang/snappy v0.0.2-0.20200707131729-196ae77b8a26 h1:lMm2hD9Fy0ynom5+85/pbdkiYcBqM1JWmhpAXLmy0fw= github.com/golang/snappy v0.0.2-0.20200707131729-196ae77b8a26/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 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 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= @@ -557,9 +570,12 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= +github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is= github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= +github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc= github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o= github.com/gxed/go-shellwords v1.0.3/go.mod h1:N7paucT91ByIjmVJHhvoarjoQnmsi3Jd3vH7VqgtMxQ= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= @@ -593,6 +609,7 @@ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= 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/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= 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= @@ -610,6 +627,7 @@ github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo= github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/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/influxdb v1.2.3-0.20180221223340-01288bdb0883/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= @@ -800,6 +818,7 @@ github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M 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/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= @@ -1130,6 +1149,7 @@ github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/A github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= 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= @@ -1165,6 +1185,7 @@ github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m github.com/mattn/go-sqlite3 v1.11.0 h1:LDdKkqtYlom37fkvqs8rMPFKAMe8+SgjbwZ6ex1/A/Q= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-xmlrpc v0.0.3/go.mod h1:mqc2dz7tP5x5BKlCahN/n+hs7OSZKJkS9JsHNBRlrxA= +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/mdlayher/genetlink v1.0.0/go.mod h1:0rJ0h4itni50A86M2kHcgS85ttZazNt7a8H2a2cw0Gc= github.com/mdlayher/netlink v0.0.0-20190409211403-11939a169225/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA= @@ -1180,6 +1201,7 @@ github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3N github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.30/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643 h1:hLDRPB66XQT/8+wG9WsDpiCvZf1yKO7sz7scAjSlBa0= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= @@ -1198,6 +1220,7 @@ github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eI 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 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -1340,6 +1363,7 @@ github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7ir 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/pelletier/go-toml v1.6.0 h1:aetoXYr0Tv7xRU/V4B4IZJ2QcbtMUFoNb3ORp7TzIK4= github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM= @@ -1372,12 +1396,14 @@ github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.6.0 h1:YVPodQOcK15POxhgARIvnDRVpLcuK8mglnMrWfyrw6A= github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/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/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181020173914-7e9e6cabbd39/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= @@ -1389,6 +1415,7 @@ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289/go.mod h1:FGbBv5OPKjch+jNUJmEQpMZytIdyW0NdBtWFcfSKusc= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -1415,6 +1442,7 @@ github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmO github.com/rcrowley/go-metrics v0.0.0-20180503174638-e2704e165165/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ= github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/renproject/aw v0.4.0-9 h1:O3rFYg4arz+kuu+qqn/+FYtWDhsstD/R8/+RkOTrOCE= github.com/renproject/aw v0.4.0-9/go.mod h1:iuELPkEjsWV9dSyZ9TE5SKsTr+jv2I9naHDhsodH3Z0= @@ -1430,6 +1458,8 @@ github.com/renproject/darknode v0.5.3-0.20200916071445-d196542ac590 h1:bhFHd7w8/ github.com/renproject/darknode v0.5.3-0.20200916071445-d196542ac590/go.mod h1:hYLUa+/gfCw08S9ejEI11gdYm3rGfRPbZgtMLiNsIB4= github.com/renproject/darknode v0.5.3-0.20200918070337-74df8570503e h1:gr8Jb+sEco/beMbRcXI5INR+r3S8jen1noBr9yaiETI= github.com/renproject/darknode v0.5.3-0.20200918070337-74df8570503e/go.mod h1:hYLUa+/gfCw08S9ejEI11gdYm3rGfRPbZgtMLiNsIB4= +github.com/renproject/darknode v0.5.3-0.20200927234247-ff2e27c43fbc h1:91VRUNd0zq/93irZM6i1iP2vCrAvRcIiNXO/bjT4Xqg= +github.com/renproject/darknode v0.5.3-0.20200927234247-ff2e27c43fbc/go.mod h1:DTLjwMuBjChmkr+hVDtdiLVYFtucdXYiDylSMkFuHVo= github.com/renproject/id v0.4.2 h1:XseNDPPCJtsZjIWR7Qgf+zxy0Gt5xsLrfwpQxJt5wFQ= github.com/renproject/id v0.4.2/go.mod h1:bCzV4zZkyWetf0GvhJxMT9HQNnGUwzQpImtXOUXqq0k= github.com/renproject/kv v1.1.2 h1:P18yHdDVJTEZ9yeyx6o82ICY1m6f+VdtAt/ouZez+AU= @@ -1440,8 +1470,12 @@ github.com/renproject/multichain v0.2.7 h1:KGb3Vm7oLG6CJK86MCylLQJDZiLeypLARI8vN github.com/renproject/multichain v0.2.7/go.mod h1:GDD+GLeclWKKBDEVT/KjGoTM8GmCf3+Ab+usPzfOUN8= github.com/renproject/multichain v0.2.8-0.20200916021910-91ea4fc0ab1a h1:SAo7cLS6gPa8ZLlfSpVFrtZ9TCdOhz4jYfD400DeDew= github.com/renproject/multichain v0.2.8-0.20200916021910-91ea4fc0ab1a/go.mod h1:02TvuvQY4UTlrJs0cItz18Gsk6zPuZM74GbnrhxDgJM= +github.com/renproject/multichain v0.2.8-0.20200925032440-5124db1cabf0 h1:HuCMJZnnn8rBtspXlgIDEVieWWxkaGLmetPY5/1Ed9U= +github.com/renproject/multichain v0.2.8-0.20200925032440-5124db1cabf0/go.mod h1:f/8MRfLbDqZUw/dDi3WS5+1xqUjYrgXCocajm9pY10g= github.com/renproject/pack v0.2.3 h1:6zHFyz45ow52iLNLG19eyA/UphJE8b2LsYEcLC3HqQQ= github.com/renproject/pack v0.2.3/go.mod h1:pzX3Hc04RoPft89LaZJVp0xgngVGi90V7GvyC3mOGg4= +github.com/renproject/pack v0.2.5 h1:BNfam8PCb5qJuIX36IqOkcRgaZLOZsM1lZZSakbOxb4= +github.com/renproject/pack v0.2.5/go.mod h1:pzX3Hc04RoPft89LaZJVp0xgngVGi90V7GvyC3mOGg4= github.com/renproject/phi v0.1.0 h1:ZOn7QeDribk/uV46OhQWcTLxyuLg7P+xR1Hfl5cOQuI= github.com/renproject/phi v0.1.0/go.mod h1:Hrxx2ONVpfByficRjyRd1trecalYr0lo7Z0akx8UXqg= github.com/renproject/surge v1.2.2/go.mod h1:jNVsKCM3/2PAllkc2cx7g2saG9NrHRX5x20I/TDMXOs= @@ -1527,22 +1561,28 @@ github.com/spaolacci/murmur3 v1.0.1-0.20190317074736-539464a789e9/go.mod h1:JwIa github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.1 h1:qgMbHoJbPbw579P+1zVY+6n4nIFuIchaIjzZ/I/Yq8M= github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.1/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.0.0/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.5.0/go.mod h1:AkYRkVJF8TkSG/xet6PzXX+l39KhhXa2pdqVSxnTcn4= github.com/spf13/viper v1.6.1/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= +github.com/spf13/viper v1.6.3 h1:pDDu1OyEDTKzpJwdq4TiuLyMsUgRa/BT5cn5O62NoHs= github.com/spf13/viper v1.6.3/go.mod h1:jUMtyi0/lB5yZH/FjyGAoH7IMNrIhlBf6pXZmbMDvzw= github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= @@ -1569,6 +1609,7 @@ github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stumble/gorocksdb v0.0.3/go.mod h1:v6IHdFBXk5DJ1K4FZ0xi+eY737quiiBxYtSWXadLybY= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/supranational/blst v0.1.1/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= @@ -1576,28 +1617,38 @@ github.com/syndtr/goleveldb v1.0.1-0.20190318030020-c3a204f8e965/go.mod h1:9OrXJ 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/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= +github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= github.com/templexxx/cpufeat v0.0.0-20180724012125-cef66df7f161/go.mod h1:wM7WEvslTq+iOEAMDLSzhVuOt5BRZ05WirO+b09GHQU= github.com/templexxx/xor v0.0.0-20191217153810-f85b25db303b/go.mod h1:5XA7W9S6mni3h5uvOC75dA3m9CCCaS83lltmc0ukdi4= +github.com/tendermint/btcd v0.1.1 h1:0VcxPfflS2zZ3RiOAHkBiFUcPvbtRj5O7zHmcJWHV7s= github.com/tendermint/btcd v0.1.1/go.mod h1:DC6/m53jtQzr/NFmMNEu0rxf18/ktVoVtMrnDD5pN+U= github.com/tendermint/crypto v0.0.0-20180820045704-3764759f34a5/go.mod h1:z4YtwM70uOnk8h0pjJYlj3zdYwi9l03By6iAIF5j/Pk= +github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 h1:hqAk8riJvK4RMWx1aInLzndwxKalgi5rTqgfXxOxbEI= github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15/go.mod h1:z4YtwM70uOnk8h0pjJYlj3zdYwi9l03By6iAIF5j/Pk= github.com/tendermint/go-amino v0.14.1/go.mod h1:i/UKE5Uocn+argJJBb12qTZsCDBcAYMbR92AaJVmKso= github.com/tendermint/go-amino v0.15.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= +github.com/tendermint/go-amino v0.15.1 h1:D2uk35eT4iTsvJd9jWIetzthE5C0/k2QmMFkCN+4JgQ= github.com/tendermint/go-amino v0.15.1/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= github.com/tendermint/iavl v0.12.4/go.mod h1:8LHakzt8/0G3/I8FUU0ReNx98S/EP6eyPJkAUvEXT/o= +github.com/tendermint/iavl v0.14.0 h1:Jkff+IFrXxRWtH9Jn/ga/2cxNnzMTv58xEKgCJsKUBg= github.com/tendermint/iavl v0.14.0/go.mod h1:QmfViflFiXzxKLQE4tAUuWQHq+RSuQFxablW5oJZ6sE= github.com/tendermint/tendermint v0.32.1/go.mod h1:jmPDAKuNkev9793/ivn/fTBnfpA9mGBww8MPRNPNxnU= github.com/tendermint/tendermint v0.32.13/go.mod h1:5/B1XZjNYtVBso8o1l/Eg4A0Mhu42lDcmftoQl95j/E= github.com/tendermint/tendermint v0.33.5/go.mod h1:0yUs9eIuuDq07nQql9BmI30FtYGcEC60Tu5JzB5IezM= github.com/tendermint/tendermint v0.33.7/go.mod h1:0yUs9eIuuDq07nQql9BmI30FtYGcEC60Tu5JzB5IezM= +github.com/tendermint/tendermint v0.33.8 h1:Xxu4QhpqcomSE0iQDw1MqLgfsa8fqtPtWFJK6zZOVso= github.com/tendermint/tendermint v0.33.8/go.mod h1:0yUs9eIuuDq07nQql9BmI30FtYGcEC60Tu5JzB5IezM= github.com/tendermint/tm-db v0.1.1/go.mod h1:0cPKWu2Mou3IlxecH+MEUSYc1Ch537alLe6CpFrKzgw= github.com/tendermint/tm-db v0.2.0/go.mod h1:0cPKWu2Mou3IlxecH+MEUSYc1Ch537alLe6CpFrKzgw= +github.com/tendermint/tm-db v0.5.1 h1:H9HDq8UEA7Eeg13kdYckkgwwkQLBnJGgX4PgLJRhieY= github.com/tendermint/tm-db v0.5.1/go.mod h1:g92zWjHpCYlEvQXvy9M168Su8V1IBEeawpXVVBaK4f4= github.com/terra-project/core v0.3.7/go.mod h1:YAzVMRCDjmgFlAgLF3h1CAHZjtWuK4CmmsjWkqSg5s0= +github.com/terra-project/core v0.4.0-rc.4 h1:6ZK9KyUCRWw5kQmcBmTbKy6RZ8UU2ew9T3NrlH4jS1U= github.com/terra-project/core v0.4.0-rc.4/go.mod h1:QoddSVukyuI5qM0rFp7xvKjTn/aoK3D177MUt1V7YXM= +github.com/terra-project/go-cosmwasm v0.10.1-terra h1:3yvESyqndOoJKmmFyGKfQy7rLg2Gz4ULwwoCi4fDqAw= github.com/terra-project/go-cosmwasm v0.10.1-terra/go.mod h1:gAFCwllx97ejI+m9SqJQrmd2SBW7HA0fOjvWWJjM2uc= +github.com/terra-project/ledger-terra-go v0.11.1-terra h1:BnwRp8dyJMN5sROg8g6dXc5/Zoi44gd5c8Llf0Nobac= github.com/terra-project/ledger-terra-go v0.11.1-terra/go.mod h1:5fdyEuDNvsymbqag/EaaAeWAgyAebQe2VH38H+DnXnA= github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g= github.com/tjfoc/gmsm v1.3.0/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w= @@ -1683,6 +1734,7 @@ github.com/xtaci/kcp-go v5.4.20+incompatible/go.mod h1:bN6vIwHQbfHaHtFpEssmWsN45 github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae/go.mod h1:gXtu8J62kEgmN++bm9BVICuT/e8yiLI2KFobd/TRFsE= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/zondax/hid v0.9.0 h1:eiT3P6vNxAEVxXMw66eZUAAnU2zD33JBkfG/EnfAKl8= github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw= go.dedis.ch/kyber/v3 v3.0.4/go.mod h1:OzvaEnPvKlyrWyp3kGXlFdp7ap1VC6RkZDTaPikqhsQ= @@ -1692,6 +1744,7 @@ go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= @@ -2078,6 +2131,7 @@ google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200608115520-7c474a2e3482 h1:i+Aiej6cta/Frzp13/swvwz5O00kYcSe0A/C5Wd7zX8= google.golang.org/genproto v0.0.0-20200608115520-7c474a2e3482/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.13.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -2100,6 +2154,7 @@ google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8 google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.28.1/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc/cmd/protoc-gen-go-grpc v0.0.0-20200617041141-9a465503579e/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -2128,6 +2183,7 @@ gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= From abf21ff9b14ac1bac6a9fde1f97714a26e4e3c30 Mon Sep 17 00:00:00 2001 From: Jaz Gulati Date: Tue, 29 Sep 2020 10:21:03 +1000 Subject: [PATCH 02/19] testutils: fix mock bindings --- testutils/blockchain.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testutils/blockchain.go b/testutils/blockchain.go index 49a9ef27..b2d1d4c8 100644 --- a/testutils/blockchain.go +++ b/testutils/blockchain.go @@ -51,7 +51,7 @@ func (b mockBindings) AccountLockInfo(ctx context.Context, chain multichain.Chai panic("unimplemented") } -func (b mockBindings) AccountBuildTx(chain multichain.Chain, asset multichain.Asset, from, to multichain.Address, value, nonce, gasLimit, gasPrice pack.U256, payload pack.Bytes) (multichain.AccountTx, error) { +func (b mockBindings) AccountBuildTx(ctx context.Context, chain multichain.Chain, asset multichain.Asset, from, to multichain.Address, value, nonce, gasLimit, gasPrice pack.U256, payload pack.Bytes) (multichain.AccountTx, error) { panic("unimplemented") } From 672d96dc76c2d2686320bf555e18d427f3729017 Mon Sep 17 00:00:00 2001 From: Jaz Gulati Date: Tue, 29 Sep 2020 10:53:03 +1000 Subject: [PATCH 03/19] update changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad47063b..c9a12531 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.2.1 +- Integrate Terra + +## 0.2.0 +- Darknode v0.3.0 compatibility + ## 0.1.12 - Update transaction if Darknodes return a "done" status - Increase default unconfirmed transaction expiry to 14 days From 788d97f51f395f7895b5e90e464da57d0c705a59 Mon Sep 17 00:00:00 2001 From: Jaz Gulati Date: Thu, 1 Oct 2020 15:57:14 +1000 Subject: [PATCH 04/19] lightnode, db, watcher, confirmer: simplify inputs --- confirmer/confirmer.go | 29 +- db/db.go | 663 ++++++----------------------------------- go.mod | 5 +- go.sum | 4 + lightnode.go | 2 +- watcher/watcher.go | 65 ++-- 6 files changed, 149 insertions(+), 619 deletions(-) diff --git a/confirmer/confirmer.go b/confirmer/confirmer.go index 248afe8e..9e078a5c 100644 --- a/confirmer/confirmer.go +++ b/confirmer/confirmer.go @@ -14,6 +14,7 @@ import ( "github.com/renproject/darknode/txengine" "github.com/renproject/lightnode/db" "github.com/renproject/lightnode/http" + "github.com/renproject/multichain" "github.com/renproject/pack" "github.com/renproject/phi" ) @@ -87,9 +88,10 @@ func (confirmer *Confirmer) checkPendingTxs(parent context.Context) { phi.ParForAll(txs, func(i int) { tx := txs[i] var confirmed bool - if tx.Selector.IsLockAndMint() { + switch { + case tx.Selector.IsLock() && tx.Selector.IsMint(): confirmed = confirmer.lockTxConfirmed(ctx, tx) - } else { + case tx.Selector.IsBurn() && tx.Selector.IsRelease(): confirmed = confirmer.burnTxConfirmed(ctx, tx) } @@ -136,25 +138,24 @@ func (confirmer *Confirmer) confirm(ctx context.Context, transaction tx.Tx) { // lockTxConfirmed checks if a given lock transaction has received sufficient // confirmations. func (confirmer *Confirmer) lockTxConfirmed(ctx context.Context, transaction tx.Tx) bool { - lockChain, ok := transaction.Selector.LockChain() - if !ok { - confirmer.options.Logger.Errorf("[confirmer] cannot get lock chain for tx=%v (%v)", transaction.Hash.String(), transaction.Selector.String()) - return false - } + lockChain := transaction.Selector.Source() switch { case lockChain.IsUTXOBased(): - input := txengine.InputLockOnUTXOAndMintOnAccount{} + input := txengine.Input{} if err := pack.Decode(&input, transaction.Input); err != nil { confirmer.options.Logger.Errorf("[confirmer] failed to decode input for tx=%v: %v", transaction.Hash.String(), err) return false } - _, err := confirmer.bindings.UTXOLockInfo(ctx, lockChain, transaction.Selector.Asset(), input.Output.Outpoint) + _, err := confirmer.bindings.UTXOLockInfo(ctx, lockChain, transaction.Selector.Asset(), multichain.UTXOutpoint{ + Hash: input.Txid, + Index: input.Txindex, + }) if err != nil { - confirmer.options.Logger.Errorf("[confirmer] cannot get output for utxo tx=%v (%v): %v", input.Output.Outpoint.Hash.String(), transaction.Selector.String(), err) + confirmer.options.Logger.Errorf("[confirmer] cannot get output for utxo tx=%v (%v): %v", input.Txid.String(), transaction.Selector.String(), err) return false } case lockChain.IsAccountBased(): - input := txengine.InputLockOnAccountAndMintOnAccount{} + input := txengine.Input{} if err := pack.Decode(&input, transaction.Input); err != nil { confirmer.options.Logger.Errorf("[confirmer] failed to decode input for tx=%v: %v", transaction.Hash.String(), err) return false @@ -173,11 +174,7 @@ func (confirmer *Confirmer) lockTxConfirmed(ctx context.Context, transaction tx. // burnTxConfirmed checks if a given burn transaction has received sufficient // confirmations. func (confirmer *Confirmer) burnTxConfirmed(ctx context.Context, transaction tx.Tx) bool { - burnChain, ok := transaction.Selector.BurnChain() - if !ok { - confirmer.options.Logger.Errorf("[confirmer] cannot get burn chain for tx=%v (%v)", transaction.Hash.String(), transaction.Selector.String()) - return false - } + burnChain := transaction.Selector.Source() nonce, ok := transaction.Input.Get("nonce").(pack.Bytes32) if !ok { confirmer.options.Logger.Errorf("[confirmer] failed to get nonce for tx=%v", transaction.Hash.String()) diff --git a/db/db.go b/db/db.go index 1fdbc4aa..950c0032 100644 --- a/db/db.go +++ b/db/db.go @@ -9,11 +9,10 @@ import ( "github.com/renproject/darknode/tx" "github.com/renproject/darknode/txengine" - "github.com/renproject/multichain/api/utxo" "github.com/renproject/pack" ) -type TxStatus tx.Status +type TxStatus uint8 const ( TxStatusNil TxStatus = iota @@ -71,19 +70,17 @@ func New(db *sql.DB) DB { } // Init creates the tables for storing transactions if they do not already -// exist. The tables will only be created the first time this funciton is called +// exist. The tables will only be created the first time this function is called // and any future calls will not return an error. func (db database) Init() error { - // Create the lock-and-mint (UTXO -> account) table if it does not exist. - lockUTXOMintAccount := `CREATE TABLE IF NOT EXISTS lock_utxo_mint_account ( + script := `CREATE TABLE IF NOT EXISTS txs ( hash VARCHAR NOT NULL PRIMARY KEY, status SMALLINT, created_time BIGINT, selector VARCHAR(255), - utxo_hash VARCHAR, - utxo_index BIGINT, - utxo_value VARCHAR(100), - utxo_pubkey_script VARCHAR, + txid VARCHAR, + txindex INTEGER, + amount VARCHAR(100), payload VARCHAR, phash VARCHAR, to_address VARCHAR, @@ -92,300 +89,23 @@ func (db database) Init() error { gpubkey VARCHAR, ghash VARCHAR );` - _, err := db.db.Exec(lockUTXOMintAccount) - if err != nil { - return err - } - - // Create the lock-and-mint (account -> account) table if it does not exist. - lockAccountMintAccount := `CREATE TABLE IF NOT EXISTS lock_account_mint_account ( - hash VARCHAR NOT NULL PRIMARY KEY, - status SMALLINT, - created_time BIGINT, - selector VARCHAR(255), - tx_id VARCHAR, - amount VARCHAR(100), - payload VARCHAR, - phash VARCHAR, - to_address VARCHAR, - nonce VARCHAR, - nhash VARCHAR, - gpubkey VARCHAR - );` - _, err = db.db.Exec(lockAccountMintAccount) - if err != nil { - return err - } - - // Create the burn-and-release (account -> UTXO) table if not exist. - burnAccountReleaseUTXO := `CREATE TABLE IF NOT EXISTS burn_account_release_utxo ( - hash VARCHAR NOT NULL PRIMARY KEY, - status SMALLINT, - created_time BIGINT, - selector VARCHAR(255), - amount VARCHAR(100), - to_address VARCHAR, - nonce VARCHAR - );` - _, err = db.db.Exec(burnAccountReleaseUTXO) - if err != nil { - return err - } - - // Create the burn-and-release (account -> account) table if not exist. - burnAccountReleaseAccount := `CREATE TABLE IF NOT EXISTS burn_account_release_account ( - hash VARCHAR NOT NULL PRIMARY KEY, - status SMALLINT, - created_time BIGINT, - selector VARCHAR(255), - amount VARCHAR(100), - to_address VARCHAR, - nonce VARCHAR - );` - _, err = db.db.Exec(burnAccountReleaseAccount) + _, err := db.db.Exec(script) return err } // InsertTx implements the DB interface. func (db database) InsertTx(tx tx.Tx) error { - switch { - case tx.Selector.IsLockAndMint(): - lockChain, ok := tx.Selector.LockChain() - if !ok { - return fmt.Errorf("invalid selector %v", tx.Selector) - } - if lockChain.IsUTXOBased() { - return db.insertLockUTXOMintAccountTx(tx) - } - return db.insertLockAccountMintAccountTx(tx) - case tx.Selector.IsBurnAndRelease(): - releaseChain, ok := tx.Selector.ReleaseChain() - if !ok { - return fmt.Errorf("invalid selector %v", tx.Selector) - } - if releaseChain.IsUTXOBased() { - return db.insertBurnAccountReleaseUTXOTx(tx) - } - return db.insertBurnAccountReleaseAccountTx(tx) - default: - return fmt.Errorf("unexpected tx selector %v", tx.Selector.String()) - } -} - -// Tx implements the DB interface. -func (db database) Tx(hash pack.Bytes32) (tx.Tx, error) { - transaction, err := db.lockUTXOMintAccountTx(hash) - if err != sql.ErrNoRows { - return transaction, err - } - transaction, err = db.lockAccountMintAccountTx(hash) - if err != sql.ErrNoRows { - return transaction, err - } - transaction, err = db.burnAccountReleaseUTXOTx(hash) - if err != sql.ErrNoRows { - return transaction, err - } - transaction, err = db.burnAccountReleaseAccountTx(hash) - if err != sql.ErrNoRows { - return transaction, err - } - return tx.Tx{}, err -} - -// Txs implements the DB interface. -func (db database) Txs(offset, limit int) ([]tx.Tx, error) { - txs := make([]tx.Tx, 0, limit) - rows, err := db.db.Query(`SELECT tableName, hash, selector, tx_id, amount, utxo_hash, utxo_index, utxo_value, utxo_pubkey_script, payload, phash, to_address, nonce, nhash, gpubkey, ghash FROM ( - SELECT 'lock_utxo_mint_account' AS tableName, hash, created_time, selector, '' AS tx_id, '' AS amount, utxo_hash, utxo_index, utxo_value, utxo_pubkey_script, payload, phash, to_address, nonce, nhash, gpubkey, ghash FROM lock_utxo_mint_account UNION - SELECT 'lock_account_mint_account' AS tableName, hash, created_time, selector, tx_id, amount, '' AS utxo_hash, '' AS utxo_index, '' AS utxo_value, '' AS utxo_pubkey_script, payload, phash, to_address, nonce, nhash, gpubkey, ghash FROM lock_account_mint_account UNION - SELECT 'burn_account_release_utxo' AS tableName, hash, created_time, selector, '' AS tx_id, amount, '' AS utxo_hash, '' AS utxo_index, '' AS utxo_value, '' AS utxo_pubkey_script, '' AS payload, '' AS phash, to_address, nonce, '' AS nhash, '' AS gpubkey, '' AS ghash FROM burn_account_release_utxo UNION - SELECT 'burn_account_release_account' AS tableName, hash, created_time, selector, '' AS tx_id, amount, '' AS utxo_hash, '' AS utxo_index, '' AS utxo_value, '' AS utxo_pubkey_script, '' AS payload, '' AS phash, to_address, nonce, '' AS nhash, '' AS gpubkey, '' AS ghash FROM burn_account_release_account - ) AS shifts ORDER BY created_time ASC LIMIT $1 OFFSET $2;`, limit, offset) - if err != nil { - return nil, err - } - defer rows.Close() - - // Loop through rows and convert them to transactions. - for rows.Next() { - tx, err := rowToTx(rows) - if err != nil { - return nil, err - } - txs = append(txs, tx) - } - return txs, rows.Err() -} - -// PendingTxs implements the DB interface. -func (db database) PendingTxs(expiry time.Duration) ([]tx.Tx, error) { - txs := make([]tx.Tx, 0, 128) - - // Get pending lock-and-mint (UTXO -> account) transactions from the database. - rows, err := db.db.Query(`SELECT hash, selector, utxo_hash, utxo_index, utxo_value, utxo_pubkey_script, payload, phash, to_address, nonce, nhash, gpubkey, ghash FROM lock_utxo_mint_account - WHERE status = $1 AND $2 - created_time < $3;`, TxStatusConfirming, time.Now().Unix(), int64(expiry.Seconds())) - if err != nil { - return nil, err - } - defer rows.Close() - - for rows.Next() { - transaction, err := rowToLockUTXOMintAccountTx(rows) - if err != nil { - return nil, err - } - txs = append(txs, transaction) - } - if rows.Err() != nil { - return nil, err - } - - // Get pending lock-and-mint (account -> account) transactions from the database. - rows, err = db.db.Query(`SELECT hash, selector, tx_id, amount, payload, phash, to_address, nonce, nhash, gpubkey FROM lock_account_mint_account - WHERE status = $1 AND $2 - created_time < $3;`, TxStatusConfirming, time.Now().Unix(), int64(expiry.Seconds())) - if err != nil { - return nil, err - } - defer rows.Close() - - for rows.Next() { - transaction, err := rowToLockAccountMintAccountTx(rows) - if err != nil { - return nil, err - } - txs = append(txs, transaction) - } - if rows.Err() != nil { - return nil, err - } - - // Get pending burn-and-release (account -> UTXO) transactions from the database. - rows, err = db.db.Query(`SELECT hash, selector, amount, to_address, nonce FROM burn_account_release_utxo - WHERE status = $1 AND $2 - created_time < $3`, TxStatusConfirming, time.Now().Unix(), int64(expiry.Seconds())) - if err != nil { - return nil, err - } - defer rows.Close() - - for rows.Next() { - transaction, err := rowToBurnAccountReleaseUTXOTx(rows) - if err != nil { - return nil, err - } - txs = append(txs, transaction) - } - - // Get pending burn-and-release (account -> account) transactions from the database. - rows, err = db.db.Query(`SELECT hash, selector, amount, to_address, nonce FROM burn_account_release_account - WHERE status = $1 AND $2 - created_time < $3`, TxStatusConfirming, time.Now().Unix(), int64(expiry.Seconds())) - if err != nil { - return nil, err - } - defer rows.Close() - - for rows.Next() { - transaction, err := rowToBurnAccountReleaseAccountTx(rows) - if err != nil { - return nil, err - } - txs = append(txs, transaction) - } - return txs, rows.Err() -} - -// TxStatus implements the DB interface. -func (db database) TxStatus(txHash pack.Bytes32) (TxStatus, error) { - var status int - err := db.db.QueryRow(`SELECT status FROM lock_utxo_mint_account WHERE hash = $1;`, txHash.String()).Scan(&status) - if err != sql.ErrNoRows { - return TxStatus(status), err - } - err = db.db.QueryRow(`SELECT status FROM lock_account_mint_account WHERE hash = $1;`, txHash.String()).Scan(&status) - if err != sql.ErrNoRows { - return TxStatus(status), err - } - err = db.db.QueryRow(`SELECT status FROM burn_account_release_utxo WHERE hash = $1;`, txHash.String()).Scan(&status) - if err != sql.ErrNoRows { - return TxStatus(status), err - } - err = db.db.QueryRow(`SELECT status FROM burn_account_release_account WHERE hash = $1;`, txHash.String()).Scan(&status) - if err != sql.ErrNoRows { - return TxStatus(status), err - } - return TxStatusNil, err -} - -// UpdateStatus implements the DB interface. -func (db database) UpdateStatus(txHash pack.Bytes32, status TxStatus) error { - _, err := db.db.Exec("UPDATE lock_utxo_mint_account SET status = $1 WHERE hash = $2 AND status < $1;", status, txHash.String()) - if err != nil { - return err - } - _, err = db.db.Exec("UPDATE lock_account_mint_account SET status = $1 WHERE hash = $2 AND status < $1;", status, txHash.String()) - if err != nil { - return err - } - _, err = db.db.Exec("UPDATE burn_account_release_utxo SET status = $1 WHERE hash = $2 AND status < $1;", status, txHash.String()) - if err != nil { - return err - } - _, err = db.db.Exec("UPDATE burn_account_release_account SET status = $1 WHERE hash = $2 AND status < $1;", status, txHash.String()) - return err -} - -func checkCount(rows *sql.Rows) (count int) { - for rows.Next() { - err := rows.Scan(&count) - if err != nil { - panic(err) - } - } - return count -} - -// Prune deletes txs which have expired based on the given expiry. -func (db database) Prune(expiry time.Duration) error { - _, err := db.db.Exec("DELETE FROM lock_utxo_mint_account WHERE $1 - created_time > $2;", time.Now().Unix(), int(expiry.Seconds())) - if err != nil { - return err - } - _, err = db.db.Exec("DELETE FROM lock_account_mint_account WHERE $1 - created_time > $2;", time.Now().Unix(), int(expiry.Seconds())) - if err != nil { - return err - } - _, err = db.db.Exec("DELETE FROM burn_account_release_utxo WHERE $1 - created_time > $2;", time.Now().Unix(), int(expiry.Seconds())) - if err != nil { - return err - } - _, err = db.db.Exec("DELETE FROM burn_account_release_account WHERE $1 - created_time > $2;", time.Now().Unix(), int(expiry.Seconds())) - return err -} - -func (db database) insertLockUTXOMintAccountTx(tx tx.Tx) error { - output, ok := tx.Input.Get("output").(pack.Struct) - if !ok { - return fmt.Errorf("unexpected type for output: expected pack.Struct, got %v", tx.Input.Get("output").Type()) - } - outpoint, ok := output.Get("outpoint").(pack.Struct) + txid, ok := tx.Input.Get("txid").(pack.Bytes) if !ok { - return fmt.Errorf("unexpected type for outpoint: expected pack.Struct, got %v", output.Get("outpoint").Type()) - } - hash, ok := outpoint.Get("hash").(pack.Bytes) - if !ok { - return fmt.Errorf("unexpected type for hash: expected pack.Bytes, got %v", outpoint.Get("hash").Type()) - } - index, ok := outpoint.Get("index").(pack.U32) - if !ok { - return fmt.Errorf("unexpected type for index: expected pack.U32, got %v", outpoint.Get("index").Type()) + return fmt.Errorf("unexpected type for txid: expected pack.Bytes, got %v", tx.Input.Get("txid").Type()) } - value, ok := output.Get("value").(pack.U256) + txindex, ok := tx.Input.Get("txindex").(pack.U32) if !ok { - return fmt.Errorf("unexpected type for value: expected pack.U256, got %v", output.Get("value").Type()) + return fmt.Errorf("unexpected type for txindex: expected pack.U32, got %v", tx.Input.Get("txindex").Type()) } - pubKeyScript, ok := output.Get("pubKeyScript").(pack.Bytes) + amount, ok := tx.Input.Get("amount").(pack.U256) if !ok { - return fmt.Errorf("unexpected type for pubKeyScript: expected pack.Bytes, got %v", output.Get("pubKeyScript").Type()) + return fmt.Errorf("unexpected type for amount: expected pack.U256, got %v", tx.Input.Get("amount").Type()) } payload, ok := tx.Input.Get("payload").(pack.Bytes) if !ok { @@ -399,9 +119,9 @@ func (db database) insertLockUTXOMintAccountTx(tx tx.Tx) error { if !ok { return fmt.Errorf("unexpected type for to: expected pack.String, got %v", tx.Input.Get("to").Type()) } - nonce, ok := tx.Input.Get("nonce").(pack.Bytes32) + nonce, ok := tx.Input.Get("nonce").(pack.U256) if !ok { - return fmt.Errorf("unexpected type for nonce: expected pack.Bytes32, got %v", tx.Input.Get("nonce").Type()) + return fmt.Errorf("unexpected type for nonce: expected pack.U256, got %v", tx.Input.Get("nonce").Type()) } nhash, ok := tx.Input.Get("nhash").(pack.Bytes32) if !ok { @@ -416,16 +136,15 @@ func (db database) insertLockUTXOMintAccountTx(tx tx.Tx) error { return fmt.Errorf("unexpected type for ghash: expected pack.Bytes32, got %v", tx.Input.Get("ghash").Type()) } - script := `INSERT INTO lock_utxo_mint_account (hash, status, created_time, selector, utxo_hash, utxo_index, utxo_value, utxo_pubkey_script, payload, phash, to_address, nonce, nhash, gpubkey, ghash) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15);` + script := `INSERT INTO txs (hash, status, created_time, selector, txid, txindex, amount, payload, phash, to_address, nonce, nhash, gpubkey, ghash) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14);` _, err := db.db.Exec(script, tx.Hash.String(), TxStatusConfirming, time.Now().Unix(), tx.Selector.String(), - hash.String(), - index, - value.String(), - pubKeyScript.String(), + txid.String(), + txindex.String(), + amount.String(), payload.String(), phash.String(), to.String(), @@ -438,182 +157,91 @@ func (db database) insertLockUTXOMintAccountTx(tx tx.Tx) error { return err } -func (db database) insertLockAccountMintAccountTx(tx tx.Tx) error { - txID, ok := tx.Input.Get("txid").(pack.Bytes) - if !ok { - return fmt.Errorf("unexpected type for txid: expected pack.Bytes, got %v", tx.Input.Get("txid").Type()) - } - amount, ok := tx.Input.Get("amount").(pack.U256) - if !ok { - return fmt.Errorf("unexpected type for amount: expected pack.U256, got %v", tx.Input.Get("amount").Type()) - } - payload, ok := tx.Input.Get("payload").(pack.Bytes) - if !ok { - return fmt.Errorf("unexpected type for payload: expected pack.Bytes, got %v", tx.Input.Get("payload").Type()) - } - phash, ok := tx.Input.Get("phash").(pack.Bytes32) - if !ok { - return fmt.Errorf("unexpected type for phash: expected pack.Bytes32, got %v", tx.Input.Get("phash").Type()) - } - to, ok := tx.Input.Get("to").(pack.String) - if !ok { - return fmt.Errorf("unexpected type for to: expected pack.String, got %v", tx.Input.Get("to").Type()) - } - nonce, ok := tx.Input.Get("nonce").(pack.U256) - if !ok { - return fmt.Errorf("unexpected type for nonce: expected pack.U256, got %v", tx.Input.Get("nonce").Type()) - } - nhash, ok := tx.Input.Get("nhash").(pack.Bytes32) - if !ok { - return fmt.Errorf("unexpected type for nhash: expected pack.Bytes32, got %v", tx.Input.Get("nhash").Type()) - } - gpubkey, ok := tx.Input.Get("gpubkey").(pack.Bytes) - if !ok { - return fmt.Errorf("unexpected type for gpubkey: expected pack.Bytes, got %v", tx.Input.Get("gpubkey").Type()) - } - - script := `INSERT INTO lock_account_mint_account (hash, status, created_time, selector, tx_id, amount, payload, phash, to_address, nonce, nhash, gpubkey) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12);` - _, err := db.db.Exec(script, - tx.Hash.String(), - TxStatusConfirming, - time.Now().Unix(), - tx.Selector.String(), - txID.String(), - amount.String(), - payload.String(), - phash.String(), - to.String(), - nonce.String(), - nhash.String(), - gpubkey.String(), - ) - - return err +// Tx implements the DB interface. +func (db database) Tx(txHash pack.Bytes32) (tx.Tx, error) { + script := "SELECT hash, selector, txid, txindex, amount, payload, phash, to_address, nonce, nhash, gpubkey, ghash FROM ttxs WHERE hash = $1" + row := db.db.QueryRow(script, txHash.String()) + return rowToTx(row) } -func (db database) insertBurnAccountReleaseUTXOTx(tx tx.Tx) error { - amount, ok := tx.Input.Get("amount").(pack.U256) - if !ok { - return fmt.Errorf("unexpected type for amount: expected pack.U256, got %v", tx.Input.Get("amount").Type()) - } - to, ok := tx.Input.Get("to").(pack.String) - if !ok { - return fmt.Errorf("unexpected type for to: expected pack.String, got %v", tx.Input.Get("to").Type()) - } - nonce, ok := tx.Input.Get("nonce").(pack.Bytes32) - if !ok { - return fmt.Errorf("unexpected type for nonce: expected pack.Bytes32, got %v", tx.Input.Get("nonce").Type()) +// Txs implements the DB interface. +func (db database) Txs(offset, limit int) ([]tx.Tx, error) { + txs := make([]tx.Tx, 0, limit) + rows, err := db.db.Query(`SELECT hash, selector, txid, txindex, amount, payload, phash, to_address, nonce, nhash, gpubkey, ghash FROM txs ORDER BY created_time ASC LIMIT $1 OFFSET $2;`, limit, offset) + if err != nil { + return nil, err } + defer rows.Close() - script := `INSERT INTO burn_account_release_utxo (hash, status, created_time, selector, amount, to_address, nonce) VALUES ($1, $2, $3, $4, $5, $6, $7);` - _, err := db.db.Exec(script, - tx.Hash.String(), - TxStatusConfirming, - time.Now().Unix(), - tx.Selector.String(), - amount.String(), - to.String(), - nonce.String(), - ) - - return err -} - -func (db database) insertBurnAccountReleaseAccountTx(tx tx.Tx) error { - amount, ok := tx.Input.Get("amount").(pack.U256) - if !ok { - return fmt.Errorf("unexpected type for amount: expected pack.U256, got %v", tx.Input.Get("amount").Type()) - } - to, ok := tx.Input.Get("to").(pack.String) - if !ok { - return fmt.Errorf("unexpected type for to: expected pack.String, got %v", tx.Input.Get("to").Type()) - } - nonce, ok := tx.Input.Get("nonce").(pack.Bytes32) - if !ok { - return fmt.Errorf("unexpected type for nonce: expected pack.Bytes32, got %v", tx.Input.Get("nonce").Type()) + // Loop through rows and convert them to transactions. + for rows.Next() { + tx, err := rowToTx(rows) + if err != nil { + return nil, err + } + txs = append(txs, tx) } + return txs, rows.Err() +} - script := `INSERT INTO burn_account_release_account (hash, status, created_time, selector, amount, to_address, nonce) VALUES ($1, $2, $3, $4, $5, $6, $7);` - _, err := db.db.Exec(script, - tx.Hash.String(), - TxStatusConfirming, - time.Now().Unix(), - tx.Selector.String(), - amount.String(), - to.String(), - nonce.String(), - ) +// PendingTxs implements the DB interface. +func (db database) PendingTxs(expiry time.Duration) ([]tx.Tx, error) { + txs := make([]tx.Tx, 0, 128) - return err -} + // Get pending transactions from the database. + rows, err := db.db.Query(`SELECT hash, selector, txid, txindex, amount, payload, phash, to_address, nonce, nhash, gpubkey, ghash FROM txs + WHERE status = $1 AND $2 - created_time < $3;`, TxStatusConfirming, time.Now().Unix(), int64(expiry.Seconds())) + if err != nil { + return nil, err + } + defer rows.Close() -func (db database) lockUTXOMintAccountTx(txHash pack.Bytes32) (tx.Tx, error) { - script := "SELECT hash, selector, utxo_hash, utxo_index, utxo_value, utxo_pubkey_script, payload, phash, to_address, nonce, nhash, gpubkey, ghash FROM lock_utxo_mint_account WHERE hash = $1" - row := db.db.QueryRow(script, txHash.String()) - return rowToLockUTXOMintAccountTx(row) + for rows.Next() { + transaction, err := rowToTx(rows) + if err != nil { + return nil, err + } + txs = append(txs, transaction) + } + return txs, rows.Err() } -func (db database) lockAccountMintAccountTx(txHash pack.Bytes32) (tx.Tx, error) { - script := "SELECT hash, selector, tx_id, amount, payload, phash, to_address, nonce, nhash, gpubkey FROM lock_account_mint_account WHERE hash = $1" - row := db.db.QueryRow(script, txHash.String()) - return rowToLockAccountMintAccountTx(row) +// TxStatus implements the DB interface. +func (db database) TxStatus(txHash pack.Bytes32) (TxStatus, error) { + var status int + err := db.db.QueryRow(`SELECT status FROM txs WHERE hash = $1;`, txHash.String()).Scan(&status) + if err != nil { + return TxStatusNil, err + } + return TxStatus(status), err } -func (db database) burnAccountReleaseUTXOTx(txHash pack.Bytes32) (tx.Tx, error) { - script := "SELECT hash, selector, amount, to_address, nonce FROM burn_account_release_utxo WHERE hash = $1" - row := db.db.QueryRow(script, txHash.String()) - return rowToBurnAccountReleaseUTXOTx(row) +// UpdateStatus implements the DB interface. +func (db database) UpdateStatus(txHash pack.Bytes32, status TxStatus) error { + _, err := db.db.Exec("UPDATE txs SET status = $1 WHERE hash = $2 AND status < $1;", status, txHash.String()) + return err } -func (db database) burnAccountReleaseAccountTx(txHash pack.Bytes32) (tx.Tx, error) { - script := "SELECT hash, selector, amount, to_address, nonce FROM burn_account_release_account WHERE hash = $1" - row := db.db.QueryRow(script, txHash.String()) - return rowToBurnAccountReleaseAccountTx(row) +// Prune deletes txs which have expired based on the given expiry. +func (db database) Prune(expiry time.Duration) error { + _, err := db.db.Exec("DELETE FROM txs WHERE $1 - created_time > $2;", time.Now().Unix(), int(expiry.Seconds())) + return err } func rowToTx(row Scannable) (tx.Tx, error) { - var tableName, hash, selector, txID, amount, utxoHash, value, pubKeyScript, payload, phash, to, nonce, nhash, gpubkey, ghash string - var utxoIndex int - if err := row.Scan(&tableName, &hash, &selector, &txID, &amount, &utxoHash, &utxoIndex, &value, &pubKeyScript, &payload, &phash, &to, &nonce, &nhash, &gpubkey, &ghash); err != nil { - return tx.Tx{}, err - } - - switch tableName { - case "lock_utxo_mint_account": - return lockUTXOMintAccountTx(hash, selector, utxoHash, utxoIndex, value, pubKeyScript, payload, phash, to, nonce, nhash, gpubkey, ghash) - case "lock_account_mint_account": - return lockAccountMintAccountTx(hash, selector, txID, amount, payload, phash, to, nonce, nhash, gpubkey) - case "burn_account_release_utxo": - return burnAccountReleaseUTXOTx(hash, selector, amount, to, nonce) - case "burn_account_release_account": - return burnAccountReleaseAccountTx(hash, selector, amount, to, nonce) - } - - return tx.Tx{}, fmt.Errorf("invalid table name %v", tableName) -} - -func rowToLockUTXOMintAccountTx(row Scannable) (tx.Tx, error) { - var hash, selector, utxoHash, value, pubKeyScript, payload, phash, to, nonce, nhash, gpubkey, ghash string - var utxoIndex int - if err := row.Scan(&hash, &selector, &utxoHash, &utxoIndex, &value, &pubKeyScript, &payload, &phash, &to, &nonce, &nhash, &gpubkey, &ghash); err != nil { + var hash, selector, txidStr, amountStr, payloadStr, phashStr, toStr, nonceStr, nhashStr, gpubkeyStr, ghashStr string + var txindex int + if err := row.Scan(&hash, &selector, &txidStr, &txindex, &amountStr, &payloadStr, &phashStr, &toStr, &nonceStr, &nhashStr, &gpubkeyStr, &ghashStr); err != nil { return tx.Tx{}, err } - return lockUTXOMintAccountTx(hash, selector, utxoHash, utxoIndex, value, pubKeyScript, payload, phash, to, nonce, nhash, gpubkey, ghash) -} - -func lockUTXOMintAccountTx(hashStr, selector, utxoHashStr string, utxoIndex int, valueStr, pubKeyScriptStr, payloadStr, phashStr, to, nonceStr, nhashStr, gpubkeyStr, ghashStr string) (tx.Tx, error) { - utxoHash, err := decodeBytes(utxoHashStr) + txID, err := decodeBytes(txidStr) if err != nil { - return tx.Tx{}, fmt.Errorf("decoding utxo hash %v: %v", utxoHashStr, err) + return tx.Tx{}, fmt.Errorf("decoding txid %v: %v", txidStr, err) } - value, err := decodeU256(valueStr) - if err != nil { - return tx.Tx{}, fmt.Errorf("decoding value %v: %v", valueStr, err) - } - pubKeyScript, err := decodeBytes(pubKeyScriptStr) + amount, err := decodeU256(amountStr) if err != nil { - return tx.Tx{}, fmt.Errorf("decoding pubkey script %v: %v", pubKeyScriptStr, err) + return tx.Tx{}, fmt.Errorf("decoding amount %v: %v", amount, err) } payload, err := decodeBytes(payloadStr) if err != nil { @@ -640,138 +268,17 @@ func lockUTXOMintAccountTx(hashStr, selector, utxoHashStr string, utxoIndex int, return tx.Tx{}, fmt.Errorf("decoding ghash %v: %v", ghashStr, err) } input, err := pack.Encode( - txengine.InputLockOnUTXOAndMintOnAccount{ - Output: utxo.Output{ - Outpoint: utxo.Outpoint{ - Hash: utxoHash, - Index: pack.NewU32(uint32(utxoIndex)), - }, - Value: value, - PubKeyScript: pubKeyScript, - }, - Payload: payload, - Phash: phash, - To: pack.String(to), - Nonce: nonce, - Nhash: nhash, - Gpubkey: gpubkey, - Ghash: ghash, - }, - ) - if err != nil { - return tx.Tx{}, err - } - return tx.NewTx(tx.Selector(selector), pack.Typed(input.(pack.Struct))) -} - -func rowToLockAccountMintAccountTx(row Scannable) (tx.Tx, error) { - var hash, selector, txID, amount, payload, phash, to, nonce, nhash, gpubkey string - if err := row.Scan(&hash, &selector, &txID, &amount, &payload, &phash, &to, &nonce, &nhash, &gpubkey); err != nil { - return tx.Tx{}, err - } - - return lockAccountMintAccountTx(hash, selector, txID, amount, payload, phash, to, nonce, nhash, gpubkey) -} - -func lockAccountMintAccountTx(hashStr, selector, txIDStr, amountStr, payloadStr, phashStr, to, nonceStr, nhashStr, gpubkeyStr string) (tx.Tx, error) { - txID, err := decodeBytes(txIDStr) - if err != nil { - return tx.Tx{}, fmt.Errorf("decoding tx ID %v: %v", txIDStr, err) - } - amount, err := decodeU256(amountStr) - if err != nil { - return tx.Tx{}, fmt.Errorf("decoding amount %v: %v", amount, err) - } - payload, err := decodeBytes(payloadStr) - if err != nil { - return tx.Tx{}, fmt.Errorf("decoding payload %v: %v", payloadStr, err) - } - phash, err := decodeBytes32(phashStr) - if err != nil { - return tx.Tx{}, fmt.Errorf("decoding phash %v: %v", phashStr, err) - } - nonce, err := decodeU256(nonceStr) - if err != nil { - return tx.Tx{}, fmt.Errorf("decoding nonce %v: %v", nonceStr, err) - } - nhash, err := decodeBytes32(nhashStr) - if err != nil { - return tx.Tx{}, fmt.Errorf("decoding nhash %v: %v", nhashStr, err) - } - gpubkey, err := decodeBytes(gpubkeyStr) - if err != nil { - return tx.Tx{}, fmt.Errorf("decoding gpubkey %v: %v", gpubkeyStr, err) - } - input, err := pack.Encode( - txengine.InputLockOnAccountAndMintOnAccount{ + txengine.Input{ Txid: txID, + Txindex: pack.U32(txindex), Amount: amount, Payload: payload, Phash: phash, - To: pack.String(to), + To: pack.String(toStr), Nonce: nonce, Nhash: nhash, Gpubkey: gpubkey, - }, - ) - if err != nil { - return tx.Tx{}, err - } - return tx.NewTx(tx.Selector(selector), pack.Typed(input.(pack.Struct))) -} - -func rowToBurnAccountReleaseUTXOTx(row Scannable) (tx.Tx, error) { - var hash, selector, amount, to, nonce string - if err := row.Scan(&hash, &selector, &amount, &to, &nonce); err != nil { - return tx.Tx{}, err - } - return burnAccountReleaseUTXOTx(hash, selector, amount, to, nonce) -} - -func burnAccountReleaseUTXOTx(hash, selector, amountStr, to, nonceStr string) (tx.Tx, error) { - amount, err := decodeU256(amountStr) - if err != nil { - return tx.Tx{}, fmt.Errorf("decoding amount %v: %v", amountStr, err) - } - nonce, err := decodeBytes32(nonceStr) - if err != nil { - return tx.Tx{}, fmt.Errorf("decoding nonce %v: %v", nonceStr, err) - } - input, err := pack.Encode( - txengine.InputBurnOnAccountAndReleaseOnUTXO{ - Amount: amount, - To: pack.String(to), - Nonce: nonce, - }, - ) - if err != nil { - return tx.Tx{}, err - } - return tx.NewTx(tx.Selector(selector), pack.Typed(input.(pack.Struct))) -} - -func rowToBurnAccountReleaseAccountTx(row Scannable) (tx.Tx, error) { - var hash, selector, amount, to, nonce string - if err := row.Scan(&hash, &selector, &amount, &to, &nonce); err != nil { - return tx.Tx{}, err - } - return burnAccountReleaseAccountTx(hash, selector, amount, to, nonce) -} - -func burnAccountReleaseAccountTx(hash, selector, amountStr, to, nonceStr string) (tx.Tx, error) { - amount, err := decodeU256(amountStr) - if err != nil { - return tx.Tx{}, fmt.Errorf("decoding amount %v: %v", amountStr, err) - } - nonce, err := decodeBytes32(nonceStr) - if err != nil { - return tx.Tx{}, fmt.Errorf("decoding nonce %v: %v", nonceStr, err) - } - input, err := pack.Encode( - txengine.InputBurnOnAccountAndReleaseOnAccount{ - Amount: amount, - To: pack.String(to), - Nonce: nonce, + Ghash: ghash, }, ) if err != nil { diff --git a/go.mod b/go.mod index 296d9134..ee1c1099 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.13 require ( github.com/allegro/bigcache v1.2.1 // indirect github.com/aristanetworks/goarista v0.0.0-20200310212843-2da4c1f5881b // indirect + github.com/btcsuite/btcd v0.21.0-beta github.com/certifi/gocertifi v0.0.0-20190905060710-a5e0173ced67 // indirect github.com/cespare/cp v1.1.1 // indirect github.com/deckarep/golang-set v1.7.1 // indirect @@ -27,10 +28,10 @@ require ( github.com/pierrec/xxHash v0.1.5 // indirect github.com/prometheus/tsdb v0.10.0 // indirect github.com/renproject/aw v0.4.0-9 - github.com/renproject/darknode v0.5.3-0.20200927234247-ff2e27c43fbc + github.com/renproject/darknode v0.5.3-0.20201001044422-e7b680305ffe github.com/renproject/id v0.4.2 github.com/renproject/kv v1.1.2 - github.com/renproject/multichain v0.2.8-0.20200925032440-5124db1cabf0 + github.com/renproject/multichain v0.2.8-0.20200929114230-302423f836e7 github.com/renproject/pack v0.2.5 github.com/renproject/phi v0.1.0 github.com/rjeczalik/notify v0.9.2 // indirect diff --git a/go.sum b/go.sum index 2d0668b3..ec39ec19 100644 --- a/go.sum +++ b/go.sum @@ -1460,6 +1460,8 @@ github.com/renproject/darknode v0.5.3-0.20200918070337-74df8570503e h1:gr8Jb+sEc github.com/renproject/darknode v0.5.3-0.20200918070337-74df8570503e/go.mod h1:hYLUa+/gfCw08S9ejEI11gdYm3rGfRPbZgtMLiNsIB4= github.com/renproject/darknode v0.5.3-0.20200927234247-ff2e27c43fbc h1:91VRUNd0zq/93irZM6i1iP2vCrAvRcIiNXO/bjT4Xqg= github.com/renproject/darknode v0.5.3-0.20200927234247-ff2e27c43fbc/go.mod h1:DTLjwMuBjChmkr+hVDtdiLVYFtucdXYiDylSMkFuHVo= +github.com/renproject/darknode v0.5.3-0.20201001044422-e7b680305ffe h1:XnTx1Yw+E90Vm8M/Ejdg5jEG3bdKS2ZVJbcgeKgAdkU= +github.com/renproject/darknode v0.5.3-0.20201001044422-e7b680305ffe/go.mod h1:2TyT/EDLdiJ6bNRViElYhl0Xu4j4bno4TYhUYXmnJZ4= github.com/renproject/id v0.4.2 h1:XseNDPPCJtsZjIWR7Qgf+zxy0Gt5xsLrfwpQxJt5wFQ= github.com/renproject/id v0.4.2/go.mod h1:bCzV4zZkyWetf0GvhJxMT9HQNnGUwzQpImtXOUXqq0k= github.com/renproject/kv v1.1.2 h1:P18yHdDVJTEZ9yeyx6o82ICY1m6f+VdtAt/ouZez+AU= @@ -1472,6 +1474,8 @@ github.com/renproject/multichain v0.2.8-0.20200916021910-91ea4fc0ab1a h1:SAo7cLS github.com/renproject/multichain v0.2.8-0.20200916021910-91ea4fc0ab1a/go.mod h1:02TvuvQY4UTlrJs0cItz18Gsk6zPuZM74GbnrhxDgJM= github.com/renproject/multichain v0.2.8-0.20200925032440-5124db1cabf0 h1:HuCMJZnnn8rBtspXlgIDEVieWWxkaGLmetPY5/1Ed9U= github.com/renproject/multichain v0.2.8-0.20200925032440-5124db1cabf0/go.mod h1:f/8MRfLbDqZUw/dDi3WS5+1xqUjYrgXCocajm9pY10g= +github.com/renproject/multichain v0.2.8-0.20200929114230-302423f836e7 h1:cl14C4cXtJCJf7xsOuz+Yj+cn7Jtob1SPfelvuIDGpA= +github.com/renproject/multichain v0.2.8-0.20200929114230-302423f836e7/go.mod h1:f/8MRfLbDqZUw/dDi3WS5+1xqUjYrgXCocajm9pY10g= github.com/renproject/pack v0.2.3 h1:6zHFyz45ow52iLNLG19eyA/UphJE8b2LsYEcLC3HqQQ= github.com/renproject/pack v0.2.3/go.mod h1:pzX3Hc04RoPft89LaZJVp0xgngVGi90V7GvyC3mOGg4= github.com/renproject/pack v0.2.5 h1:BNfam8PCb5qJuIX36IqOkcRgaZLOZsM1lZZSakbOxb4= diff --git a/lightnode.go b/lightnode.go index 96782de7..bdc5efc5 100644 --- a/lightnode.go +++ b/lightnode.go @@ -133,7 +133,7 @@ func New(options Options, ctx context.Context, logger logrus.FieldLogger, sqlDB if watchers[chain] == nil { watchers[chain] = map[multichain.Asset]watcher.Watcher{} } - watchers[chain][asset] = watcher.NewWatcher(logger, selector, ethClients[chain], bindings, resolver, client, options.WatcherPollRate) + watchers[chain][asset] = watcher.NewWatcher(logger, selector, verifierBindings, ethClients[chain], bindings, resolver, client, options.WatcherPollRate) } } diff --git a/watcher/watcher.go b/watcher/watcher.go index 15485de8..d91af3b7 100644 --- a/watcher/watcher.go +++ b/watcher/watcher.go @@ -2,10 +2,13 @@ package watcher import ( "context" + "encoding/hex" "fmt" "time" + "github.com/btcsuite/btcd/btcec" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" "github.com/go-redis/redis/v7" "github.com/renproject/darknode/jsonrpc" @@ -22,7 +25,9 @@ import ( // then forwarded to the cacher. type Watcher struct { logger logrus.FieldLogger + gpubkey pack.Bytes selector tx.Selector + bindings txengine.Bindings ethClient *ethclient.Client ethBindings *ethereumbindings.MintGatewayLogicV1 resolver *resolver.Resolver @@ -31,10 +36,23 @@ type Watcher struct { } // NewWatcher returns a new Watcher. -func NewWatcher(logger logrus.FieldLogger, selector tx.Selector, ethClient *ethclient.Client, ethBindings *ethereumbindings.MintGatewayLogicV1, resolver *resolver.Resolver, cache *redis.Client, pollInterval time.Duration) Watcher { +func NewWatcher(logger logrus.FieldLogger, selector tx.Selector, bindings txengine.Bindings, ethClient *ethclient.Client, ethBindings *ethereumbindings.MintGatewayLogicV1, resolver *resolver.Resolver, cache *redis.Client, pollInterval time.Duration) Watcher { + // TODO: This should be customisable based on the network. + pubKeyStr := "024c27e5610c701d857ff13464ea1592cf6e651bc6fde143f7d032b3298e7397e6" + pubKeyBytes, err := hex.DecodeString(pubKeyStr) + if err != nil { + panic(fmt.Sprintf("decoding public key: %v", err)) + } + pubKey, err := crypto.DecompressPubkey(pubKeyBytes) + if err != nil { + panic(fmt.Sprintf("decompressing public key: %v", err)) + } + gpubkey := (*btcec.PublicKey)(pubKey).SerializeCompressed() return Watcher{ logger: logger, + gpubkey: gpubkey, selector: selector, + bindings: bindings, ethClient: ethClient, ethBindings: ethBindings, resolver: resolver, @@ -103,7 +121,7 @@ func (watcher Watcher) watchLogShiftOuts(parent context.Context) { copy(nonceBytes[:], pack.NewU256FromU64(pack.NewU64(nonce)).Bytes()) // Send the burn transaction to the resolver. - params, err := watcher.burnToParams(pack.NewU256FromU64(pack.NewU64(amount)), pack.String(to), nonceBytes) + params, err := watcher.burnToParams(iter.Event.Raw.TxHash.Bytes(), pack.NewU256FromU64(pack.NewU64(amount)), pack.String(to), nonceBytes, watcher.gpubkey) if err != nil { watcher.logger.Infof("[watcher] cannot get params from burn transaction: %v", err) } @@ -152,27 +170,30 @@ func (watcher Watcher) lastCheckedBlockNumber(currentBlockN uint64) (uint64, err } // burnToParams constructs params for a SubmitTx request with given ref. -func (watcher Watcher) burnToParams(amount pack.U256, to pack.String, nonce pack.Bytes32) (jsonrpc.ParamsSubmitTx, error) { - burnChain, ok := watcher.selector.BurnChain() - if !ok { - - } - var input pack.Value - var err error - switch burnChain.ChainType() { - case multichain.ChainTypeUTXOBased: - input, err = pack.Encode(txengine.InputBurnOnAccountAndReleaseOnUTXO{ - Amount: amount, - To: to, - Nonce: nonce, - }) - case multichain.ChainTypeAccountBased: - input, err = pack.Encode(txengine.InputBurnOnAccountAndReleaseOnAccount{ - Amount: amount, - To: to, - Nonce: nonce, - }) +func (watcher Watcher) burnToParams(txid pack.Bytes, amount pack.U256, to pack.String, nonce pack.Bytes32, gpubkey pack.Bytes) (jsonrpc.ParamsSubmitTx, error) { + burnChain := watcher.selector.Destination() + toBytes, err := watcher.bindings.DecodeAddress(burnChain, multichain.Address(to)) + if err != nil { + return jsonrpc.ParamsSubmitTx{}, err } + + txindex := pack.U32(0) + payload := pack.Bytes{} + phash := txengine.Phash(payload) + nhash := txengine.Nhash(nonce, txid, txindex) + ghash := txengine.Ghash(watcher.selector, phash, toBytes, nonce) + input, err := pack.Encode(txengine.Input{ + Txid: txid, + Txindex: txindex, + Amount: amount, + Payload: payload, + Phash: phash, + To: to, + Nonce: nonce, + Nhash: nhash, + Gpubkey: gpubkey, + Ghash: ghash, + }) if err != nil { return jsonrpc.ParamsSubmitTx{}, err } From 86211cf2e0c84e0e6a0dc3699976fe2ebfda87c4 Mon Sep 17 00:00:00 2001 From: Jaz Gulati Date: Thu, 1 Oct 2020 16:13:42 +1000 Subject: [PATCH 05/19] update dockerfile --- Dockerfile | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/Dockerfile b/Dockerfile index 557817b7..7c21edfa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,26 +7,25 @@ ENV GO111MODULE=on ARG GITHUB_TOKEN RUN git config --global url."https://${GITHUB_TOKEN}:x-oauth-basic@github.com/".insteadOf "https://github.com/" -# Download dependencies. -WORKDIR /lightnode -COPY go.mod . -COPY go.sum . -RUN go mod download - -# Copy the code into the container. -COPY . . - # Download Filecoin dependencies RUN apt-get autoclean RUN apt-get update RUN apt-get install -y jq RUN apt-get install -y ocl-icd-opencl-dev -RUN git submodule add --force https://github.com/filecoin-project/filecoin-ffi.git extern/filecoin-ffi -WORKDIR /lightnode/extern/filecoin-ffi +RUN git clone https://github.com/filecoin-project/filecoin-ffi.git /extern/filecoin-ffi +WORKDIR /extern/filecoin-ffi RUN git checkout 777a6fbf4446b1112adfd4fa5dd88e0c88974122 RUN make + +# Download dependencies. WORKDIR /lightnode -RUN go mod edit -replace=github.com/filecoin-project/filecoin-ffi=./extern/filecoin-ffi +COPY go.mod . +COPY go.sum . +RUN go mod download + +# Copy the code into the container. +COPY . . +RUN go mod edit -replace=github.com/filecoin-project/filecoin-ffi=../extern/filecoin-ffi # Build the code inside the container. RUN go build ./cmd/lightnode From b5ed85387713b4da75c5562469d448f6db21e1dc Mon Sep 17 00:00:00 2001 From: Jaz Gulati Date: Fri, 2 Oct 2020 11:22:13 +1000 Subject: [PATCH 06/19] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c9a12531..5c604c12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,5 @@ ## 0.2.1 +- Darknode transaction input compatibility updates - Integrate Terra ## 0.2.0 From e1810f6b1351439c181d0a2593170f4ffb7a8bce Mon Sep 17 00:00:00 2001 From: Jaz Gulati Date: Fri, 2 Oct 2020 12:05:13 +1000 Subject: [PATCH 07/19] db: fix table name --- db/db.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/db.go b/db/db.go index 950c0032..2a30aa53 100644 --- a/db/db.go +++ b/db/db.go @@ -159,7 +159,7 @@ func (db database) InsertTx(tx tx.Tx) error { // Tx implements the DB interface. func (db database) Tx(txHash pack.Bytes32) (tx.Tx, error) { - script := "SELECT hash, selector, txid, txindex, amount, payload, phash, to_address, nonce, nhash, gpubkey, ghash FROM ttxs WHERE hash = $1" + script := "SELECT hash, selector, txid, txindex, amount, payload, phash, to_address, nonce, nhash, gpubkey, ghash FROM txs WHERE hash = $1" row := db.db.QueryRow(script, txHash.String()) return rowToTx(row) } From 7a8e2d1dbe751b92198689aa61b363f3fd3764f2 Mon Sep 17 00:00:00 2001 From: Jaz Gulati Date: Fri, 2 Oct 2020 12:18:42 +1000 Subject: [PATCH 08/19] db: fix nonce type --- db/db.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/db/db.go b/db/db.go index 2a30aa53..410baf80 100644 --- a/db/db.go +++ b/db/db.go @@ -119,9 +119,9 @@ func (db database) InsertTx(tx tx.Tx) error { if !ok { return fmt.Errorf("unexpected type for to: expected pack.String, got %v", tx.Input.Get("to").Type()) } - nonce, ok := tx.Input.Get("nonce").(pack.U256) + nonce, ok := tx.Input.Get("nonce").(pack.Bytes32) if !ok { - return fmt.Errorf("unexpected type for nonce: expected pack.U256, got %v", tx.Input.Get("nonce").Type()) + return fmt.Errorf("unexpected type for nonce: expected pack.Bytes32, got %v", tx.Input.Get("nonce").Type()) } nhash, ok := tx.Input.Get("nhash").(pack.Bytes32) if !ok { From b19e97157b674390f668b0b484396b3139db7027 Mon Sep 17 00:00:00 2001 From: Jaz Gulati Date: Fri, 2 Oct 2020 12:27:20 +1000 Subject: [PATCH 09/19] go: update darknode --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index ee1c1099..f60ffc22 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/pierrec/xxHash v0.1.5 // indirect github.com/prometheus/tsdb v0.10.0 // indirect github.com/renproject/aw v0.4.0-9 - github.com/renproject/darknode v0.5.3-0.20201001044422-e7b680305ffe + github.com/renproject/darknode v0.5.3-0.20201002022143-1217e7b73be2 github.com/renproject/id v0.4.2 github.com/renproject/kv v1.1.2 github.com/renproject/multichain v0.2.8-0.20200929114230-302423f836e7 diff --git a/go.sum b/go.sum index ec39ec19..2126ed00 100644 --- a/go.sum +++ b/go.sum @@ -1462,6 +1462,8 @@ github.com/renproject/darknode v0.5.3-0.20200927234247-ff2e27c43fbc h1:91VRUNd0z github.com/renproject/darknode v0.5.3-0.20200927234247-ff2e27c43fbc/go.mod h1:DTLjwMuBjChmkr+hVDtdiLVYFtucdXYiDylSMkFuHVo= github.com/renproject/darknode v0.5.3-0.20201001044422-e7b680305ffe h1:XnTx1Yw+E90Vm8M/Ejdg5jEG3bdKS2ZVJbcgeKgAdkU= github.com/renproject/darknode v0.5.3-0.20201001044422-e7b680305ffe/go.mod h1:2TyT/EDLdiJ6bNRViElYhl0Xu4j4bno4TYhUYXmnJZ4= +github.com/renproject/darknode v0.5.3-0.20201002022143-1217e7b73be2 h1:amCFK3nZegO9u+3iICtYjJYVOk8aG/dd+whbyk4mMJs= +github.com/renproject/darknode v0.5.3-0.20201002022143-1217e7b73be2/go.mod h1:XSaLRnb/xCt8+IwN5IH1mPXx9RvCi4gigff9LQviPTY= github.com/renproject/id v0.4.2 h1:XseNDPPCJtsZjIWR7Qgf+zxy0Gt5xsLrfwpQxJt5wFQ= github.com/renproject/id v0.4.2/go.mod h1:bCzV4zZkyWetf0GvhJxMT9HQNnGUwzQpImtXOUXqq0k= github.com/renproject/kv v1.1.2 h1:P18yHdDVJTEZ9yeyx6o82ICY1m6f+VdtAt/ouZez+AU= From bb582b93feb061ce613a47ec88616647526d3f99 Mon Sep 17 00:00:00 2001 From: Jaz Gulati Date: Fri, 2 Oct 2020 14:12:27 +1000 Subject: [PATCH 10/19] confirmer: fix selector check --- confirmer/confirmer.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/confirmer/confirmer.go b/confirmer/confirmer.go index 9e078a5c..c0d09951 100644 --- a/confirmer/confirmer.go +++ b/confirmer/confirmer.go @@ -89,9 +89,9 @@ func (confirmer *Confirmer) checkPendingTxs(parent context.Context) { tx := txs[i] var confirmed bool switch { - case tx.Selector.IsLock() && tx.Selector.IsMint(): + case tx.Selector.IsLock(): confirmed = confirmer.lockTxConfirmed(ctx, tx) - case tx.Selector.IsBurn() && tx.Selector.IsRelease(): + case tx.Selector.IsBurn(): confirmed = confirmer.burnTxConfirmed(ctx, tx) } From 74b835beb1330b7d473b7dd8ae3501d2052f49d0 Mon Sep 17 00:00:00 2001 From: Jaz Gulati Date: Fri, 2 Oct 2020 14:12:40 +1000 Subject: [PATCH 11/19] testutils: fix mock account lock info --- testutils/blockchain.go | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/testutils/blockchain.go b/testutils/blockchain.go index b2d1d4c8..8adcdf07 100644 --- a/testutils/blockchain.go +++ b/testutils/blockchain.go @@ -15,6 +15,45 @@ import ( "github.com/sirupsen/logrus" ) +type mockAccountTx struct { +} + +func (tx mockAccountTx) Hash() pack.Bytes { + return pack.Bytes{} +} + +func (tx mockAccountTx) From() multichain.Address { + return "" +} + +func (tx mockAccountTx) To() multichain.Address { + return "" +} + +func (tx mockAccountTx) Value() pack.U256 { + return pack.NewU256([32]byte{}) +} + +func (tx mockAccountTx) Nonce() pack.U256 { + return pack.NewU256([32]byte{}) +} + +func (tx mockAccountTx) Payload() multichain.ContractCallData { + return []byte{} +} + +func (tx mockAccountTx) Sighashes() ([]pack.Bytes32, error) { + return []pack.Bytes32{}, nil +} + +func (tx mockAccountTx) Sign(signatures []pack.Bytes65, pubKey pack.Bytes) error { + return nil +} + +func (tx mockAccountTx) Serialize() (pack.Bytes, error) { + return pack.Bytes{}, nil +} + type mockBindings struct { logger logrus.FieldLogger maxAttemptsUntilConfirmed int @@ -48,7 +87,7 @@ func (b mockBindings) AccountBurnInfo(ctx context.Context, chain multichain.Chai } func (b mockBindings) AccountLockInfo(ctx context.Context, chain multichain.Chain, asset multichain.Asset, txid pack.Bytes) (multichain.AccountTx, error) { - panic("unimplemented") + return mockAccountTx{}, nil } func (b mockBindings) AccountBuildTx(ctx context.Context, chain multichain.Chain, asset multichain.Asset, from, to multichain.Address, value, nonce, gasLimit, gasPrice pack.U256, payload pack.Bytes) (multichain.AccountTx, error) { From da0ecfda4aca75a436f2372b468042d1eb27d664 Mon Sep 17 00:00:00 2001 From: Jaz Gulati Date: Fri, 2 Oct 2020 14:23:42 +1000 Subject: [PATCH 12/19] db_test: update tests to reflect table change --- db/db_test.go | 68 +++++++++------------------------------------------ 1 file changed, 11 insertions(+), 57 deletions(-) diff --git a/db/db_test.go b/db/db_test.go index fcb1c919..ad64ce1f 100644 --- a/db/db_test.go +++ b/db/db_test.go @@ -55,24 +55,8 @@ var _ = Describe("Lightnode db", func() { } cleanUp := func(db *sql.DB) { - dropLockUTXOMintAccount := "DROP TABLE IF EXISTS lock_utxo_mint_account;" - _, err := db.Exec(dropLockUTXOMintAccount) - Expect(err).NotTo(HaveOccurred()) - - dropLockAccountMintAccount := "DROP TABLE IF EXISTS lock_account_mint_account;" - _, err = db.Exec(dropLockAccountMintAccount) - Expect(err).NotTo(HaveOccurred()) - - dropBurnAccountReleaseUTXO := "DROP TABLE IF EXISTS burn_account_release_utxo;" - _, err = db.Exec(dropBurnAccountReleaseUTXO) - Expect(err).NotTo(HaveOccurred()) - - dropBurnAccountReleaseAccount := "DROP TABLE IF EXISTS burn_account_release_account;" - _, err = db.Exec(dropBurnAccountReleaseAccount) - Expect(err).NotTo(HaveOccurred()) - - dropBurnAccountMintAccount := "DROP TABLE IF EXISTS burn_account_mint_account;" - _, err = db.Exec(dropBurnAccountMintAccount) + dropTxs := "DROP TABLE IF EXISTS txs;" + _, err := db.Exec(dropTxs) Expect(err).NotTo(HaveOccurred()) } @@ -99,25 +83,16 @@ var _ = Describe("Lightnode db", func() { db := New(sqlDB) // Tables should not exist before creation. - Expect(CheckTableExistence(dbname, "lock_utxo_mint_account", sqlDB)).Should(HaveOccurred()) - Expect(CheckTableExistence(dbname, "lock_account_mint_account", sqlDB)).Should(HaveOccurred()) - Expect(CheckTableExistence(dbname, "burn_account_release_utxo", sqlDB)).Should(HaveOccurred()) - Expect(CheckTableExistence(dbname, "burn_account_release_account", sqlDB)).Should(HaveOccurred()) + Expect(CheckTableExistence(dbname, "txs", sqlDB)).Should(HaveOccurred()) // Tables should exist after creation. Expect(db.Init()).To(Succeed()) - Expect(CheckTableExistence(dbname, "lock_utxo_mint_account", sqlDB)).NotTo(HaveOccurred()) - Expect(CheckTableExistence(dbname, "lock_account_mint_account", sqlDB)).NotTo(HaveOccurred()) - Expect(CheckTableExistence(dbname, "burn_account_release_utxo", sqlDB)).NotTo(HaveOccurred()) - Expect(CheckTableExistence(dbname, "burn_account_release_account", sqlDB)).NotTo(HaveOccurred()) + Expect(CheckTableExistence(dbname, "txs", sqlDB)).NotTo(HaveOccurred()) // Multiple calls of the creation function should not have // any effect on the existing tables. Expect(db.Init()).To(Succeed()) - Expect(CheckTableExistence(dbname, "lock_utxo_mint_account", sqlDB)).NotTo(HaveOccurred()) - Expect(CheckTableExistence(dbname, "lock_account_mint_account", sqlDB)).NotTo(HaveOccurred()) - Expect(CheckTableExistence(dbname, "burn_account_release_utxo", sqlDB)).NotTo(HaveOccurred()) - Expect(CheckTableExistence(dbname, "burn_account_release_account", sqlDB)).NotTo(HaveOccurred()) + Expect(CheckTableExistence(dbname, "txs", sqlDB)).NotTo(HaveOccurred()) }) }) @@ -193,10 +168,7 @@ var _ = Describe("Lightnode db", func() { for i := 0; i < 50; i++ { transaction := txutil.RandomGoodTx(r) Expect(db.InsertTx(transaction)).To(Succeed()) - Expect(UpdateTxCreatedTime(sqlDB, "lock_utxo_mint_account", transaction.Hash, time.Now().Unix()-24*3600)).Should(Succeed()) - Expect(UpdateTxCreatedTime(sqlDB, "lock_account_mint_account", transaction.Hash, time.Now().Unix()-24*3600)).Should(Succeed()) - Expect(UpdateTxCreatedTime(sqlDB, "burn_account_release_utxo", transaction.Hash, time.Now().Unix()-24*3600)).Should(Succeed()) - Expect(UpdateTxCreatedTime(sqlDB, "burn_account_release_account", transaction.Hash, time.Now().Unix()-24*3600)).Should(Succeed()) + Expect(UpdateTxCreatedTime(sqlDB, "txs", transaction.Hash, time.Now().Unix()-24*3600)).Should(Succeed()) } pendingTxs, err := db.PendingTxs(time.Hour) Expect(err).NotTo(HaveOccurred()) @@ -254,34 +226,16 @@ var _ = Describe("Lightnode db", func() { // Ensure no data gets pruned before it is expired. Expect(db.Prune(5 * time.Second)).Should(Succeed()) - numLockUTXOMintAccount, err := NumOfDataEntries(sqlDB, "lock_utxo_mint_account") - Expect(err).NotTo(HaveOccurred()) - numLockAccountMintAccount, err := NumOfDataEntries(sqlDB, "lock_account_mint_account") - Expect(err).NotTo(HaveOccurred()) - numBurnAccountReleaseUTXO, err := NumOfDataEntries(sqlDB, "burn_account_release_utxo") - Expect(err).NotTo(HaveOccurred()) - numBurnAccountReleaseAccount, err := NumOfDataEntries(sqlDB, "burn_account_release_account") + numTxs, err := NumOfDataEntries(sqlDB, "txs") Expect(err).NotTo(HaveOccurred()) - Expect(numLockUTXOMintAccount + numLockAccountMintAccount + numBurnAccountReleaseUTXO + numBurnAccountReleaseAccount).Should(Equal(1)) + Expect(numTxs).Should(Equal(1)) // Ensure data gets pruned once it has expired. - Expect(UpdateTxCreatedTime(sqlDB, "lock_utxo_mint_account", transaction.Hash, time.Now().Unix()-5)).Should(Succeed()) - Expect(UpdateTxCreatedTime(sqlDB, "lock_account_mint_account", transaction.Hash, time.Now().Unix()-5)).Should(Succeed()) - Expect(UpdateTxCreatedTime(sqlDB, "burn_account_release_utxo", transaction.Hash, time.Now().Unix()-5)).Should(Succeed()) - Expect(UpdateTxCreatedTime(sqlDB, "burn_account_release_account", transaction.Hash, time.Now().Unix()-5)).Should(Succeed()) + Expect(UpdateTxCreatedTime(sqlDB, "txs", transaction.Hash, time.Now().Unix()-5)).Should(Succeed()) Expect(db.Prune(time.Second)).Should(Succeed()) - numLockUTXOMintAccount, err = NumOfDataEntries(sqlDB, "lock_utxo_mint_account") - Expect(err).NotTo(HaveOccurred()) - Expect(numLockUTXOMintAccount).Should(BeZero()) - numLockAccountMintAccount, err = NumOfDataEntries(sqlDB, "lock_account_mint_account") - Expect(err).NotTo(HaveOccurred()) - Expect(numLockAccountMintAccount).Should(BeZero()) - numBurnAccountReleaseUTXO, err = NumOfDataEntries(sqlDB, "burn_account_release_utxo") - Expect(err).NotTo(HaveOccurred()) - Expect(numBurnAccountReleaseUTXO).Should(BeZero()) - numBurnAccountReleaseAccount, err = NumOfDataEntries(sqlDB, "burn_account_release_account") + numTxs, err = NumOfDataEntries(sqlDB, "txs") Expect(err).NotTo(HaveOccurred()) - Expect(numBurnAccountReleaseAccount).Should(BeZero()) + Expect(numTxs).Should(BeZero()) return true } From a76b86a30567dfab8efe7057d4d7b8a17a76d27d Mon Sep 17 00:00:00 2001 From: Jaz Gulati Date: Fri, 2 Oct 2020 14:44:12 +1000 Subject: [PATCH 13/19] db: fix txindex type --- db/db.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/db.go b/db/db.go index 410baf80..9ce0096b 100644 --- a/db/db.go +++ b/db/db.go @@ -79,7 +79,7 @@ func (db database) Init() error { created_time BIGINT, selector VARCHAR(255), txid VARCHAR, - txindex INTEGER, + txindex BIGINT, amount VARCHAR(100), payload VARCHAR, phash VARCHAR, From ed3378efbce935f1f79efa9739c3fc8fe0c35ef3 Mon Sep 17 00:00:00 2001 From: Jaz Gulati Date: Fri, 2 Oct 2020 15:04:36 +1000 Subject: [PATCH 14/19] go: update darknode --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index f60ffc22..66f2ec3a 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/pierrec/xxHash v0.1.5 // indirect github.com/prometheus/tsdb v0.10.0 // indirect github.com/renproject/aw v0.4.0-9 - github.com/renproject/darknode v0.5.3-0.20201002022143-1217e7b73be2 + github.com/renproject/darknode v0.5.3-0.20201002050348-0e3b2e64ae63 github.com/renproject/id v0.4.2 github.com/renproject/kv v1.1.2 github.com/renproject/multichain v0.2.8-0.20200929114230-302423f836e7 diff --git a/go.sum b/go.sum index 2126ed00..fc789f46 100644 --- a/go.sum +++ b/go.sum @@ -1464,6 +1464,8 @@ github.com/renproject/darknode v0.5.3-0.20201001044422-e7b680305ffe h1:XnTx1Yw+E github.com/renproject/darknode v0.5.3-0.20201001044422-e7b680305ffe/go.mod h1:2TyT/EDLdiJ6bNRViElYhl0Xu4j4bno4TYhUYXmnJZ4= github.com/renproject/darknode v0.5.3-0.20201002022143-1217e7b73be2 h1:amCFK3nZegO9u+3iICtYjJYVOk8aG/dd+whbyk4mMJs= github.com/renproject/darknode v0.5.3-0.20201002022143-1217e7b73be2/go.mod h1:XSaLRnb/xCt8+IwN5IH1mPXx9RvCi4gigff9LQviPTY= +github.com/renproject/darknode v0.5.3-0.20201002050348-0e3b2e64ae63 h1:XtcGcBIXv7oi/OslAHy47QN/4ycKmA5ICUN2IZMYo6Y= +github.com/renproject/darknode v0.5.3-0.20201002050348-0e3b2e64ae63/go.mod h1:XSaLRnb/xCt8+IwN5IH1mPXx9RvCi4gigff9LQviPTY= github.com/renproject/id v0.4.2 h1:XseNDPPCJtsZjIWR7Qgf+zxy0Gt5xsLrfwpQxJt5wFQ= github.com/renproject/id v0.4.2/go.mod h1:bCzV4zZkyWetf0GvhJxMT9HQNnGUwzQpImtXOUXqq0k= github.com/renproject/kv v1.1.2 h1:P18yHdDVJTEZ9yeyx6o82ICY1m6f+VdtAt/ouZez+AU= From 4edd16870cd420e2a9c87060e39f528a9269974a Mon Sep 17 00:00:00 2001 From: Jaz Gulati Date: Wed, 7 Oct 2020 15:43:47 +1100 Subject: [PATCH 15/19] watcher: return on error --- watcher/watcher.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/watcher/watcher.go b/watcher/watcher.go index d91af3b7..49a32d49 100644 --- a/watcher/watcher.go +++ b/watcher/watcher.go @@ -123,11 +123,19 @@ func (watcher Watcher) watchLogShiftOuts(parent context.Context) { // Send the burn transaction to the resolver. params, err := watcher.burnToParams(iter.Event.Raw.TxHash.Bytes(), pack.NewU256FromU64(pack.NewU64(amount)), pack.String(to), nonceBytes, watcher.gpubkey) if err != nil { - watcher.logger.Infof("[watcher] cannot get params from burn transaction: %v", err) + watcher.logger.Errorf("[watcher] cannot get params from burn transaction: %v", err) + if err := watcher.cache.Set(watcher.key(), iter.Event.Raw.BlockNumber, 0).Err(); err != nil { + watcher.logger.Errorf("[watcher] error setting last checked block number in redis: %v", err) + } + return } response := watcher.resolver.SubmitTx(ctx, 0, ¶ms, nil) if response.Error != nil { - watcher.logger.Infof("[watcher] invalid burn transaction: %v", response.Error.Message) + watcher.logger.Errorf("[watcher] invalid burn transaction: %v", response.Error.Message) + if err := watcher.cache.Set(watcher.key(), iter.Event.Raw.BlockNumber, 0).Err(); err != nil { + watcher.logger.Errorf("[watcher] error setting last checked block number in redis: %v", err) + } + return } } if err := iter.Error(); err != nil { From 918ff9e32e8a447b71ca7c0c4ecff0852bd6f362 Mon Sep 17 00:00:00 2001 From: Jaz Gulati Date: Wed, 7 Oct 2020 15:47:07 +1100 Subject: [PATCH 16/19] watcher, lightnode: fetch dist pub key from env --- lightnode.go | 2 +- watcher/watcher.go | 17 +++-------------- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/lightnode.go b/lightnode.go index bdc5efc5..7e66a2e7 100644 --- a/lightnode.go +++ b/lightnode.go @@ -133,7 +133,7 @@ func New(options Options, ctx context.Context, logger logrus.FieldLogger, sqlDB if watchers[chain] == nil { watchers[chain] = map[multichain.Asset]watcher.Watcher{} } - watchers[chain][asset] = watcher.NewWatcher(logger, selector, verifierBindings, ethClients[chain], bindings, resolver, client, options.WatcherPollRate) + watchers[chain][asset] = watcher.NewWatcher(logger, selector, verifierBindings, ethClients[chain], bindings, resolver, client, options.DistPubKey, options.WatcherPollRate) } } diff --git a/watcher/watcher.go b/watcher/watcher.go index 49a32d49..f21c48e6 100644 --- a/watcher/watcher.go +++ b/watcher/watcher.go @@ -2,19 +2,18 @@ package watcher import ( "context" - "encoding/hex" "fmt" "time" "github.com/btcsuite/btcd/btcec" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" "github.com/go-redis/redis/v7" "github.com/renproject/darknode/jsonrpc" "github.com/renproject/darknode/tx" "github.com/renproject/darknode/txengine" "github.com/renproject/darknode/txengine/txenginebindings/ethereumbindings" + "github.com/renproject/id" "github.com/renproject/lightnode/resolver" "github.com/renproject/multichain" "github.com/renproject/pack" @@ -36,18 +35,8 @@ type Watcher struct { } // NewWatcher returns a new Watcher. -func NewWatcher(logger logrus.FieldLogger, selector tx.Selector, bindings txengine.Bindings, ethClient *ethclient.Client, ethBindings *ethereumbindings.MintGatewayLogicV1, resolver *resolver.Resolver, cache *redis.Client, pollInterval time.Duration) Watcher { - // TODO: This should be customisable based on the network. - pubKeyStr := "024c27e5610c701d857ff13464ea1592cf6e651bc6fde143f7d032b3298e7397e6" - pubKeyBytes, err := hex.DecodeString(pubKeyStr) - if err != nil { - panic(fmt.Sprintf("decoding public key: %v", err)) - } - pubKey, err := crypto.DecompressPubkey(pubKeyBytes) - if err != nil { - panic(fmt.Sprintf("decompressing public key: %v", err)) - } - gpubkey := (*btcec.PublicKey)(pubKey).SerializeCompressed() +func NewWatcher(logger logrus.FieldLogger, selector tx.Selector, bindings txengine.Bindings, ethClient *ethclient.Client, ethBindings *ethereumbindings.MintGatewayLogicV1, resolver *resolver.Resolver, cache *redis.Client, distPubKey *id.PubKey, pollInterval time.Duration) Watcher { + gpubkey := (*btcec.PublicKey)(distPubKey).SerializeCompressed() return Watcher{ logger: logger, gpubkey: gpubkey, From c14de5ad38d3dc2a03ed4cca9279831b649281f8 Mon Sep 17 00:00:00 2001 From: Jaz Gulati Date: Wed, 7 Oct 2020 16:04:49 +1100 Subject: [PATCH 17/19] watcher: fix error handling --- watcher/watcher.go | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/watcher/watcher.go b/watcher/watcher.go index f21c48e6..5d7e2968 100644 --- a/watcher/watcher.go +++ b/watcher/watcher.go @@ -112,19 +112,13 @@ func (watcher Watcher) watchLogShiftOuts(parent context.Context) { // Send the burn transaction to the resolver. params, err := watcher.burnToParams(iter.Event.Raw.TxHash.Bytes(), pack.NewU256FromU64(pack.NewU64(amount)), pack.String(to), nonceBytes, watcher.gpubkey) if err != nil { - watcher.logger.Errorf("[watcher] cannot get params from burn transaction: %v", err) - if err := watcher.cache.Set(watcher.key(), iter.Event.Raw.BlockNumber, 0).Err(); err != nil { - watcher.logger.Errorf("[watcher] error setting last checked block number in redis: %v", err) - } + watcher.logger.Fatalf("[watcher] cannot get params from burn transaction: %v", err) return } response := watcher.resolver.SubmitTx(ctx, 0, ¶ms, nil) if response.Error != nil { - watcher.logger.Errorf("[watcher] invalid burn transaction: %v", response.Error.Message) - if err := watcher.cache.Set(watcher.key(), iter.Event.Raw.BlockNumber, 0).Err(); err != nil { - watcher.logger.Errorf("[watcher] error setting last checked block number in redis: %v", err) - } - return + watcher.logger.Errorf("[watcher] invalid burn transaction %v: %v", params, response.Error.Message) + continue } } if err := iter.Error(); err != nil { From 98888b7a547bc3944508cbff6b1a1b7b99e0af22 Mon Sep 17 00:00:00 2001 From: Jaz Gulati Date: Wed, 7 Oct 2020 16:12:42 +1100 Subject: [PATCH 18/19] watcher: don't panic on error --- watcher/watcher.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/watcher/watcher.go b/watcher/watcher.go index 5d7e2968..af77b269 100644 --- a/watcher/watcher.go +++ b/watcher/watcher.go @@ -112,7 +112,7 @@ func (watcher Watcher) watchLogShiftOuts(parent context.Context) { // Send the burn transaction to the resolver. params, err := watcher.burnToParams(iter.Event.Raw.TxHash.Bytes(), pack.NewU256FromU64(pack.NewU64(amount)), pack.String(to), nonceBytes, watcher.gpubkey) if err != nil { - watcher.logger.Fatalf("[watcher] cannot get params from burn transaction: %v", err) + watcher.logger.Errorf("[watcher] cannot get params from burn transaction (to=%v, amount=%v, nonce=%v): %v", to, amount, nonce, err) return } response := watcher.resolver.SubmitTx(ctx, 0, ¶ms, nil) From b3f7ec249aa79919d6a5feddaa2f1fad426e8497 Mon Sep 17 00:00:00 2001 From: Jaz Gulati Date: Wed, 7 Oct 2020 16:36:20 +1100 Subject: [PATCH 19/19] watcher: continue upon error --- watcher/watcher.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/watcher/watcher.go b/watcher/watcher.go index af77b269..39174993 100644 --- a/watcher/watcher.go +++ b/watcher/watcher.go @@ -113,7 +113,7 @@ func (watcher Watcher) watchLogShiftOuts(parent context.Context) { params, err := watcher.burnToParams(iter.Event.Raw.TxHash.Bytes(), pack.NewU256FromU64(pack.NewU64(amount)), pack.String(to), nonceBytes, watcher.gpubkey) if err != nil { watcher.logger.Errorf("[watcher] cannot get params from burn transaction (to=%v, amount=%v, nonce=%v): %v", to, amount, nonce, err) - return + continue } response := watcher.resolver.SubmitTx(ctx, 0, ¶ms, nil) if response.Error != nil {