Skip to content

Commit a8c92a1

Browse files
authored
[staking] extra bonus requires enable auto-stake for at least 3 months (iotexproject#2144)
1 parent 28118ec commit a8c92a1

File tree

8 files changed

+49
-104
lines changed

8 files changed

+49
-104
lines changed

action/protocol/poll/protocol.go

-19
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,6 @@ var ErrDelegatesNotAsExpected = errors.New("delegates are not as expected")
5151
var ErrDelegatesNotExist = errors.New("delegates cannot be found")
5252

5353
type (
54-
validationContextKey struct{}
55-
56-
// ValidationCtx provides validation auxiliary information.
57-
ValidationCtx struct {
58-
// Validated indicates validation has been done
59-
Validated bool
60-
}
61-
6254
// GetCandidates returns the current candidates
6355
GetCandidates func(protocol.StateReader, uint64, bool, bool) ([]*state.Candidate, uint64, error)
6456

@@ -123,17 +115,6 @@ func MustGetProtocol(registry *protocol.Registry) Protocol {
123115
return pp
124116
}
125117

126-
// WithValidationlCtx add ValidationCtx into context.
127-
func WithValidationlCtx(ctx context.Context, val ValidationCtx) context.Context {
128-
return context.WithValue(ctx, validationContextKey{}, val)
129-
}
130-
131-
// GetValidationCtx gets ValidationCtx
132-
func GetValidationCtx(ctx context.Context) (ValidationCtx, bool) {
133-
val, ok := ctx.Value(validationContextKey{}).(ValidationCtx)
134-
return val, ok
135-
}
136-
137118
// NewProtocol instantiates a rewarding protocol instance.
138119
func NewProtocol(
139120
cfg config.Config,

action/protocol/poll/protocol_test.go

-12
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,3 @@ func TestMustGetProtocol(t *testing.T) {
7777
require.NoError(p.Register(re))
7878
require.NotNil(FindProtocol(re))
7979
}
80-
81-
func TestGetValidationCtx(t *testing.T) {
82-
require := require.New(t)
83-
pCtx := ValidationCtx{
84-
Validated: true,
85-
}
86-
ctx := WithValidationlCtx(context.Background(), pCtx)
87-
require.NotNil(ctx)
88-
ret, ok := GetValidationCtx(ctx)
89-
require.True(ok)
90-
require.Equal(true, ret.Validated)
91-
}

action/protocol/poll/util.go

-5
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,6 @@ func handle(ctx context.Context, act action.Action, sm protocol.StateManager, in
6868
}
6969

7070
func validate(ctx context.Context, sr protocol.StateReader, p Protocol, act action.Action) error {
71-
valCtx, ok := GetValidationCtx(ctx)
72-
if ok && valCtx.Validated {
73-
return nil
74-
}
75-
7671
ppr, ok := act.(*action.PutPollResult)
7772
if !ok {
7873
return nil

action/protocol/staking/handlers_test.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ func TestProtocol_HandleCandidateRegister(t *testing.T) {
274274
identityset.Address(29).String(),
275275
"",
276276
"1200000000000000000000000",
277-
"1914576399585798860414342",
277+
"1806204150552640363969204",
278278
uint32(10000),
279279
false,
280280
nil,
@@ -316,7 +316,7 @@ func TestProtocol_HandleCandidateRegister(t *testing.T) {
316316
identityset.Address(29).String(),
317317
identityset.Address(30).String(),
318318
"120000000000000000000000",
319-
"1914576399585798860414342",
319+
"1806204150552640363969204",
320320
uint32(10000),
321321
false,
322322
nil,
@@ -337,7 +337,7 @@ func TestProtocol_HandleCandidateRegister(t *testing.T) {
337337
identityset.Address(29).String(),
338338
identityset.Address(30).String(),
339339
"1200000000000000000000000",
340-
"1914576399585798860414342",
340+
"1806204150552640363969204",
341341
uint32(10000),
342342
false,
343343
nil,
@@ -357,7 +357,7 @@ func TestProtocol_HandleCandidateRegister(t *testing.T) {
357357
identityset.Address(29).String(),
358358
identityset.Address(30).String(),
359359
"1200000000000000000000000",
360-
"1914576399585798860414342",
360+
"1806204150552640363969204",
361361
uint32(10000),
362362
false,
363363
nil,
@@ -524,7 +524,7 @@ func TestProtocol_handleCandidateUpdate(t *testing.T) {
524524
identityset.Address(29).String(),
525525
"",
526526
"1200000000000000000000000",
527-
"1914576399585798860414342",
527+
"1806204150552640363969204",
528528
uint32(10000),
529529
false,
530530
[]byte("payload"),
@@ -571,7 +571,7 @@ func TestProtocol_handleCandidateUpdate(t *testing.T) {
571571
identityset.Address(29).String(),
572572
identityset.Address(27).String(),
573573
"1200000000000000000000000",
574-
"1914576399585798860414342",
574+
"1806204150552640363969204",
575575
uint32(10000),
576576
false,
577577
[]byte("payload"),
@@ -594,7 +594,7 @@ func TestProtocol_handleCandidateUpdate(t *testing.T) {
594594
identityset.Address(29).String(),
595595
identityset.Address(27).String(),
596596
"1200000000000000000000000",
597-
"1914576399585798860414342",
597+
"1806204150552640363969204",
598598
uint32(10000),
599599
false,
600600
[]byte("payload"),

action/protocol/staking/vote_bucket.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,8 @@ func calculateVoteWeight(c genesis.VoteWeightCalConsts, v *VoteBucket, selfStake
313313
if remainingTime > 0 {
314314
weight += math.Log(math.Ceil(remainingTime/86400)*(1+m)) / math.Log(c.DurationLg) / 100
315315
}
316-
if selfStake {
316+
if selfStake && v.AutoStake && v.StakedDuration >= time.Duration(91)*24*time.Hour {
317+
// self-stake extra bonus requires enable auto-stake for at least 3 months
317318
weight *= c.SelfStake
318319
}
319320

e2etest/native_staking_test.go

+40-53
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,14 @@ const (
3636

3737
candidate1Name = "candidate1"
3838
candidate2Name = "candidate2"
39-
selfStake = "1200000000000000000000000"
40-
initVotes = "1272000000000000063948846"
41-
vote = "100000000000000000000"
42-
autoStakeVote = "103801784016923925869"
43-
initBalance = "100000000000000000000000000"
39+
)
40+
41+
var (
42+
selfStake, _ = big.NewInt(0).SetString("1200000000000000000000000", 10)
43+
cand1Votes, _ = big.NewInt(0).SetString("1635067133824581908640994", 10)
44+
vote, _ = big.NewInt(0).SetString("100000000000000000000", 10)
45+
autoStakeVote, _ = big.NewInt(0).SetString("103801784016923925869", 10)
46+
initBalance, _ = big.NewInt(0).SetString("100000000000000000000000000", 10)
4447
)
4548

4649
var (
@@ -57,14 +60,14 @@ func TestNativeStaking(t *testing.T) {
5760
identityset.Address(23).String(),
5861
identityset.Address(23).String(),
5962
"test1",
60-
selfStake,
63+
selfStake.String(),
6164
},
6265
{
6366
identityset.Address(24).String(),
6467
identityset.Address(25).String(),
6568
identityset.Address(25).String(),
6669
"test2",
67-
selfStake,
70+
selfStake.String(),
6871
},
6972
}
7073

@@ -93,10 +96,10 @@ func TestNativeStaking(t *testing.T) {
9396
cand2PriKey := identityset.PrivateKey(1)
9497

9598
register1, err := testutil.SignedCandidateRegister(1, candidate1Name, cand1Addr.String(), cand1Addr.String(),
96-
cand1Addr.String(), selfStake, 1, false, nil, gasLimit, gasPrice, cand1PriKey)
99+
cand1Addr.String(), selfStake.String(), 91, true, nil, gasLimit, gasPrice, cand1PriKey)
97100
require.NoError(err)
98101
register2, err := testutil.SignedCandidateRegister(1, candidate2Name, cand2Addr.String(), cand2Addr.String(),
99-
cand2Addr.String(), selfStake, 1, false, nil, gasLimit, gasPrice, cand2PriKey)
102+
cand2Addr.String(), selfStake.String(), 1, false, nil, gasLimit, gasPrice, cand2PriKey)
100103
require.NoError(err)
101104

102105
fixedTime := time.Unix(cfg.Genesis.Timestamp, 0)
@@ -106,8 +109,8 @@ func TestNativeStaking(t *testing.T) {
106109
[]action.SealedEnvelope{register2}, fixedTime))
107110

108111
// check candidate state
109-
require.NoError(checkCandidateState(sf, candidate1Name, cand1Addr.String(), selfStake, initVotes, cand1Addr))
110-
require.NoError(checkCandidateState(sf, candidate1Name, cand1Addr.String(), selfStake, initVotes, cand1Addr))
112+
require.NoError(checkCandidateState(sf, candidate1Name, cand1Addr.String(), selfStake, cand1Votes, cand1Addr))
113+
require.NoError(checkCandidateState(sf, candidate2Name, cand2Addr.String(), selfStake, selfStake, cand2Addr))
111114

112115
// check candidate account state
113116
require.NoError(checkAccountState(cfg, sf, register1, true, initBalance, cand1Addr))
@@ -126,21 +129,19 @@ func TestNativeStaking(t *testing.T) {
126129
voter2Addr := identityset.Address(3)
127130
voter2PriKey := identityset.PrivateKey(3)
128131

129-
cs1, err := testutil.SignedCreateStake(1, candidate1Name, vote, 1, false,
132+
cs1, err := testutil.SignedCreateStake(1, candidate1Name, vote.String(), 1, false,
130133
nil, gasLimit, gasPrice, voter1PriKey)
131134
require.NoError(err)
132-
cs2, err := testutil.SignedCreateStake(1, candidate1Name, vote, 1, false,
135+
cs2, err := testutil.SignedCreateStake(1, candidate1Name, vote.String(), 1, false,
133136
nil, gasLimit, gasPrice, voter2PriKey)
134137
require.NoError(err)
135138

136139
require.NoError(createAndCommitBlock(bc, []address.Address{voter1Addr, voter2Addr},
137140
[]action.SealedEnvelope{cs1, cs2}, fixedTime))
138141

139142
// check candidate state
140-
wv, _ := big.NewInt(0).SetString(vote, 10)
141-
expectedVotes, _ := big.NewInt(0).SetString(initVotes, 10)
142-
expectedVotes.Add(expectedVotes, big.NewInt(0).Mul(wv, big.NewInt(2)))
143-
require.NoError(checkCandidateState(sf, candidate1Name, cand1Addr.String(), selfStake, expectedVotes.String(), cand1Addr))
143+
expectedVotes := big.NewInt(0).Add(cand1Votes, big.NewInt(0).Mul(vote, big.NewInt(2)))
144+
require.NoError(checkCandidateState(sf, candidate1Name, cand1Addr.String(), selfStake, expectedVotes, cand1Addr))
144145

145146
// check voter account state
146147
require.NoError(checkAccountState(cfg, sf, cs1, false, initBalance, voter1Addr))
@@ -162,14 +163,13 @@ func TestNativeStaking(t *testing.T) {
162163
cc, err := testutil.SignedChangeCandidate(2, candidate2Name, voter2BucketIndex, nil,
163164
gasLimit, gasPrice, voter2PriKey)
164165
require.NoError(err)
165-
166166
require.NoError(createAndCommitBlock(bc, []address.Address{voter2Addr}, []action.SealedEnvelope{cc}, fixedTime))
167167

168168
// check candidate state
169-
expectedVotes, _ = big.NewInt(0).SetString(initVotes, 10)
170-
expectedVotes.Add(expectedVotes, wv)
171-
require.NoError(checkCandidateState(sf, candidate1Name, cand1Addr.String(), selfStake, expectedVotes.String(), cand1Addr))
172-
require.NoError(checkCandidateState(sf, candidate2Name, cand2Addr.String(), selfStake, expectedVotes.String(), cand2Addr))
169+
expectedVotes = big.NewInt(0).Add(cand1Votes, vote)
170+
require.NoError(checkCandidateState(sf, candidate1Name, cand1Addr.String(), selfStake, expectedVotes, cand1Addr))
171+
expectedVotes = big.NewInt(0).Add(selfStake, vote)
172+
require.NoError(checkCandidateState(sf, candidate2Name, cand2Addr.String(), selfStake, expectedVotes, cand2Addr))
173173

174174
// transfer stake
175175
ts, err := testutil.SignedTransferStake(2, voter2Addr.String(), voter1BucketIndex, nil, gasLimit, gasPrice, voter1PriKey)
@@ -191,7 +191,7 @@ func TestNativeStaking(t *testing.T) {
191191
require.Equal(voter1BucketIndex, bis[1])
192192

193193
// deposit to stake
194-
ds, err := testutil.SignedDepositToStake(3, voter2BucketIndex, vote, nil, gasLimit, gasPrice, voter2PriKey)
194+
ds, err := testutil.SignedDepositToStake(3, voter2BucketIndex, vote.String(), nil, gasLimit, gasPrice, voter2PriKey)
195195
require.NoError(err)
196196
require.NoError(createAndCommitBlock(bc, []address.Address{voter2Addr}, []action.SealedEnvelope{ds}, fixedTime))
197197
r, err := dao.GetReceiptByActionHash(ds.Hash(), 6)
@@ -205,21 +205,16 @@ func TestNativeStaking(t *testing.T) {
205205
require.NoError(createAndCommitBlock(bc, []address.Address{voter2Addr}, []action.SealedEnvelope{rs}, fixedTime))
206206

207207
// check candidate state
208-
expectedVotes, _ = big.NewInt(0).SetString(initVotes, 10)
209-
wv, _ = big.NewInt(0).SetString(autoStakeVote, 10)
210-
expectedVotes.Add(expectedVotes, wv)
211-
require.NoError(checkCandidateState(sf, candidate2Name, cand2Addr.String(), selfStake, expectedVotes.String(), cand2Addr))
208+
expectedVotes = big.NewInt(0).Add(selfStake, autoStakeVote)
209+
require.NoError(checkCandidateState(sf, candidate2Name, cand2Addr.String(), selfStake, expectedVotes, cand2Addr))
212210

213211
// deposit to stake again
214-
ds, err = testutil.SignedDepositToStake(3, voter2BucketIndex, vote, nil, gasLimit, gasPrice, voter2PriKey)
212+
ds, err = testutil.SignedDepositToStake(3, voter2BucketIndex, vote.String(), nil, gasLimit, gasPrice, voter2PriKey)
215213
require.NoError(err)
216214
require.NoError(createAndCommitBlock(bc, []address.Address{voter2Addr}, []action.SealedEnvelope{ds}, fixedTime))
217215

218216
// check voter account state
219-
voterBalance, _ := big.NewInt(0).SetString(initBalance, 10)
220-
vote, _ := big.NewInt(0).SetString(vote, 10)
221-
voterBalance.Sub(voterBalance, vote)
222-
require.NoError(checkAccountState(cfg, sf, ds, false, voterBalance.String(), voter2Addr))
217+
require.NoError(checkAccountState(cfg, sf, ds, false, big.NewInt(0).Sub(initBalance, vote), voter2Addr))
223218

224219
// unstake voter stake
225220
us, err := testutil.SignedReclaimStake(false, 4, voter1BucketIndex, nil, gasLimit, gasPrice, voter2PriKey)
@@ -232,47 +227,39 @@ func TestNativeStaking(t *testing.T) {
232227
require.NoError(createAndCommitBlock(bc, []address.Address{voter2Addr}, []action.SealedEnvelope{us}, unstakeTime))
233228

234229
// check candidate state
235-
expectedVotes, _ = big.NewInt(0).SetString(initVotes, 10)
236-
require.NoError(checkCandidateState(sf, candidate1Name, cand1Addr.String(), selfStake, expectedVotes.String(), cand1Addr))
230+
require.NoError(checkCandidateState(sf, candidate1Name, cand1Addr.String(), selfStake, cand1Votes, cand1Addr))
237231

238232
// unstake self stake
239233
us, err = testutil.SignedReclaimStake(false, 2, selfstakeIndex1, nil, gasLimit, gasPrice, cand1PriKey)
240234
require.NoError(err)
241235
require.NoError(createAndCommitBlock(bc, []address.Address{cand1Addr}, []action.SealedEnvelope{us}, unstakeTime))
242236

243237
// check candidate state
244-
expectedVotes = big.NewInt(0)
245-
expectedSelfStake := big.NewInt(0)
246-
require.NoError(checkCandidateState(sf, candidate1Name, cand1Addr.String(), expectedSelfStake.String(),
247-
expectedVotes.String(), cand1Addr))
238+
require.NoError(checkCandidateState(sf, candidate1Name, cand1Addr.String(), selfStake, cand1Votes, cand1Addr))
248239

249240
// withdraw stake
250241
ws, err := testutil.SignedReclaimStake(true, 3, selfstakeIndex1, nil, gasLimit, gasPrice, cand1PriKey)
251242
require.NoError(err)
252243
require.NoError(createAndCommitBlock(bc, []address.Address{cand1Addr}, []action.SealedEnvelope{ws}, unstakeTime))
253244
r, err = dao.GetReceiptByActionHash(ws.Hash(), 12)
254245
require.NoError(err)
255-
require.Equal(uint64(iotextypes.ReceiptStatus_ErrWithdrawBeforeMaturity), r.Status)
246+
require.Equal(uint64(iotextypes.ReceiptStatus_ErrWithdrawBeforeUnstake), r.Status)
256247

257248
require.NoError(createAndCommitBlock(bc, []address.Address{cand1Addr}, []action.SealedEnvelope{ws}, unstakeTime.Add(cfg.Genesis.WithdrawWaitingPeriod)))
258249

259250
// check buckets
260251
_, err = sf.State(&bis, protocol.NamespaceOption(staking.StakingNameSpace),
261252
protocol.KeyOption(addrKeyWithPrefix(cand1Addr, _voterIndex)))
262-
require.Error(err)
263-
require.Equal(state.ErrStateNotExist, errors.Cause(err))
253+
require.NoError(err)
254+
require.Equal(1, len(bis))
264255

265256
_, err = sf.State(&bis, protocol.NamespaceOption(staking.StakingNameSpace),
266257
protocol.KeyOption(addrKeyWithPrefix(cand1Addr, _candIndex)))
267258
require.NoError(err)
268-
require.Equal(1, len(bis))
259+
require.Equal(2, len(bis))
269260

270261
// check candidate account state
271-
candidateBalance, _ := big.NewInt(0).SetString(initBalance, 10)
272-
registrationFee, ok := new(big.Int).SetString(cfg.Genesis.RegistrationConsts.Fee, 10)
273-
require.True(ok)
274-
candidateBalance.Sub(candidateBalance, registrationFee)
275-
require.NoError(checkAccountState(cfg, sf, ws, false, candidateBalance.String(), cand1Addr))
262+
require.NoError(checkAccountState(cfg, sf, ws, true, big.NewInt(0).Sub(initBalance, selfStake), cand1Addr))
276263
}
277264

278265
cfg := config.Default
@@ -318,9 +305,9 @@ func addrKeyWithPrefix(voterAddr address.Address, prefix byte) []byte {
318305
func checkCandidateState(
319306
sr protocol.StateReader,
320307
expectedName,
321-
expectedOwnerAddr,
308+
expectedOwnerAddr string,
322309
expectedSelfStake,
323-
expectedVotes string,
310+
expectedVotes *big.Int,
324311
candidateAddr address.Address,
325312
) error {
326313
var cand staking.Candidate
@@ -333,10 +320,10 @@ func checkCandidateState(
333320
if expectedOwnerAddr != cand.Owner.String() {
334321
return errors.New("Owner address does not match")
335322
}
336-
if expectedSelfStake != cand.SelfStake.String() {
323+
if expectedSelfStake.Cmp(cand.SelfStake) != 0 {
337324
return errors.New("self stake does not match")
338325
}
339-
if expectedVotes != cand.Votes.String() {
326+
if expectedVotes.Cmp(cand.Votes) != 0 {
340327
return errors.New("votes does not match")
341328
}
342329
return nil
@@ -347,7 +334,7 @@ func checkAccountState(
347334
sr protocol.StateReader,
348335
act action.SealedEnvelope,
349336
registrationFee bool,
350-
expectedBalance string,
337+
expectedBalance *big.Int,
351338
accountAddr address.Address,
352339
) error {
353340
cost, err := act.Cost()
@@ -362,7 +349,7 @@ func checkAccountState(
362349
if err != nil {
363350
return err
364351
}
365-
if expectedBalance != big.NewInt(0).Add(acct1.Balance, cost).String() {
352+
if expectedBalance.Cmp(cost.Add(cost, acct1.Balance)) != 0 {
366353
return errors.New("balance does not match")
367354
}
368355
return nil

go.mod

-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ require (
1414
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0
1515
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
1616
github.com/hashicorp/golang-lru v0.5.1
17-
github.com/iotexproject/go-ethereum v1.7.3 // indirect
1817
github.com/iotexproject/go-fsm v1.0.0
1918
github.com/iotexproject/go-p2p v0.2.12
2019
github.com/iotexproject/go-pkgs v0.1.2-0.20200212033110-8fa5cf96fc1b

go.sum

-6
Original file line numberDiff line numberDiff line change
@@ -163,17 +163,11 @@ github.com/iotexproject/iotex-address v0.2.1 h1:ZJH2ajx5OBrbaRJ0ZWlWUo685zr5kjWi
163163
github.com/iotexproject/iotex-address v0.2.1/go.mod h1:ONmTqmg6zO7VWF9TcWN+UrreFr/xpazlv9PWOALbLFA=
164164
github.com/iotexproject/iotex-antenna-go/v2 v2.3.2 h1:xCJa1QYV/f9cSF9z32fFmfTcGb8sYvn1No+uDlgwABA=
165165
github.com/iotexproject/iotex-antenna-go/v2 v2.3.2/go.mod h1:R6WIWVfZAnpSo8llzEsSoGJgHSYeYamjBqG35oHpgxU=
166-
github.com/iotexproject/iotex-election v0.2.11 h1:opQk5DVVtem2u6tIO/wFND4qX9QqpL8Pb/hiPG3fuFw=
167-
github.com/iotexproject/iotex-election v0.2.11/go.mod h1:y5niif2oeYT1MVS4WOIqNgSlDCpmGWjR8clafzrOg6E=
168-
github.com/iotexproject/iotex-election v0.2.16 h1:MilLe/wpT/yJL9QV2oN+wI/h9EC2roatoH5/dsESAPg=
169-
github.com/iotexproject/iotex-election v0.2.16/go.mod h1:8GJZXtJeTaqOypPaQNzPWqCXEde4tU8fL00vsbvqEkw=
170166
github.com/iotexproject/iotex-election v0.2.17-0.20200424232423-683b3d35aa4b h1:EHrO7nE8ryh5X4a+V8LwG+UVoUC3rSB2f9lYVD5tJzA=
171167
github.com/iotexproject/iotex-election v0.2.17-0.20200424232423-683b3d35aa4b/go.mod h1:8GJZXtJeTaqOypPaQNzPWqCXEde4tU8fL00vsbvqEkw=
172168
github.com/iotexproject/iotex-proto v0.2.1-0.20190814190638-f74c55ffedf5/go.mod h1:962P5o0qlB5sqRT07TJBMX31i2u309kzDqqwCg+cGz0=
173169
github.com/iotexproject/iotex-proto v0.2.5 h1:SYdl9Lqb0LYfFf3sfw92fN8GY3bthfCvGmltz+2uvDQ=
174170
github.com/iotexproject/iotex-proto v0.2.5/go.mod h1:962P5o0qlB5sqRT07TJBMX31i2u309kzDqqwCg+cGz0=
175-
github.com/iotexproject/iotex-proto v0.2.6-0.20200402191724-24f4101d4987 h1:mxVn3FVBuYn0g0RcAhhOwcWVoLj5Mv4H9wkdyX0x/sI=
176-
github.com/iotexproject/iotex-proto v0.2.6-0.20200402191724-24f4101d4987/go.mod h1:xKA4yUbg208k1j3+t10Pe7IzT6uHcP+/4rsDanF4Q58=
177171
github.com/iotexproject/iotex-proto v0.2.6-0.20200409230611-748f6ab69ca5 h1:ggKAkpi4j0aDPnLS5tIgZcfr6MKrWbnDScnqZ4NsyEU=
178172
github.com/iotexproject/iotex-proto v0.2.6-0.20200409230611-748f6ab69ca5/go.mod h1:xKA4yUbg208k1j3+t10Pe7IzT6uHcP+/4rsDanF4Q58=
179173
github.com/ipfs/go-cid v0.0.1 h1:GBjWPktLnNyX0JiQCNFpUuUSoMw5KMyqrsejHYlILBE=

0 commit comments

Comments
 (0)