Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8a3612a18c |
@@ -8,7 +8,6 @@ import { ENV } from '../../config';
|
||||
|
||||
import noIcon from '../../images/token-no-icon.png';
|
||||
import vegaBlack from '../../images/vega_black.png';
|
||||
import vegaVesting from '../../images/vega_vesting.png';
|
||||
import { BigNumber } from '../../lib/bignumber';
|
||||
import type { WalletCardAssetProps } from '../wallet-card';
|
||||
import { useVegaWallet } from '@vegaprotocol/wallet';
|
||||
@@ -103,10 +102,7 @@ export const usePollForDelegations = () => {
|
||||
setAccounts(
|
||||
accounts
|
||||
.filter(
|
||||
(a) =>
|
||||
a.type === Schema.AccountType.ACCOUNT_TYPE_GENERAL ||
|
||||
a.type === Schema.AccountType.ACCOUNT_TYPE_VESTED_REWARDS ||
|
||||
a.type === Schema.AccountType.ACCOUNT_TYPE_VESTING_REWARDS
|
||||
(a) => a.type === Schema.AccountType.ACCOUNT_TYPE_GENERAL
|
||||
)
|
||||
.map((a) => {
|
||||
const isVega =
|
||||
@@ -119,23 +115,14 @@ export const usePollForDelegations = () => {
|
||||
subheading: isVega ? t('collateral') : a.asset.symbol,
|
||||
symbol: a.asset.symbol,
|
||||
decimals: a.asset.decimals,
|
||||
assetId: a.asset.id,
|
||||
balance: new BigNumber(
|
||||
addDecimal(a.balance, a.asset.decimals)
|
||||
),
|
||||
image: isVega
|
||||
? vegaBlack
|
||||
: a.type ===
|
||||
Schema.AccountType.ACCOUNT_TYPE_VESTED_REWARDS ||
|
||||
a.type ===
|
||||
Schema.AccountType.ACCOUNT_TYPE_VESTING_REWARDS
|
||||
? vegaVesting
|
||||
: noIcon,
|
||||
image: isVega ? vegaBlack : noIcon,
|
||||
border: isVega,
|
||||
address: isAssetTypeERC20(a.asset)
|
||||
? a.asset.source.contractAddress
|
||||
: undefined,
|
||||
type: a.type,
|
||||
};
|
||||
})
|
||||
.sort((a, b) => {
|
||||
|
||||
@@ -1,18 +1,9 @@
|
||||
import React, { useMemo } from 'react';
|
||||
import React from 'react';
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
import { useAnimateValue } from '../../hooks/use-animate-value';
|
||||
import type { BigNumber } from '../../lib/bignumber';
|
||||
import { useNumberParts } from '@vegaprotocol/react-helpers';
|
||||
import * as Schema from '@vegaprotocol/types';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { AnchorButton, Tooltip } from '@vegaprotocol/ui-toolkit';
|
||||
import {
|
||||
CONSOLE_TRANSFER_ASSET,
|
||||
DApp,
|
||||
useLinks,
|
||||
} from '@vegaprotocol/environment';
|
||||
import { useNetworkParam } from '@vegaprotocol/network-parameters';
|
||||
|
||||
interface WalletCardProps {
|
||||
children: React.ReactNode;
|
||||
@@ -109,10 +100,8 @@ export interface WalletCardAssetProps {
|
||||
symbol: string;
|
||||
balance: BigNumber;
|
||||
decimals: number;
|
||||
assetId?: string;
|
||||
border?: boolean;
|
||||
subheading?: string;
|
||||
type?: Schema.AccountType;
|
||||
}
|
||||
|
||||
export const WalletCardAsset = ({
|
||||
@@ -121,37 +110,16 @@ export const WalletCardAsset = ({
|
||||
symbol,
|
||||
balance,
|
||||
decimals,
|
||||
assetId,
|
||||
border,
|
||||
subheading,
|
||||
type,
|
||||
}: WalletCardAssetProps) => {
|
||||
const [integers, decimalsPlaces, separator] = useNumberParts(
|
||||
balance,
|
||||
decimals
|
||||
);
|
||||
const { t } = useTranslation();
|
||||
const consoleLink = useLinks(DApp.Console);
|
||||
const transferAssetLink = (assetId: string) =>
|
||||
consoleLink(CONSOLE_TRANSFER_ASSET.replace(':assetId', assetId));
|
||||
const { param: baseRate } = useNetworkParam('rewards_vesting_baseRate');
|
||||
|
||||
const isRedeemable =
|
||||
type === Schema.AccountType.ACCOUNT_TYPE_VESTED_REWARDS && assetId;
|
||||
|
||||
const accountTypeTooltip = useMemo(() => {
|
||||
if (type === Schema.AccountType.ACCOUNT_TYPE_VESTED_REWARDS) {
|
||||
return t('VestedRewardsTooltip');
|
||||
}
|
||||
if (type === Schema.AccountType.ACCOUNT_TYPE_VESTING_REWARDS && baseRate) {
|
||||
return t('VestingRewardsTooltip', { baseRate });
|
||||
}
|
||||
|
||||
return null;
|
||||
}, [baseRate, t, type]);
|
||||
|
||||
return (
|
||||
<div className="flex flex-nowrap gap-2 mt-2 mb-4">
|
||||
<div className="flex flex-nowrap mt-2 mb-4">
|
||||
<img
|
||||
alt="Vega"
|
||||
src={image}
|
||||
@@ -161,37 +129,15 @@ export const WalletCardAsset = ({
|
||||
/>
|
||||
<div>
|
||||
<div
|
||||
className="flex align-center items-baseline text-base gap-2"
|
||||
className="flex align-center text-base"
|
||||
data-testid="currency-title"
|
||||
>
|
||||
<div className="mb-0 uppercase">{name}</div>
|
||||
<div className="mb-0 px-2 uppercase">{name}</div>
|
||||
<div className="mb-0 uppercase text-neutral-400">
|
||||
{subheading || symbol}
|
||||
</div>
|
||||
</div>
|
||||
{type ? (
|
||||
<div className="mb-[2px] flex gap-2 items-baseline">
|
||||
<Tooltip description={accountTypeTooltip}>
|
||||
<span className="px-2 py-1 leading-none text-xs bg-vega-cdark-700 rounded">
|
||||
{Schema.AccountTypeMapping[type]}
|
||||
</span>
|
||||
</Tooltip>
|
||||
{isRedeemable ? (
|
||||
<Tooltip description={t('RedeemRewardsTooltip')}>
|
||||
<AnchorButton
|
||||
variant="primary"
|
||||
size="xs"
|
||||
href={transferAssetLink(assetId)}
|
||||
target="_blank"
|
||||
className="px-2 py-1 leading-none text-xs bg-vega-yellow text-black rounded"
|
||||
>
|
||||
{t('Redeem')}
|
||||
</AnchorButton>
|
||||
</Tooltip>
|
||||
) : null}
|
||||
</div>
|
||||
) : null}
|
||||
<div className="basis-full font-mono" data-testid="currency-value">
|
||||
<div className="px-2 basis-full font-mono" data-testid="currency-value">
|
||||
<span>
|
||||
{integers}
|
||||
{separator}
|
||||
|
||||
@@ -953,8 +953,5 @@
|
||||
"ACCOUNT_TYPE_REWARD_RELATIVE_RETURN": "Relative return reward account",
|
||||
"ACCOUNT_TYPE_REWARD_RETURN_VOLATILITY": "Return volatility reward account",
|
||||
"ACCOUNT_TYPE_REWARD_VALIDATOR_RANKING": "Validator ranking reward account",
|
||||
"ACCOUNT_TYPE_PENDING_FEE_REFERRAL_REWARD": "Pending fee referral reward account",
|
||||
"VestingRewardsTooltip": "Vesting rewards will be moved to vested account at a rate of {{baseRate}} per epoch.",
|
||||
"VestedRewardsTooltip": "Vested rewards can be redeemed using Console",
|
||||
"RedeemRewardsTooltip": "Click to redeem vested rewards in Console"
|
||||
"ACCOUNT_TYPE_PENDING_FEE_REFERRAL_REWARD": "Pending fee referral reward account"
|
||||
}
|
||||
|
||||
@@ -1,28 +1,11 @@
|
||||
import { fireEvent, render, screen, waitFor } from '@testing-library/react';
|
||||
import userEvent from '@testing-library/user-event';
|
||||
import BigNumber from 'bignumber.js';
|
||||
import {
|
||||
AddressField,
|
||||
TransferFee,
|
||||
TransferForm,
|
||||
type TransferFormProps,
|
||||
} from './transfer-form';
|
||||
import { AddressField, TransferFee, TransferForm } from './transfer-form';
|
||||
import { AccountType } from '@vegaprotocol/types';
|
||||
import { removeDecimal } from '@vegaprotocol/utils';
|
||||
import { MockedProvider } from '@apollo/client/testing';
|
||||
|
||||
describe('TransferForm', () => {
|
||||
const renderComponent = (props: TransferFormProps) => {
|
||||
return render(
|
||||
// Wrap with mock provider as the form will make queries to fetch the selected
|
||||
// toVegaKey accounts. We don't test this for now but we need to wrap so that
|
||||
// the component has access to the client
|
||||
<MockedProvider>
|
||||
<TransferForm {...props} />
|
||||
</MockedProvider>
|
||||
);
|
||||
};
|
||||
|
||||
const submit = async () => {
|
||||
await userEvent.click(
|
||||
screen.getByRole('button', { name: 'Confirm transfer' })
|
||||
@@ -83,7 +66,7 @@ describe('TransferForm', () => {
|
||||
// 1003-TRAN-017
|
||||
// 1003-TRAN-018
|
||||
// 1003-TRAN-019
|
||||
renderComponent(props);
|
||||
render(<TransferForm {...props} />);
|
||||
// Select a pubkey
|
||||
await userEvent.selectOptions(
|
||||
screen.getByLabelText('To Vega key'),
|
||||
@@ -130,7 +113,7 @@ describe('TransferForm', () => {
|
||||
// 1003-TRAN-012
|
||||
// 1003-TRAN-013
|
||||
// 1003-TRAN-004
|
||||
renderComponent(props);
|
||||
render(<TransferForm {...props} />);
|
||||
await submit();
|
||||
expect(await screen.findAllByText('Required')).toHaveLength(3); // pubkey is set as default value
|
||||
const toggle = screen.getByText('Enter manually');
|
||||
@@ -156,7 +139,7 @@ describe('TransferForm', () => {
|
||||
// 1002-WITH-010
|
||||
// 1003-TRAN-011
|
||||
// 1003-TRAN-014
|
||||
renderComponent(props);
|
||||
render(<TransferForm {...props} />);
|
||||
|
||||
// check current pubkey not shown
|
||||
const keySelect = screen.getByLabelText<HTMLSelectElement>('To Vega key');
|
||||
@@ -223,7 +206,7 @@ describe('TransferForm', () => {
|
||||
describe('IncludeFeesCheckbox', () => {
|
||||
it('validates fields and submits when checkbox is checked', async () => {
|
||||
const mockSubmit = jest.fn();
|
||||
renderComponent({ ...props, submitTransfer: mockSubmit });
|
||||
render(<TransferForm {...props} submitTransfer={mockSubmit} />);
|
||||
|
||||
// check current pubkey not shown
|
||||
const keySelect = screen.getByLabelText<HTMLSelectElement>('To Vega key');
|
||||
@@ -292,7 +275,7 @@ describe('TransferForm', () => {
|
||||
});
|
||||
|
||||
it('validates fields when checkbox is not checked', async () => {
|
||||
renderComponent(props);
|
||||
render(<TransferForm {...props} />);
|
||||
|
||||
// check current pubkey not shown
|
||||
const keySelect: HTMLSelectElement = screen.getByLabelText('To Vega key');
|
||||
|
||||
@@ -27,8 +27,6 @@ import { useCallback, useEffect, useMemo, useState } from 'react';
|
||||
import { Controller, useForm } from 'react-hook-form';
|
||||
import { AssetOption, Balance } from '@vegaprotocol/assets';
|
||||
import { AccountType, AccountTypeMapping } from '@vegaprotocol/types';
|
||||
import { useDataProvider } from '@vegaprotocol/data-provider';
|
||||
import { accountsDataProvider } from './accounts-data-provider';
|
||||
|
||||
interface FormFields {
|
||||
toVegaKey: string;
|
||||
@@ -37,7 +35,7 @@ interface FormFields {
|
||||
fromAccount: AccountType;
|
||||
}
|
||||
|
||||
export interface TransferFormProps {
|
||||
interface TransferFormProps {
|
||||
pubKey: string | null;
|
||||
pubKeys: string[] | null;
|
||||
accounts: Array<{
|
||||
@@ -74,28 +72,8 @@ export const TransferForm = ({
|
||||
|
||||
const assets = sortBy(
|
||||
accounts
|
||||
.filter(
|
||||
(a) =>
|
||||
a.type === AccountType.ACCOUNT_TYPE_GENERAL ||
|
||||
a.type === AccountType.ACCOUNT_TYPE_VESTED_REWARDS
|
||||
)
|
||||
// Sum the general and vested account balances so the value shown in the asset
|
||||
// dropdown is correct for all transferable accounts
|
||||
.reduce((merged, account) => {
|
||||
const existing = merged.findIndex(
|
||||
(m) => m.asset.id === account.asset.id
|
||||
);
|
||||
if (existing > -1) {
|
||||
const balance = new BigNumber(merged[existing].balance)
|
||||
.plus(new BigNumber(account.balance))
|
||||
.toString();
|
||||
merged[existing] = { ...merged[existing], balance };
|
||||
return merged;
|
||||
}
|
||||
return [...merged, account];
|
||||
}, [] as typeof accounts)
|
||||
.filter((a) => a.type === AccountType.ACCOUNT_TYPE_GENERAL)
|
||||
.map((account) => ({
|
||||
key: account.asset.id,
|
||||
...account.asset,
|
||||
balance: addDecimal(account.balance, account.asset.decimals),
|
||||
})),
|
||||
@@ -109,30 +87,18 @@ export const TransferForm = ({
|
||||
|
||||
const asset = assets.find((a) => a.id === assetId);
|
||||
|
||||
const { data: toAccounts } = useDataProvider({
|
||||
dataProvider: accountsDataProvider,
|
||||
variables: {
|
||||
partyId: selectedPubKey,
|
||||
},
|
||||
skip: !selectedPubKey,
|
||||
});
|
||||
|
||||
const account = accounts.find(
|
||||
(a) => a.asset.id === assetId && a.type === fromAccount
|
||||
);
|
||||
const accountBalance =
|
||||
account && addDecimal(account.balance, account.asset.decimals);
|
||||
|
||||
// The general account of the selected pubkey. You can only transfer
|
||||
// to general accounts, either when redeeming vested rewards or just
|
||||
// during normal general -> general transfers
|
||||
const toGeneralAccount =
|
||||
toAccounts &&
|
||||
toAccounts.find((a) => {
|
||||
return (
|
||||
a.asset.id === assetId && a.type === AccountType.ACCOUNT_TYPE_GENERAL
|
||||
);
|
||||
});
|
||||
// General account for the selected asset
|
||||
const generalAccount = accounts.find((a) => {
|
||||
return (
|
||||
a.asset.id === assetId && a.type === AccountType.ACCOUNT_TYPE_GENERAL
|
||||
);
|
||||
});
|
||||
|
||||
const [includeFee, setIncludeFee] = useState(false);
|
||||
|
||||
@@ -260,7 +226,7 @@ export const TransferForm = ({
|
||||
>
|
||||
{assets.map((a) => (
|
||||
<AssetOption
|
||||
key={a.key}
|
||||
key={a.id}
|
||||
asset={a}
|
||||
balance={
|
||||
<Balance
|
||||
@@ -330,16 +296,14 @@ export const TransferForm = ({
|
||||
defaultValue={AccountType.ACCOUNT_TYPE_GENERAL}
|
||||
>
|
||||
<option value={AccountType.ACCOUNT_TYPE_GENERAL}>
|
||||
{toGeneralAccount
|
||||
{generalAccount
|
||||
? `${
|
||||
AccountTypeMapping[AccountType.ACCOUNT_TYPE_GENERAL]
|
||||
} (${addDecimalsFormatNumber(
|
||||
toGeneralAccount.balance,
|
||||
toGeneralAccount.asset.decimals
|
||||
)} ${toGeneralAccount.asset.symbol})`
|
||||
: `${AccountTypeMapping[AccountType.ACCOUNT_TYPE_GENERAL]} ${
|
||||
asset ? `(0 ${asset.symbol})` : ''
|
||||
}`}
|
||||
generalAccount.balance,
|
||||
generalAccount.asset.decimals
|
||||
)} ${generalAccount.asset.symbol})`
|
||||
: AccountTypeMapping[AccountType.ACCOUNT_TYPE_GENERAL]}
|
||||
</option>
|
||||
</TradingSelect>
|
||||
</TradingFormGroup>
|
||||
|
||||
@@ -126,11 +126,6 @@ export const useEtherscanLink = () => {
|
||||
return link;
|
||||
};
|
||||
|
||||
// Console pages
|
||||
export const CONSOLE_TRANSFER = '#/portfolio/assets/transfer';
|
||||
export const CONSOLE_TRANSFER_ASSET =
|
||||
'#/portfolio/assets/transfer?assetId=:assetId';
|
||||
|
||||
// Governance pages
|
||||
export const TOKEN_NEW_MARKET_PROPOSAL = '/proposals/propose/new-market';
|
||||
export const TOKEN_NEW_NETWORK_PARAM_PROPOSAL =
|
||||
|
||||
@@ -12,7 +12,6 @@ export const NetworkParams = {
|
||||
'rewards_marketCreationQuantumMultiple',
|
||||
reward_staking_delegation_payoutDelay:
|
||||
'reward_staking_delegation_payoutDelay',
|
||||
rewards_vesting_baseRate: 'rewards_vesting_baseRate',
|
||||
governance_proposal_market_minVoterBalance:
|
||||
'governance_proposal_market_minVoterBalance',
|
||||
governance_proposal_market_minClose: 'governance_proposal_market_minClose',
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
genesis.json
|
||||
genesis.tmp
|
||||
+18
-32
@@ -2,11 +2,10 @@
|
||||
"app_state": {
|
||||
"assets": {
|
||||
"73174a6fb1d5802ba0ac7bd7ab79e0a3a4837b262de0a4e80815a55442692bd0": {
|
||||
"min_lp_stake": "1",
|
||||
"decimals": 5,
|
||||
"name": "BTC (fake)",
|
||||
"quantum": "1",
|
||||
"symbol": "fBTC",
|
||||
"total_supply": "21000000",
|
||||
"source": {
|
||||
"builtin_asset": {
|
||||
"max_faucet_amount_mint": "1000000"
|
||||
@@ -14,11 +13,10 @@
|
||||
}
|
||||
},
|
||||
"8566db7257222b5b7ef2886394ad28b938b28680a54a169bbc795027b89d6665": {
|
||||
"min_lp_stake": "1",
|
||||
"decimals": 5,
|
||||
"name": "DAI (fake)",
|
||||
"quantum": "1",
|
||||
"symbol": "fDAI",
|
||||
"total_supply": "1000000000",
|
||||
"source": {
|
||||
"builtin_asset": {
|
||||
"max_faucet_amount_mint": "10000000000"
|
||||
@@ -26,11 +24,10 @@
|
||||
}
|
||||
},
|
||||
"e02d4c15d790d1d2dffaf2dcd1cf06a1fe656656cf4ed18c8ce99f9e83643567": {
|
||||
"min_lp_stake": "1",
|
||||
"decimals": 5,
|
||||
"name": "EURO (fake)",
|
||||
"symbol": "fEURO",
|
||||
"total_supply": "1000000000",
|
||||
"quantum": "1",
|
||||
"source": {
|
||||
"builtin_asset": {
|
||||
"max_faucet_amount_mint": "10000000000"
|
||||
@@ -38,11 +35,10 @@
|
||||
}
|
||||
},
|
||||
"816af99af60d684502a40824758f6b5377e6af48e50a9ee8ef478ecb879ea8bc": {
|
||||
"min_lp_stake": "1",
|
||||
"decimals": 5,
|
||||
"name": "USDC (fake)",
|
||||
"symbol": "fUSDC",
|
||||
"total_supply": "1000000000",
|
||||
"quantum": "1",
|
||||
"source": {
|
||||
"builtin_asset": {
|
||||
"max_faucet_amount_mint": "1000000000000"
|
||||
@@ -50,11 +46,10 @@
|
||||
}
|
||||
},
|
||||
"62dfb1ab1cd488862b416cf163c75bc9a279226c65ac287c0dd67650daa444ee": {
|
||||
"min_lp_stake": "1",
|
||||
"decimals": 5,
|
||||
"name": "XYZ (α alpha)",
|
||||
"quantum": "1",
|
||||
"symbol": "XYZalpha",
|
||||
"total_supply": "1000000000",
|
||||
"source": {
|
||||
"builtin_asset": {
|
||||
"max_faucet_amount_mint": "100000000000"
|
||||
@@ -62,11 +57,10 @@
|
||||
}
|
||||
},
|
||||
"dedb3c42e7bc88d98a7fe0d73c7b9870b34c62c79a713071bd4d645ef7c216ee": {
|
||||
"min_lp_stake": "1",
|
||||
"decimals": 5,
|
||||
"name": "XYZ (β beta)",
|
||||
"quantum": "1",
|
||||
"symbol": "XYZbeta",
|
||||
"total_supply": "1000000000",
|
||||
"source": {
|
||||
"builtin_asset": {
|
||||
"max_faucet_amount_mint": "100000000000"
|
||||
@@ -74,11 +68,10 @@
|
||||
}
|
||||
},
|
||||
"a0ea8a48eb5cb024e66be5777bea75165ffcaf0be82d9047e376ce352e202f76": {
|
||||
"min_lp_stake": "1",
|
||||
"decimals": 5,
|
||||
"name": "XYZ (γ gamma)",
|
||||
"quantum": "1",
|
||||
"symbol": "XYZgamma",
|
||||
"total_supply": "1000000000",
|
||||
"source": {
|
||||
"builtin_asset": {
|
||||
"max_faucet_amount_mint": "100000000000"
|
||||
@@ -86,11 +79,10 @@
|
||||
}
|
||||
},
|
||||
"9ed5dd08c88e38f1c92cb8f056bd9d0507512c9ea4e6f308936f73646187b8e9": {
|
||||
"min_lp_stake": "1",
|
||||
"decimals": 5,
|
||||
"name": "XYZ (δ delta)",
|
||||
"quantum": "1",
|
||||
"symbol": "XYZdelta",
|
||||
"total_supply": "1000000000",
|
||||
"source": {
|
||||
"builtin_asset": {
|
||||
"max_faucet_amount_mint": "100000000000"
|
||||
@@ -98,11 +90,10 @@
|
||||
}
|
||||
},
|
||||
"bdcde894dcc4ffa11d6192065d84f9dcc75814cf24760ff4f3e50d64eaddbc02": {
|
||||
"min_lp_stake": "1",
|
||||
"decimals": 5,
|
||||
"name": "XYZ (ε epsilon)",
|
||||
"quantum": "1",
|
||||
"symbol": "XYZepsilon",
|
||||
"total_supply": "1000000000",
|
||||
"source": {
|
||||
"builtin_asset": {
|
||||
"max_faucet_amount_mint": "100000000000"
|
||||
@@ -110,11 +101,10 @@
|
||||
}
|
||||
},
|
||||
"{{.GetVegaContractID "tBTC"}}": {
|
||||
"min_lp_stake": "1",
|
||||
"decimals": 5,
|
||||
"name": "BTC (local)",
|
||||
"quantum": "1",
|
||||
"symbol": "tBTC",
|
||||
"total_supply": "0",
|
||||
"source": {
|
||||
"erc20": {
|
||||
"contract_address": "{{.GetEthContractAddr "tBTC"}}"
|
||||
@@ -122,11 +112,10 @@
|
||||
}
|
||||
},
|
||||
"{{.GetVegaContractID "tDAI"}}": {
|
||||
"min_lp_stake": "1",
|
||||
"decimals": 5,
|
||||
"quantum": "1",
|
||||
"name": "DAI (local)",
|
||||
"symbol": "tDAI",
|
||||
"total_supply": "0",
|
||||
"source": {
|
||||
"erc20": {
|
||||
"contract_address": "{{.GetEthContractAddr "tDAI"}}"
|
||||
@@ -134,11 +123,10 @@
|
||||
}
|
||||
},
|
||||
"{{.GetVegaContractID "tEURO"}}": {
|
||||
"min_lp_stake": "1",
|
||||
"quantum": "1",
|
||||
"decimals": 5,
|
||||
"name": "EURO (local)",
|
||||
"symbol": "tEURO",
|
||||
"total_supply": "0",
|
||||
"source": {
|
||||
"erc20": {
|
||||
"contract_address": "{{.GetEthContractAddr "tEURO"}}"
|
||||
@@ -146,11 +134,10 @@
|
||||
}
|
||||
},
|
||||
"{{.GetVegaContractID "tUSDC"}}": {
|
||||
"min_lp_stake": "1",
|
||||
"quantum": "1",
|
||||
"decimals": 5,
|
||||
"name": "USDC (local)",
|
||||
"symbol": "tUSDC",
|
||||
"total_supply": "0",
|
||||
"source": {
|
||||
"erc20": {
|
||||
"contract_address": "{{.GetEthContractAddr "tUSDC"}}"
|
||||
@@ -158,11 +145,10 @@
|
||||
}
|
||||
},
|
||||
"{{.GetVegaContractID "VEGA"}}": {
|
||||
"min_lp_stake": "1",
|
||||
"quantum": "1",
|
||||
"decimals": 18,
|
||||
"name": "Vega",
|
||||
"symbol": "VEGA",
|
||||
"total_supply": "64999723000000000000000000",
|
||||
"source": {
|
||||
"erc20": {
|
||||
"contract_address": "{{.GetEthContractAddr "VEGA"}}"
|
||||
@@ -171,7 +157,7 @@
|
||||
}
|
||||
},
|
||||
"network": {
|
||||
"ReplayAttackThreshold": 30
|
||||
"replay_attack_threshold": 30
|
||||
},
|
||||
"network_parameters": {
|
||||
"blockchains.ethereumConfig": "{\"network_id\": \"{{ .NetworkID }}\", \"chain_id\": \"{{ .ChainID }}\", \"collateral_bridge_contract\": { \"address\": \"{{.GetEthContractAddr "erc20_bridge_1"}}\" }, \"confirmations\": 3, \"staking_bridge_contract\": { \"address\": \"{{.GetEthContractAddr "staking_bridge"}}\", \"deployment_block_height\": 0}, \"token_vesting_contract\": { \"address\": \"{{.GetEthContractAddr "erc20_vesting"}}\", \"deployment_block_height\": 0 }, \"multisig_control_contract\": { \"address\": \"{{.GetEthContractAddr "MultisigControl"}}\", \"deployment_block_height\": 0 }}",
|
||||
@@ -194,17 +180,17 @@
|
||||
"market.auction.minimumDuration": "3s",
|
||||
"market.fee.factors.infrastructureFee": "0.001",
|
||||
"market.fee.factors.makerFee": "0.004",
|
||||
"market.stake.target.timeWindow": "1h0m0s",
|
||||
"market.stake.target.scalingFactor": "10",
|
||||
"market.liquidity.stakeToCcyVolume": "0.3",
|
||||
"market.liquidity.targetstake.triggering.ratio": "0.7",
|
||||
"market.liquidity.providersFeeCalculationTimeStep": "5s",
|
||||
"network.checkpoint.timeElapsedBetweenCheckpoints": "10s",
|
||||
"reward.asset": "{{.GetVegaContractID "VEGA"}}",
|
||||
"reward.staking.delegation.competitionLevel": "3.1",
|
||||
"reward.staking.delegation.delegatorShare": "0.883",
|
||||
"reward.staking.delegation.maxPayoutPerParticipant": "700000000000000000000",
|
||||
"reward.staking.delegation.maxPayoutPerEpoch": "7000000000000000000000",
|
||||
"reward.staking.delegation.minimumValidatorStake": "3000000000000000000000",
|
||||
"reward.staking.delegation.payoutDelay": "10s",
|
||||
"reward.staking.delegation.payoutFraction": "0.007",
|
||||
"spam.protection.delegation.min.tokens": "1000000000000000000",
|
||||
"spam.protection.max.delegations": "390",
|
||||
"spam.protection.max.proposals": "100",
|
||||
|
||||
Executable
+63
@@ -0,0 +1,63 @@
|
||||
#!/bin/bash
|
||||
run_indented() {
|
||||
local indent=${INDENT:-" "}
|
||||
{ "$@" 2> >(sed "s/^/$indent/g" >&2); } | sed "s/^/$indent/g"
|
||||
}
|
||||
bold=$(tput bold)
|
||||
normal=$(tput sgr0)
|
||||
|
||||
# The name of the application to check.
|
||||
APPLICATION="vega"
|
||||
DEBUG=false
|
||||
|
||||
|
||||
for arg in "$@"; do
|
||||
if [ "$arg" = "debug" ]; then
|
||||
# Set the flag to false if 'notidyup' is found
|
||||
DEBUG=true
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
echo "${bold}# Setup${normal}"
|
||||
# Check if the application exists.
|
||||
if command -v "$APPLICATION" &> /dev/null; then
|
||||
# Run the application if it exists.
|
||||
run_indented "$APPLICATION" version
|
||||
else
|
||||
# Print an error message if the application doesn't exist.
|
||||
echo "Error: $APPLICATION is not installed."
|
||||
# Exit with a non-zero exit code to indicate failure.
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "${bold}# Generating genesis${normal}"
|
||||
run_indented vegacapsule template genesis --path genesis.tmpl > genesis.tmp
|
||||
run_indented tail -n +3 genesis.tmp > genesis.json
|
||||
run_indented rm genesis.tmp
|
||||
|
||||
if jq empty "genesis.json" &> /dev/null; then
|
||||
run_indented echo ""
|
||||
run_indented echo "${bold}The genesis.json file is valid JSON.${normal}"
|
||||
else
|
||||
run_indented echo ""
|
||||
run_indented echo "${bold}The genesis.json file is invalid JSON.${normal}"
|
||||
# Exit with a non-zero exit code to indicate failure
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if $DEBUG; then
|
||||
run_indented cat genesis.json
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "${bold}# Verifying genesis${normal}"
|
||||
run_indented vega verify genesis genesis.json
|
||||
echo ""
|
||||
|
||||
# Tidy up
|
||||
if [[ "$DEBUG" == "false" ]]; then
|
||||
run_indented rm genesis.json
|
||||
fi
|
||||
Reference in New Issue
Block a user