Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Channel #3

Merged
merged 10 commits into from
Sep 11, 2023
54 changes: 54 additions & 0 deletions channel/backend.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package channel

import (
"crypto/sha256"
"perun.network/go-perun/channel"
"perun.network/go-perun/wallet"
"perun.network/perun-stellar-backend/channel/types"
"perun.network/perun-stellar-backend/wire"
)

type backend struct{}

var Backend = backend{}

func init() {
channel.SetBackend(Backend)
}

func (b backend) CalcID(params *channel.Params) channel.ID {
wp := wire.MustMakeParams(*params)
bytes, err := wp.MarshalBinary()
if err != nil {
panic(err)
}
return sha256.Sum256(bytes)
}

func (b backend) Sign(account wallet.Account, state *channel.State) (wallet.Sig, error) {
bytes, err := EncodeState(state)
if err != nil {
return nil, err
}
return account.SignData(bytes)
}

func (b backend) Verify(addr wallet.Address, state *channel.State, sig wallet.Sig) (bool, error) {
bytes, err := EncodeState(state)
if err != nil {
return false, err
}
return wallet.VerifySignature(bytes, sig, addr)
}

func (b backend) NewAsset() channel.Asset {
return &types.StellarAsset{}
}

func EncodeState(state *channel.State) ([]byte, error) {
ws, err := wire.MakeState(*state)
if err != nil {
return nil, err
}
return ws.MarshalBinary()
}
8 changes: 8 additions & 0 deletions channel/test/init.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package test

import "perun.network/go-perun/channel/test"

func init() {
test.SetRandomizer(&Randomizer{})

}
17 changes: 17 additions & 0 deletions channel/test/randomizer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package test

iljabvh marked this conversation as resolved.
Show resolved Hide resolved
import (
"math/rand"

"perun.network/go-perun/channel"
"perun.network/go-perun/channel/test"
"perun.network/perun-stellar-backend/channel/types"
)

type Randomizer struct{}

func (*Randomizer) NewRandomAsset(*rand.Rand) channel.Asset {
return &types.StellarAsset{}
}

var _ test.Randomizer = (*Randomizer)(nil)
112 changes: 112 additions & 0 deletions channel/types/asset.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
package types

import (
"errors"
"github.com/stellar/go/keypair"
"github.com/stellar/go/xdr"
"perun.network/go-perun/channel"
)

const HashLenXdr = 32

type StellarAsset struct {
contractID xdr.Hash
}

func (s StellarAsset) ContractID() xdr.Hash {
return s.contractID
}

func NewStellarAsset(contractID xdr.Hash) *StellarAsset {
return &StellarAsset{contractID: contractID}
}

func (s StellarAsset) MarshalBinary() (data []byte, err error) {
return s.contractID.MarshalBinary()
}

func (s *StellarAsset) UnmarshalBinary(data []byte) error {
var addr [HashLenXdr]byte
copy(addr[:], data)
err := s.contractID.UnmarshalBinary(data)
if err != nil {
panic(err)
iljabvh marked this conversation as resolved.
Show resolved Hide resolved
}
return nil
}

func (s StellarAsset) Equal(asset channel.Asset) bool {
_, ok := asset.(*StellarAsset)
return ok
}

func (s StellarAsset) MakeScAddress() (xdr.ScAddress, error) {
hash := s.contractID
scvAddr, err := MakeContractAddress(hash)
if err != nil {
panic(err)
iljabvh marked this conversation as resolved.
Show resolved Hide resolved
}
return scvAddr, nil
}

func (s *StellarAsset) FromScAddress(address xdr.ScAddress) error {
addrType := address.Type
if addrType != xdr.ScAddressTypeScAddressTypeContract {
return errors.New("invalid address type")
}

s.contractID = *address.ContractId
return nil
}

func NewStellarAssetFromScAddress(address xdr.ScAddress) (*StellarAsset, error) {
s := &StellarAsset{}
err := s.FromScAddress(address)
if err != nil {
return nil, err
}
return s, nil
}

func MustStellarAsset(asset channel.Asset) *StellarAsset {
p, ok := asset.(*StellarAsset)
if !ok {
panic("Asset has invalid type")
}
return p
}

func ToStellarAsset(asset channel.Asset) (*StellarAsset, error) {
p, ok := asset.(*StellarAsset)
if !ok {
return nil, errors.New("asset has invalid type")
}
return p, nil
}

func MakeAccountAddress(kp keypair.KP) (xdr.ScAddress, error) {
accountId, err := xdr.AddressToAccountId(kp.Address())
if err != nil {
return xdr.ScAddress{}, err
}
return xdr.NewScAddress(xdr.ScAddressTypeScAddressTypeAccount, accountId)
}

func MakeContractAddress(contractID xdr.Hash) (xdr.ScAddress, error) {
if len(contractID) != HashLenXdr {
return xdr.ScAddress{}, errors.New("invalid contractID length for xdr.Hash")
}

iljabvh marked this conversation as resolved.
Show resolved Hide resolved
return xdr.NewScAddress(xdr.ScAddressTypeScAddressTypeContract, contractID)
}

func ToAccountAddress(address xdr.ScAddress) (keypair.FromAddress, error) {
if address.Type != xdr.ScAddressTypeScAddressTypeAccount {
return keypair.FromAddress{}, errors.New("invalid address type")
}
kp, err := keypair.ParseAddress(address.AccountId.Address())
if err != nil {
return keypair.FromAddress{}, err
}
return *kp, nil
}
44 changes: 44 additions & 0 deletions channel/types/asset_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package types_test

iljabvh marked this conversation as resolved.
Show resolved Hide resolved
import (
"bytes"
"github.com/stellar/go/keypair"
"github.com/stellar/go/xdr"
"perun.network/perun-stellar-backend/channel/types"
"testing"
)

func TestMarshalAndUnmarshalBinary(t *testing.T) {
var hash xdr.Hash
copy(hash[:], []byte("testhashfortestingonly!testhash"))

asset := types.NewStellarAsset(hash)

data, err := asset.MarshalBinary()
if err != nil {
t.Fatal(err)
}

newAsset := &types.StellarAsset{}
err = newAsset.UnmarshalBinary(data)
if err != nil {
t.Fatal(err)
}

if !bytes.Equal([]byte(newAsset.ContractID().HexString()), []byte(asset.ContractID().HexString())) {
t.Fatalf("expected %x, got %x", asset.ContractID(), newAsset.ContractID())
}
}

func TestMakeAccountAddress(t *testing.T) {
kp, _ := keypair.Random()

address, err := types.MakeAccountAddress(kp)
if err != nil {
t.Fatal(err)
}

if address.Type != xdr.ScAddressTypeScAddressTypeAccount {
t.Fatalf("expected account address type, got %v", address.Type)
}
}
17 changes: 13 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,27 @@ module perun.network/perun-stellar-backend

go 1.19

require github.com/stellar/go v0.0.0-20230718034032-95c2976a11f2
require github.com/stellar/go v0.0.0-20230905170723-6e18a2f2f583

require (
github.com/stretchr/testify v1.7.0
github.com/stellar/go-xdr v0.0.0-20211103144802-8017fc4bdfee
github.com/stretchr/testify v1.8.1
perun.network/go-perun v0.10.6
polycry.pt/poly-go v0.0.0-20220222131629-aa4bdbaab60b
)

require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/go-chi/chi v4.0.3+incompatible // indirect
github.com/go-errors/errors v0.0.0-20150906023321-a41850380601 // indirect
github.com/gorilla/schema v1.1.0 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/manucorporat/sse v0.0.0-20160126180136-ee05b128a739 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/stellar/go-xdr v0.0.0-20211103144802-8017fc4bdfee // indirect
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect
github.com/segmentio/go-loggly v0.5.1-0.20171222203950-eb91657e62b2 // indirect
github.com/sirupsen/logrus v1.8.1 // indirect
github.com/stretchr/objx v0.5.0 // indirect
golang.org/x/sys v0.11.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
77 changes: 63 additions & 14 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,33 +1,82 @@
github.com/ajg/form v0.0.0-20160822230020-523a5da1a92f h1:zvClvFQwU++UpIUBGC8YmDlfhUrweEy1R1Fj1gu5iIM=
github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=
github.com/fatih/structs v1.0.0 h1:BrX964Rv5uQ3wwS+KRUAJCBBw5PQmgJfJ6v4yly5QwU=
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
github.com/gavv/monotime v0.0.0-20161010190848-47d58efa6955 h1:gmtGRvSexPU4B1T/yYo0sLOKzER1YT+b4kPxPpm0Ty4=
github.com/go-chi/chi v4.0.3+incompatible h1:gakN3pDJnzZN5jqFV2TEdF66rTfKeITyR8qu6ekICEY=
github.com/go-chi/chi v4.0.3+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
github.com/go-errors/errors v0.0.0-20150906023321-a41850380601 h1:jxTbmDuqQUTI6MscgbqB39vtxGfr2fi61nYIcFQUnlE=
github.com/go-errors/errors v0.0.0-20150906023321-a41850380601/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/go-querystring v0.0.0-20160401233042-9235644dd9e5 h1:oERTZ1buOUYlpmKaqlO5fYmz8cZ1rYu5DieJzF4ZVmU=
github.com/gorilla/schema v1.1.0 h1:CamqUDOFUBqzrvxuz2vEwo8+SUdwsluFh7IlzJh30LY=
github.com/gorilla/schema v1.1.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU=
github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk=
github.com/jarcoal/httpmock v0.0.0-20161210151336-4442edb3db31 h1:Aw95BEvxJ3K6o9GGv5ppCd1P8hkeIeEJ30FO+OhOJpM=
github.com/klauspost/compress v1.15.0 h1:xqfchp4whNFxn5A4XFyyYtitiWI8Hy5EW59jEwcyL6U=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs=
github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/manucorporat/sse v0.0.0-20160126180136-ee05b128a739 h1:ykXz+pRRTibcSjG1yRhpdSHInF8yZY/mfn+Rz2Nd1rE=
github.com/manucorporat/sse v0.0.0-20160126180136-ee05b128a739/go.mod h1:zUx1mhth20V3VKgL5jbd1BSQcW4Fy6Qs4PZvQwRFwzM=
github.com/moul/http2curl v0.0.0-20161031194548-4e24498b31db h1:eZgFHVkk9uOTaOQLC6tgjkzdp7Ays8eEVecBcfHZlJQ=
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stellar/go v0.0.0-20230718034032-95c2976a11f2 h1:puur8PRJFs+o3CFEUf5FF/w3kOVAd1bvK9PU9jr3ouA=
github.com/stellar/go v0.0.0-20230718034032-95c2976a11f2/go.mod h1:iTkyf5zUHlaIjZjyxaLLXLv+YHqg3etsqn8AOQ+DvG8=
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
github.com/segmentio/go-loggly v0.5.1-0.20171222203950-eb91657e62b2 h1:S4OC0+OBKz6mJnzuHioeEat74PuQ4Sgvbf8eus695sc=
github.com/segmentio/go-loggly v0.5.1-0.20171222203950-eb91657e62b2/go.mod h1:8zLRYR5npGjaOXgPSKat5+oOh+UHd8OdbS18iqX9F6Y=
github.com/sergi/go-diff v0.0.0-20161205080420-83532ca1c1ca h1:oR/RycYTFTVXzND5r4FdsvbnBn0HJXSVeNAnwaTXRwk=
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/stellar/go v0.0.0-20230901231653-c146db6b0c11 h1:b47q1il6CaPIBPdcUrVhtc4Gn+EWN6dFRjd/bsTNQ+U=
github.com/stellar/go v0.0.0-20230901231653-c146db6b0c11/go.mod h1:5/qoLl0pexA5OPi0BZvDsOc3532CJlHuRg1dnBxbsGg=
github.com/stellar/go v0.0.0-20230905170723-6e18a2f2f583 h1:oC7naR8IBqtWV/b+G91gTOe+jR52+GpkXhCxEyYawYY=
github.com/stellar/go v0.0.0-20230905170723-6e18a2f2f583/go.mod h1:5/qoLl0pexA5OPi0BZvDsOc3532CJlHuRg1dnBxbsGg=
github.com/stellar/go-xdr v0.0.0-20211103144802-8017fc4bdfee h1:fbVs0xmXpBvVS4GBeiRmAE3Le70ofAqFMch1GTiq/e8=
github.com/stellar/go-xdr v0.0.0-20211103144802-8017fc4bdfee/go.mod h1:yoxyU/M8nl9LKeWIoBrbDPQ7Cy+4jxRcWcOayZ4BMps=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/fasthttp v1.34.0 h1:d3AAQJ2DRcxJYHm7OXNXtXt2as1vMDfxeIcFvhmGGm4=
github.com/xdrpp/goxdr v0.1.1 h1:E1B2c6E8eYhOVyd7yEpOyopzTPirUeF6mVOfXfGyJyc=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s=
golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY=
github.com/xeipuuv/gojsonpointer v0.0.0-20151027082146-e0fe6f683076 h1:KM4T3G70MiR+JtqplcYkNVoNz7pDwYaBxWBXQK804So=
github.com/xeipuuv/gojsonreference v0.0.0-20150808065054-e02fc20de94c h1:XZWnr3bsDQWAZg4Ne+cPoXRPILrNlPNQfxBuwLl43is=
github.com/xeipuuv/gojsonschema v0.0.0-20161231055540-f06f290571ce h1:cVSRGH8cOveJNwFEEZLXtB+XMnRqKLjUP6V/ZFYQCXI=
github.com/yalp/jsonpath v0.0.0-20150812003900-31a79c7593bb h1:06WAhQa+mYv7BiOk13B/ywyTlkoE/S7uu6TBKU6FHnE=
github.com/yudai/gojsondiff v0.0.0-20170107030110-7b1b7adf999d h1:yJIizrfO599ot2kQ6Af1enICnwBD3XoxgX3MrMwot2M=
github.com/yudai/golcs v0.0.0-20150405163532-d1c525dea8ce h1:888GrqRxabUce7lj4OaoShPxodm3kXOMpSa85wdYzfY=
golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ=
golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
gopkg.in/gavv/httpexpect.v1 v1.0.0-20170111145843-40724cf1e4a0 h1:r5ptJ1tBxVAeqw4CrYWhXIMr0SybY3CDHuIbCg5CFVw=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
perun.network/go-perun v0.10.6 h1:uj1e33yfCSfE75DK/uwjNp+TwvGG85Qhi6HuYQ9EPrQ=
perun.network/go-perun v0.10.6/go.mod h1:BGBZC3npkX457u87pjDd0NEIXr1a4dsH4H/YpLdGGe8=
polycry.pt/poly-go v0.0.0-20220222131629-aa4bdbaab60b h1:BJsSrLQ3kLRNYXNqly//IYeXlVmAhpI5wYbg2WD1wR0=
Expand Down
Loading