allow ref link (#97)

This commit is contained in:
DR497 2021-07-04 03:17:58 +08:00 committed by GitHub
parent c098b44436
commit 7b7afc8606
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 462 additions and 72 deletions

View File

@ -1,3 +1,4 @@
REACT_APP_USDT_REFERRAL_FEES_ADDRESS=''
REACT_APP_USDC_REFERRAL_FEES_ADDRESS=''
REACT_APP_ALLOW_REF_LINK=true
REACT_APP_EXCLUDE_MARKETS=[]

View File

@ -12,6 +12,7 @@
"@project-serum/pool": "0.2.2",
"@project-serum/serum": "^0.13.41",
"@project-serum/sol-wallet-adapter": "^0.2.0",
"@solana/spl-name-service": "^0.1.2",
"@solana/spl-token": "^0.1.6",
"@solana/web3.js": "0.86.1",
"@testing-library/jest-dom": "^4.2.4",
@ -29,6 +30,7 @@
"immutable-tuple": "^0.4.10",
"nanoid": "^3.1.22",
"qrcode.react": "^1.0.0",
"query-string": "^7.0.1",
"react": "^16.13.1",
"react-app-polyfill": "^1.0.5",
"react-copy-to-clipboard": "^5.0.2",

View File

@ -7,6 +7,7 @@ import { Spin } from 'antd';
import ErrorBoundary from './components/ErrorBoundary';
import { Routes } from './routes';
import { PreferencesProvider } from './utils/preferences';
import { ReferrerProvider } from './utils/referrer';
export default function App() {
return (
@ -14,13 +15,15 @@ export default function App() {
<GlobalStyle />
<ErrorBoundary>
<ConnectionProvider>
<WalletProvider>
<PreferencesProvider>
<Suspense fallback={() => <Spin size="large" />}>
<Routes />
</Suspense>
</PreferencesProvider>
</WalletProvider>
<ReferrerProvider>
<WalletProvider>
<PreferencesProvider>
<Suspense fallback={() => <Spin size="large" />}>
<Routes />
</Suspense>
</PreferencesProvider>
</WalletProvider>
</ReferrerProvider>
</ConnectionProvider>
</ErrorBoundary>
</Suspense>

View File

@ -1,10 +1,25 @@
import { Layout } from 'antd';
import React from 'react';
import React, { useEffect } from 'react';
import TopBar from './TopBar';
import { CustomFooter as Footer } from './Footer';
import { useReferrer } from '../utils/referrer';
import queryString from 'query-string';
import { useLocation } from 'react-router-dom';
import { notify } from '../utils/notifications';
const { Header, Content } = Layout;
export default function BasicLayout({ children }) {
const { refCode, setRefCode, allowRefLink } = useReferrer();
const { search } = useLocation();
const parsed = queryString.parse(search);
useEffect(() => {
if (!!parsed.refCode && parsed.refCode !== refCode && allowRefLink) {
notify({ message: `New referrer ${parsed.refCode} added` });
setRefCode(parsed.refCode);
}
}, [parsed, refCode, setRefCode, allowRefLink]);
return (
<React.Fragment>
<Layout

View File

@ -2,6 +2,7 @@ import React from 'react';
import { Layout, Row, Col, Grid } from 'antd';
import Link from './Link';
import { helpUrls } from './HelpUrls';
import { useReferrer } from '../utils/referrer';
const { Footer } = Layout;
const { useBreakpoint } = Grid;
@ -19,15 +20,18 @@ const footerElements = [
export const CustomFooter = () => {
const smallScreen = !useBreakpoint().lg;
const { refCode, allowRefLink } = useReferrer();
return (
<Footer
style={{
height: '45px',
height: '55px',
paddingBottom: 10,
paddingTop: 10,
}}
>
{refCode && allowRefLink && (
<Row justify="center">Your referrer is {refCode}</Row>
)}
<Row align="middle" gutter={[16, 4]}>
{!smallScreen && (
<>

View File

@ -1,5 +1,5 @@
import {Button, Col, Divider, Popover, Row} from 'antd';
import React, {useState} from 'react';
import { Button, Col, Divider, Popover, Row } from 'antd';
import React, { useState } from 'react';
import FloatingElement from './layout/FloatingElement';
import styled from 'styled-components';
import {
@ -11,18 +11,19 @@ import {
useTokenAccounts,
} from '../utils/markets';
import DepositDialog from './DepositDialog';
import {useWallet} from '../utils/wallet';
import { useWallet } from '../utils/wallet';
import Link from './Link';
import {settleFunds} from '../utils/send';
import {useSendConnection} from '../utils/connection';
import {notify} from '../utils/notifications';
import {Balances} from '../utils/types';
import { settleFunds } from '../utils/send';
import { useSendConnection } from '../utils/connection';
import { notify } from '../utils/notifications';
import { Balances } from '../utils/types';
import StandaloneTokenAccountsSelect from './StandaloneTokenAccountSelect';
import LinkAddress from './LinkAddress';
import {InfoCircleOutlined} from '@ant-design/icons';
import {useInterval} from "../utils/useInterval";
import {useLocalStorageState} from "../utils/utils";
import { AUTO_SETTLE_DISABLED_OVERRIDE } from "../utils/preferences";
import { InfoCircleOutlined } from '@ant-design/icons';
import { useInterval } from '../utils/useInterval';
import { useLocalStorageState } from '../utils/utils';
import { AUTO_SETTLE_DISABLED_OVERRIDE } from '../utils/preferences';
import { useReferrer } from '../utils/referrer';
const RowBox = styled(Row)`
padding-bottom: 20px;
@ -53,12 +54,9 @@ export default function StandaloneBalancesDisplay() {
balances && balances.find((b) => b.coin === baseCurrency);
const quoteCurrencyBalances =
balances && balances.find((b) => b.coin === quoteCurrency);
const [autoSettleEnabled] = useLocalStorageState(
'autoSettleEnabled',
true,
);
const [autoSettleEnabled] = useLocalStorageState('autoSettleEnabled', true);
const [lastSettledAt, setLastSettledAt] = useState<number>(0);
const { usdcRef, usdtRef } = useReferrer();
async function onSettleFunds() {
if (!wallet) {
notify({
@ -110,6 +108,8 @@ export default function StandaloneBalancesDisplay() {
wallet,
baseCurrencyAccount,
quoteCurrencyAccount,
usdcRef,
usdtRef,
});
} catch (e) {
notify({
@ -122,10 +122,21 @@ export default function StandaloneBalancesDisplay() {
useInterval(() => {
const autoSettle = async () => {
if (AUTO_SETTLE_DISABLED_OVERRIDE || !wallet || !market || !openOrdersAccount || !baseCurrencyAccount || !quoteCurrencyAccount || !autoSettleEnabled) {
if (
AUTO_SETTLE_DISABLED_OVERRIDE ||
!wallet ||
!market ||
!openOrdersAccount ||
!baseCurrencyAccount ||
!quoteCurrencyAccount ||
!autoSettleEnabled
) {
return;
}
if (!baseCurrencyBalances?.unsettled && !quoteCurrencyBalances?.unsettled) {
if (
!baseCurrencyBalances?.unsettled &&
!quoteCurrencyBalances?.unsettled
) {
return;
}
if (Date.now() - lastSettledAt < 15000) {
@ -141,6 +152,8 @@ export default function StandaloneBalancesDisplay() {
wallet,
baseCurrencyAccount,
quoteCurrencyAccount,
usdcRef,
usdtRef,
});
} catch (e) {
console.log('Error auto settling funds: ' + e.message);
@ -148,12 +161,7 @@ export default function StandaloneBalancesDisplay() {
}
console.log('Finished settling funds.');
};
(
connected &&
wallet?.autoApprove &&
autoSettleEnabled &&
autoSettle()
);
connected && wallet?.autoApprove && autoSettleEnabled && autoSettle();
}, 1000);
const formattedBalances: [

View File

@ -9,6 +9,7 @@ import { useSendConnection } from '../../utils/connection';
import { useWallet } from '../../utils/wallet';
import { settleFunds } from '../../utils/send';
import { notify } from '../../utils/notifications';
import { useReferrer } from '../../utils/referrer';
export default function BalancesTable({
balances,
@ -19,6 +20,7 @@ export default function BalancesTable({
const [accounts] = useTokenAccounts();
const connection = useSendConnection();
const { wallet } = useWallet();
const { usdcRef, usdtRef } = useReferrer();
async function onSettleFunds(market, openOrders) {
try {
@ -35,6 +37,8 @@ export default function BalancesTable({
accounts,
market?.quoteMintAddress,
),
usdcRef,
usdtRef,
});
} catch (e) {
notify({

147
src/utils/referrer.tsx Normal file
View File

@ -0,0 +1,147 @@
import React, { useContext, useEffect, useState } from 'react';
import { useConnection } from './connection';
import { PublicKey } from '@solana/web3.js';
import {
NameRegistryState,
getHashedName,
getNameAccountKey,
getTwitterRegistry,
} from '@solana/spl-name-service';
import { TOKEN_PROGRAM_ID } from '@solana/spl-token';
import { useLocalStorageState } from './utils';
interface ReferrerContextValues {
usdcRef: PublicKey | undefined;
usdtRef: PublicKey | undefined;
setRefCode: (arg: any) => void;
refCode: string | undefined;
allowRefLink: boolean;
}
const ReferrerContext: React.Context<null | ReferrerContextValues> = React.createContext<null | ReferrerContextValues>(
null,
);
export const ASSOCIATED_TOKEN_PROGRAM_ID: PublicKey = new PublicKey(
'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL',
);
const USDC_MINT = new PublicKey('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v');
const USDT_MINT = new PublicKey('Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB');
export async function findAssociatedTokenAddress(
walletAddress: PublicKey,
tokenMintAddress: PublicKey,
): Promise<PublicKey> {
return (
await PublicKey.findProgramAddress(
[
walletAddress.toBuffer(),
TOKEN_PROGRAM_ID.toBuffer(),
tokenMintAddress.toBuffer(),
],
ASSOCIATED_TOKEN_PROGRAM_ID,
)
)[0];
}
// Address of the SOL TLD
export const SOL_TLD_AUTHORITY = new PublicKey(
'58PwtjSDuFHuUkYjH9BYnnQKHfwo9reZhC2zMJv9JPkx',
);
export const getInputKey = async (input: string) => {
let hashed_input_name = await getHashedName(input);
let inputDomainKey = await getNameAccountKey(
hashed_input_name,
undefined,
SOL_TLD_AUTHORITY,
);
return { inputDomainKey: inputDomainKey, hashedInputName: hashed_input_name };
};
export const useFeesAccountsFromRefCode = (refCode: string | undefined) => {
const connection = useConnection();
const [usdc, setUsdc] = useState<PublicKey | undefined>(undefined);
const [usdt, setUsdt] = useState<PublicKey | undefined>(undefined);
useEffect(() => {
const fn = async () => {
let usdcAddress: undefined | PublicKey = undefined;
let usdtAddress: undefined | PublicKey = undefined;
if (!refCode) {
setUsdc(
process.env.REACT_APP_USDC_REFERRAL_FEES_ADDRESS
? new PublicKey(process.env.REACT_APP_USDC_REFERRAL_FEES_ADDRESS)
: undefined,
);
setUsdt(
process.env.REACT_APP_USDT_REFERRAL_FEES_ADDRESS
? new PublicKey(process.env.REACT_APP_USDT_REFERRAL_FEES_ADDRESS)
: undefined,
);
return;
}
try {
let nameRegistryState: NameRegistryState;
if (refCode.includes('.sol')) {
const { inputDomainKey } = await getInputKey(
refCode.replace('.sol', ''),
);
nameRegistryState = await NameRegistryState.retrieve(
connection,
inputDomainKey,
);
} else {
nameRegistryState = await getTwitterRegistry(connection, refCode);
}
usdcAddress = await findAssociatedTokenAddress(
nameRegistryState.owner,
USDC_MINT,
);
usdtAddress = await findAssociatedTokenAddress(
nameRegistryState.owner,
USDT_MINT,
);
const usdcAccountInfo = await connection.getAccountInfo(usdcAddress);
const usdtAccountInfo = await connection.getAccountInfo(usdtAddress);
if (!!usdcAccountInfo?.data) setUsdc(usdcAddress);
if (!!usdtAccountInfo?.data) setUsdt(usdtAddress);
} catch (err) {
console.warn(`Error getting refcode ${err}`);
}
};
fn();
}, [connection, refCode]);
return { usdcRef: usdc, usdtRef: usdt };
};
export const ReferrerProvider = ({ children }) => {
const allowRefLink = process.env.REACT_APP_ALLOW_REF_LINK === 'true';
const [refCode, setRefCode] = useLocalStorageState('refCode');
const { usdcRef, usdtRef } = useFeesAccountsFromRefCode(
allowRefLink ? refCode : undefined,
);
useEffect(() => {
if (!allowRefLink) setRefCode(null);
}, [allowRefLink, setRefCode]);
return (
<ReferrerContext.Provider
value={{ usdcRef, usdtRef, setRefCode, refCode, allowRefLink }}
>
{children}
</ReferrerContext.Provider>
);
};
export const useReferrer = () => {
const context = useContext(ReferrerContext);
if (!context) throw new Error('Missing referrer context');
return {
usdcRef: context.usdcRef,
usdtRef: context.usdtRef,
setRefCode: context.setRefCode,
refCode: context.refCode,
allowRefLink: context.allowRefLink,
};
};

View File

@ -13,12 +13,17 @@ import {
Transaction,
TransactionSignature,
} from '@solana/web3.js';
import { Token, ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID } from '@solana/spl-token';
import {
Token,
ASSOCIATED_TOKEN_PROGRAM_ID,
TOKEN_PROGRAM_ID,
} from '@solana/spl-token';
import BN from 'bn.js';
import {
DexInstructions,
Market,
OpenOrders, parseInstructionErrorResponse,
OpenOrders,
parseInstructionErrorResponse,
TOKEN_MINTS,
TokenInstructions,
} from '@project-serum/serum';
@ -72,6 +77,8 @@ export async function settleFunds({
baseCurrencyAccount,
quoteCurrencyAccount,
sendNotification = true,
usdcRef = undefined,
usdtRef = undefined,
}: {
market: Market;
openOrders: OpenOrders;
@ -79,7 +86,9 @@ export async function settleFunds({
wallet: WalletAdapter;
baseCurrencyAccount: TokenAccount;
quoteCurrencyAccount: TokenAccount;
sendNotification?: boolean,
sendNotification?: boolean;
usdcRef?: PublicKey;
usdtRef?: PublicKey;
}): Promise<string | undefined> {
if (
!market ||
@ -89,7 +98,7 @@ export async function settleFunds({
(!baseCurrencyAccount && !quoteCurrencyAccount)
) {
if (sendNotification) {
notify({message: 'Not connected'});
notify({ message: 'Not connected' });
}
return;
}
@ -120,22 +129,14 @@ export async function settleFunds({
if (market.supportsReferralFees) {
const usdt = TOKEN_MINTS.find(({ name }) => name === 'USDT');
const usdc = TOKEN_MINTS.find(({ name }) => name === 'USDC');
if (
process.env.REACT_APP_USDT_REFERRAL_FEES_ADDRESS &&
usdt &&
market.quoteMintAddress.equals(usdt.address)
) {
referrerQuoteWallet = new PublicKey(
process.env.REACT_APP_USDT_REFERRAL_FEES_ADDRESS,
);
if (usdtRef && usdt && market.quoteMintAddress.equals(usdt.address)) {
referrerQuoteWallet = usdtRef;
} else if (
process.env.REACT_APP_USDC_REFERRAL_FEES_ADDRESS &&
usdcRef &&
usdc &&
market.quoteMintAddress.equals(usdc.address)
) {
referrerQuoteWallet = new PublicKey(
process.env.REACT_APP_USDC_REFERRAL_FEES_ADDRESS,
);
referrerQuoteWallet = usdcRef;
}
}
const {
@ -160,7 +161,7 @@ export async function settleFunds({
wallet,
connection,
sendingMessage: 'Settling funds...',
sendNotification
sendNotification,
});
}
@ -222,7 +223,10 @@ export async function settleAllFunds({
// @ts-ignore
m._decoded?.ownAddress?.equals(openOrdersAccount.market),
);
if (openOrdersAccount.baseTokenFree.isZero() && openOrdersAccount.quoteTokenFree.isZero()) {
if (
openOrdersAccount.baseTokenFree.isZero() &&
openOrdersAccount.quoteTokenFree.isZero()
) {
// nothing to settle for this market.
return null;
}
@ -643,7 +647,7 @@ export async function sendTransaction({
sentMessage?: string;
successMessage?: string;
timeout?: number;
sendNotification?: boolean
sendNotification?: boolean;
}) {
const signedTransaction = await signTransaction({
transaction,
@ -658,7 +662,7 @@ export async function sendTransaction({
sentMessage,
successMessage,
timeout,
sendNotification
sendNotification,
});
}
@ -726,11 +730,11 @@ export async function sendSignedTransaction({
sentMessage?: string;
successMessage?: string;
timeout?: number;
sendNotification?: boolean
sendNotification?: boolean;
}): Promise<string> {
const rawTransaction = signedTransaction.serialize();
const startTime = getUnixTs();
if (sendNotification){
if (sendNotification) {
notify({ message: sendingMessage });
}
const txid: TransactionSignature = await connection.sendRawTransaction(
@ -778,8 +782,14 @@ export async function sendSignedTransaction({
}
}
let parsedError;
if (typeof simulateResult.err == 'object' && "InstructionError" in simulateResult.err) {
const parsedErrorInfo = parseInstructionErrorResponse(signedTransaction, simulateResult.err["InstructionError"]);
if (
typeof simulateResult.err == 'object' &&
'InstructionError' in simulateResult.err
) {
const parsedErrorInfo = parseInstructionErrorResponse(
signedTransaction,
simulateResult.err['InstructionError'],
);
parsedError = parsedErrorInfo.error;
} else {
parsedError = JSON.stringify(simulateResult.err);

View File

@ -104,7 +104,7 @@ export function useLocalStorageStringState(
} else {
localStorage.setItem(key, newState);
}
localStorageListeners[key].forEach((listener) =>
localStorageListeners[key]?.forEach((listener) =>
listener(key + '\n' + newState),
);
},

222
yarn.lock
View File

@ -1550,6 +1550,36 @@
resolved "https://registry.yarnpkg.com/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz#5405ee8e444ed212db44e79351f0c70a582aae25"
integrity sha512-DetpxZw1fzPD5xUBrIAoplLChO2VB8DlL5Gg+I1IR9b2wPqYIca2WSUxL5g1vLeR4MsQq1NeWriXAVffV+U1Fw==
"@solana/spl-name-service@^0.1.2":
version "0.1.2"
resolved "https://registry.yarnpkg.com/@solana/spl-name-service/-/spl-name-service-0.1.2.tgz#d49240a692bbf05ef56d79db0916b17a4829b99d"
integrity sha512-rmVYzhmZgaYmaANzmuxemoJWMnkuM59zitJpdkJejn/oTPYc+SezhQk52fN4dqjCz1cTBnzDJ+0AUJIwgNWnNQ==
dependencies:
"@solana/spl-token" "0.1.4"
"@solana/web3.js" "^1.11.0"
bip32 "^2.0.6"
bn.js "^5.1.3"
bs58 "4.0.1"
buffer-layout "^1.2.0"
core-util-is "^1.0.2"
crypto "^1.0.1"
crypto-ts "^1.0.2"
fs "^0.0.1-security"
tweetnacl "^1.0.3"
webpack-dev-server "^3.11.2"
"@solana/spl-token@0.1.4":
version "0.1.4"
resolved "https://registry.yarnpkg.com/@solana/spl-token/-/spl-token-0.1.4.tgz#7fc6ba82a7fbb2b0907f7ffc87709488db83ed2a"
integrity sha512-W8uSC4ysWVjbKK7lvsIHFxdMIkOCEoOm9tYY9VVpBlUIp4+K5bpPxHXUlxMiHfkKPWAxab6IGUn71VVLg8uq5Q==
dependencies:
"@babel/runtime" "^7.10.5"
"@solana/web3.js" "^1.9.1"
bn.js "^5.1.0"
buffer "6.0.3"
buffer-layout "^1.2.0"
dotenv "8.2.0"
"@solana/spl-token@^0.1.6":
version "0.1.6"
resolved "https://registry.yarnpkg.com/@solana/spl-token/-/spl-token-0.1.6.tgz#fa136b0a3db84f07a99bc0e54cf4e91f2d6da2e8"
@ -1608,7 +1638,7 @@
tweetnacl "^1.0.0"
ws "^7.0.0"
"@solana/web3.js@^1.12.0":
"@solana/web3.js@^1.11.0", "@solana/web3.js@^1.12.0", "@solana/web3.js@^1.9.1":
version "1.20.0"
resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.20.0.tgz#9a1855a239c96c5b946bdbe4cc5e3768ee3b2a77"
integrity sha512-s/hmbeC7h0QeMKDHl5HTJbY4NSrT3IK1oGerNwdmFfnbs9ygtBbXo1MXaeYVDcNazsthKgiYE+unNd+cpVH8HA==
@ -1936,6 +1966,11 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-15.6.0.tgz#f0ddca5a61e52627c9dcb771a6039d44694597bc"
integrity sha512-gCYSfQpy+LYhOFTKAeE8BkyGqaxmlFxe+n4DKM6DR0wzw/HISUE/hAmkC/KT8Sw5PCJblqg062b3z9gucv3k0A==
"@types/node@10.12.18":
version "10.12.18"
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.18.tgz#1d3ca764718915584fcd9f6344621b7672665c67"
integrity sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==
"@types/node@^12.12.54":
version "12.20.13"
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.13.tgz#e743bae112bd779ac9650f907197dd2caa7f0364"
@ -2982,19 +3017,32 @@ binary-extensions@^2.0.0:
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
bindings@^1.5.0:
bindings@^1.3.0, bindings@^1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
dependencies:
file-uri-to-path "1.0.0"
bip32@^2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/bip32/-/bip32-2.0.6.tgz#6a81d9f98c4cd57d05150c60d8f9e75121635134"
integrity sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==
dependencies:
"@types/node" "10.12.18"
bs58check "^2.1.1"
create-hash "^1.2.0"
create-hmac "^1.1.7"
tiny-secp256k1 "^1.1.3"
typeforce "^1.11.5"
wif "^2.0.6"
bluebird@^3.5.5:
version "3.7.2"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9:
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.8, bn.js@^4.11.9:
version "4.12.0"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
@ -3177,13 +3225,22 @@ browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4
escalade "^3.1.1"
node-releases "^1.1.70"
bs58@^4.0.0, bs58@^4.0.1:
bs58@4.0.1, bs58@^4.0.0, bs58@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a"
integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo=
dependencies:
base-x "^3.0.2"
bs58check@<3.0.0, bs58check@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc"
integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==
dependencies:
bs58 "^4.0.0"
create-hash "^1.1.0"
safe-buffer "^5.1.2"
bser@2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05"
@ -3910,7 +3967,7 @@ core-js@^3.5.0:
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.9.0.tgz#790b1bb11553a2272b36e2625c7179db345492f8"
integrity sha512-PyFBJaLq93FlyYdsndE5VaueA9K5cNB7CGzeCj191YYLhkQM0gdZR2SKihM70oF0wdqKSKClv/tEBOpoRmdOVQ==
core-util-is@1.0.2, core-util-is@~1.0.0:
core-util-is@1.0.2, core-util-is@^1.0.2, core-util-is@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
@ -4037,6 +4094,18 @@ crypto-hash@^1.2.2:
resolved "https://registry.yarnpkg.com/crypto-hash/-/crypto-hash-1.3.0.tgz#b402cb08f4529e9f4f09346c3e275942f845e247"
integrity sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg==
crypto-ts@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/crypto-ts/-/crypto-ts-1.0.2.tgz#c2ae47b42f1a8affcf33bddbe3283983150c8a05"
integrity sha1-wq5HtC8aiv/PM73b4yg5gxUMigU=
dependencies:
tslib "^1.7.1"
crypto@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/crypto/-/crypto-1.0.1.tgz#2af1b7cad8175d24c8a1b0778255794a21803037"
integrity sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==
css-blank-pseudo@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5"
@ -4323,7 +4392,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9:
dependencies:
ms "2.0.0"
debug@^3.1.1, debug@^3.2.5:
debug@^3.1.1, debug@^3.2.5, debug@^3.2.6:
version "3.2.7"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
@ -4687,7 +4756,7 @@ electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.649:
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.673.tgz#b4f81c930b388f962b7eba20d0483299aaa40913"
integrity sha512-ms+QR2ckfrrpEAjXweLx6kNCbpAl66DcW//3BZD4BV5KhUgr0RZRce1ON/9J3QyA3JO28nzgb5Xv8DnPr05ILg==
elliptic@^6.5.2, elliptic@^6.5.3:
elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3:
version "6.5.4"
resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
@ -5369,6 +5438,13 @@ faye-websocket@^0.10.0:
dependencies:
websocket-driver ">=0.5.1"
faye-websocket@^0.11.3:
version "0.11.4"
resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da"
integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==
dependencies:
websocket-driver ">=0.5.1"
faye-websocket@~0.11.1:
version "0.11.3"
resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e"
@ -5459,6 +5535,11 @@ fill-range@^7.0.1:
dependencies:
to-regex-range "^5.0.1"
filter-obj@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b"
integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs=
finalhandler@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
@ -5711,6 +5792,11 @@ fs.realpath@^1.0.0:
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
fs@^0.0.1-security:
version "0.0.1-security"
resolved "https://registry.yarnpkg.com/fs/-/fs-0.0.1-security.tgz#8a7bd37186b6dddf3813f23858b57ecaaf5e41d4"
integrity sha1-invTcYa23d84E/I4WLV+yq9eQdQ=
fsevents@2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805"
@ -7493,7 +7579,7 @@ json2mq@^0.2.0:
dependencies:
string-convert "^0.2.0"
json3@^3.3.2:
json3@^3.3.2, json3@^3.3.3:
version "3.3.3"
resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81"
integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==
@ -8341,7 +8427,7 @@ mz@^2.7.0:
object-assign "^4.0.1"
thenify-all "^1.0.0"
nan@^2.12.1:
nan@^2.12.1, nan@^2.13.2:
version "2.14.2"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19"
integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==
@ -10056,6 +10142,16 @@ query-string@^4.1.0:
object-assign "^4.1.0"
strict-uri-encode "^1.0.0"
query-string@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.0.1.tgz#45bd149cf586aaa582dffc7ec7a8ad97dd02f75d"
integrity sha512-uIw3iRvHnk9to1blJCG3BTc+Ro56CBowJXKmNNAm3RulvPBzWLRqKSiiDk+IplJhsydwtuNMHi8UGQFcCLVfkA==
dependencies:
decode-uri-component "^0.2.0"
filter-obj "^1.1.0"
split-on-first "^1.0.0"
strict-uri-encode "^2.0.0"
querystring-es3@^0.2.0:
version "0.2.1"
resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
@ -11179,6 +11275,13 @@ selfsigned@^1.10.7:
dependencies:
node-forge "^0.10.0"
selfsigned@^1.10.8:
version "1.10.11"
resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.11.tgz#24929cd906fe0f44b6d01fb23999a739537acbe9"
integrity sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==
dependencies:
node-forge "^0.10.0"
semver-compare@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
@ -11464,6 +11567,18 @@ sockjs-client@1.4.0:
json3 "^3.3.2"
url-parse "^1.4.3"
sockjs-client@^1.5.0:
version "1.5.1"
resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.1.tgz#256908f6d5adfb94dabbdbd02c66362cca0f9ea6"
integrity sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==
dependencies:
debug "^3.2.6"
eventsource "^1.0.7"
faye-websocket "^0.11.3"
inherits "^2.0.4"
json3 "^3.3.3"
url-parse "^1.5.1"
sockjs@0.3.20:
version "0.3.20"
resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.20.tgz#b26a283ec562ef8b2687b44033a4eeceac75d855"
@ -11473,6 +11588,15 @@ sockjs@0.3.20:
uuid "^3.4.0"
websocket-driver "0.6.5"
sockjs@^0.3.21:
version "0.3.21"
resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.21.tgz#b34ffb98e796930b60a0cfa11904d6a339a7d417"
integrity sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==
dependencies:
faye-websocket "^0.11.3"
uuid "^3.4.0"
websocket-driver "^0.7.4"
sort-keys@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
@ -11568,6 +11692,11 @@ spdy@^4.0.2:
select-hose "^2.0.0"
spdy-transport "^3.0.0"
split-on-first@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f"
integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==
split-string@^3.0.1, split-string@^3.0.2:
version "3.1.0"
resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
@ -11677,6 +11806,11 @@ strict-uri-encode@^1.0.0:
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=
strict-uri-encode@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY=
string-argv@0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da"
@ -12086,6 +12220,17 @@ tiny-invariant@^1.0.2, tiny-invariant@^1.0.6:
resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875"
integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==
tiny-secp256k1@^1.1.3:
version "1.1.6"
resolved "https://registry.yarnpkg.com/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz#7e224d2bee8ab8283f284e40e6b4acb74ffe047c"
integrity sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA==
dependencies:
bindings "^1.3.0"
bn.js "^4.11.8"
create-hmac "^1.1.7"
elliptic "^6.4.0"
nan "^2.13.2"
tiny-warning@^1.0.0, tiny-warning@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754"
@ -12187,7 +12332,7 @@ ts-pnp@^1.1.6:
resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92"
integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==
tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0:
tslib@^1.10.0, tslib@^1.7.1, tslib@^1.8.1, tslib@^1.9.0:
version "1.14.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
@ -12221,7 +12366,7 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0:
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
tweetnacl@^1.0.0:
tweetnacl@^1.0.0, tweetnacl@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596"
integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==
@ -12271,6 +12416,11 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
typeforce@^1.11.5:
version "1.18.0"
resolved "https://registry.yarnpkg.com/typeforce/-/typeforce-1.18.0.tgz#d7416a2c5845e085034d70fcc5b6cc4a90edbfdc"
integrity sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==
typescript@^3.9.7:
version "3.9.9"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.9.tgz#e69905c54bc0681d0518bd4d587cc6f2d0b1a674"
@ -12392,7 +12542,7 @@ url-loader@2.3.0:
mime "^2.4.4"
schema-utils "^2.5.0"
url-parse@^1.4.3:
url-parse@^1.4.3, url-parse@^1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.1.tgz#d5fa9890af8a5e1f274a2c98376510f6425f6e3b"
integrity sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==
@ -12645,6 +12795,45 @@ webpack-dev-server@3.11.0:
ws "^6.2.1"
yargs "^13.3.2"
webpack-dev-server@^3.11.2:
version "3.11.2"
resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz#695ebced76a4929f0d5de7fd73fafe185fe33708"
integrity sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==
dependencies:
ansi-html "0.0.7"
bonjour "^3.5.0"
chokidar "^2.1.8"
compression "^1.7.4"
connect-history-api-fallback "^1.6.0"
debug "^4.1.1"
del "^4.1.1"
express "^4.17.1"
html-entities "^1.3.1"
http-proxy-middleware "0.19.1"
import-local "^2.0.0"
internal-ip "^4.3.0"
ip "^1.1.5"
is-absolute-url "^3.0.3"
killable "^1.0.1"
loglevel "^1.6.8"
opn "^5.5.0"
p-retry "^3.0.1"
portfinder "^1.0.26"
schema-utils "^1.0.0"
selfsigned "^1.10.8"
semver "^6.3.0"
serve-index "^1.9.1"
sockjs "^0.3.21"
sockjs-client "^1.5.0"
spdy "^4.0.2"
strip-ansi "^3.0.1"
supports-color "^6.1.0"
url "^0.11.0"
webpack-dev-middleware "^3.7.2"
webpack-log "^2.0.0"
ws "^6.2.1"
yargs "^13.3.2"
webpack-log@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f"
@ -12714,7 +12903,7 @@ websocket-driver@0.6.5:
dependencies:
websocket-extensions ">=0.1.1"
websocket-driver@>=0.5.1:
websocket-driver@>=0.5.1, websocket-driver@^0.7.4:
version "0.7.4"
resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760"
integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==
@ -12798,6 +12987,13 @@ which@^2.0.1:
dependencies:
isexe "^2.0.0"
wif@^2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/wif/-/wif-2.0.6.tgz#08d3f52056c66679299726fade0d432ae74b4704"
integrity sha1-CNP1IFbGZnkplyb63g1DKudLRwQ=
dependencies:
bs58check "<3.0.0"
word-wrap@~1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"