Skip to content

Commit

Permalink
Merge pull request #1220 from crypto-com/dev
Browse files Browse the repository at this point in the history
Feature: Merge Dev to Master
  • Loading branch information
crypto-matto authored Aug 22, 2022
2 parents c76a569 + 2d7daa5 commit eaee257
Show file tree
Hide file tree
Showing 93 changed files with 140 additions and 37 deletions.
24 changes: 23 additions & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
@@ -1 +1,23 @@
* text eol=lf
*.js text eol=lf
*.ts text eol=lf
*.tsx text eol=lf

*.png binary
*.jpg binary
*.jpeg binary
*.gif binary
*.ico binary
*.mov binary
*.mp4 binary
*.mp3 binary
*.flv binary
*.fla binary
*.swf binary
*.gz binary
*.zip binary
*.7z binary
*.ttf binary
*.eot binary
*.woff binary
*.pyc binary
*.pdf binary
Empty file modified public/dapp_logos/005bXle3_400x400.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified public/dapp_logos/5E1nW_0q_400x400.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified public/dapp_logos/ATYOILyW_400x400.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/dapp_logos/Argo_Finance.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/dapp_logos/Boomer_Squad.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/dapp_logos/Cougar_Optimizer.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/dapp_logos/DexPad.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/dapp_logos/Ferro_Protocol.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/dapp_logos/MarbleVerse.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified public/dapp_logos/OzhB0zBV_400x400.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/dapp_logos/PegasusDollar.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/dapp_logos/TofuNFT.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified public/dapp_logos/VNkWg0qu_400x400.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/dapp_logos/VersaGames.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified public/dapp_logos/Xc1TIhyS_400x400.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified public/dapp_logos/XcdQvwmw_400x400.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified public/dapp_logos/adamant-finance.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified public/dapp_logos/agile-finance.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified public/dapp_logos/annex.jpg
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified public/dapp_logos/autofarm.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified public/dapp_logos/bHEK4pyP_400x400.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified public/dapp_logos/bankswap.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified public/dapp_logos/beefy-finance.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified public/dapp_logos/blackbird-finance.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified public/dapp_logos/bushicro-logo.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified public/dapp_logos/chronoswap.jpg
100644 → 100755
Empty file modified public/dapp_logos/cougar-exchange.png
100644 → 100755
Empty file modified public/dapp_logos/cougarswap.png
100644 → 100755
Empty file modified public/dapp_logos/croblanc.jpg
100644 → 100755
Empty file modified public/dapp_logos/crodex.jpg
100644 → 100755
Empty file modified public/dapp_logos/croissant-games.png
100644 → 100755
Empty file modified public/dapp_logos/cronaswap.png
100644 → 100755
Empty file modified public/dapp_logos/cronofi-finance.png
100644 → 100755
Empty file modified public/dapp_logos/cronos-ragdolls-logo.png
100644 → 100755
Empty file modified public/dapp_logos/cronosbay.png
100644 → 100755
Empty file modified public/dapp_logos/cronossociety-logo.png
100644 → 100755
Empty file modified public/dapp_logos/crosea-logo.png
100644 → 100755
Empty file modified public/dapp_logos/croskull.png
100644 → 100755
Empty file modified public/dapp_logos/crowfi.jpg
100644 → 100755
Empty file modified public/dapp_logos/crystl-finance.png
100644 → 100755
Empty file modified public/dapp_logos/cyber-dog.png
100644 → 100755
Empty file modified public/dapp_logos/darkcrypto.svg
100644 → 100755
Empty file modified public/dapp_logos/dna-dollar.jpg
100644 → 100755
Empty file modified public/dapp_logos/duckydefi.png
100644 → 100755
Empty file modified public/dapp_logos/ebisus-bay.png
100644 → 100755
Empty file modified public/dapp_logos/elk.jpg
100644 → 100755
Empty file modified public/dapp_logos/empire-dex.jpg
100644 → 100755
Empty file modified public/dapp_logos/fortune-dao.png
100644 → 100755
Empty file modified public/dapp_logos/galatea-cash.jpg
100644 → 100755
Empty file modified public/dapp_logos/genesis-finance.png
100644 → 100755
Empty file modified public/dapp_logos/kafefinance.png
100644 → 100755
Empty file modified public/dapp_logos/kryptodex.jpg
100644 → 100755
Empty file modified public/dapp_logos/kyberswap.png
100644 → 100755
Empty file modified public/dapp_logos/liquidus.png
100644 → 100755
Empty file modified public/dapp_logos/lootpad.png
100644 → 100755
Empty file modified public/dapp_logos/metacrono.png
100644 → 100755
Empty file modified public/dapp_logos/metaverse-pixels-logo.png
100644 → 100755
Empty file modified public/dapp_logos/metf-finance.png
100644 → 100755
Empty file modified public/dapp_logos/mimas-finance.png
100644 → 100755
Empty file modified public/dapp_logos/minotaur-money.png
100644 → 100755
Binary file added public/dapp_logos/minted.png
Empty file modified public/dapp_logos/mm-finance.jpg
100644 → 100755
Empty file modified public/dapp_logos/mmf-money.png
100644 → 100755
Empty file modified public/dapp_logos/mmo-finance.png
100644 → 100755
Empty file modified public/dapp_logos/panels-project-logo.png
100644 → 100755
Empty file modified public/dapp_logos/photonswap-finance.jpg
100644 → 100755
Empty file modified public/dapp_logos/pickle.svg
100644 → 100755
Empty file modified public/dapp_logos/reckless-robots-logo.png
100644 → 100755
Empty file modified public/dapp_logos/salem-finance.png
100644 → 100755
Empty file modified public/dapp_logos/savannah-finance.png
100644 → 100755
Empty file modified public/dapp_logos/shield_logo.png
100644 → 100755
Empty file modified public/dapp_logos/single-finance-logo.png
100644 → 100755
Empty file modified public/dapp_logos/smolswap.jpg
100644 → 100755
Empty file modified public/dapp_logos/stormswap.png
100644 → 100755
Empty file modified public/dapp_logos/swapp.jpg
100644 → 100755
Empty file modified public/dapp_logos/tectonic.png
100644 → 100755
Empty file modified public/dapp_logos/the-crobees-logo.png
100644 → 100755
Empty file modified public/dapp_logos/the-gas-station-logo.png
100644 → 100755
Empty file modified public/dapp_logos/vjQcypIM_400x400.png
100644 → 100755
Empty file modified public/dapp_logos/vultureswap.jpg
100644 → 100755
Empty file modified public/dapp_logos/vvs-finance.jpg
100644 → 100755
Empty file modified public/dapp_logos/yieldwolf.jpg
100644 → 100755
Empty file modified public/dapp_logos/zeus-finance.png
100644 → 100755
42 changes: 33 additions & 9 deletions src/config/StaticAssets.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
// Every created wallet get initialized with a new CRO asset
import { getRandomId } from '../crypto/RandomGen';
import { AssetCreationType, UserAssetConfig, UserAssetType } from '../models/UserAsset';
import { AssetCreationType, UserAsset, UserAssetConfig, UserAssetType } from '../models/UserAsset';
import { WalletConfig, SupportedChainName } from './StaticConfig';
import { checkIfTestnet } from '../utils/utils';
import { ICON_ATOM_TENDERMINT, ICON_CRO_EVM, ICON_CRO_TENDERMINT, ICON_ETH_EVM } from '../components/AssetIcon';
import { Session } from '../models/Session';
import { TestNetCroeseid4Config, MainNetConfig } from './StaticConfig';

// This will be used later for asset recreation/migration
export const STATIC_ASSET_COUNT = 4;
Expand Down Expand Up @@ -55,17 +57,20 @@ export const MainNetEvmConfig: UserAssetConfig = {
// Every created wallet get initialized with a new CRO asset
export const CRONOS_TENDERMINT_ASSET = (walletConfig: WalletConfig) => {
const { network } = walletConfig;
const assetSymbol = network.coin.croDenom.toString().toUpperCase();
const isTestnet = checkIfTestnet(network);

const config: UserAssetConfig = {
explorerUrl: walletConfig.explorerUrl,
explorer: walletConfig.explorer,
chainId: network.chainId,
fee: { gasLimit: '300000', networkFee: '10000' },
indexingUrl: walletConfig.indexingUrl,
explorerUrl: isTestnet ? TestNetCroeseid4Config.explorerUrl : MainNetConfig.explorerUrl,
explorer: isTestnet ? TestNetCroeseid4Config.explorer : MainNetConfig.explorer,
chainId: isTestnet ? TestNetCroeseid4Config.network.chainId : MainNetConfig.network.chainId,
fee: {
gasLimit: isTestnet ? TestNetCroeseid4Config.fee.gasLimit : MainNetConfig.fee.gasLimit,
networkFee: isTestnet ? TestNetCroeseid4Config.fee.networkFee : MainNetConfig.fee.networkFee,
},
indexingUrl: isTestnet ? TestNetCroeseid4Config.indexingUrl : MainNetConfig.indexingUrl,
isLedgerSupportDisabled: true,
isStakingDisabled: true,
nodeUrl: network.defaultNodeUrl,
nodeUrl: isTestnet ? TestNetCroeseid4Config.nodeUrl : MainNetConfig.nodeUrl,
memoSupportDisabled: false,
};

Expand All @@ -76,7 +81,7 @@ export const CRONOS_TENDERMINT_ASSET = (walletConfig: WalletConfig) => {
icon_url: ICON_CRO_TENDERMINT,
identifier: getRandomId(),
name: SupportedChainName.CRYPTO_ORG,
symbol: assetSymbol,
symbol: isTestnet ? TestNetCroeseid4Config.network.coin.croDenom.toString().toUpperCase() : MainNetConfig.network.coin.croDenom.toString().toUpperCase(),
mainnetSymbol: 'CRO', // This is to be used solely for markets data since testnet market prices is always non existent
stakedBalance: '0',
unbondingBalance: '0',
Expand Down Expand Up @@ -235,3 +240,22 @@ export const ETH_ASSET = (walletConfig: WalletConfig) => {
config,
};
};

export const getDefaultUserAssetConfig = (asset: UserAsset | undefined, session: Session) => {
if(!asset) return;
const { assetType, name } = asset;
const { config } = session.wallet;

switch (`${assetType}-${name}`) {
case `${UserAssetType.TENDERMINT}-${SupportedChainName.COSMOS_HUB}`:
return ATOM_TENDERMINT_ASSET(config);
case `${UserAssetType.TENDERMINT}-${SupportedChainName.CRYPTO_ORG}`:
return CRONOS_TENDERMINT_ASSET(config);
case `${UserAssetType.EVM}-${SupportedChainName.CRONOS}`:
return CRONOS_EVM_ASSET(config);
case `${UserAssetType.EVM}-${SupportedChainName.ETHEREUM}`:
return ETH_ASSET(config);
default:
return null;
}
};
4 changes: 2 additions & 2 deletions src/config/StaticConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,7 @@ const TestnetCroeseid4: Network = {
rpcUrl: 'https://testnet-croeseid-4.crypto.org:26657',
};

const TestNetCroeseid4Config: WalletConfig = {
export const TestNetCroeseid4Config: WalletConfig = {
enabled: true,
name: NetworkName.TESTNET,
derivationPath: 'm/44\'/1\'/0\'/0/0',
Expand All @@ -387,7 +387,7 @@ const TestNetCroeseid4Config: WalletConfig = {
},
};

const MainNetConfig: WalletConfig = {
export const MainNetConfig: WalletConfig = {
enabled: true,
name: NetworkName.MAINNET,
derivationPath: 'm/44\'/394\'/0\'/0/0',
Expand Down
Binary file removed src/pages/dapp/assets/Ferro_Protocol.png
Diff not rendered.
Binary file added src/pages/dapp/assets/ferro.png
8 changes: 8 additions & 0 deletions src/pages/dapp/assets/projects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -725,6 +725,14 @@ const NFTProjects: CronosProject[] = [
link: 'https://cronossociety.com/',
twitter: 'https://twitter.com/CronosSociety',
},
{
name: 'Minted',
category: ['NFT'],
description: 'Get rewarded for trading NFTs',
logo: 'minted.png',
link: 'https://minted.network/',
twitter: '',
}
];

export const projects = [...defillamaProjects, ...unListedProjects, ...NFTProjects];
10 changes: 9 additions & 1 deletion src/pages/dapp/dapp.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { Dapp } from './types';
import BorderlessCard from './components/BorderlessCard/BorderlessCard';
import logoVvs from './assets/vvs.svg';
import logoTectonic from './assets/tectonic.svg';
import logoFerroProtocol from './assets/Ferro_Protocol.png';
import logoFerroProtocol from './assets/ferro.png';

import AddressBar from './components/AddressBar/AddressBar';
import SavedTab from './components/Tabs/SavedTab';
Expand All @@ -26,6 +26,14 @@ const { Header, Content } = Layout;
const { TabPane } = Tabs;

const DappList: Dapp[] = [
{
name: 'Minted',
logo: '/dapp_logos/minted.png',
alt: '',
description:
'Get rewarded for trading NFTs.',
url: 'https://minted.network/',
},
{
name: 'Ferro Protocol',
logo: logoFerroProtocol,
Expand Down
70 changes: 48 additions & 22 deletions src/pages/settings/components/FormSettings.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { useEffect, useState } from 'react';
import React, { useEffect, useRef, useState } from 'react';
import { Route, useHistory, Switch as RouterSwitch } from 'react-router-dom';
import '../settings.less';
import 'antd/dist/antd.css';
Expand All @@ -21,6 +21,7 @@ import { GeneralSettingsForm } from './GeneralSettingsForm';
import { MetaInfoComponent } from './MetaInfoComponent';
import { getAssetConfigFromWalletConfig } from '../utils';
import Support from '../tabs/Support/Support';
import { getDefaultUserAssetConfig } from '../../../config/StaticAssets';

const { ipcRenderer } = window.require('electron');

Expand All @@ -43,8 +44,10 @@ export const FormSettings = () => {
const [session, setSession] = useRecoilState(sessionState);
const [walletAllAssets, setWalletAllAssets] = useRecoilState(walletAllAssetsState);
const [currentAssetIdentifier, setCurrentAssetIdentifier] = useState<string>();

const didMountRef = useRef(false);

const defaultSettings: UserAssetConfig =
const prevSettings: UserAssetConfig =
session.activeAsset?.config || getAssetConfigFromWalletConfig(session.wallet.config);

const history = useHistory();
Expand All @@ -59,35 +62,44 @@ export const FormSettings = () => {
useEffect(() => {
const croAsset = getCronosTendermintAsset(walletAllAssets);

if (defaultSettings.fee !== undefined) {
networkFee = defaultSettings.fee.networkFee;
if (prevSettings.fee !== undefined) {
networkFee = prevSettings.fee.networkFee;
}
if (defaultSettings.fee !== undefined) {
gasLimit = defaultSettings.fee.gasLimit;
if (prevSettings.fee !== undefined) {
gasLimit = prevSettings.fee.gasLimit;
}

form.setFieldsValue({
nodeUrl: defaultSettings.nodeUrl,
chainId: defaultSettings.chainId,
indexingUrl: defaultSettings.indexingUrl,
nodeUrl: prevSettings.nodeUrl,
chainId: prevSettings.chainId,
indexingUrl: prevSettings.indexingUrl,
networkFee,
gasLimit,
});
if (!currentAssetIdentifier && croAsset) {
setCurrentAssetIdentifier(croAsset?.identifier);

}
if (!didMountRef.current && croAsset) {
didMountRef.current = true;
setSession({
...session,
activeAsset: croAsset,
});
return;
}
}, [form, defaultSettings, walletAllAssets, setSession]);
}, [form, prevSettings, walletAllAssets, session, setSession]);

const onFinish = async values => {
const defaultGasLimit =
defaultSettings.fee !== undefined ? defaultSettings.fee.gasLimit : FIXED_DEFAULT_GAS_LIMIT;
prevSettings.fee !== undefined ? prevSettings.fee.gasLimit : FIXED_DEFAULT_GAS_LIMIT;
const defaultNetworkFee =
defaultSettings.fee !== undefined ? defaultSettings.fee.networkFee : FIXED_DEFAULT_FEE;
prevSettings.fee !== undefined ? prevSettings.fee.networkFee : FIXED_DEFAULT_FEE;

if (
defaultSettings.nodeUrl === values.nodeUrl &&
defaultSettings.indexingUrl === values.indexingUrl &&
defaultSettings.chainId === values.chainId &&
prevSettings.nodeUrl === values.nodeUrl &&
prevSettings.indexingUrl === values.indexingUrl &&
prevSettings.chainId === values.chainId &&
defaultGasLimit === values.gasLimit &&
defaultNetworkFee === values.networkFee
) {
Expand Down Expand Up @@ -155,15 +167,26 @@ export const FormSettings = () => {
);
};

const onRestoreDefaults = () => {
const onRestorePrevSettings = () => {
form.setFieldsValue({
nodeUrl: defaultSettings.nodeUrl,
chainId: defaultSettings.chainId,
indexingUrl: defaultSettings.indexingUrl,
nodeUrl: prevSettings.nodeUrl,
chainId: prevSettings.chainId,
indexingUrl: prevSettings.indexingUrl,
networkFee:
defaultSettings.fee && defaultSettings.fee.networkFee ? defaultSettings.fee.networkFee : '',
prevSettings.fee && prevSettings.fee.networkFee ? prevSettings.fee.networkFee : '',
gasLimit:
defaultSettings.fee && defaultSettings.fee.gasLimit ? defaultSettings.fee.gasLimit : '',
prevSettings.fee && prevSettings.fee.gasLimit ? prevSettings.fee.gasLimit : '',
});
};

const onDefaultSettings = () => {
const defaultAssetConfig = getDefaultUserAssetConfig(session.activeAsset!, session);
form.setFieldsValue({
nodeUrl: defaultAssetConfig?.config.nodeUrl,
chainId: defaultAssetConfig?.config.chainId,
indexingUrl: defaultAssetConfig?.config.indexingUrl,
networkFee: defaultAssetConfig?.config.fee.networkFee,
gasLimit: defaultAssetConfig?.config.fee.gasLimit,
});
};

Expand Down Expand Up @@ -216,9 +239,12 @@ export const FormSettings = () => {
<Button type="primary" htmlType="submit" loading={isButtonLoading}>
{t('general.save')}
</Button>
<Button type="link" htmlType="button" onClick={onRestoreDefaults}>
<Button type="link" htmlType="button" onClick={onRestorePrevSettings}>
{t('general.discard')}
</Button>
<Button type="link" htmlType="button" onClick={onDefaultSettings} style={{ color: '#20bca4' }}>
{t('general.default')}
</Button>
</Form.Item>
</div>
</div>
Expand Down
13 changes: 12 additions & 1 deletion src/pages/settings/components/GeneralSettingsForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { EnableGeneralSettingsPropagation } from '../../../models/Wallet';
import { AnalyticsService } from '../../../service/analytics/AnalyticsService';
import { getChainName } from '../../../utils/utils';
import { AssetIcon } from '../../../components/AssetIcon';
import { UserAssetType } from '../../../models/UserAsset';

const { Option } = Select;

Expand All @@ -31,7 +32,17 @@ export const GeneralSettingsForm = props => {
const configurableAssets = useMemo(() => {
return walletAllAssets.filter(asset => {
return _.size(asset.contractAddress) < 1;
});
})
// Prioritize CRO assets over other assets
.sort((a, b) => {
if(a.mainnetSymbol === 'CRO') {
if(b.mainnetSymbol === 'CRO' && b.assetType === UserAssetType.TENDERMINT) {
return 1;
}
return -1;
}
return 1;
});
}, [walletAllAssets]);

const onSwitchAsset = value => {
Expand Down
6 changes: 5 additions & 1 deletion src/pages/settings/settings.less
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
.settings-content {
padding: 24px;
.container {
max-width: 500px;
max-width: 600px;
// width: 500px;
// .ant-row.ant-form-item.button {
// width: 600px;
// }
.item {
margin-bottom: 20px;
}
Expand Down

0 comments on commit eaee257

Please sign in to comment.