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

Configure to run with pos devnet #301

Draft
wants to merge 5 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 23 additions & 23 deletions Caddyfile
Original file line number Diff line number Diff line change
Expand Up @@ -28,28 +28,28 @@ header @html Cache-Control no-store
header @html Content-Security-Policy "
default-src 'self';
connect-src
{$DOMAIN:https://node.deso.org}/api/v0/get-users-stateless
{$DOMAIN:https://node.deso.org}/api/v0/get-app-state
{$DOMAIN:https://node.deso.org}/api/v0/jumio-begin
{$DOMAIN:https://node.deso.org}/api/v0/jumio-flow-finished
{$DOMAIN:https://node.deso.org}/api/v0/get-referral-info-for-referral-hash
{$DOMAIN:https://node.deso.org}/api/v0/get-user-derived-keys
{$DOMAIN:https://node.deso.org}/api/v0/get-transaction-spending
{$DOMAIN:https://node.deso.org}/api/v0/send-phone-number-verification-text
{$DOMAIN:https://node.deso.org}/api/v0/submit-phone-number-verification-code
{$DOMAIN:https://node.deso.org}/api/v0/get-transaction-spending-limit-hex-string
{$DOMAIN:https://node.deso.org}/api/v0/get-transaction-spending-limit-response-from-hex/
{$DOMAIN:https://node.deso.org}/api/v0/get-single-post
{$DOMAIN:https://node.deso.org}/api/v0/get-exchange-rate
{$DOMAIN:https://node.deso.org}/api/v0/query-eth-rpc
{$DOMAIN:https://node.deso.org}/api/v0/submit-eth-tx
{$DOMAIN:https://node.deso.org}/api/v0/get-access-bytes
{$DOMAIN:https://node.deso.org}/api/v0/send-starter-deso-for-metamask-account
{$DOMAIN:https://node.deso.org}/api/v0/authorize-derived-key
{$DOMAIN:https://node.deso.org}/api/v0/get-txn
{$DOMAIN:https://node.deso.org}/api/v0/verify-captcha
{$DOMAIN:https://node.deso.org}/api/v0/get-bulk-messaging-public-keys
{$DOMAIN:https://node.deso.org}/api/v0/submit-transaction
{$DOMAIN:https://devnet-0.deso.run}/api/v0/get-users-stateless
{$DOMAIN:https://devnet-0.deso.run}/api/v0/get-app-state
{$DOMAIN:https://devnet-0.deso.run}/api/v0/jumio-begin
{$DOMAIN:https://devnet-0.deso.run}/api/v0/jumio-flow-finished
{$DOMAIN:https://devnet-0.deso.run}/api/v0/get-referral-info-for-referral-hash
{$DOMAIN:https://devnet-0.deso.run}/api/v0/get-user-derived-keys
{$DOMAIN:https://devnet-0.deso.run}/api/v0/get-transaction-spending
{$DOMAIN:https://devnet-0.deso.run}/api/v0/send-phone-number-verification-text
{$DOMAIN:https://devnet-0.deso.run}/api/v0/submit-phone-number-verification-code
{$DOMAIN:https://devnet-0.deso.run}/api/v0/get-transaction-spending-limit-hex-string
{$DOMAIN:https://devnet-0.deso.run}/api/v0/get-transaction-spending-limit-response-from-hex/
{$DOMAIN:https://devnet-0.deso.run}/api/v0/get-single-post
{$DOMAIN:https://devnet-0.deso.run}/api/v0/get-exchange-rate
{$DOMAIN:https://devnet-0.deso.run}/api/v0/query-eth-rpc
{$DOMAIN:https://devnet-0.deso.run}/api/v0/submit-eth-tx
{$DOMAIN:https://devnet-0.deso.run}/api/v0/get-access-bytes
{$DOMAIN:https://devnet-0.deso.run}/api/v0/send-starter-deso-for-metamask-account
{$DOMAIN:https://devnet-0.deso.run}/api/v0/authorize-derived-key
{$DOMAIN:https://devnet-0.deso.run}/api/v0/get-txn
{$DOMAIN:https://devnet-0.deso.run}/api/v0/verify-captcha
{$DOMAIN:https://devnet-0.deso.run}/api/v0/get-bulk-messaging-public-keys
{$DOMAIN:https://devnet-0.deso.run}/api/v0/submit-transaction
https://test.deso.org/api/v0/get-users-stateless
https://test.deso.org/api/v0/get-app-state
https://test.deso.org/api/v0/jumio-begin
Expand Down Expand Up @@ -81,7 +81,7 @@ header @html Content-Security-Policy "
https://explorer-api.walletconnect.com/
wss://relay.walletconnect.com/;
img-src 'self'
{$DOMAIN:https://node.deso.org}/api/v0/get-single-profile-picture/
{$DOMAIN:https://devnet-0.deso.run}/api/v0/get-single-profile-picture/
https://test.deso.org/api/v0/get-single-profile-picture/
i.imgur.com
images.deso.org
Expand Down
3 changes: 0 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@ COPY ./package.json .
COPY ./package-lock.json .
COPY ./.npmrc .

# use yarn to upgrade npm
RUN yarn global add npm@7

# install frontend dependencies before copying the frontend code
# into the container so we get docker cache benefits
RUN npm install
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,4 @@ After proper configuration of `environment.ts` and `environment.prod.ts`, run `n
## Format

Formatting will happen upon commit. Developers can also run `npm run format` or `npx npm run format` if npm isn't installed to format all source files

4 changes: 2 additions & 2 deletions src/app/account.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -351,8 +351,8 @@ export class AccountService {
const btcDepositAddress = 'Not implemented yet';
const ethDepositAddress = 'Not implemented yet';

// days * (24 hours / day) * (60 minutes / hour) * (1 block / 5 minutes) = blocks
const numBlocksBeforeExpiration = (numDaysBeforeExpiration * 24 * 60) / 5;
// days * (24 hours / day) * (60 minutes / hour) * (60 seconds / minute) * (1 block / second) = blocks
const numBlocksBeforeExpiration = numDaysBeforeExpiration * 24 * 60 * 60;

// By default, we authorize this derived key for 8640 blocks, which is about 30 days.
const expirationBlock = blockHeight + numBlocksBeforeExpiration;
Expand Down
4 changes: 4 additions & 0 deletions src/app/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ import { TransactionSpendingLimitDaoCoinLimitOrderComponent } from './transactio
import { TransactionSpendingLimitNftComponent } from './transaction-spending-limit/transaction-spending-limit-nft/transaction-spending-limit-nft.component';
import { TransactionSpendingLimitSectionComponent } from './transaction-spending-limit/transaction-spending-limit-section/transaction-spending-limit-section.component';
import { TransactionSpendingLimitComponent } from './transaction-spending-limit/transaction-spending-limit.component';
import { TransactionSpendingLimitStakeComponent } from './transaction-spending-limit/transaction-spending-limit-stake/transaction-spending-limit-stake.component';
import { TransactionSpendingLimitLockupComponent } from './transaction-spending-limit/transaction-spending-limit-lockup/transaction-spending-limit-lockup.component';

@NgModule({
declarations: [
Expand Down Expand Up @@ -107,6 +109,8 @@ import { TransactionSpendingLimitComponent } from './transaction-spending-limit/
RecoverySecretComponent,
BackupSeedDialogComponent,
RemoveAccountDialogComponent,
TransactionSpendingLimitStakeComponent,
TransactionSpendingLimitLockupComponent,
],
imports: [
BrowserModule,
Expand Down
141 changes: 138 additions & 3 deletions src/app/approve/approve.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,16 @@ import {
TransactionMetadataUpdateNFT,
TransactionMetadataUpdateProfile,
TransactionSpendingLimit,
TransactionMetadataRegisterAsValidator,
TransactionMetadataUnregisterAsValidator,
TransactionMetadataStake,
TransactionMetadataUnstake,
TransactionMetadataUnlockStake,
TransactionMetadataUnjailValidator,
TransactionMetadataCoinLockup,
TransactionMetadataUpdateCoinLockupParams,
TransactionMetadataCoinLockupTransfer,
TransactionMetadataCoinUnlock,
} from '../../lib/deso/transaction';
import { ExtraData } from '../../types/identity';
import { AccountService } from '../account.service';
Expand Down Expand Up @@ -304,12 +314,12 @@ export class ApproveComponent implements OnInit {
);
publicKeys = [daoCoinPublicKey];
if (daoCoinMetadata.operationType === 0) {
const mintAmount = this.hexNanosToUnitString(
const mintAmount = this.hexBaseUnitsToUnitString(
daoCoinMetadata.coinsToMintNanos
);
description = `mint ${mintAmount} ${daoCoinPublicKey} DAO coins`;
} else if (daoCoinMetadata.operationType === 1) {
const burnAmount = this.hexNanosToUnitString(
const burnAmount = this.hexBaseUnitsToUnitString(
daoCoinMetadata.coinsToBurnNanos
);
description = `burn ${burnAmount} ${daoCoinPublicKey} DAO coins`;
Expand All @@ -322,7 +332,7 @@ export class ApproveComponent implements OnInit {
case TransactionMetadataTransferDAOCoin:
const daoCoinTransferMetadata = this.transaction
.metadata as TransactionMetadataTransferDAOCoin;
const daoCoinTransferAmount = this.hexNanosToUnitString(
const daoCoinTransferAmount = this.hexBaseUnitsToUnitString(
daoCoinTransferMetadata.daoCoinToTransferNanos
);
const daoCoinTransferPublicKey = this.base58KeyCheck(
Expand Down Expand Up @@ -388,6 +398,7 @@ export class ApproveComponent implements OnInit {
this.hexScaledExchangeRateToFloat(
daoCoinLimitOrderMetadata.scaledExchangeRateCoinsToSellPerCoinToBuy
);
// TODO: figure out if we need to use hexBaseUnitsToUnitString here.
const quantityToFill = this.hexNanosToUnitString(
daoCoinLimitOrderMetadata.quantityToFillInBaseUnits
);
Expand Down Expand Up @@ -588,6 +599,120 @@ export class ApproveComponent implements OnInit {
description = `unknown messaging action on ${messageType} to ${recipient}`;
}
break;
case TransactionMetadataRegisterAsValidator:
// TODO: Do we want any additional details in the approve component?
description = 'register as a validator';
break;
case TransactionMetadataUnregisterAsValidator:
description = 'unregister as a validator';
break;
case TransactionMetadataStake:
const stakeMetadata = this.transaction
.metadata as TransactionMetadataStake;
const stakeValidatorPublicKey = this.base58KeyCheck(
stakeMetadata.validatorPublicKey
);
publicKeys = [stakeValidatorPublicKey];
const stakeAmountNanos = this.hexNanosToUnitString(
stakeMetadata.stakeAmountNanos
);
description = `stake ${stakeAmountNanos} $DESO to ${stakeValidatorPublicKey}`;
break;
case TransactionMetadataUnstake:
const unstakeMetadata = this.transaction
.metadata as TransactionMetadataUnstake;
const unstakeValidatorPublicKey = this.base58KeyCheck(
unstakeMetadata.validatorPublicKey
);
publicKeys = [unstakeValidatorPublicKey];
const unstakeAmountNanos = this.hexNanosToUnitString(
unstakeMetadata.unstakeAmountNanos
);
description = `unstake ${unstakeAmountNanos} $DESO from ${unstakeValidatorPublicKey}`;
break;
case TransactionMetadataUnlockStake:
const unlockStakeMetadata = this.transaction
.metadata as TransactionMetadataUnlockStake;
const unlockStakeValidatorPublicKey = this.base58KeyCheck(
unlockStakeMetadata.validatorPublicKey
);
publicKeys = [unlockStakeValidatorPublicKey];
description =
`unlock stake from ${unlockStakeValidatorPublicKey}, ` +
`starting from epochs ${unlockStakeMetadata.startEpochNumber} to ${unlockStakeMetadata.endEpochNumber}`;
break;
case TransactionMetadataUnjailValidator:
description = 'unjail your validator';
break;
case TransactionMetadataCoinLockup:
// NOTE: we don't need a special case for DESO right now
// as lockups are not allowed for DESO at this time.
const coinLockupMetadata = this.transaction
.metadata as TransactionMetadataCoinLockup;
const lockupAmount = this.hexBaseUnitsToUnitString(
coinLockupMetadata.lockupAmountBaseUnits
);
const lockupProfilePubKey = this.base58KeyCheck(
coinLockupMetadata.profilePublicKey
);
const lockUpRecipientPubKey = this.base58KeyCheck(
coinLockupMetadata.recipientPublicKey
);
publicKeys = [lockupProfilePubKey, lockUpRecipientPubKey];
description = `lockup ${lockupAmount} of your ${lockupProfilePubKey} coins`;
break;
case TransactionMetadataUpdateCoinLockupParams:
const updateCoinLockupParamsMetadata = this.transaction
.metadata as TransactionMetadataUpdateCoinLockupParams;
description =
`update your coin lockup params\n` +
`${
updateCoinLockupParamsMetadata.removeYieldCurvePoint
? 'Remove'
: 'Add'
} yield curve point with
${
updateCoinLockupParamsMetadata.lockupYieldAPYBasisPoints / 100
}% APY for a lockup of
${
updateCoinLockupParamsMetadata.lockupYieldDurationNanoSecs
} nanoseconds
${
!updateCoinLockupParamsMetadata.newLockupTransferRestrictions
? ''
: 'and update your lockup transfer restrictions'
}`;

break;
case TransactionMetadataCoinLockupTransfer:
// NOTE: we don't need a special case for DESO right now
// as lockups are not allowed for DESO at this time.
const coinLockupTransferMetadata = this.transaction
.metadata as TransactionMetadataCoinLockupTransfer;
const lockupTransferAmount = this.hexBaseUnitsToUnitString(
coinLockupTransferMetadata.lockedCoinsToTransferBaseUnits
);
const lockupTransferProfilePubKey = this.base58KeyCheck(
coinLockupTransferMetadata.profilePublicKey
);
const lockupTransferRecipientPubKey = this.base58KeyCheck(
coinLockupTransferMetadata.recipientPublicKey
);
publicKeys = [
lockupTransferProfilePubKey,
lockupTransferRecipientPubKey,
];
description = `transfer ${lockupTransferAmount} of your locked ${lockupTransferProfilePubKey} coins to ${lockupTransferRecipientPubKey}`;
break;
case TransactionMetadataCoinUnlock:
const coinUnlockMetadata = this.transaction
.metadata as TransactionMetadataCoinUnlock;
const unlockProfilePubKey = this.base58KeyCheck(
coinUnlockMetadata.profilePublicKey
);
publicKeys = [unlockProfilePubKey];
description = `unlock your locked ${unlockProfilePubKey} coins`;
break;
}

// Set the transaction description based on the description populated with public keys.
Expand All @@ -608,14 +733,24 @@ export class ApproveComponent implements OnInit {
return bs58check.encode(Buffer.from([...prefix, ...keyBytes]));
}

// uint256 to DESO nano conversions.
hexNanosToUnitString(nanos: Buffer): string {
return this.nanosToUnitString(parseInt(nanos.toString('hex'), 16));
}

// unit256 to base unit conversions.
hexBaseUnitsToUnitString(baseUnits: Buffer): string {
return this.baseUnitsToUnitString(parseInt(baseUnits.toString('hex'), 16));
}

nanosToUnitString(nanos: number): string {
return this.toFixedLengthDecimalString(nanos / 1e9);
}

baseUnitsToUnitString(baseUnits: number): string {
return this.toFixedLengthDecimalString(baseUnits / 1e18);
}

hexScaledExchangeRateToFloat(hex: Buffer): number {
return parseInt(hex.toString('hex'), 16) / 1e38;
}
Expand Down
43 changes: 42 additions & 1 deletion src/app/backend-api.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,8 @@ export type LimitOperationString =
| NFTLimitOperationString
| AssociationOperationString
| AccessGroupOperationString
| AccessGroupMemberOperationString;
| AccessGroupMemberOperationString
| LockupLimitOperationString;
export type CreatorCoinOperationLimitMap =
CoinOperationLimitMap<CreatorCoinLimitOperationString>;
export type DAOCoinOperationLimitMap =
Expand Down Expand Up @@ -236,6 +237,42 @@ export type AccessGroupMemberLimitMapItem = {
OpCount: number;
};

export type StakeLimitMapItem = {
ValidatorPublicKeyBase58Check: string;
StakeLimit: string; // Hex string
};

export type UnstakeLimitMapItem = {
ValidatorPublicKeyBase58Check: string;
UnstakeLimit: string; // Hex string
};

export type UnlockStakeLimitMapItem = {
ValidatorPublicKeyBase58Check: string;
OpCount: number;
};

export enum LockupLimitScopeType {
ANY = 'AnyCoins',
SCOPED = 'ScopedCoins',
}

export enum LockupLimitOperationString {
ANY = 'Any',
COIN_LOCKUP = 'CoinLockup',
UPDATE_COIN_LOCKUP_YIELD_CURVE = 'UpdateCoinLockupYieldCurve',
UPDATE_COIN_LOCKUP_TRANSFER_RESTRICTIONS = 'UpdateCoinLockupTransferRestrictions',
COIN_LOCKUP_TRANSFER = 'CoinLockupTransferOperationString',
COIN_UNLOCK = 'CoinLockupUnlock',
}

export type LockupLimitMapItem = {
ProfilePublicKeyBase58Check: string;
ScopeType: LockupLimitScopeType;
Operation: LockupLimitOperationString;
OpCount: number;
};

export interface TransactionSpendingLimitResponse {
GlobalDESOLimit: number;
// TODO: make enum for transaction type string
Expand All @@ -247,6 +284,10 @@ export interface TransactionSpendingLimitResponse {
AssociationLimitMap?: AssociationLimitMapItem[];
AccessGroupLimitMap?: AccessGroupLimitMapItem[];
AccessGroupMemberLimitMap?: AccessGroupMemberLimitMapItem[];
StakeLimitMap?: StakeLimitMapItem[];
UnstakeLimitMap?: UnstakeLimitMapItem[];
UnlockStakeLimitMap?: UnlockStakeLimitMapItem[];
LockupLimitMap?: LockupLimitMapItem[];
IsUnlimited?: boolean;
DerivedKeyMemo?: string;
}
Expand Down
Loading
Loading