Skip to content

Commit 19e260b

Browse files
authored
Communicate additional send and buy module limits to client (#61)
1 parent 3c819eb commit 19e260b

File tree

5 files changed

+93
-29
lines changed

5 files changed

+93
-29
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ require (
66
firebase.google.com/go/v4 v4.8.0
77
github.com/aws/aws-sdk-go-v2 v0.17.0
88
github.com/bits-and-blooms/bloom/v3 v3.1.0
9-
github.com/code-payments/code-protobuf-api v1.10.0
9+
github.com/code-payments/code-protobuf-api v1.11.0
1010
github.com/emirpasic/gods v1.12.0
1111
github.com/envoyproxy/protoc-gen-validate v0.1.0
1212
github.com/golang-jwt/jwt/v5 v5.0.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,8 @@ github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWH
108108
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
109109
github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
110110
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
111-
github.com/code-payments/code-protobuf-api v1.10.0 h1:0I/lCHUtuQdbSKj02miQZlwSEdEUqVtTR0LxPTxA15w=
112-
github.com/code-payments/code-protobuf-api v1.10.0/go.mod h1:pHQm75vydD6Cm2qHAzlimW6drysm489Z4tVxC2zHSsU=
111+
github.com/code-payments/code-protobuf-api v1.11.0 h1:xlE4cwDAkyzsa8Jxmvy5D0trtTGLCw+wqs142tYhTXo=
112+
github.com/code-payments/code-protobuf-api v1.11.0/go.mod h1:pHQm75vydD6Cm2qHAzlimW6drysm489Z4tVxC2zHSsU=
113113
github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6 h1:NmTXa/uVnDyp0TY5MKi197+3HWcnYWfnHGyaFthlnGw=
114114
github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
115115
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=

pkg/code/server/grpc/transaction/v2/limits.go

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ import (
88

99
transactionpb "github.com/code-payments/code-protobuf-api/generated/go/transaction/v2"
1010

11-
currency_lib "github.com/code-payments/code-server/pkg/currency"
12-
"github.com/code-payments/code-server/pkg/grpc/client"
13-
"github.com/code-payments/code-server/pkg/kin"
1411
"github.com/code-payments/code-server/pkg/code/balance"
1512
"github.com/code-payments/code-server/pkg/code/common"
1613
"github.com/code-payments/code-server/pkg/code/data/phone"
1714
exchange_rate_util "github.com/code-payments/code-server/pkg/code/exchangerate"
1815
"github.com/code-payments/code-server/pkg/code/limit"
16+
currency_lib "github.com/code-payments/code-server/pkg/currency"
17+
"github.com/code-payments/code-server/pkg/grpc/client"
18+
"github.com/code-payments/code-server/pkg/kin"
1919
)
2020

2121
func (s *transactionServer) GetLimits(ctx context.Context, req *transactionpb.GetLimitsRequest) (*transactionpb.GetLimitsResponse, error) {
@@ -35,31 +35,35 @@ func (s *transactionServer) GetLimits(ctx context.Context, req *transactionpb.Ge
3535
return nil, err
3636
}
3737

38-
zeroSendLimits := make(map[string]*transactionpb.RemainingSendLimit)
38+
zeroSendLimits := make(map[string]*transactionpb.SendLimit)
3939
zeroMicroPaymentLimits := make(map[string]*transactionpb.MicroPaymentLimit)
40+
zeroBuyModuleLimits := make(map[string]*transactionpb.BuyModuleLimit)
4041
for currency := range limit.SendLimits {
41-
zeroSendLimits[string(currency)] = &transactionpb.RemainingSendLimit{
42-
NextTransaction: 0,
42+
zeroSendLimits[string(currency)] = &transactionpb.SendLimit{
43+
NextTransaction: 0,
44+
MaxPerTransaction: 0,
45+
MaxPerDay: 0,
4346
}
4447
zeroMicroPaymentLimits[string(currency)] = &transactionpb.MicroPaymentLimit{
4548
MaxPerTransaction: 0,
4649
MinPerTransaction: 0,
4750
}
4851
}
49-
zeroSendLimits[string(currency_lib.KIN)] = &transactionpb.RemainingSendLimit{
52+
zeroSendLimits[string(currency_lib.KIN)] = &transactionpb.SendLimit{
5053
NextTransaction: 0,
5154
}
5255
zeroMicroPaymentLimits[string(currency_lib.KIN)] = &transactionpb.MicroPaymentLimit{
5356
MaxPerTransaction: 0,
5457
MinPerTransaction: 0,
5558
}
5659
zeroResp := &transactionpb.GetLimitsResponse{
57-
Result: transactionpb.GetLimitsResponse_OK,
58-
RemainingSendLimitsByCurrency: zeroSendLimits,
60+
Result: transactionpb.GetLimitsResponse_OK,
61+
SendLimitsByCurrency: zeroSendLimits,
62+
MicroPaymentLimitsByCurrency: zeroMicroPaymentLimits,
63+
BuyModuleLimitsByCurrency: zeroBuyModuleLimits,
5964
DepositLimit: &transactionpb.DepositLimit{
6065
MaxQuarks: 0,
6166
},
62-
MicroPaymentLimitsByCurrency: zeroMicroPaymentLimits,
6367
}
6468

6569
verificationRecord, err := s.data.GetLatestPhoneVerificationForAccount(ctx, ownerAccount.PublicKey().ToBase58())
@@ -108,7 +112,7 @@ func (s *transactionServer) GetLimits(ctx context.Context, req *transactionpb.Ge
108112
// Part 1: Calculate send limits
109113
//
110114

111-
remainingSendLimits := make(map[string]*transactionpb.RemainingSendLimit)
115+
sendLimits := make(map[string]*transactionpb.SendLimit)
112116
for currency, sendLimit := range limit.SendLimits {
113117
otherRate, ok := multiRateRecord.Rates[string(currency)]
114118
if !ok {
@@ -133,16 +137,20 @@ func (s *transactionServer) GetLimits(ctx context.Context, req *transactionpb.Ge
133137
remainingNextTransaction = 0
134138
}
135139

136-
remainingSendLimits[string(currency)] = &transactionpb.RemainingSendLimit{
137-
NextTransaction: float32(remainingNextTransaction),
140+
sendLimits[string(currency)] = &transactionpb.SendLimit{
141+
NextTransaction: float32(remainingNextTransaction),
142+
MaxPerTransaction: float32(sendLimit.PerTransaction),
143+
MaxPerDay: float32(sendLimit.Daily),
138144
}
139145
}
140146

141-
usdSendLimits := remainingSendLimits[string(currency_lib.USD)]
147+
usdSendLimits := sendLimits[string(currency_lib.USD)]
142148

143149
// Inject a Kin limit based on the remaining USD amount and rate
144-
remainingSendLimits[string(currency_lib.KIN)] = &transactionpb.RemainingSendLimit{
145-
NextTransaction: usdSendLimits.NextTransaction / float32(usdRate),
150+
sendLimits[string(currency_lib.KIN)] = &transactionpb.SendLimit{
151+
NextTransaction: usdSendLimits.NextTransaction / float32(usdRate),
152+
MaxPerTransaction: usdSendLimits.MaxPerTransaction / float32(usdRate),
153+
MaxPerDay: usdSendLimits.MaxPerDay / float32(usdRate),
146154
}
147155

148156
//
@@ -183,12 +191,25 @@ func (s *transactionServer) GetLimits(ctx context.Context, req *transactionpb.Ge
183191
}
184192
}
185193

194+
//
195+
// Part 4: Calculate buy module limits
196+
//
197+
198+
convertedBuyModuleLimits := make(map[string]*transactionpb.BuyModuleLimit)
199+
for currency, limits := range limit.SendLimits {
200+
convertedBuyModuleLimits[string(currency)] = &transactionpb.BuyModuleLimit{
201+
MaxPerTransaction: float32(limits.PerTransaction),
202+
MinPerTransaction: float32(limits.PerTransaction / 10),
203+
}
204+
}
205+
186206
return &transactionpb.GetLimitsResponse{
187-
Result: transactionpb.GetLimitsResponse_OK,
188-
RemainingSendLimitsByCurrency: remainingSendLimits,
207+
Result: transactionpb.GetLimitsResponse_OK,
208+
SendLimitsByCurrency: sendLimits,
209+
MicroPaymentLimitsByCurrency: convertedMicroPaymentLimits,
210+
BuyModuleLimitsByCurrency: convertedBuyModuleLimits,
189211
DepositLimit: &transactionpb.DepositLimit{
190212
MaxQuarks: kin.ToQuarks(uint64(usdForNextDeposit / usdRate)),
191213
},
192-
MicroPaymentLimitsByCurrency: convertedMicroPaymentLimits,
193214
}, nil
194215
}

pkg/code/server/grpc/transaction/v2/limits_test.go

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ import (
1414
commonpb "github.com/code-payments/code-protobuf-api/generated/go/common/v1"
1515
transactionpb "github.com/code-payments/code-protobuf-api/generated/go/transaction/v2"
1616

17+
"github.com/code-payments/code-server/pkg/code/limit"
1718
currency_lib "github.com/code-payments/code-server/pkg/currency"
1819
"github.com/code-payments/code-server/pkg/kin"
1920
"github.com/code-payments/code-server/pkg/testutil"
20-
"github.com/code-payments/code-server/pkg/code/limit"
2121
)
2222

2323
func TestGetLimits_SendLimits_HappyPath(t *testing.T) {
@@ -44,9 +44,13 @@ func TestGetLimits_SendLimits_HappyPath(t *testing.T) {
4444

4545
actual := limitsByCurrency[string(currency_lib.USD)]
4646
assert.EqualValues(t, usdLimits.PerTransaction, actual.NextTransaction)
47+
assert.EqualValues(t, usdLimits.PerTransaction, actual.MaxPerTransaction)
48+
assert.EqualValues(t, usdLimits.Daily, actual.MaxPerDay)
4749

4850
actual = limitsByCurrency[string(currency_lib.KIN)]
4951
assert.EqualValues(t, usdLimits.PerTransaction/usdRate.Rate, actual.NextTransaction)
52+
assert.EqualValues(t, usdLimits.PerTransaction/usdRate.Rate, actual.MaxPerTransaction)
53+
assert.EqualValues(t, usdLimits.Daily/usdRate.Rate, actual.MaxPerDay)
5054

5155
sendingPhone.privatelyWithdraw123KinToExternalWallet(t).requireSuccess(t)
5256

@@ -58,9 +62,13 @@ func TestGetLimits_SendLimits_HappyPath(t *testing.T) {
5862

5963
actual := limitsByCurrency[string(currency_lib.USD)]
6064
assert.EqualValues(t, usdLimits.Daily-usdSent, actual.NextTransaction)
65+
assert.EqualValues(t, usdLimits.PerTransaction, actual.MaxPerTransaction)
66+
assert.EqualValues(t, usdLimits.Daily, actual.MaxPerDay)
6167

6268
actual = limitsByCurrency[string(currency_lib.KIN)]
6369
assert.EqualValues(t, (usdLimits.Daily-usdSent)/usdRate.Rate, actual.NextTransaction)
70+
assert.EqualValues(t, usdLimits.PerTransaction/usdRate.Rate, actual.MaxPerTransaction)
71+
assert.EqualValues(t, usdLimits.Daily/usdRate.Rate, actual.MaxPerDay)
6472

6573
for {
6674
if usdSent > usdLimits.Daily {
@@ -78,9 +86,13 @@ func TestGetLimits_SendLimits_HappyPath(t *testing.T) {
7886

7987
actual = limitsByCurrency[string(currency_lib.USD)]
8088
assert.EqualValues(t, 0, actual.NextTransaction)
89+
assert.EqualValues(t, usdLimits.PerTransaction, actual.MaxPerTransaction)
90+
assert.EqualValues(t, usdLimits.Daily, actual.MaxPerDay)
8191

8292
actual = limitsByCurrency[string(currency_lib.KIN)]
8393
assert.EqualValues(t, 0, actual.NextTransaction)
94+
assert.EqualValues(t, usdLimits.PerTransaction/usdRate.Rate, actual.MaxPerTransaction)
95+
assert.EqualValues(t, usdLimits.Daily/usdRate.Rate, actual.MaxPerDay)
8496
}
8597

8698
func TestGetLimits_DepositLimits_HappyPath_DailyConsumed(t *testing.T) {
@@ -178,6 +190,24 @@ func TestGetLimits_MicroPaymentLimits_HappyPath(t *testing.T) {
178190
}
179191
}
180192

193+
func TestGetLimits_BuyModuleLimits_HappyPath(t *testing.T) {
194+
server, phone, _, cleanup := setupTestEnv(t, &testOverrides{})
195+
defer cleanup()
196+
197+
server.generateAvailableNonces(t, 10000)
198+
199+
phone.openAccounts(t).requireSuccess(t)
200+
201+
actualBuyModuleLimits := phone.getBuyModuleLimits(t)
202+
assert.Len(t, actualBuyModuleLimits, len(limit.SendLimits))
203+
for currency, actualLimits := range actualBuyModuleLimits {
204+
sendLimit, ok := limit.SendLimits[currency_lib.Code(currency)]
205+
require.True(t, ok)
206+
assert.EqualValues(t, sendLimit.PerTransaction, actualLimits.MaxPerTransaction)
207+
assert.EqualValues(t, sendLimit.PerTransaction/10, actualLimits.MinPerTransaction)
208+
}
209+
}
210+
181211
func TestGetLimits_UnauthenticateddAccess(t *testing.T) {
182212
_, phone, _, cleanup := setupTestEnv(t, &testOverrides{})
183213
defer cleanup()

pkg/code/server/grpc/transaction/v2/testutil.go

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5217,7 +5217,7 @@ func (p *phoneTestEnv) validateUpgradeableIntents(t *testing.T, upgradeableInten
52175217
}
52185218
}
52195219

5220-
func (p *phoneTestEnv) getSendLimits(t *testing.T) map[string]*transactionpb.RemainingSendLimit {
5220+
func (p *phoneTestEnv) getSendLimits(t *testing.T) map[string]*transactionpb.SendLimit {
52215221
req := &transactionpb.GetLimitsRequest{
52225222
Owner: p.parentAccount.ToProto(),
52235223
ConsumedSince: timestamppb.New(time.Now().Add(-24 * time.Hour)),
@@ -5227,10 +5227,10 @@ func (p *phoneTestEnv) getSendLimits(t *testing.T) map[string]*transactionpb.Rem
52275227
resp, err := p.client.GetLimits(p.ctx, req)
52285228
require.NoError(t, err)
52295229
assert.Equal(t, transactionpb.GetLimitsResponse_OK, resp.Result)
5230-
return resp.RemainingSendLimitsByCurrency
5230+
return resp.SendLimitsByCurrency
52315231
}
52325232

5233-
func (p *phoneTestEnv) getDepositLimit(t *testing.T) *transactionpb.DepositLimit {
5233+
func (p *phoneTestEnv) getMicroPaymentLimits(t *testing.T) map[string]*transactionpb.MicroPaymentLimit {
52345234
req := &transactionpb.GetLimitsRequest{
52355235
Owner: p.parentAccount.ToProto(),
52365236
ConsumedSince: timestamppb.New(time.Now().Add(-24 * time.Hour)),
@@ -5240,10 +5240,10 @@ func (p *phoneTestEnv) getDepositLimit(t *testing.T) *transactionpb.DepositLimit
52405240
resp, err := p.client.GetLimits(p.ctx, req)
52415241
require.NoError(t, err)
52425242
assert.Equal(t, transactionpb.GetLimitsResponse_OK, resp.Result)
5243-
return resp.DepositLimit
5243+
return resp.MicroPaymentLimitsByCurrency
52445244
}
52455245

5246-
func (p *phoneTestEnv) getMicroPaymentLimits(t *testing.T) map[string]*transactionpb.MicroPaymentLimit {
5246+
func (p *phoneTestEnv) getBuyModuleLimits(t *testing.T) map[string]*transactionpb.BuyModuleLimit {
52475247
req := &transactionpb.GetLimitsRequest{
52485248
Owner: p.parentAccount.ToProto(),
52495249
ConsumedSince: timestamppb.New(time.Now().Add(-24 * time.Hour)),
@@ -5253,7 +5253,20 @@ func (p *phoneTestEnv) getMicroPaymentLimits(t *testing.T) map[string]*transacti
52535253
resp, err := p.client.GetLimits(p.ctx, req)
52545254
require.NoError(t, err)
52555255
assert.Equal(t, transactionpb.GetLimitsResponse_OK, resp.Result)
5256-
return resp.MicroPaymentLimitsByCurrency
5256+
return resp.BuyModuleLimitsByCurrency
5257+
}
5258+
5259+
func (p *phoneTestEnv) getDepositLimit(t *testing.T) *transactionpb.DepositLimit {
5260+
req := &transactionpb.GetLimitsRequest{
5261+
Owner: p.parentAccount.ToProto(),
5262+
ConsumedSince: timestamppb.New(time.Now().Add(-24 * time.Hour)),
5263+
}
5264+
req.Signature = p.signProtoMessage(t, req, req.Owner, false)
5265+
5266+
resp, err := p.client.GetLimits(p.ctx, req)
5267+
require.NoError(t, err)
5268+
assert.Equal(t, transactionpb.GetLimitsResponse_OK, resp.Result)
5269+
return resp.DepositLimit
52575270
}
52585271

52595272
func (p *phoneTestEnv) getPaymentHistory(t *testing.T) []*transactionpb.PaymentHistoryItem {

0 commit comments

Comments
 (0)