Skip to content

Commit 1e4c26b

Browse files
committed
PoS Spending Limits UI
1 parent fd55a7c commit 1e4c26b

14 files changed

+534
-37
lines changed

src/app/app.module.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ import { TransactionSpendingLimitDaoCoinLimitOrderComponent } from './transactio
6060
import { TransactionSpendingLimitNftComponent } from './transaction-spending-limit/transaction-spending-limit-nft/transaction-spending-limit-nft.component';
6161
import { TransactionSpendingLimitSectionComponent } from './transaction-spending-limit/transaction-spending-limit-section/transaction-spending-limit-section.component';
6262
import { TransactionSpendingLimitComponent } from './transaction-spending-limit/transaction-spending-limit.component';
63+
import { TransactionSpendingLimitStakeComponent } from './transaction-spending-limit/transaction-spending-limit-stake/transaction-spending-limit-stake.component';
64+
import { TransactionSpendingLimitLockupComponent } from './transaction-spending-limit/transaction-spending-limit-lockup/transaction-spending-limit-lockup.component';
6365

6466
@NgModule({
6567
declarations: [
@@ -107,6 +109,8 @@ import { TransactionSpendingLimitComponent } from './transaction-spending-limit/
107109
RecoverySecretComponent,
108110
BackupSeedDialogComponent,
109111
RemoveAccountDialogComponent,
112+
TransactionSpendingLimitStakeComponent,
113+
TransactionSpendingLimitLockupComponent,
110114
],
111115
imports: [
112116
BrowserModule,

src/app/backend-api.service.ts

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,8 @@ export type LimitOperationString =
147147
| NFTLimitOperationString
148148
| AssociationOperationString
149149
| AccessGroupOperationString
150-
| AccessGroupMemberOperationString;
150+
| AccessGroupMemberOperationString
151+
| LockupLimitOperationString;
151152
export type CreatorCoinOperationLimitMap =
152153
CoinOperationLimitMap<CreatorCoinLimitOperationString>;
153154
export type DAOCoinOperationLimitMap =
@@ -236,6 +237,42 @@ export type AccessGroupMemberLimitMapItem = {
236237
OpCount: number;
237238
};
238239

240+
export type StakeLimitMapItem = {
241+
ValidatorPublicKeyBase58Check: string;
242+
StakeLimit: string; // Hex string
243+
};
244+
245+
export type UnstakeLimitMapItem = {
246+
ValidatorPublicKeyBase58Check: string;
247+
UnstakeLimit: string; // Hex string
248+
};
249+
250+
export type UnlockStakeLimitMapItem = {
251+
ValidatorPublicKeyBase58Check: string;
252+
OpCount: number;
253+
};
254+
255+
export enum LockupLimitScopeType {
256+
ANY = 'AnyCoins',
257+
SCOPED = 'ScopedCoins',
258+
}
259+
260+
export enum LockupLimitOperationString {
261+
ANY = 'Any',
262+
COIN_LOCKUP = 'CoinLockup',
263+
UPDATE_COIN_LOCKUP_YIELD_CURVE = 'UpdateCoinLockupYieldCurve',
264+
UPDATE_COIN_LOCKUP_TRANSFER_RESTRICTIONS = 'UpdateCoinLockupTransferRestrictions',
265+
COIN_LOCKUP_TRANSFER = 'CoinLockupTransferOperationString',
266+
COIN_UNLOCK = 'CoinLockupUnlock',
267+
}
268+
269+
export type LockupLimitMapItem = {
270+
ProfilePublicKeyBase58Check: string;
271+
ScopeType: LockupLimitScopeType;
272+
Operation: LockupLimitOperationString;
273+
OpCount: number;
274+
};
275+
239276
export interface TransactionSpendingLimitResponse {
240277
GlobalDESOLimit: number;
241278
// TODO: make enum for transaction type string
@@ -247,6 +284,10 @@ export interface TransactionSpendingLimitResponse {
247284
AssociationLimitMap?: AssociationLimitMapItem[];
248285
AccessGroupLimitMap?: AccessGroupLimitMapItem[];
249286
AccessGroupMemberLimitMap?: AccessGroupMemberLimitMapItem[];
287+
StakeLimitMap?: StakeLimitMapItem[];
288+
UnstakeLimitMap?: UnstakeLimitMapItem[];
289+
UnlockStakeLimitMap?: UnlockStakeLimitMapItem[];
290+
LockupLimitMap?: LockupLimitMapItem[];
250291
IsUnlimited?: boolean;
251292
DerivedKeyMemo?: string;
252293
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<div class="display--flex justify--between margin-bottom--small">
2+
<div class="text--left width--25">
3+
<img
4+
class="avatar--medium avatar--rounded margin-right--xsmall"
5+
[appAvatar]="lockupLimitMapItem?.ProfilePublicKeyBase58Check"
6+
*ngIf="
7+
lockupLimitMapItem?.ProfilePublicKeyBase58Check &&
8+
appUser?.ProfileEntryResponse?.Username
9+
"
10+
/>
11+
{{
12+
appUser?.ProfileEntryResponse?.Username ||
13+
lockupLimitMapItem?.ProfilePublicKeyBase58Check ||
14+
(lockupLimitMapItem?.ScopeType === LockupLimitScopeType.ANY
15+
? 'Any Profile'
16+
: 'DESO') | truncateAddressOrUsername
17+
}}
18+
</div>
19+
<div class="display-flex justify--center width--50">
20+
<code>
21+
{{ getOperationString() }}
22+
</code>
23+
</div>
24+
<div class="width--25 text--right">
25+
<code>
26+
{{ globalVars.formatTxCountLimit(lockupLimitMapItem?.OpCount) }}
27+
</code>
28+
</div>
29+
</div>

src/app/transaction-spending-limit/transaction-spending-limit-lockup/transaction-spending-limit-lockup.component.scss

Whitespace-only changes.
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { Component, Input, OnInit } from '@angular/core';
2+
import { GlobalVarsService } from 'src/app/global-vars.service';
3+
import {
4+
LockupLimitMapItem,
5+
LockupLimitOperationString,
6+
LockupLimitScopeType,
7+
User,
8+
} from '../../backend-api.service';
9+
import { TransactionSpendingLimitComponent } from '../transaction-spending-limit.component';
10+
11+
@Component({
12+
selector: 'app-transaction-spending-limit-lockup',
13+
templateUrl: './transaction-spending-limit-lockup.component.html',
14+
styleUrls: ['./transaction-spending-limit-lockup.component.scss'],
15+
})
16+
export class TransactionSpendingLimitLockupComponent implements OnInit {
17+
@Input() lockupLimitMapItem: LockupLimitMapItem | undefined;
18+
@Input() appUser: User | undefined;
19+
TransactionSpendingLimitComponent = TransactionSpendingLimitComponent;
20+
LockupLimitScopeType = LockupLimitScopeType;
21+
22+
constructor(public globalVars: GlobalVarsService) {}
23+
24+
ngOnInit(): void {}
25+
26+
getOperationString(): string {
27+
switch (this.lockupLimitMapItem?.Operation) {
28+
case LockupLimitOperationString.ANY:
29+
return 'Any';
30+
case LockupLimitOperationString.COIN_LOCKUP:
31+
return 'Lockup';
32+
case LockupLimitOperationString.COIN_LOCKUP_TRANSFER:
33+
return 'Transfer';
34+
case LockupLimitOperationString.UPDATE_COIN_LOCKUP_YIELD_CURVE:
35+
return 'Update lockup yield curve';
36+
case LockupLimitOperationString.UPDATE_COIN_LOCKUP_TRANSFER_RESTRICTIONS:
37+
return 'Update transfer restriction';
38+
case LockupLimitOperationString.COIN_UNLOCK:
39+
return 'Unlock coins';
40+
default:
41+
return '';
42+
}
43+
}
44+
}

src/app/transaction-spending-limit/transaction-spending-limit-section/transaction-spending-limit-section.component.html

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,135 @@
220220
></app-transaction-spending-limit-access-group-member>
221221
</div>
222222
</ng-container>
223+
<ng-container
224+
*ngIf="sectionTitle === TransactionSpendingLimitComponent.StakeSection"
225+
>
226+
<div class="display--flex justify--between items--center">
227+
<div class="text--text-lightest">Validator</div>
228+
<div class="text--text-lightest">Amount</div>
229+
</div>
230+
<div
231+
*ngIf="anyValidatorItem"
232+
class="display--flex flex--column padding-top--small justify--between"
233+
>
234+
<app-transaction-spending-limit-stake
235+
[stakeLimitMapItem]="anyValidatorItem"
236+
[operationName]="'Stake'"
237+
></app-transaction-spending-limit-stake>
238+
</div>
239+
<div
240+
*ngFor="
241+
let stakeLimitMapItem of stakeLimitMap
242+
| slice : 0 : (showAll ? stakeLimitMap.length : defaultNumShown)
243+
"
244+
class="display--flex flex--column padding-top--small justify--between"
245+
>
246+
<app-transaction-spending-limit-stake
247+
[stakeLimitMapItem]="stakeLimitMapItem"
248+
[appUser]="userMap[stakeLimitMapItem.ValidatorPublicKeyBase58Check]"
249+
[operationName]="'Stake'"
250+
></app-transaction-spending-limit-stake>
251+
</div>
252+
</ng-container>
253+
<ng-container
254+
*ngIf="
255+
sectionTitle === TransactionSpendingLimitComponent.UnstakeSection
256+
"
257+
>
258+
<div class="display--flex justify--between items--center">
259+
<div class="text--text-lightest">Validator</div>
260+
<div class="text--text-lightest">Amount</div>
261+
</div>
262+
<div
263+
*ngIf="anyValidatorItem"
264+
class="display--flex flex--column padding-top--small justify--between"
265+
>
266+
<app-transaction-spending-limit-stake
267+
[stakeLimitMapItem]="anyValidatorItem"
268+
[operationName]="'Unstake'"
269+
></app-transaction-spending-limit-stake>
270+
</div>
271+
<div
272+
*ngFor="
273+
let unstakeLimitMapItem of unstakeLimitMap
274+
| slice : 0 : (showAll ? unstakeLimitMap.length : defaultNumShown)
275+
"
276+
class="display--flex flex--column padding-top--small justify--between"
277+
>
278+
<app-transaction-spending-limit-stake
279+
[stakeLimitMapItem]="unstakeLimitMapItem"
280+
[appUser]="
281+
userMap[unstakeLimitMapItem.ValidatorPublicKeyBase58Check]
282+
"
283+
[operationName]="'Unstake'"
284+
></app-transaction-spending-limit-stake>
285+
</div>
286+
</ng-container>
287+
<ng-container
288+
*ngIf="
289+
sectionTitle === TransactionSpendingLimitComponent.UnlockStakeSection
290+
"
291+
>
292+
<div class="display--flex justify--between items--center">
293+
<div class="text--text-lightest">Validator</div>
294+
<div class="text--text-lightest">Txn Limit</div>
295+
</div>
296+
<div
297+
*ngIf="anyValidatorItem"
298+
class="display--flex flex--column padding-top--small justify--between"
299+
>
300+
<app-transaction-spending-limit-stake
301+
[stakeLimitMapItem]="anyValidatorItem"
302+
[operationName]="'Unlock Stake'"
303+
></app-transaction-spending-limit-stake>
304+
</div>
305+
<div
306+
*ngFor="
307+
let unlockStakeLimitMapItem of unlockStakeLimitMap
308+
| slice
309+
: 0
310+
: (showAll ? unlockStakeLimitMap.length : defaultNumShown)
311+
"
312+
class="display--flex flex--column padding-top--small justify--between"
313+
>
314+
<app-transaction-spending-limit-stake
315+
[stakeLimitMapItem]="unlockStakeLimitMapItem"
316+
[appUser]="
317+
userMap[unlockStakeLimitMapItem.ValidatorPublicKeyBase58Check]
318+
"
319+
[operationName]="'Unlock Stake'"
320+
></app-transaction-spending-limit-stake>
321+
</div>
322+
</ng-container>
323+
<ng-container
324+
*ngIf="sectionTitle === TransactionSpendingLimitComponent.LockupSection"
325+
>
326+
<div class="display--flex justify--between items--center">
327+
<div class="text--text-lightest">Profile</div>
328+
<div class="text--text-lightest">Operation</div>
329+
<div class="text--text-lightest">Txn Limit</div>
330+
</div>
331+
<div
332+
*ngFor="let lockupLimitItem of anyLockupLimitItems"
333+
class="display--flex flex--column padding-top--small justify--between"
334+
>
335+
<app-transaction-spending-limit-lockup
336+
[lockupLimitMapItem]="lockupLimitItem"
337+
></app-transaction-spending-limit-lockup>
338+
</div>
339+
<div
340+
*ngFor="
341+
let lockupLimitMapItem of lockupLimitMap
342+
| slice : 0 : (showAll ? lockupLimitMap.length : defaultNumShown)
343+
"
344+
class="display--flex flex--column padding-top--small justify--between"
345+
>
346+
<app-transaction-spending-limit-lockup
347+
[lockupLimitMapItem]="lockupLimitMapItem"
348+
[appUser]="userMap[lockupLimitMapItem.ProfilePublicKeyBase58Check]"
349+
></app-transaction-spending-limit-lockup>
350+
</div>
351+
</ng-container>
223352
</div>
224353
</div>
225354

0 commit comments

Comments
 (0)