diff --git a/chain/starname/address.go b/chain/starname/address.go new file mode 100644 index 00000000..deb2f3da --- /dev/null +++ b/chain/starname/address.go @@ -0,0 +1,28 @@ +package starname + +import "github.com/renproject/multichain/chain/cosmos" + +type ( + // Address re-exports cosmos-compatible address + Address = cosmos.Address + + // AddressDecoder re-exports cosmos.AddressDecoder + AddressDecoder = cosmos.AddressDecoder + + // AddressEncoder re-exports cosmos.AddressEncoder + AddressEncoder = cosmos.AddressEncoder + + // AddressEncodeDecoder re-exports cosmos.AddressEncodeDecoder + AddressEncodeDecoder = cosmos.AddressEncodeDecoder +) + +var ( + // NewAddressDecoder re-exports cosmos.NewAddressDecoder + NewAddressDecoder = cosmos.NewAddressDecoder + + // NewAddressEncoder re-exports cosmos.NewAddressEncoder + NewAddressEncoder = cosmos.NewAddressEncoder + + // NewAddressEncodeDecoder re-exports cosmos.NewAddressEnodeDecoder + NewAddressEncodeDecoder = cosmos.NewAddressEncodeDecoder +) diff --git a/chain/starname/address_test.go b/chain/starname/address_test.go new file mode 100644 index 00000000..eacc1d01 --- /dev/null +++ b/chain/starname/address_test.go @@ -0,0 +1,23 @@ +package starname_test + +import ( + "github.com/renproject/multichain" + "github.com/renproject/multichain/chain/starname" + "github.com/renproject/pack" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +var _ = Describe("Starname", func() { + Context("when decoding address", func() { + Context("when decoding Starname address", func() { + It("should work", func() { + decoder := starname.NewAddressDecoder("star") + addrStr := "star1478t4fltj689nqu83vsmhz27quk7uggjwe96yk" + _, err := decoder.DecodeAddress(multichain.Address(pack.NewString(addrStr))) + Expect(err).ToNot(HaveOccurred()) + }) + }) + }) +}) diff --git a/chain/starname/starname.go b/chain/starname/starname.go new file mode 100644 index 00000000..55cf72d3 --- /dev/null +++ b/chain/starname/starname.go @@ -0,0 +1,38 @@ +package starname + +import ( + "github.com/iov-one/iovns/app" + "github.com/renproject/multichain/api/account" + "github.com/renproject/multichain/chain/cosmos" +) + +type ( + // Client re-exports cosmos.Client + Client = cosmos.Client + + // ClientOptions re-exports cosmos.ClientOptions + ClientOptions = cosmos.ClientOptions + + // TxBuilderOptions re-exports cosmos.TxBuilderOptions + TxBuilderOptions = cosmos.TxBuilderOptions +) + +var ( + // DefaultClientOptions re-exports default cosmos-compatible client options + DefaultClientOptions = cosmos.DefaultClientOptions + + // NewGasEstimator re-exports cosmos.NewGasEstimator + NewGasEstimator = cosmos.NewGasEstimator +) + +// NewClient returns returns a new Client with starname codec +func NewClient(opts ClientOptions) *Client { + return cosmos.NewClient(opts, app.MakeCodec(), "star") +} + +// NewTxBuilder returns an implementation of the transaction builder interface +// from the Cosmos Compat API, and exposes the functionality to build simple +// Starname transactions. +func NewTxBuilder(opts TxBuilderOptions, client *Client) account.TxBuilder { + return cosmos.NewTxBuilder(opts, client) +} diff --git a/chain/starname/starname_suite_test.go b/chain/starname/starname_suite_test.go new file mode 100644 index 00000000..c55595ab --- /dev/null +++ b/chain/starname/starname_suite_test.go @@ -0,0 +1,13 @@ +package starname_test + +import ( + "testing" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +func TestStarname(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Starname (IOV) Suite") +} diff --git a/chain/starname/starname_test.go b/chain/starname/starname_test.go new file mode 100644 index 00000000..8c4b5cbb --- /dev/null +++ b/chain/starname/starname_test.go @@ -0,0 +1,126 @@ +package starname_test + +import ( + "context" + "encoding/hex" + "os" + + "github.com/renproject/id" + "github.com/renproject/multichain" + "github.com/renproject/multichain/api/address" + "github.com/renproject/multichain/chain/starname" + "github.com/renproject/pack" + "github.com/renproject/surge" + "github.com/tendermint/tendermint/crypto/secp256k1" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +var _ = Describe("Starname", func() { + Context("when submitting transactions", func() { + Context("when sending IOV", func() { + It("should work", func() { + // create context for the test + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // Load private key, and assume that the associated address has + // funds to spend. You can do this by setting IOV_PK to the + // value specified in the `./multichaindeploy/.env` file. + pkEnv := os.Getenv("IOV_PK") + if pkEnv == "" { + panic("IOV_PK is undefined") + } + + pkBz, err := hex.DecodeString(pkEnv) + Expect(err).ToNot(HaveOccurred()) + + var pk secp256k1.PrivKeySecp256k1 + copy(pk[:], pkBz) + + var privKey id.PrivKey + err = surge.FromBinary(&privKey, pkBz) + Expect(err).NotTo(HaveOccurred()) + + addr := starname.Address(pk.PubKey().Address()) + + // random recipient + pkRecipient := secp256k1.GenPrivKey() + addrEncoder := starname.NewAddressEncoder("star") + recipient, err := addrEncoder.EncodeAddress(address.RawAddress(pack.Bytes(pkRecipient.PubKey().Address()))) + Expect(err).NotTo(HaveOccurred()) + + // instantiate a new client and avoid a port collision with terra and + // set BroadcastMode to block to avoid having to loop on client.Tx() + client := starname.NewClient( + starname.DefaultClientOptions(). + WithHost("http://0.0.0.0:46657"). + WithBroadcastMode("block"). + WithCoinDenom("tiov"), + ) + + nonce, err := client.AccountNonce(ctx, multichain.Address(addr.String())) + Expect(err).NotTo(HaveOccurred()) + + // create a new cosmos-compatible transaction builder + txBuilder := starname.NewTxBuilder(starname.TxBuilderOptions{ + ChainID: "testnet", + }, client) + + // build the transaction + payload := pack.NewBytes([]byte("multichain")) + amount := pack.NewU256FromU64(pack.U64(2000000)) + tx, err := txBuilder.BuildTx( + ctx, + multichain.Address(addr.String()), // from + recipient, // to + amount, // amount + nonce, // nonce + pack.NewU256FromU64(pack.U64(200000)), // gas limit + pack.NewU256FromU64(pack.U64(1)), // gas price + pack.NewU256FromU64(pack.U64(1)), // gas cap + payload, // memo + ) + Expect(err).NotTo(HaveOccurred()) + + // get the transaction bytes and sign it + sighashes, err := tx.Sighashes() + Expect(err).NotTo(HaveOccurred()) + Expect(len(sighashes)).To(Equal(1)) + hash := id.Hash(sighashes[0]) + sig, err := privKey.Sign(&hash) + Expect(err).NotTo(HaveOccurred()) + sigBytes, err := surge.ToBinary(sig) + Expect(err).NotTo(HaveOccurred()) + sig65 := pack.Bytes65{} + copy(sig65[:], sigBytes) + + // attach the signature to the transaction + pubKey := pk.PubKey().(secp256k1.PubKeySecp256k1) + err = tx.Sign( + []pack.Bytes65{sig65}, + pack.NewBytes(pubKey[:]), + ) + Expect(err).NotTo(HaveOccurred()) + + // submit the transaction to the chain + txHash := tx.Hash() + err = client.SubmitTx(ctx, tx) + Expect(err).NotTo(HaveOccurred()) + + // We don't need to loop due to instant finality and broadcast + // mode "block". If err == nil then we were successfully able to + // use the multichain to construct and submit a Starname (IOV) + // transaction! + foundTx, confs, err := client.Tx(ctx, txHash) + Expect(err).NotTo(HaveOccurred()) + Expect(confs.Uint64()).To(Equal(uint64(1))) + Expect(foundTx.Payload()).To(Equal(multichain.ContractCallData([]byte(string(payload))))) + Expect(foundTx.From()).To(Equal(multichain.Address(addr.String()))) + Expect(foundTx.To()).To(Equal(recipient)) + Expect(foundTx.Value()).To(Equal(amount)) + }) + }) + }) +}) diff --git a/go.mod b/go.mod index 0b489eae..94714f16 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,7 @@ require ( github.com/filecoin-project/go-jsonrpc v0.1.2-0.20201008195726-68c6a2704e49 github.com/filecoin-project/go-state-types v0.0.0-20201013222834-41ea465f274f github.com/filecoin-project/lotus v1.1.2 + github.com/iov-one/iovns v0.9.7 github.com/ipfs/go-cid v0.0.7 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/multiformats/go-varint v0.0.6 diff --git a/go.sum b/go.sum index 83c8ff33..7fcbb339 100644 --- a/go.sum +++ b/go.sum @@ -57,6 +57,7 @@ github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee/go.mod h1:W0GbEAA4 github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= @@ -82,6 +83,7 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= @@ -179,6 +181,7 @@ github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7 github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= 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.39.1-rc1/go.mod h1:soj4C8lIjJLeUQPBqrM+krbXdnF4cDKaaDgg1JIJYRU= 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-20180819234021-555e2067c45d h1:49RLWk1j44Xu4fjHb6JFYmeUnDORVwHNkDxaQ0ctCVU= @@ -208,6 +211,7 @@ github.com/davidlazar/go-crypto v0.0.0-20190912175916-7055855a373f h1:BOaYiTvg8p github.com/davidlazar/go-crypto v0.0.0-20190912175916-7055855a373f/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4= github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= +github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e h1:lj77EKYUpYXTd8CD/+QMIf8b6OIOTsfEBSXiAzuEHTU= github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e/go.mod h1:3ZQK6DMPSz/QZ73jlWxBtUhNA8xZx7LzUFSq/OfP8vk= github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= @@ -254,6 +258,7 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= github.com/ethereum/go-ethereum v1.9.5/go.mod h1:PwpWDrCLZrV+tfrhqqF6kPknbISMHaJv9Ln3kPCZLwY= github.com/ethereum/go-ethereum v1.9.20 h1:kk/J5OIoaoz3DRrCXznz3RGi212mHHXwzXlY/ZQxcj0= github.com/ethereum/go-ethereum v1.9.20/go.mod h1:JSSTypSMTkGZtAdAChH2wP5dZEvPGh3nUTuDpH+hNrg= @@ -269,6 +274,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.8.0/go.mod h1:3l45GVGkyrnYNl9HoIjnp2NnNWvh6hLAqD8yTfGjnw8= github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fd/go-nat v1.0.0/go.mod h1:BTBu/CKvMmOMUPkKVef1pngt2WFH/lg7E6yQnulfp6E= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.4 h1:gSNMv0qWwH16fGQs7ycOUrDjY6YCSsgLUl0I0KLjo8w= @@ -380,6 +387,7 @@ github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/status v1.0.3/go.mod h1:SavQ51ycCLnc7dGyJxp8YAmudx8xqiVrRf+6IXRsugc= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -529,6 +537,10 @@ github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NH 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= +github.com/iov-one/cosmos-sdk-crud v0.0.0-20200804183153-2b7470a92e52 h1:fCi/QCX1F8J61LrRsSmWBXpTVIdDFAi3Enf+6FQkd7g= +github.com/iov-one/cosmos-sdk-crud v0.0.0-20200804183153-2b7470a92e52/go.mod h1:wfvPz9CNFOERo+9wnq2jUeDKH6NHSrFtJcNA2oB6UdQ= +github.com/iov-one/iovns v0.9.7 h1:hcSUy5r/pMsWLZfTWRvSKGidnQHrtdgbF8Wy3anB4yI= +github.com/iov-one/iovns v0.9.7/go.mod h1:BmzELdFofTb2ImjagA4WB6ppbv/fsm06FyrZuUEpx9A= github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= @@ -720,6 +732,9 @@ github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZl github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jinzhu/gorm v1.9.14/go.mod h1:G3LB3wezTOWM2ITLzPxEXgSkOXAntiLHS7UdBefADcs= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= 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= @@ -771,6 +786,7 @@ github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.7.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-addr-util v0.0.2 h1:7cWK5cdA5x72jX0g8iLrQWm5TRJZ6CzGdPEhWj7plWU= @@ -1104,6 +1120,7 @@ github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= 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= @@ -1339,6 +1356,7 @@ github.com/prometheus/procfs v0.1.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rakyll/statik v0.1.6/go.mod h1:OEi9wJV/fMUAGx1eNjq75DKDsJVuEv1U0oYdX6GX8Zs= +github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmOeY0= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -1429,8 +1447,9 @@ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasO 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/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= +github.com/spf13/afero v1.2.2/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.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= @@ -1485,6 +1504,7 @@ github.com/tendermint/go-amino v0.15.1/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoM 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.33.5/go.mod h1:0yUs9eIuuDq07nQql9BmI30FtYGcEC60Tu5JzB5IezM= +github.com/tendermint/tendermint v0.33.6/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= @@ -1635,6 +1655,7 @@ golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -1645,6 +1666,7 @@ golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -1691,6 +1713,7 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1734,8 +1757,9 @@ golang.org/x/net v0.0.0-20200519113804-d87ec0cfa476/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200904194848-62affa334b73 h1:MXfv8rhZWmFeqX3GNZRsd6vOLoaCHjYEX3qkRo3YBUA= +golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= diff --git a/infra/.env b/infra/.env index 92ced4f5..51f65a7a 100644 --- a/infra/.env +++ b/infra/.env @@ -58,6 +58,17 @@ export ETHEREUM_ADDRESS=0xa0df350d2637096571F7A701CBc1C5fdE30dF76A export FILECOIN_PK=7b2254797065223a22736563703235366b31222c22507269766174654b6579223a22756d6a634e436a487a5438455757485849754a4c4b58745035437153323435666238626c656c756e5448493d227d export FILECOIN_ADDRESS=f1ej2tountzqwnu6uswhqdzvw6yy5xvcig6rxl2qa +# +# Starname (IOV) +# + +# Starname (IOV) address that will have plenty funds. Generally, this is set to an +# address for which the private key is known by a test suite. This allows the test +# suite access to plenty of testing funds. +# celery tooth legend old stuff sentence night fossil original twin gorilla cup +export IOV_PK=784f100c54e1b6b1f6749496697e6d4b4c902b44992ea0e6b684840dc168e57d +export IOV_ADDRESS=star1zw4wpwvr6fz9hw2p6d8x7pdhczaulavp3qs8pm + # # Terra # diff --git a/infra/docker-compose.yaml b/infra/docker-compose.yaml index b30be3fb..47a175f0 100644 --- a/infra/docker-compose.yaml +++ b/infra/docker-compose.yaml @@ -125,17 +125,17 @@ services: entrypoint: - "./root/run.sh" - # - # Zcash - # - zcash: + ## + ## Starname (IOV) + ## + starname: build: - context: ./zcash + context: ./starname ports: - - "0.0.0.0:18232:18232" + - "0.0.0.0:46657:46657" entrypoint: - "./root/run.sh" - - "${ZCASH_ADDRESS}" + - "${IOV_ADDRESS}" ## ## Terra @@ -148,3 +148,15 @@ services: entrypoint: - "./root/run.sh" - "${TERRA_ADDRESS}" + + # + # Zcash + # + zcash: + build: + context: ./zcash + ports: + - "0.0.0.0:18232:18232" + entrypoint: + - "./root/run.sh" + - "${ZCASH_ADDRESS}" diff --git a/infra/starname/Dockerfile b/infra/starname/Dockerfile new file mode 100644 index 00000000..b9ca676c --- /dev/null +++ b/infra/starname/Dockerfile @@ -0,0 +1,17 @@ +FROM ubuntu:xenial + +RUN apt-get update --fix-missing && apt-get install --yes software-properties-common wget +RUN wget -c https://github.com/iov-one/iovns/releases/download/v0.9.4/iovns-0.9.4-linux-amd64.tar.gz -O - | tar xz +RUN mkdir -p /app/bin +RUN mv ./iovnsd ./iovnscli /app/bin +RUN chmod +x /app/bin/iovnsd +RUN chmod +x /app/bin/iovnscli +RUN ln -s /app/bin/iovnsd /usr/bin/iovnsd +RUN ln -s /app/bin/iovnscli /usr/bin/iovnscli + +COPY run.sh /root/run.sh +RUN chmod +x /root/run.sh + +EXPOSE 46657 + +ENTRYPOINT ["./root/run.sh"] diff --git a/infra/starname/run.sh b/infra/starname/run.sh new file mode 100644 index 00000000..5e312619 --- /dev/null +++ b/infra/starname/run.sh @@ -0,0 +1,21 @@ +#!/bin/bash +ADDRESS=$1 + +# Print setup +echo "IOV_ADDRESS=$ADDRESS" + +# Register client key +iovnscli keys add validator --keyring-backend=test +echo $(iovnscli keys show validator --keyring-backend=test) + +# Initialize testnet +iovnsd init testnet --chain-id testnet +iovnsd add-genesis-account $(iovnscli keys show validator -a --keyring-backend=test) 10000000000tiov +iovnsd add-genesis-account $ADDRESS 10000000000tiov +iovnsd gentx --amount 10000000000tiov --name validator --keyring-backend=test +iovnsd collect-gentxs +sed -i 's/stake/tiov/g' ~/.iovnsd/config/genesis.json +iovnsd validate-genesis + +# Start iovnsd +iovnsd start --rpc.laddr "tcp://0.0.0.0:46657" diff --git a/multichain.go b/multichain.go index 436a7fc0..323ae372 100644 --- a/multichain.go +++ b/multichain.go @@ -108,6 +108,7 @@ const ( ETH = Asset("ETH") // Ether FIL = Asset("FIL") // Filecoin FTM = Asset("FTM") // Fantom + IOV = Asset("IOV") // Starname (IOV) SOL = Asset("SOL") // Solana LUNA = Asset("LUNA") // Luna ZEC = Asset("ZEC") // Zcash @@ -142,6 +143,8 @@ func (asset Asset) OriginChain() Chain { return Filecoin case FTM: return Fantom + case IOV: + return Starname case LUNA: return Terra case SOL: @@ -169,7 +172,7 @@ func (asset Asset) ChainType() ChainType { switch asset { case BCH, BTC, DGB, DOGE, ZEC: return ChainTypeUTXOBased - case BNB, ETH, FIL, LUNA: + case BNB, ETH, FIL, LUNA, IOV: return ChainTypeAccountBased // These assets are handled separately because they are mock assets. These @@ -218,6 +221,7 @@ const ( Ethereum = Chain("Ethereum") Fantom = Chain("Fantom") Filecoin = Chain("Filecoin") + Starname = Chain("Starname (IOV)") Solana = Chain("Solana") Terra = Chain("Terra") Zcash = Chain("Zcash") @@ -254,7 +258,7 @@ func (chain Chain) ChainType() ChainType { switch chain { case Bitcoin, BitcoinCash, DigiByte, Dogecoin, Zcash: return ChainTypeUTXOBased - case BinanceSmartChain, Ethereum, Filecoin, Terra: + case BinanceSmartChain, Ethereum, Filecoin, Terra, Starname: return ChainTypeAccountBased // These chains are handled separately because they are mock chains. These @@ -300,6 +304,8 @@ func (chain Chain) NativeAsset() Asset { return ETH case Filecoin: return FIL + case Starname: + return IOV case Terra: return LUNA case Zcash: