Skip to content

Commit

Permalink
client/core: store swap/redeem immediately after bcast
Browse files Browse the repository at this point in the history
  • Loading branch information
chappjc committed Feb 22, 2021
1 parent a7b5aa0 commit e8a42ef
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 44 deletions.
41 changes: 31 additions & 10 deletions client/core/core_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2728,7 +2728,7 @@ func TestTradeTracking(t *testing.T) {
auditInfo.expiration = matchTime.Add(tracker.lockTimeTaker)

// success, full handleAuditRoute>processAuditMsg>auditContract
rig.db.updateMatchChan = make(chan order.MatchStatus, 1)
rig.db.updateMatchChan = make(chan order.MatchStatus, 2)
err = handleAuditRoute(tCore, rig.dc, msg)
if err != nil {
t.Fatalf("audit error: %v", err)
Expand Down Expand Up @@ -2762,7 +2762,12 @@ func TestTradeTracking(t *testing.T) {
tBtcWallet.redeemCoins = []dex.Bytes{redeemCoin}
rig.ws.queueResponse(msgjson.RedeemRoute, redeemAcker)
tCore.tickAsset(dc, tBTC.ID)
// TakerSwapCast -> MatchComplete (MakerRedeem skipped when redeem ack is received with valid sig)
status = <-rig.db.updateMatchChan
// TakerSwapCast -> MakerRedeemed after broadcast, before redeem request
if status != order.MakerRedeemed {
t.Fatalf("wrong match status wanted %v, got %v", order.MatchComplete, status)
}
// TakerSwapCast -> MatchComplete after redeem request
status = <-rig.db.updateMatchChan
if status != order.MatchComplete {
t.Fatalf("wrong match status wanted %v, got %v", order.MatchComplete, status)
Expand Down Expand Up @@ -2848,7 +2853,7 @@ func TestTradeTracking(t *testing.T) {
if !bytes.Equal(proof.MakerSwap, audit.CoinID) {
t.Fatalf("maker redeem coin not set")
}
<-rig.db.updateMatchChan
<-rig.db.updateMatchChan // counterparty audit
if !bytes.Equal(auth.AuditSig, audit.Sig) {
t.Fatalf("audit sig not set for taker")
}
Expand All @@ -2873,6 +2878,7 @@ func TestTradeTracking(t *testing.T) {
if len(proof.TakerSwap) == 0 {
t.Fatalf("swap not broadcast with confirmations")
}
<-rig.db.updateMatchChan // initsig update after init response

// Receive the maker's redemption.
redemptionCoin := encode.RandomBytes(36)
Expand Down Expand Up @@ -2909,7 +2915,7 @@ func TestTradeTracking(t *testing.T) {
if err != nil {
t.Fatalf("should have worked, got: %v", err)
}
// For taker there's one status update to MakerRedeemed on bcast...
// For taker there's one status update to MakerRedeemed prior to bcast...
status = <-rig.db.updateMatchChan
if status != order.MakerRedeemed {
t.Fatalf("wrong match status wanted %v, got %v", order.MakerRedeemed, status)
Expand All @@ -2926,6 +2932,11 @@ func TestTradeTracking(t *testing.T) {
if len(proof.TakerRedeem) == 0 {
t.Fatalf("taker redemption not sent")
}
<-rig.db.updateMatchChan // RedeemSig after 'redeem' request response
if len(auth.RedeemSig) == 0 {
t.Fatalf("redeem sig not recorded for valid redeem ack")
}

rig.db.updateMatchChan = nil
tBtcWallet.redeemErrChan = nil

Expand Down Expand Up @@ -3405,7 +3416,7 @@ func TestRefunds(t *testing.T) {
}
checkStatus("taker matched", match, order.NewlyMatched)
// Send through the audit request for the maker's init.
rig.db.updateMatchChan = make(chan order.MatchStatus, 1)
rig.db.updateMatchChan = make(chan order.MatchStatus, 2)
audit, auditInfo = tMsgAudit(loid, mid, addr, matchSize, nil)
tBtcWallet.auditInfo = auditInfo
auditInfo.expiration = encode.DropMilliseconds(matchTime.Add(tracker.lockTimeMaker))
Expand Down Expand Up @@ -3435,6 +3446,17 @@ func TestRefunds(t *testing.T) {
if !bytes.Equal(match.MetaData.Proof.Script, counterScript) {
t.Fatalf("invalid contract recorded for Taker swap")
}
// still takerswapcast, but with initsig
status = <-rig.db.updateMatchChan
if status != order.TakerSwapCast {
t.Fatalf("wrong match status wanted %v, got %v", order.TakerSwapCast, status)
}
// , metaData := match.Match, match.MetaData
auth := &match.MetaData.Proof.Auth
// proof := &metaData.Proof
if len(auth.InitSig) == 0 {
t.Fatalf("init sig not recorded for valid init ack")
}

// Attempt refund.
rig.db.updateMatchChan = nil
Expand Down Expand Up @@ -4096,17 +4118,16 @@ func TestLogout(t *testing.T) {
}
rig.dc.trades[ord.ID()] = tracker

dc, _, _ := testDexConnection(rig.core.ctx)
initUserAssets := func() {
tCore.user = new(User)
dc.assetsMtx.Lock()
tCore.user.Assets = make(map[uint32]*SupportedAsset, len(dc.assets))
for assetsID := range dc.assets {
rig.dc.assetsMtx.Lock()
tCore.user.Assets = make(map[uint32]*SupportedAsset, len(rig.dc.assets))
for assetsID := range rig.dc.assets {
tCore.user.Assets[assetsID] = &SupportedAsset{
ID: assetsID,
}
}
dc.assetsMtx.Unlock()
rig.dc.assetsMtx.Unlock()
}

ensureErr := func(tag string) {
Expand Down
70 changes: 46 additions & 24 deletions client/core/trade.go
Original file line number Diff line number Diff line change
Expand Up @@ -1418,14 +1418,31 @@ func (c *Core) swapMatchGroup(t *trackedTrade, matches []*matchTracker, errs *er
// Add any errors encountered to `errs` and proceed to next match
// to ensure that swap details are saved for all matches.
for i, receipt := range receipts {
// Save the contract script swap coin ID to the DB before attempting the
// init request, which can be slow.
match := matches[i]
coin := receipt.Coin()
coinID, contract := coin.ID(), receipt.Contract()
proof := &match.MetaData.Proof
proof.Script = contract
if match.Match.Side == order.Taker {
proof.TakerSwap = []byte(coinID)
match.SetStatus(order.TakerSwapCast)
} else {
proof.MakerSwap = []byte(coinID)
match.SetStatus(order.MakerSwapCast)
}
if err := t.db.UpdateMatch(&match.MetaMatch); err != nil {
errs.add("error storing swap details in database for match %s, coin %s: %v",
match.id, coinIDString(t.wallets.fromAsset.ID, coinID), err)
}

c.log.Infof("Contract coin %v (%s), value = %d, refundable at %v (script = %v)",
coin, t.wallets.fromAsset.Symbol, coin.Value(), receipt.Expiration(), receipt.Contract())
coin, t.wallets.fromAsset.Symbol, coin.Value(), receipt.Expiration(), contract)
if secret := match.MetaData.Proof.Secret; len(secret) > 0 {
c.log.Tracef("Contract coin %v secret = %x", coin, secret)
}
err := c.finalizeSwapAction(t, match, coin.ID(), receipt.Contract())
err := c.finalizeSwapAction(t, match, coinID, contract)
if err != nil {
errs.addErr(err)
}
Expand All @@ -1443,12 +1460,15 @@ func (c *Core) swapMatchGroup(t *trackedTrade, matches []*matchTracker, errs *er
// This method modifies match fields and MUST be called with the trackedTrade
// mutex lock held for writes.
func (c *Core) finalizeSwapAction(t *trackedTrade, match *matchTracker, coinID, contract []byte) error {
_, _, proof, auth := match.parts()
auth := &match.MetaData.Proof.Auth
if len(auth.InitSig) != 0 {
return fmt.Errorf("'init' already sent for match %v", match.id)
}
errs := newErrorSet("")

c.log.Infof("Notifying DEX %s of our %s swap contract %v for match %v",
t.dc.acct.host, t.wallets.fromAsset.Symbol, coinIDString(t.fromAssetID, coinID), match.id)

// attempt to send `init` request and validate server ack.
ack := new(msgjson.Acknowledgement)
init := &msgjson.Init{
Expand All @@ -1473,15 +1493,7 @@ func (c *Core) finalizeSwapAction(t *trackedTrade, match *matchTracker, coinID,
errs.add("'init' ack signature error for match %s: %v", match.id, err)
}

// Update the match db data with the swap details.
proof.Script = contract
if match.Match.Side == order.Taker {
proof.TakerSwap = coinID
match.SetStatus(order.TakerSwapCast)
} else {
proof.MakerSwap = coinID
match.SetStatus(order.MakerSwapCast)
}
// Update the match db data with the init response signature.
if len(ack.Sig) != 0 {
auth.InitSig = ack.Sig
auth.InitStamp = encode.UnixMilliU(time.Now())
Expand Down Expand Up @@ -1601,7 +1613,23 @@ func (c *Core) redeemMatchGroup(t *trackedTrade, matches []*matchTracker, errs *

// Send the redemption information to the DEX.
for i, match := range matches {
err := c.finalizeRedeemAction(t, match, coinIDs[i])
// Save the redeem coin ID to the DB before attempting the redeem
// request, which can be slow.
coinID := coinIDs[i]
proof := &match.MetaData.Proof
if match.Match.Side == order.Taker {
match.SetStatus(order.MatchComplete)
proof.TakerRedeem = []byte(coinID)
} else {
match.SetStatus(order.MakerRedeemed) // MatchComplete after redeem response
proof.MakerRedeem = []byte(coinID)
}
if err := t.db.UpdateMatch(&match.MetaMatch); err != nil {
errs.add("error storing redeem details in database for match %s, coin %s: %v",
match.id, coinIDString(t.wallets.toAsset.ID, coinID), err)
}

err := c.finalizeRedeemAction(t, match, coinID)
if err != nil {
errs.addErr(err)
}
Expand All @@ -1628,6 +1656,8 @@ func (c *Core) finalizeRedeemAction(t *trackedTrade, match *matchTracker, coinID
// Not necessary for revoked matches.
var needsResolution bool
if !proof.IsRevoked() {
c.log.Infof("Notifying DEX %s of our %s swap redemption %v for match %v",
t.dc.acct.host, t.wallets.toAsset.Symbol, coinIDString(t.wallets.toAsset.ID, coinID), match.id)
msgRedeem := &msgjson.Redeem{
OrderID: t.ID().Bytes(),
MatchID: match.id.Bytes(),
Expand All @@ -1654,18 +1684,10 @@ func (c *Core) finalizeRedeemAction(t *trackedTrade, match *matchTracker, coinID
}
}

if match.Match.Side == order.Taker {
if len(auth.RedeemSig) > 0 {
// As maker, this is the end. However, this diverges from server, which
// is still needs taker's redeem. Taker has already set MatchComplete.
match.SetStatus(order.MatchComplete)
proof.TakerRedeem = coinID
} else {
if len(auth.RedeemSig) > 0 {
// As maker, this is the end. However, this diverges from server,
// which is still needs taker's redeem.
match.SetStatus(order.MatchComplete)
} else {
match.SetStatus(order.MakerRedeemed)
}
proof.MakerRedeem = coinID
}
if err := t.db.UpdateMatch(&match.MetaMatch); err != nil {
errs.add("error storing redeem details in database for match %s, coin %s: %v",
Expand Down
10 changes: 0 additions & 10 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
decred.org/cspp v0.2.0/go.mod h1:KVnB49sueBFCldRa/ivZCaWZbrPNEiXWwxHCf1jTYKI=
github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg=
github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 h1:w1UutsfOrms1J05zt7ISrnJIXKzwaspym5BTKGx93EI=
github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412/go.mod h1:WPjqKcmVOxf0XSf3YxCJs6N6AOSrOx3obionmG7T0y0=
Expand All @@ -21,7 +20,6 @@ github.com/btcsuite/snappy-go v1.0.0 h1:ZxaA6lo2EpxGddsA8JwWOcxlzRybb444sgmeJQMJ
github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc=
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=
github.com/btcsuite/winsvc v1.0.0 h1:J9B4L7e3oqhXOcm+2IuNApwzQec85lE+QaikUcCs+dk=
github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=
github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
Expand All @@ -31,7 +29,6 @@ github.com/dchest/blake256 v1.0.0/go.mod h1:xXNWCE1jsAP8DAjP+rKw2MbeqLczjI3TRx2V
github.com/dchest/siphash v1.2.1 h1:4cLinnzVJDKxTCl9B01807Yiy+W7ZzVHj/KIroQRvT4=
github.com/dchest/siphash v1.2.1/go.mod h1:q+IRvb2gOSrUnYoPqHiyHXS0FOBBOdl6tONBlVnOnt4=
github.com/decred/base58 v1.0.0/go.mod h1:LLY1p5e3g91byL/UO1eiZaYd+uRoVRarybgcoymu9Ks=
github.com/decred/base58 v1.0.1 h1:w5qTcb0hYpKuIBYIn4Ckirkj1aOWrSq8onPQpb3eGg8=
github.com/decred/base58 v1.0.1/go.mod h1:H2ENcsJjye1G7CbRa67kV9OFaui0LGr56ntKKoY5g9c=
github.com/decred/base58 v1.0.3 h1:KGZuh8d1WEMIrK0leQRM47W85KqCAdl2N+uagbctdDI=
github.com/decred/base58 v1.0.3/go.mod h1:pXP9cXCfM2sFLb2viz2FNIdeMWmZDBKG3ZBYbiSM78E=
Expand All @@ -53,7 +50,6 @@ github.com/decred/dcrd/chaincfg/v3 v3.0.0 h1:+TFbu7ZmvBwM+SZz5mrj6cun9ts/6DAL5sq
github.com/decred/dcrd/chaincfg/v3 v3.0.0/go.mod h1:EspyubQ7D2w6tjP7rBGDIE7OTbuMgBjR2F2kZFnh31A=
github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0=
github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=
github.com/decred/dcrd/crypto/ripemd160 v1.0.0 h1:MciTnR4NfBqDFRFjFkrn8WPLP4Vo7t6ww6ghfn6wcXQ=
github.com/decred/dcrd/crypto/ripemd160 v1.0.0/go.mod h1:F0H8cjIuWTRoixr/LM3REB8obcWkmYx0gbxpQWR8RPg=
github.com/decred/dcrd/crypto/ripemd160 v1.0.1 h1:TjRL4LfftzTjXzaufov96iDAkbY2R3aTvH2YMYa1IOc=
github.com/decred/dcrd/crypto/ripemd160 v1.0.1/go.mod h1:F0H8cjIuWTRoixr/LM3REB8obcWkmYx0gbxpQWR8RPg=
Expand All @@ -64,7 +60,6 @@ github.com/decred/dcrd/dcrec v1.0.0 h1:W+z6Es+Rai3MXYVoPAxYr5U1DGis0Co33scJ6uH2J
github.com/decred/dcrd/dcrec v1.0.0/go.mod h1:HIaqbEJQ+PDzQcORxnqen5/V1FR3B4VpIfmePklt8Q8=
github.com/decred/dcrd/dcrec/edwards v1.0.0 h1:UDcPNzclKiJlWqV3x1Fl8xMCJrolo4PB4X9t8LwKDWU=
github.com/decred/dcrd/dcrec/edwards v1.0.0/go.mod h1:HblVh1OfMt7xSxUL1ufjToaEvpbjpWvvTAUx4yem8BI=
github.com/decred/dcrd/dcrec/edwards/v2 v2.0.0 h1:E5KszxGgpjpmW8vN811G6rBAZg0/S/DftdGqN4FW5x4=
github.com/decred/dcrd/dcrec/edwards/v2 v2.0.0/go.mod h1:d0H8xGMWbiIQP7gN3v2rByWUcuZPm9YsgmnfoxgbINc=
github.com/decred/dcrd/dcrec/edwards/v2 v2.0.1 h1:V6eqU1crZzuoFT4KG2LhaU5xDSdkHuvLQsj25wd7Wb4=
github.com/decred/dcrd/dcrec/edwards/v2 v2.0.1/go.mod h1:d0H8xGMWbiIQP7gN3v2rByWUcuZPm9YsgmnfoxgbINc=
Expand All @@ -75,7 +70,6 @@ github.com/decred/dcrd/dcrec/secp256k1/v2 v2.0.0 h1:3GIJYXQDAKpLEFriGFN8SbSffak1
github.com/decred/dcrd/dcrec/secp256k1/v2 v2.0.0/go.mod h1:3s92l0paYkZoIHuj4X93Teg/HB7eGM9x/zokGw+u4mY=
github.com/decred/dcrd/dcrec/secp256k1/v3 v3.0.0 h1:sgNeV1VRMDzs6rzyPpxyM0jp317hnwiq58Filgag2xw=
github.com/decred/dcrd/dcrec/secp256k1/v3 v3.0.0/go.mod h1:J70FGZSbzsjecRTiTzER+3f1KZLNaXkuv+yeFTKoxM8=
github.com/decred/dcrd/dcrjson/v3 v3.0.1 h1:b9cpplNJG+nutE2jS8K/BtSGIJihEQHhFjFAsvJF/iI=
github.com/decred/dcrd/dcrjson/v3 v3.0.1/go.mod h1:fnTHev/ABGp8IxFudDhjGi9ghLiXRff1qZz/wvq12Mg=
github.com/decred/dcrd/dcrjson/v3 v3.1.0 h1:Y2VjCXCNWbNIa52wMKEuNiU+9rUgnjYb5c1JQW6PuzM=
github.com/decred/dcrd/dcrjson/v3 v3.1.0/go.mod h1:fnTHev/ABGp8IxFudDhjGi9ghLiXRff1qZz/wvq12Mg=
Expand All @@ -92,7 +86,6 @@ github.com/decred/dcrd/hdkeychain/v2 v2.1.0 h1:NVNIz36HPukOnaysBDsLO+2kWqijLM4tv
github.com/decred/dcrd/hdkeychain/v2 v2.1.0/go.mod h1:DR+lD4uV8G0i3c9qnUJwjiGaaEWK+nSrbWCz1BRHBL8=
github.com/decred/dcrd/rpc/jsonrpc/types v1.0.1 h1:sWsGtWzdmrna6aysDCHwjANTJh+Lxt2xp6S10ahP79Y=
github.com/decred/dcrd/rpc/jsonrpc/types v1.0.1/go.mod h1:dJUp9PoyFYklzmlImpVkVLOr6j4zKuUv66YgemP2sd8=
github.com/decred/dcrd/rpc/jsonrpc/types/v2 v2.0.0 h1:uyvwjO+90KHxZIIztobB9cG+qVSHhCT+aGSiZF1vGAg=
github.com/decred/dcrd/rpc/jsonrpc/types/v2 v2.0.0/go.mod h1:c5S+PtQWNIA2aUakgrLhrlopkMadcOv51dWhCEdo49c=
github.com/decred/dcrd/rpc/jsonrpc/types/v2 v2.1.0 h1:s0BYGNeQpsSPRVzryacl8OfKftvbFyODfPuSfnCv0QI=
github.com/decred/dcrd/rpc/jsonrpc/types/v2 v2.1.0/go.mod h1:krn89ZOgSa8yc7sA4WpDK95p61NnjNWFkNlMnGrKbMc=
Expand All @@ -104,7 +97,6 @@ github.com/decred/dcrd/txscript/v2 v2.1.0/go.mod h1:XaJAVrZU4NWRx4UEzTiDAs86op1m
github.com/decred/dcrd/txscript/v3 v3.0.0 h1:74NmirXAIskbGP0g9OWtrmN7OxDbWJ9G73a5uoxTkcM=
github.com/decred/dcrd/txscript/v3 v3.0.0/go.mod h1:pdvnlD4KGdDoc09cvWRJ8EoRQUaiUz41uDevOWuEfII=
github.com/decred/dcrd/wire v1.2.0/go.mod h1:/JKOsLInOJu6InN+/zH5AyCq3YDIOW/EqcffvU8fJHM=
github.com/decred/dcrd/wire v1.3.0 h1:X76I2/a8esUmxXmFpJpAvXEi014IA4twgwcOBeIS8lE=
github.com/decred/dcrd/wire v1.3.0/go.mod h1:fnKGlUY2IBuqnpxx5dYRU5Oiq392OBqAuVjRVSkIoXM=
github.com/decred/dcrd/wire v1.4.0 h1:KmSo6eTQIvhXS0fLBQ/l7hG7QLcSJQKSwSyzSqJYDk0=
github.com/decred/dcrd/wire v1.4.0/go.mod h1:WxC/0K+cCAnBh+SKsRjIX9YPgvrjhmE+6pZlel1G7Ro=
Expand Down Expand Up @@ -146,7 +138,6 @@ github.com/jrick/wsrpc/v2 v2.0.0/go.mod h1:naH/fojac6vQWYgAA0e7b9TX/bShsWoVL7Cwr
github.com/jrick/wsrpc/v2 v2.2.0/go.mod h1:naH/fojac6vQWYgAA0e7b9TX/bShsWoVL7CwrdvFmUk=
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE=
github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
Expand All @@ -173,7 +164,6 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 h1:cg5LA/zNPRzIXIWSCxQW10Rvpy94aQh3LT/ShoCpkHw=
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g=
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
Expand Down

0 comments on commit e8a42ef

Please sign in to comment.