From 58d64f2cface5f402f3d99415e3a34aaa3f88980 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 13 Jun 2023 11:00:18 +0330
Subject: [PATCH 001/175] init drop down
---
src/components/NetworkSelector.tsx | 187 +++++++++++++++++++++++------
1 file changed, 153 insertions(+), 34 deletions(-)
diff --git a/src/components/NetworkSelector.tsx b/src/components/NetworkSelector.tsx
index 07c3d58ee1..431823620d 100644
--- a/src/components/NetworkSelector.tsx
+++ b/src/components/NetworkSelector.tsx
@@ -1,26 +1,121 @@
-import { useState } from 'react';
+import { ComponentType, ReactElement, useState } from 'react';
import styled from 'styled-components';
-import { B, brandColors, mediaQueries } from '@giveth/ui-design-system';
+import {
+ B,
+ IconChevronDown24,
+ IconChevronUp24,
+ IconFlash16,
+ IconNetwork24,
+ IconRocketInSpace16,
+ P,
+ brandColors,
+ neutralColors,
+} from '@giveth/ui-design-system';
import { useWeb3React } from '@web3-react/core';
+import Select, {
+ ControlProps,
+ DropdownIndicatorProps,
+ OptionProps,
+ StylesConfig,
+ components,
+} from 'react-select';
import { switchNetwork } from '@/lib/wallet';
-import { givEconomySupportedNetworks } from '@/lib/constants/constants';
import { Flex } from './styled-components/Flex';
-import { IconGnosisChain } from './Icons/GnosisChain';
-import { IconEthereum } from './Icons/Eth';
import { ChangeNetworkModal } from './modals/ChangeNetwork';
import config from '../configuration';
-
-interface NetworkSelectorProps {
- disabled?: boolean;
-}
-
+import { EProjectsSortBy } from '@/apollo/types/gqlEnums';
interface ISelector {
isSelected: boolean;
}
+export interface ISelectedSort {
+ icon: ReactElement;
+ label: string;
+ value: EProjectsSortBy;
+}
+
+const DropdownIndicator: ComponentType = props => {
+ return props.selectProps.menuIsOpen ? (
+
+ ) : (
+
+ );
+};
+
+const Option: ComponentType> = props => {
+ const { data } = props;
+ const { label } = data;
+ const Icon = data.icon;
+
+ return (
+
+
+
+ {Icon}
+ {label}
+
+
+
+ );
+};
+
+const Control: ComponentType> = ({
+ children,
+ ...props
+}) => {
+ return (
+
+ {props.selectProps.value ? (
+ <>
+ {(props.selectProps.value as ISelectedSort).icon}
+ {children}
+ >
+ ) : (
+ children
+ )}
+
+ );
+};
+
+const selectStyles: StylesConfig = {
+ container: styles => ({
+ ...styles,
+ zIndex: 3,
+ border: 'none',
+ borderRadius: '8px',
+ '&:hover': {
+ borderColor: 'transparent',
+ },
+ }),
+ control: styles => ({
+ ...styles,
+ padding: '12px 16px',
+ border: 'none',
+ boxShadow: 'none',
+ }),
+ indicatorSeparator: styles => ({
+ ...styles,
+ display: 'none',
+ }),
+};
+
+const sortByOptions = [
+ {
+ label: 'label.givpower',
+ value: EProjectsSortBy.INSTANT_BOOSTING,
+ icon: ,
+ },
+ {
+ label: 'label.rank',
+ value: EProjectsSortBy.GIVPOWER,
+ icon: ,
+ },
+];
+
export const NetworkSelector = () => {
const [showChangeNetworkModal, setShowChangeNetworkModal] = useState(false);
+ const [value, setValue] = useState(sortByOptions[0]);
const [targetNetwork, setTargetNetwork] = useState(
config.MAINNET_NETWORK_NUMBER,
);
@@ -41,10 +136,30 @@ export const NetworkSelector = () => {
return (
<>
{chainId ? (
-
-
+
+
+ Network
+
+ */}
) : (
'' // TODO: show connect your wallet
@@ -79,32 +194,36 @@ export const NetworkSelector = () => {
);
};
-const NetworkSelectorContainer = styled(Flex)`
+interface INetworkSelectorProps {}
+
+const NetworkSelectorContainer = styled(Flex)`
height: 48px;
- border-radius: 88px;
+ border-radius: 24px;
border: 1px solid ${brandColors.giv[600]};
- overflow: hidden;
+`;
+
+const Title = styled(Flex)`
+ padding: 12px 16px;
+ color: ${brandColors.deep[100]};
+ background-color: ${brandColors.giv[900]};
+`;
+
+const OptionContainer = styled.div`
cursor: pointer;
- opacity: ${props => (props.disabled ? '0.2' : '1')};
- pointer-events: ${props => (props.disabled ? 'none' : 'auto')};
- ${mediaQueries.mobileL} {
- width: 360px;
- }
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
`;
-const Selector = styled(Flex)`
+const RowContainer = styled.div`
+ display: flex;
align-items: center;
- justify-content: center;
- padding: 12px 24px;
gap: 8px;
- width: 50%;
- background: ${props => (props.isSelected ? brandColors.giv[600] : '')};
- & > div {
- display: none;
+ > :first-child {
+ flex-shrink: 0;
}
- ${mediaQueries.mobileL} {
- & > div {
- display: block;
- }
+ > :last-child {
+ width: 100%;
+ color: ${neutralColors.gray[900]};
}
`;
From 865fa7e7d773b6161c591489cef084bdc17a97c6 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 13 Jun 2023 12:59:44 +0330
Subject: [PATCH 002/175] add change network functionality
---
src/components/NetworkSelector.tsx | 97 ++++++++++++++++---------
src/lib/constants/selectCustomStyles.ts | 2 +-
2 files changed, 62 insertions(+), 37 deletions(-)
diff --git a/src/components/NetworkSelector.tsx b/src/components/NetworkSelector.tsx
index 431823620d..e3d7c39537 100644
--- a/src/components/NetworkSelector.tsx
+++ b/src/components/NetworkSelector.tsx
@@ -1,12 +1,10 @@
-import { ComponentType, ReactElement, useState } from 'react';
+import { ComponentType, useEffect, useState } from 'react';
import styled from 'styled-components';
import {
B,
IconChevronDown24,
IconChevronUp24,
- IconFlash16,
IconNetwork24,
- IconRocketInSpace16,
P,
brandColors,
neutralColors,
@@ -24,17 +22,30 @@ import { switchNetwork } from '@/lib/wallet';
import { Flex } from './styled-components/Flex';
import { ChangeNetworkModal } from './modals/ChangeNetwork';
import config from '../configuration';
-import { EProjectsSortBy } from '@/apollo/types/gqlEnums';
-interface ISelector {
- isSelected: boolean;
-}
+import { BasicNetworkConfig } from '@/types/config';
+import NetworkLogo from './NetworkLogo';
-export interface ISelectedSort {
- icon: ReactElement;
+export interface ISelected {
label: string;
- value: EProjectsSortBy;
+ value: number;
+ network: BasicNetworkConfig;
+ active: boolean;
}
+const _options = [
+ { network: config.MAINNET_CONFIG, active: true },
+ { network: config.XDAI_CONFIG, active: true },
+ { network: config.OPTIMISM_CONFIG, active: true },
+ { network: config.CELO_CONFIG, active: false },
+];
+
+const options = _options.map(o => ({
+ label: o.network.chainName,
+ value: parseInt(o.network.chainId),
+ network: o.network,
+ active: o.active,
+}));
+
const DropdownIndicator: ComponentType = props => {
return props.selectProps.menuIsOpen ? (
@@ -43,16 +54,15 @@ const DropdownIndicator: ComponentType = props => {
);
};
-const Option: ComponentType> = props => {
+const Option: ComponentType> = props => {
const { data } = props;
- const { label } = data;
- const Icon = data.icon;
+ const { value, label } = data;
return (
- {Icon}
+
{label}
@@ -60,15 +70,19 @@ const Option: ComponentType> = props => {
);
};
-const Control: ComponentType> = ({
+const Control: ComponentType> = ({
children,
...props
}) => {
+ const value = props.selectProps.value;
return (
- {props.selectProps.value ? (
+ {value ? (
<>
- {(props.selectProps.value as ISelectedSort).icon}
+
{children}
>
) : (
@@ -81,41 +95,42 @@ const Control: ComponentType> = ({
const selectStyles: StylesConfig = {
container: styles => ({
...styles,
+ backgroundColor: brandColors.giv[600],
+ color: neutralColors.gray[100],
zIndex: 3,
border: 'none',
- borderRadius: '8px',
+ borderRadius: '32px',
+ minWidth: '200px',
'&:hover': {
borderColor: 'transparent',
},
}),
control: styles => ({
...styles,
+ backgroundColor: brandColors.giv[600],
+ color: neutralColors.gray[100],
padding: '12px 16px',
border: 'none',
boxShadow: 'none',
+ borderRadius: '0 24px 24px 0 ',
}),
indicatorSeparator: styles => ({
...styles,
display: 'none',
}),
+ placeholder: styles => ({
+ ...styles,
+ color: neutralColors.gray[100],
+ }),
+ singleValue: (styles, { data }) => ({
+ ...styles,
+ color: neutralColors.gray[100],
+ }),
};
-const sortByOptions = [
- {
- label: 'label.givpower',
- value: EProjectsSortBy.INSTANT_BOOSTING,
- icon: ,
- },
- {
- label: 'label.rank',
- value: EProjectsSortBy.GIVPOWER,
- icon: ,
- },
-];
-
export const NetworkSelector = () => {
const [showChangeNetworkModal, setShowChangeNetworkModal] = useState(false);
- const [value, setValue] = useState(sortByOptions[0]);
+ const [value, setValue] = useState(options[1]);
const [targetNetwork, setTargetNetwork] = useState(
config.MAINNET_NETWORK_NUMBER,
);
@@ -133,6 +148,15 @@ export const NetworkSelector = () => {
}
};
+ useEffect(() => {
+ if (chainId) {
+ const selected = options.find(o => o.value === chainId);
+ if (selected) {
+ setValue(selected);
+ }
+ }
+ }, [chainId]);
+
return (
<>
{chainId ? (
@@ -148,13 +172,13 @@ export const NetworkSelector = () => {
Control: (props: any) => ,
}}
onChange={(e: any) => {
- console.log('e.value', e.value);
+ handleChangeNetwork(e.value);
}}
value={value}
- options={sortByOptions}
+ options={options}
styles={selectStyles}
- id='sorting'
- name='sorting'
+ id='network-selector'
+ name='network-selector'
isClearable={false}
isSearchable={false}
isMulti={false}
@@ -206,6 +230,7 @@ const Title = styled(Flex)`
padding: 12px 16px;
color: ${brandColors.deep[100]};
background-color: ${brandColors.giv[900]};
+ border-radius: 24px 0 0 24px;
`;
const OptionContainer = styled.div`
diff --git a/src/lib/constants/selectCustomStyles.ts b/src/lib/constants/selectCustomStyles.ts
index d5b89899e6..b85abbb365 100644
--- a/src/lib/constants/selectCustomStyles.ts
+++ b/src/lib/constants/selectCustomStyles.ts
@@ -47,7 +47,7 @@ const selectCustomStyles: StylesConfig = {
}),
placeholder: styles => ({
...styles,
- color: `${neutralColors.gray[500]}`,
+ color: neutralColors.gray[500],
}),
};
From 4f210d86dbeff8eed745614b8da5f33987a94972 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 13 Jun 2023 13:13:44 +0330
Subject: [PATCH 003/175] update styles
---
src/components/NetworkSelector.tsx | 44 ++++++++++++++++--------------
1 file changed, 24 insertions(+), 20 deletions(-)
diff --git a/src/components/NetworkSelector.tsx b/src/components/NetworkSelector.tsx
index e3d7c39537..6d0d22fdc7 100644
--- a/src/components/NetworkSelector.tsx
+++ b/src/components/NetworkSelector.tsx
@@ -2,10 +2,10 @@ import { ComponentType, useEffect, useState } from 'react';
import styled from 'styled-components';
import {
B,
+ GLink,
IconChevronDown24,
IconChevronUp24,
IconNetwork24,
- P,
brandColors,
neutralColors,
} from '@giveth/ui-design-system';
@@ -24,6 +24,7 @@ import { ChangeNetworkModal } from './modals/ChangeNetwork';
import config from '../configuration';
import { BasicNetworkConfig } from '@/types/config';
import NetworkLogo from './NetworkLogo';
+import { Shadow } from './styled-components/Shadow';
export interface ISelected {
label: string;
@@ -61,10 +62,8 @@ const Option: ComponentType> = props => {
return (
-
-
- {label}
-
+
+ {label}
);
@@ -100,7 +99,7 @@ const selectStyles: StylesConfig = {
zIndex: 3,
border: 'none',
borderRadius: '32px',
- minWidth: '200px',
+ minWidth: '220px',
'&:hover': {
borderColor: 'transparent',
},
@@ -120,10 +119,28 @@ const selectStyles: StylesConfig = {
}),
placeholder: styles => ({
...styles,
+ }),
+ singleValue: styles => ({
+ ...styles,
color: neutralColors.gray[100],
}),
- singleValue: (styles, { data }) => ({
+ menu: styles => ({
...styles,
+ marginTop: '8px',
+ borderRadius: '8px',
+ padding: '8px',
+ backgroundColor: brandColors.giv[600],
+ boxShadow: Shadow.Dark[500],
+ }),
+ option: (styles, { isFocused, isSelected }) => ({
+ padding: '8px 16px',
+ margin: '8px',
+ borderRadius: '8px',
+ backgroundColor: isSelected
+ ? brandColors.giv[700]
+ : isFocused
+ ? brandColors.giv[500]
+ : brandColors.giv[600],
color: neutralColors.gray[100],
}),
};
@@ -235,20 +252,7 @@ const Title = styled(Flex)`
const OptionContainer = styled.div`
cursor: pointer;
- display: flex;
- align-items: center;
- justify-content: space-between;
-`;
-
-const RowContainer = styled.div`
display: flex;
align-items: center;
gap: 8px;
- > :first-child {
- flex-shrink: 0;
- }
- > :last-child {
- width: 100%;
- color: ${neutralColors.gray[900]};
- }
`;
From 74c79796f7cfe7feb00fdeb8987b8065c60d737d Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 13 Jun 2023 13:36:10 +0330
Subject: [PATCH 004/175] add coming soon
---
src/components/NetworkSelector.tsx | 36 +++++++++++++++++++++---------
1 file changed, 25 insertions(+), 11 deletions(-)
diff --git a/src/components/NetworkSelector.tsx b/src/components/NetworkSelector.tsx
index 6d0d22fdc7..a92053e2c1 100644
--- a/src/components/NetworkSelector.tsx
+++ b/src/components/NetworkSelector.tsx
@@ -56,15 +56,27 @@ const DropdownIndicator: ComponentType = props => {
};
const Option: ComponentType> = props => {
- const { data } = props;
+ const { data, isSelected, isDisabled } = props;
const { value, label } = data;
return (
-
-
- {label}
-
+ {isSelected || isDisabled ? (
+
+
+ {isSelected ? 'Selected' : 'Coming soon'}
+
+
+
+ {label}
+
+
+ ) : (
+
+
+ {label}
+
+ )}
);
};
@@ -109,9 +121,11 @@ const selectStyles: StylesConfig = {
backgroundColor: brandColors.giv[600],
color: neutralColors.gray[100],
padding: '12px 16px',
+ fontWeight: 500,
border: 'none',
boxShadow: 'none',
borderRadius: '0 24px 24px 0 ',
+ cursor: 'pointer',
}),
indicatorSeparator: styles => ({
...styles,
@@ -132,7 +146,7 @@ const selectStyles: StylesConfig = {
backgroundColor: brandColors.giv[600],
boxShadow: Shadow.Dark[500],
}),
- option: (styles, { isFocused, isSelected }) => ({
+ option: (styles, { isFocused, isSelected, isDisabled }) => ({
padding: '8px 16px',
margin: '8px',
borderRadius: '8px',
@@ -142,6 +156,8 @@ const selectStyles: StylesConfig = {
? brandColors.giv[500]
: brandColors.giv[600],
color: neutralColors.gray[100],
+ opacity: isDisabled ? 0.5 : 1,
+ cursor: isDisabled ? 'default' : 'pointer',
}),
};
@@ -199,6 +215,7 @@ export const NetworkSelector = () => {
isClearable={false}
isSearchable={false}
isMulti={false}
+ isOptionDisabled={(option: any) => !option.active}
/>
{/*
Date: Tue, 13 Jun 2023 13:36:20 +0330
Subject: [PATCH 005/175] remove comments
---
src/components/NetworkSelector.tsx | 21 ---------------------
1 file changed, 21 deletions(-)
diff --git a/src/components/NetworkSelector.tsx b/src/components/NetworkSelector.tsx
index a92053e2c1..2731cc130d 100644
--- a/src/components/NetworkSelector.tsx
+++ b/src/components/NetworkSelector.tsx
@@ -217,27 +217,6 @@ export const NetworkSelector = () => {
isMulti={false}
isOptionDisabled={(option: any) => !option.active}
/>
- {/*
- handleChangeNetwork(config.XDAI_NETWORK_NUMBER)
- }
- >
-
- Gnosis Chain
-
-
- handleChangeNetwork(config.MAINNET_NETWORK_NUMBER)
- }
- >
-
- Ethereum
- */}
) : (
'' // TODO: show connect your wallet
From 995dc54d1e9423e6f93d62991b2bdec3de9ef61f Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 13 Jun 2023 13:39:11 +0330
Subject: [PATCH 006/175] add space to label
---
src/components/NetworkSelector.tsx | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/components/NetworkSelector.tsx b/src/components/NetworkSelector.tsx
index 2731cc130d..75e2f91925 100644
--- a/src/components/NetworkSelector.tsx
+++ b/src/components/NetworkSelector.tsx
@@ -244,6 +244,7 @@ const Title = styled(Flex)`
color: ${brandColors.deep[100]};
background-color: ${brandColors.giv[900]};
border-radius: 24px 0 0 24px;
+ gap: 8px;
`;
const SelectedTitle = styled(GLink)`
From 90b72977c128645101753ccc0923d5979227f558 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 13 Jun 2023 16:14:20 +0330
Subject: [PATCH 007/175] remove default title
---
src/components/GIVeconomyPages/GIVstream.tsx | 1 +
src/components/RewardCard.tsx | 4 ++--
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/components/GIVeconomyPages/GIVstream.tsx b/src/components/GIVeconomyPages/GIVstream.tsx
index 3b6ad45386..f3b16a8502 100644
--- a/src/components/GIVeconomyPages/GIVstream.tsx
+++ b/src/components/GIVeconomyPages/GIVstream.tsx
@@ -137,6 +137,7 @@ export const TabGIVstreamTop = () => {
config.MAINNET_NETWORK_NUMBER,
config.XDAI_NETWORK_NUMBER,
]}
+ title='Your GIVstream Rewards'
/>
diff --git a/src/components/RewardCard.tsx b/src/components/RewardCard.tsx
index ba8dc68ec3..0adf0d39bf 100644
--- a/src/components/RewardCard.tsx
+++ b/src/components/RewardCard.tsx
@@ -25,7 +25,7 @@ import useGIVTokenDistroHelper from '@/hooks/useGIVTokenDistroHelper';
import { useAppSelector } from '@/features/hooks';
import { WrongNetworkInnerModal } from '@/components//modals/WrongNetworkInnerModal';
interface IRewardCardProps {
- title?: string;
+ title: string;
liquidAmount: ethers.BigNumber;
stream: BigNumber.Value;
actionLabel?: string;
@@ -41,7 +41,7 @@ interface IRewardCardProps {
}
export const RewardCard: FC = ({
- title = 'Your GIVstream Rewards',
+ title,
liquidAmount = ethers.constants.Zero,
stream = Zero,
actionLabel,
From a246324793e620b45835a26e4339cc5769c63d7c Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 13 Jun 2023 16:14:48 +0330
Subject: [PATCH 008/175] fix typo
---
src/components/RewardCard.tsx | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/components/RewardCard.tsx b/src/components/RewardCard.tsx
index 0adf0d39bf..81fc0c0089 100644
--- a/src/components/RewardCard.tsx
+++ b/src/components/RewardCard.tsx
@@ -73,7 +73,7 @@ export const RewardCard: FC = ({
return (
<>
-
+
{!network || !targetNetworks.includes(network) ? (
= ({
)}
>
)}
-
+
{showWhatIsGIVstreamModal && (
= ({
);
};
-const RewadCardContainer = styled.div`
+const RewardCardContainer = styled.div`
position: relative;
background-color: ${brandColors.giv[700]};
padding: 24px 24px;
From dc9c84914b353b19caabe0a6295d46fd4735b0f8 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 13 Jun 2023 16:19:24 +0330
Subject: [PATCH 009/175] support different chains
---
src/components/RewardCard.tsx | 18 +++++-------------
1 file changed, 5 insertions(+), 13 deletions(-)
diff --git a/src/components/RewardCard.tsx b/src/components/RewardCard.tsx
index 81fc0c0089..3717e89b3a 100644
--- a/src/components/RewardCard.tsx
+++ b/src/components/RewardCard.tsx
@@ -17,13 +17,12 @@ import BigNumber from 'bignumber.js';
import { IconGIV } from './Icons/GIV';
import { Flex } from './styled-components/Flex';
import { formatWeiHelper, Zero } from '@/helpers/number';
-import config from '@/configuration';
-import { IconEthereum } from './Icons/Eth';
-import { IconGnosisChain } from './Icons/GnosisChain';
import { WhatIsStreamModal } from '@/components/modals/WhatIsStream';
import useGIVTokenDistroHelper from '@/hooks/useGIVTokenDistroHelper';
import { useAppSelector } from '@/features/hooks';
import { WrongNetworkInnerModal } from '@/components//modals/WrongNetworkInnerModal';
+import NetworkLogo from './NetworkLogo';
+import { networksParams } from '@/helpers/blockchain';
interface IRewardCardProps {
title: string;
liquidAmount: ethers.BigNumber;
@@ -81,19 +80,12 @@ export const RewardCard: FC = ({
/>
) : (
<>
-
+
{title}
- {network === config.MAINNET_NETWORK_NUMBER && (
-
- )}
- {network === config.XDAI_NETWORK_NUMBER && (
-
- )}
+
- {network === config.MAINNET_NETWORK_NUMBER
- ? 'ETH'
- : 'GNO'}
+ {networksParams[network].chainName}
From 572f46358caf0cc92696ebf325fdf39ecbe2004b Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 13 Jun 2023 19:05:05 +0330
Subject: [PATCH 010/175] remove unused components
---
src/components/DAOChangeNetworkModal.tsx | 84 -----------------
.../givfarm/DAOChangeNetworkModal.tsx | 90 -------------------
2 files changed, 174 deletions(-)
delete mode 100644 src/components/DAOChangeNetworkModal.tsx
delete mode 100644 src/components/givfarm/DAOChangeNetworkModal.tsx
diff --git a/src/components/DAOChangeNetworkModal.tsx b/src/components/DAOChangeNetworkModal.tsx
deleted file mode 100644
index ad89d1df19..0000000000
--- a/src/components/DAOChangeNetworkModal.tsx
+++ /dev/null
@@ -1,84 +0,0 @@
-import {
- neutralColors,
- brandColors,
- Caption,
- Button,
- IconInfoFilled16,
-} from '@giveth/ui-design-system';
-import { useWeb3React } from '@web3-react/core';
-import { InjectedConnector } from '@web3-react/injected-connector';
-import styled from 'styled-components';
-import { useIntl } from 'react-intl';
-import { switchNetwork } from '@/lib/metamask';
-import { Flex } from './styled-components/Flex';
-import config from '@/configuration';
-
-interface IChangeNetworkModal {
- network: number;
-}
-
-export const DAOChangeNetworkModal = ({ network }: IChangeNetworkModal) => {
- const { account, activate } = useWeb3React();
- const networkLabel =
- network === config.XDAI_NETWORK_NUMBER ? 'Gnosis chain' : 'Mainnet';
-
- const { formatMessage } = useIntl();
-
- const checkWalletAndSwitchNetwork = async (network: number) => {
- if (!account) {
- await activate(new InjectedConnector({}));
- await switchNetwork(network);
- }
- if (account) {
- await switchNetwork(network);
- }
- };
- return (
-
-
-
- {formatMessage({ id: 'label.switch_network' })}
-
-
- {formatMessage(
- { id: 'label.this_regenfarm_is_only_available_on_network' },
- { networkLabel },
- )}
-
- checkWalletAndSwitchNetwork(network)}
- />
-
- );
-};
-
-const DAOChangeNetworkModalContainer = styled.div`
- background-color: ${neutralColors.gray[100]};
- color: ${brandColors.giv[300]};
- border: 1px solid ${brandColors.giv[300]};
- border-radius: 8px;
- width: 320px;
- z-index: 4;
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- opacity: 2;
- padding: 16px;
-`;
-
-const Title = styled(Caption)`
- font-weight: bold;
-`;
-
-const Desc = styled(Caption)`
- margin-left: 32px;
- margin-bottom: 16px;
-`;
-
-const ChangeButton = styled(Button)`
- color: ${brandColors.giv[300]};
- margin-left: auto;
-`;
diff --git a/src/components/givfarm/DAOChangeNetworkModal.tsx b/src/components/givfarm/DAOChangeNetworkModal.tsx
deleted file mode 100644
index 6cad28c55d..0000000000
--- a/src/components/givfarm/DAOChangeNetworkModal.tsx
+++ /dev/null
@@ -1,90 +0,0 @@
-import {
- neutralColors,
- brandColors,
- Caption,
- Button,
- IconInfoFilled16,
-} from '@giveth/ui-design-system';
-import { useWeb3React } from '@web3-react/core';
-import { InjectedConnector } from '@web3-react/injected-connector';
-import styled from 'styled-components';
-import { useIntl } from 'react-intl';
-import { switchNetwork } from '@/lib/metamask';
-import { Flex } from '../styled-components/Flex';
-import { IChangeNetworkModal } from './common';
-import config from '@/configuration';
-import { mediaQueries } from '@/lib/constants/constants';
-
-const DAOChangeNetworkModal = ({ network }: IChangeNetworkModal) => {
- const { account, activate } = useWeb3React();
- const networkLabel =
- network === config.XDAI_NETWORK_NUMBER ? 'Gnosis chain' : 'Mainnet';
-
- const { formatMessage } = useIntl();
-
- const checkWalletAndSwitchNetwork = async (network: number) => {
- if (!account) {
- await activate(new InjectedConnector({}));
- await switchNetwork(network);
- }
- if (account) {
- await switchNetwork(network);
- }
- };
- return (
-
-
-
- {formatMessage({ id: 'label.switch_network' })}
-
-
- {formatMessage(
- { id: 'label.this_regenfarm_is_only_available_on_network' },
- { networkLabel },
- )}
-
- checkWalletAndSwitchNetwork(network)}
- />
-
- );
-};
-
-const DAOChangeNetworkModalContainer = styled.div`
- background-color: ${neutralColors.gray[100]};
- color: ${brandColors.giv[300]};
- border: 1px solid ${brandColors.giv[300]};
- border-radius: 8px;
- width: 100%;
- z-index: 4;
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- opacity: 2;
- padding: 16px;
- ${mediaQueries.tablet} {
- width: 320px;
- }
-`;
-
-const Title = styled(Caption)`
- font-weight: bold;
-`;
-
-const Desc = styled(Caption)`
- margin-left: 32px;
- margin-bottom: 16px;
-`;
-
-const ChangeButton = styled(Button)`
- color: ${brandColors.giv[300]};
- margin-left: auto;
-`;
-
-export default DAOChangeNetworkModal;
From 3e4bd00de3132f486724b72ad249e32392a849b8 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 13 Jun 2023 19:05:17 +0330
Subject: [PATCH 011/175] add jointItems
---
src/helpers/text.ts | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/helpers/text.ts b/src/helpers/text.ts
index 7bbd612762..dd7bccfecd 100644
--- a/src/helpers/text.ts
+++ b/src/helpers/text.ts
@@ -19,3 +19,9 @@ export function getTextWidth(
}
return 0;
}
+
+export const jointItems = (items: string[]) => {
+ const _item = [...items];
+ const last = _item.pop();
+ return _item.join(', ') + ' and ' + last;
+};
From 383792f58417ea03019f0b0d43b100d863a6baf7 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 13 Jun 2023 19:05:28 +0330
Subject: [PATCH 012/175] add new copies
---
lang/ca.json | 3 ++-
lang/en.json | 3 ++-
lang/es.json | 3 ++-
3 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/lang/ca.json b/lang/ca.json
index bafc07f0da..56522f393c 100644
--- a/lang/ca.json
+++ b/lang/ca.json
@@ -674,7 +674,8 @@
"label.vote_in_the_givgarden": "Vota al GIVgarden",
"label.the_giv_garden_empowers_the_giv_community": "El GIVgarden capacita la comunitat de Giveth per coordinar-se al voltant dels recursos compartits de baix cap amunt.",
"label.stake_tokens_in_the_givfarm": "Aposta els teus tokens al GIVfarm per augmentar les teves recompenses.",
- "label.givfarm_is_only_available_on_main_and_gnosis": "El GIVfarm només està disponible a Mainnet i a la xarxa de Gnosis.",
+ "component.reward_card.wrong_network": "",
+ "component.reward_card.connect_wallet": "",
"label.your_givfarm_rewards": "Les teves recompenses del GIVfarm",
"label.bridge_your_giv": "Mou el teu GIV",
"label.contract": "Contracte",
diff --git a/lang/en.json b/lang/en.json
index 71254a037a..81690395a4 100644
--- a/lang/en.json
+++ b/lang/en.json
@@ -716,7 +716,8 @@
"label.vote_in_the_givgarden": "Vote in the GIVgarden",
"label.the_giv_garden_empowers_the_giv_community": "The GIVgarden empowers the Giveth community to coordinate around shared resources from the bottom up.",
"label.stake_tokens_in_the_givfarm": "Stake tokens in the GIVfarm to grow your rewards.",
- "label.givfarm_is_only_available_on_main_and_gnosis": "GIVfarm is only available on Mainnet and Gnosis Chain.",
+ "component.reward_card.wrong_network": "{name} is only available on {chains}. Please switch the network.",
+ "component.reward_card.connect_wallet": "{name} is only available on {chains}.",
"label.your_givfarm_rewards": "Your GIVfarm rewards",
"label.bridge_your_giv": "Bridge your GIV",
"label.contract": "Contract",
diff --git a/lang/es.json b/lang/es.json
index 7a0ac1d2cc..8103e2d814 100644
--- a/lang/es.json
+++ b/lang/es.json
@@ -714,7 +714,8 @@
"label.vote_in_the_givgarden": "Vota en el GIVgarden",
"label.the_giv_garden_empowers_the_giv_community": "El GIVgarden permite a la comunidad Giveth coordinarse en torno a recursos compartidos desde abajo hacia arriba.",
"label.stake_tokens_in_the_givfarm": "Haz stake de tus tokens en el GIVfarm para aumentar tus recompensas.",
- "label.givfarm_is_only_available_on_main_and_gnosis": "La GIVfarm solo está disponible en Mainnet y Gnosis Chain.",
+ "component.reward_card.wrong_network": "",
+ "component.reward_card.connect_wallet": "",
"label.your_givfarm_rewards": "Tus recompensas de GIVfarm",
"label.bridge_your_giv": "Mueve tu GIV",
"label.contract": "Contrato",
From caa20ad165fe0d191231897012faaaa6afb94683 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 13 Jun 2023 19:06:01 +0330
Subject: [PATCH 013/175] update wrong network copy
---
src/components/RewardCard.tsx | 5 ++--
.../modals/WrongNetworkInnerModal.tsx | 29 +++++++++++++++----
src/components/views/givfarm/GIVfarmTop.tsx | 3 +-
3 files changed, 29 insertions(+), 8 deletions(-)
diff --git a/src/components/RewardCard.tsx b/src/components/RewardCard.tsx
index 3717e89b3a..06a7d893d8 100644
--- a/src/components/RewardCard.tsx
+++ b/src/components/RewardCard.tsx
@@ -24,6 +24,7 @@ import { WrongNetworkInnerModal } from '@/components//modals/WrongNetworkInnerMo
import NetworkLogo from './NetworkLogo';
import { networksParams } from '@/helpers/blockchain';
interface IRewardCardProps {
+ cardName: string;
title: string;
liquidAmount: ethers.BigNumber;
stream: BigNumber.Value;
@@ -40,6 +41,7 @@ interface IRewardCardProps {
}
export const RewardCard: FC = ({
+ cardName,
title,
liquidAmount = ethers.constants.Zero,
stream = Zero,
@@ -49,7 +51,6 @@ export const RewardCard: FC = ({
subButtonCb,
network,
className,
- wrongNetworkText,
targetNetworks,
rewardTokenSymbol = 'GIV',
tokenPrice,
@@ -76,7 +77,7 @@ export const RewardCard: FC = ({
{!network || !targetNetworks.includes(network) ? (
) : (
<>
diff --git a/src/components/modals/WrongNetworkInnerModal.tsx b/src/components/modals/WrongNetworkInnerModal.tsx
index dd7eec5c72..ff1c072536 100644
--- a/src/components/modals/WrongNetworkInnerModal.tsx
+++ b/src/components/modals/WrongNetworkInnerModal.tsx
@@ -11,12 +11,12 @@ import { useAppDispatch } from '@/features/hooks';
import { setShowWalletModal } from '@/features/modal/modal.slice';
export interface IWrongNetworkInnerModal {
- text?: string;
+ cardName: string;
targetNetworks: number[];
}
export const WrongNetworkInnerModal: FC = ({
- text,
+ cardName,
targetNetworks,
}) => {
const { account } = useWeb3React();
@@ -36,8 +36,17 @@ export const WrongNetworkInnerModal: FC = ({
{account ? (
<>
- {text}
- Please switch the network.
+
+ {formatMessage(
+ {
+ id: 'component.reward_card.wrong_network',
+ },
+ {
+ name: cardName,
+ chains: '',
+ },
+ )}
+
{targetNetworks.map(network => (
@@ -57,7 +66,17 @@ export const WrongNetworkInnerModal: FC = ({
) : (
<>
- {text}
+
+ {formatMessage(
+ {
+ id: 'component.reward_card.connect_wallet',
+ },
+ {
+ name: cardName,
+ chains: '',
+ },
+ )}
+
@@ -73,7 +81,7 @@ export const WrongNetworkInnerModal: FC = ({
},
{
name: cardName,
- chains: '',
+ chains: chainsStr,
},
)}
From dd6d8369e3a23cd449d8a4a2832006d11b41e620 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 13 Jun 2023 19:18:17 +0330
Subject: [PATCH 017/175] add optimism to givstream
---
src/components/GIVeconomyPages/GIVstream.tsx | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/components/GIVeconomyPages/GIVstream.tsx b/src/components/GIVeconomyPages/GIVstream.tsx
index f31f94c22c..05586e9519 100644
--- a/src/components/GIVeconomyPages/GIVstream.tsx
+++ b/src/components/GIVeconomyPages/GIVstream.tsx
@@ -134,6 +134,7 @@ export const TabGIVstreamTop = () => {
targetNetworks={[
config.MAINNET_NETWORK_NUMBER,
config.XDAI_NETWORK_NUMBER,
+ config.OPTIMISM_NETWORK_NUMBER,
]}
title='Your GIVstream Rewards'
/>
From 7867a7f1d8c5f087fbb98054aa7ba4a67da8b8df Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 13 Jun 2023 19:18:24 +0330
Subject: [PATCH 018/175] add optimism to givbacks
---
src/components/GIVeconomyPages/GIVbacks.tsx | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/src/components/GIVeconomyPages/GIVbacks.tsx b/src/components/GIVeconomyPages/GIVbacks.tsx
index b9bbd1ac3f..1acc3130e5 100644
--- a/src/components/GIVeconomyPages/GIVbacks.tsx
+++ b/src/components/GIVeconomyPages/GIVbacks.tsx
@@ -111,7 +111,10 @@ export const TabGIVbacksTop = () => {
}
subButtonCb={() => setShowGivBackExplain(true)}
network={chainId}
- targetNetworks={[config.XDAI_NETWORK_NUMBER]}
+ targetNetworks={[
+ config.XDAI_NETWORK_NUMBER,
+ config.OPTIMISM_NETWORK_NUMBER,
+ ]}
/>
From 54b8df5d05eef11df33c9f0cb04c5fd57884ce31 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 13 Jun 2023 19:25:36 +0330
Subject: [PATCH 019/175] remove switch network from wrong inner card
---
.../modals/WrongNetworkInnerModal.tsx | 25 ++++++-------------
1 file changed, 7 insertions(+), 18 deletions(-)
diff --git a/src/components/modals/WrongNetworkInnerModal.tsx b/src/components/modals/WrongNetworkInnerModal.tsx
index d25114380d..2cebe1f31c 100644
--- a/src/components/modals/WrongNetworkInnerModal.tsx
+++ b/src/components/modals/WrongNetworkInnerModal.tsx
@@ -4,9 +4,8 @@ import { FC } from 'react';
import { useIntl } from 'react-intl';
import { Button } from '@giveth/ui-design-system';
import { useWeb3React } from '@web3-react/core';
-import { switchNetwork } from '@/lib/wallet';
-import { chainName, mediaQueries } from '@/lib/constants/constants';
+import { mediaQueries } from '@/lib/constants/constants';
import { useAppDispatch } from '@/features/hooks';
import { setShowWalletModal } from '@/features/modal/modal.slice';
import { networksParams } from '@/helpers/blockchain';
@@ -29,10 +28,6 @@ export const WrongNetworkInnerModal: FC = ({
dispatch(setShowWalletModal(true));
};
- const checkWalletAndSwitchNetwork = async (network: number) => {
- await switchNetwork(network);
- };
-
const chainNames = targetNetworks.map(
network => networksParams[network].chainName,
);
@@ -57,18 +52,12 @@ export const WrongNetworkInnerModal: FC = ({
- {targetNetworks.map(network => (
-
>
) : (
From d341abd121d5c6fd5770b3f93067d5b6f254b474 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 13 Jun 2023 19:44:31 +0330
Subject: [PATCH 020/175] change SwitchNetwork modal to accept custom network
list
---
src/components/modals/SwitchNetwork.tsx | 67 +++++++++++++------------
1 file changed, 35 insertions(+), 32 deletions(-)
diff --git a/src/components/modals/SwitchNetwork.tsx b/src/components/modals/SwitchNetwork.tsx
index c0c794b7a7..4fefc8152b 100644
--- a/src/components/modals/SwitchNetwork.tsx
+++ b/src/components/modals/SwitchNetwork.tsx
@@ -17,20 +17,29 @@ import { switchNetwork } from '@/lib/wallet';
import { useAppSelector } from '@/features/hooks';
import config from '@/configuration';
import { ETheme } from '@/features/general/general.slice';
+import { networksParams } from '@/helpers/blockchain';
-const networks = [
- config.MAINNET_CONFIG,
- config.XDAI_CONFIG,
- config.POLYGON_CONFIG,
- config.CELO_CONFIG,
- config.OPTIMISM_CONFIG,
+const _networks = [
+ config.MAINNET_NETWORK_NUMBER,
+ config.XDAI_NETWORK_NUMBER,
+ config.POLYGON_NETWORK_NUMBER,
+ config.CELO_NETWORK_NUMBER,
+ config.OPTIMISM_NETWORK_NUMBER,
];
-const SwitchNetwork: FC = ({ setShowModal }) => {
+interface ISwitchNetworkModal extends IModal {
+ customNetworks?: number[];
+}
+
+const SwitchNetwork: FC = ({
+ customNetworks,
+ setShowModal,
+}) => {
const { isAnimating, closeModal } = useModalAnimation(setShowModal);
const { chainId } = useWeb3React();
const { formatMessage } = useIntl();
const theme = useAppSelector(state => state.general.theme);
+ const networks = customNetworks || _networks;
return (
= ({ setShowModal }) => {
headerTitlePosition='left'
>
- {networks.map(network => {
- const _chainId = parseInt(network.chainId);
- return (
- {
- switchNetwork(_chainId);
- closeModal();
- }}
- isSelected={_chainId === chainId}
- key={_chainId}
- theme={theme}
- >
-
- {network.chainName}
- {_chainId === chainId && (
-
- {formatMessage({ id: 'label.selected' })}
-
- )}
-
- );
- })}
+ {networks.map(networkId => (
+ {
+ switchNetwork(networkId);
+ closeModal();
+ }}
+ isSelected={networkId === chainId}
+ key={networkId}
+ theme={theme}
+ >
+
+ {networksParams[networkId].chainName}
+ {networkId === chainId && (
+
+ {formatMessage({ id: 'label.selected' })}
+
+ )}
+
+ ))}
);
From 69927cca45dc0e12543fb2581c093c5759c4ab22 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 13 Jun 2023 19:46:23 +0330
Subject: [PATCH 021/175] use SwitchNetwork on WrongNetworkInnerModal
---
src/components/modals/WrongNetworkInnerModal.tsx | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/src/components/modals/WrongNetworkInnerModal.tsx b/src/components/modals/WrongNetworkInnerModal.tsx
index 2cebe1f31c..f4aacb03bb 100644
--- a/src/components/modals/WrongNetworkInnerModal.tsx
+++ b/src/components/modals/WrongNetworkInnerModal.tsx
@@ -1,6 +1,6 @@
import { P, brandColors } from '@giveth/ui-design-system';
import styled from 'styled-components';
-import { FC } from 'react';
+import { FC, useState } from 'react';
import { useIntl } from 'react-intl';
import { Button } from '@giveth/ui-design-system';
import { useWeb3React } from '@web3-react/core';
@@ -10,6 +10,7 @@ import { useAppDispatch } from '@/features/hooks';
import { setShowWalletModal } from '@/features/modal/modal.slice';
import { networksParams } from '@/helpers/blockchain';
import { jointItems } from '@/helpers/text';
+import SwitchNetwork from './SwitchNetwork';
export interface IWrongNetworkInnerModal {
cardName: string;
@@ -20,6 +21,8 @@ export const WrongNetworkInnerModal: FC = ({
cardName,
targetNetworks,
}) => {
+ const [showSwitchNetwork, setShowSwitchNetwork] = useState(false);
+
const { account } = useWeb3React();
const dispatch = useAppDispatch();
const { formatMessage } = useIntl();
@@ -57,6 +60,7 @@ export const WrongNetworkInnerModal: FC = ({
id: 'label.switch_network',
})}
buttonType='primary'
+ onClick={() => setShowSwitchNetwork(true)}
/>
>
@@ -86,6 +90,12 @@ export const WrongNetworkInnerModal: FC = ({
>
)}
+ {showSwitchNetwork && (
+
+ )}
);
};
From 56e19f96a9f416017e21fc7ba7a3c0d97483d867 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 13 Jun 2023 19:53:54 +0330
Subject: [PATCH 022/175] align icons
---
src/components/NetworkSelector.tsx | 18 ++++++++++++++----
1 file changed, 14 insertions(+), 4 deletions(-)
diff --git a/src/components/NetworkSelector.tsx b/src/components/NetworkSelector.tsx
index 75e2f91925..1a82b63852 100644
--- a/src/components/NetworkSelector.tsx
+++ b/src/components/NetworkSelector.tsx
@@ -66,14 +66,18 @@ const Option: ComponentType> = props => {
{isSelected ? 'Selected' : 'Coming soon'}
-
-
+
+
+
+
{label}
) : (
-
-
+
+
+
+
{label}
)}
@@ -237,6 +241,7 @@ const NetworkSelectorContainer = styled(Flex)`
height: 48px;
border-radius: 24px;
border: 1px solid ${brandColors.giv[600]};
+ width: fit-content;
`;
const Title = styled(Flex)`
@@ -250,3 +255,8 @@ const Title = styled(Flex)`
const SelectedTitle = styled(GLink)`
color: ${brandColors.giv[200]};
`;
+
+const IconWrapper = styled.div`
+ width: 16px;
+ height: 16px;
+`;
From 8136bc82303b56361e66382282d77756e2957d0d Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 13 Jun 2023 20:24:27 +0330
Subject: [PATCH 023/175] remove wrong network
---
src/components/modals/SwitchNetwork.tsx | 4 +++
src/components/modals/WrongNetwork.tsx | 42 -------------------------
src/context/claim.context.tsx | 7 +++--
3 files changed, 8 insertions(+), 45 deletions(-)
delete mode 100644 src/components/modals/WrongNetwork.tsx
diff --git a/src/components/modals/SwitchNetwork.tsx b/src/components/modals/SwitchNetwork.tsx
index 4fefc8152b..41d0f91bc6 100644
--- a/src/components/modals/SwitchNetwork.tsx
+++ b/src/components/modals/SwitchNetwork.tsx
@@ -5,6 +5,7 @@ import {
IconNetwork32,
neutralColors,
Overline,
+ P,
} from '@giveth/ui-design-system';
import styled from 'styled-components';
import { useIntl } from 'react-intl';
@@ -28,10 +29,12 @@ const _networks = [
];
interface ISwitchNetworkModal extends IModal {
+ desc?: string;
customNetworks?: number[];
}
const SwitchNetwork: FC = ({
+ desc,
customNetworks,
setShowModal,
}) => {
@@ -50,6 +53,7 @@ const SwitchNetwork: FC = ({
headerTitlePosition='left'
>
+ {desc && {desc}
}
{networks.map(networkId => (
{
diff --git a/src/components/modals/WrongNetwork.tsx b/src/components/modals/WrongNetwork.tsx
deleted file mode 100644
index 82d3a08821..0000000000
--- a/src/components/modals/WrongNetwork.tsx
+++ /dev/null
@@ -1,42 +0,0 @@
-import styled from 'styled-components';
-import { Modal } from './Modal';
-import {
- IWrongNetworkInnerModal,
- WrongNetworkInnerModal,
-} from './WrongNetworkInnerModal';
-import { useModalAnimation } from '@/hooks/useModalAnimation';
-import type { IModal } from '@/types/common';
-import type { FC } from 'react';
-interface IWrongNetworkModal extends IModal, IWrongNetworkInnerModal {}
-
-export const WrongNetworkModal: FC = ({
- text,
- targetNetworks,
- setShowModal,
-}) => {
- const { isAnimating, closeModal } = useModalAnimation(setShowModal);
-
- return (
-
-
-
- You're connected to the wrong network!
-
-
-
-
- );
-};
-
-const WrongNetworkModalContainer = styled.div`
- padding: 0 30px 20px;
- margin-top: -12px;
-`;
-
-const WrongNetworkModalTitle = styled.span`
- font-family: 'Red Hat Text';
- font-size: 24px;
-`;
diff --git a/src/context/claim.context.tsx b/src/context/claim.context.tsx
index 56e58730f6..f0b96f68fc 100644
--- a/src/context/claim.context.tsx
+++ b/src/context/claim.context.tsx
@@ -12,8 +12,8 @@ import { BigNumber } from 'ethers';
import { Dispatch } from 'react';
import { useWeb3React } from '@web3-react/core';
import config from '@/configuration';
-import { WrongNetworkModal } from '@/components/modals/WrongNetwork';
import { fetchAirDropClaimData, hasClaimedAirDrop } from '@/lib/claim';
+import SwitchNetwork from '@/components/modals/SwitchNetwork';
export enum GiveDropStateType {
notConnected,
@@ -124,9 +124,10 @@ export const ClaimProvider: FC = ({ children }) => {
>
{children}
{showModal && (
-
)}
From bee2a6bdb6325aeee18e0dbb65853569dc49d477 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 26 Jun 2023 14:54:30 +0330
Subject: [PATCH 024/175] add Optimism Goerli
---
src/config/development.ts | 8 ++++----
src/helpers/blockchain.ts | 11 +++++++++++
2 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/src/config/development.ts b/src/config/development.ts
index 02796d84c1..a4c2b73d37 100644
--- a/src/config/development.ts
+++ b/src/config/development.ts
@@ -14,7 +14,7 @@ const SEPT_8TH_2022 = 1662595200000;
const MAINNET_NETWORK_NUMBER = 5; // Goerli
const XDAI_NETWORK_NUMBER = 100; // xDAI
const POLYGON_NETWORK_NUMBER = 137;
-const OPTIMISM_NETWORK_NUMBER = 10;
+const OPTIMISM_NETWORK_NUMBER = 420;
const CELO_NETWORK_NUMBER = 44787;
const config: EnvConfig = {
@@ -256,12 +256,12 @@ const config: EnvConfig = {
},
OPTIMISM_CONFIG: {
- nodeUrl: networksParams[10]?.rpcUrls[0],
- ...networksParams[10],
+ nodeUrl: networksParams[420]?.rpcUrls[0],
+ ...networksParams[420],
gasPreference: {
// Keep it empty for automatic configuration
},
- blockExplorerName: ['OptimismScan'],
+ blockExplorerName: ['GoerliOptimismScan'],
subgraphAddress: '',
},
diff --git a/src/helpers/blockchain.ts b/src/helpers/blockchain.ts
index 768ef10ac8..d95133e63d 100644
--- a/src/helpers/blockchain.ts
+++ b/src/helpers/blockchain.ts
@@ -80,6 +80,17 @@ export const networksParams: {
blockExplorerUrls: ['https://kovan.etherscan.io/'],
rpcUrls: ['https://kovan.infura.io/v3/'],
},
+ 420: {
+ chainId: '0x1A4',
+ chainName: 'Optimism Goerli',
+ nativeCurrency: {
+ name: 'ETH',
+ symbol: 'ETH',
+ decimals: 18,
+ },
+ blockExplorerUrls: ['https://goerli-optimism.etherscan.io/'],
+ rpcUrls: ['https://goerli.optimism.io/'],
+ },
137: {
chainId: '0x89',
chainName: 'Polygon Mainnet',
From 64166efce229c1283ce5705764b77b3c9c2d0110 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 26 Jun 2023 16:08:08 +0330
Subject: [PATCH 025/175] init OPTIMISM_CONFIG
---
src/config/development.ts | 12 ++++++++++++
src/types/config.ts | 2 +-
2 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/src/config/development.ts b/src/config/development.ts
index a4c2b73d37..8753f3a90e 100644
--- a/src/config/development.ts
+++ b/src/config/development.ts
@@ -263,6 +263,18 @@ const config: EnvConfig = {
},
blockExplorerName: ['GoerliOptimismScan'],
subgraphAddress: '',
+ TOKEN_ADDRESS: '0x83a8eea6427985C523a0c4d9d3E62C051B6580d3',
+ tokenAddressOnUniswapV2: '0x4f4F9b8D5B4d0Dc10506e5551B0513B61fD59e75',
+ TOKEN_DISTRO_ADDRESS: '0xc916Ce4025Cb479d9BA9D798A80094a449667F5D',
+ pools: [],
+ regenPools: [],
+ regenStreams: [],
+ GIV: {
+ network: OPTIMISM_NETWORK_NUMBER,
+ LM_ADDRESS: '',
+ BUY_LINK: 'https://',
+ },
+ uniswapV2Subgraph: '',
},
CELO_CONFIG: {
diff --git a/src/types/config.ts b/src/types/config.ts
index 4a8dd4731b..2110c6478c 100644
--- a/src/types/config.ts
+++ b/src/types/config.ts
@@ -167,7 +167,7 @@ export interface EnvConfig {
MAINNET_CONFIG: MainnetNetworkConfig;
XDAI_CONFIG: XDaiNetworkConfig;
POLYGON_CONFIG: BasicNetworkConfig;
- OPTIMISM_CONFIG: BasicNetworkConfig;
+ OPTIMISM_CONFIG: SimpleNetworkConfig;
CELO_CONFIG: BasicNetworkConfig;
GARDEN_LINK: string;
BASE_ROUTE: string;
From 1148399c0056e066200567580015c92117f12472 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 26 Jun 2023 16:16:14 +0330
Subject: [PATCH 026/175] add optimism to target networks
---
src/components/views/givfarm/GIVfarmTop.tsx | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/components/views/givfarm/GIVfarmTop.tsx b/src/components/views/givfarm/GIVfarmTop.tsx
index 079a4128a3..ab47fa56f4 100644
--- a/src/components/views/givfarm/GIVfarmTop.tsx
+++ b/src/components/views/givfarm/GIVfarmTop.tsx
@@ -59,6 +59,7 @@ export const GIVfarmTop = () => {
targetNetworks={[
config.MAINNET_NETWORK_NUMBER,
config.XDAI_NETWORK_NUMBER,
+ config.OPTIMISM_NETWORK_NUMBER,
]}
/>
From 5400a2c07e9ea899a02b538307175959398dac88 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 26 Jun 2023 16:27:14 +0330
Subject: [PATCH 027/175] update contract addresses
---
src/config/development.ts | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/config/development.ts b/src/config/development.ts
index 8753f3a90e..5e693750fe 100644
--- a/src/config/development.ts
+++ b/src/config/development.ts
@@ -263,9 +263,9 @@ const config: EnvConfig = {
},
blockExplorerName: ['GoerliOptimismScan'],
subgraphAddress: '',
- TOKEN_ADDRESS: '0x83a8eea6427985C523a0c4d9d3E62C051B6580d3',
+ TOKEN_ADDRESS: '0xc916Ce4025Cb479d9BA9D798A80094a449667F5D',
tokenAddressOnUniswapV2: '0x4f4F9b8D5B4d0Dc10506e5551B0513B61fD59e75',
- TOKEN_DISTRO_ADDRESS: '0xc916Ce4025Cb479d9BA9D798A80094a449667F5D',
+ TOKEN_DISTRO_ADDRESS: '0x8D2cBce8ea0256bFFBa6fa4bf7CEC46a1d9b43f6',
pools: [],
regenPools: [],
regenStreams: [],
From e7f316468f6b085ab8a91ebcc5432ca49c28d048 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 26 Jun 2023 16:33:34 +0330
Subject: [PATCH 028/175] change xDaiValues to gnosisValues
---
pages/test1.tsx | 6 +++---
src/components/GIVeconomyPages/GIVbacks.tsx | 8 ++++----
src/components/GIVeconomyPages/GIVpower.tsx | 2 +-
src/components/givfarm/RegenStreamCard.tsx | 2 +-
.../modals/Boost/BoostModal.test.tsx | 12 ++++++------
src/components/modals/Boost/BoostModal.tsx | 2 +-
src/components/modals/StakeLock/LockSlider.tsx | 2 +-
.../modals/StakeLock/LockingBrief.tsx | 2 +-
.../modals/StakeLock/TotalGIVpowerBox.tsx | 4 ++--
src/components/views/claim/cards/Govern.tsx | 6 +++---
src/components/views/claim/cards/Stake.tsx | 6 +++---
.../views/userProfile/ProfileOverviewTab.tsx | 2 +-
.../boostedTab/EmptyPowerBoosting.tsx | 2 +-
.../boostedTab/ProfileBoostedTab.tsx | 2 +-
src/config/production.ts | 12 ++++++++++++
src/features/hooks.ts | 4 +++-
src/features/subgraph/subgraph.slice.ts | 18 ++++--------------
src/hooks/useStakingPool.tsx | 2 +-
src/hooks/useTokenDistroHelper.tsx | 2 +-
19 files changed, 50 insertions(+), 46 deletions(-)
diff --git a/pages/test1.tsx b/pages/test1.tsx
index 10a43f382f..736f041b75 100644
--- a/pages/test1.tsx
+++ b/pages/test1.tsx
@@ -35,8 +35,8 @@ const TestRoute = () => {
//This comment is for testing1
const TestIndex = () => {
- // const xDaiValues = useSelector(
- // (state: RootState) => state.subgraph.xDaiValues,
+ // const gnosisValues = useSelector(
+ // (state: RootState) => state.subgraph.gnosisValues,
// );
const [showModal, setShowModal] = useState(false);
const { account } = useWeb3React();
@@ -80,7 +80,7 @@ const TestIndex = () => {
console.log('res', res);
};
- // console.log('xDaiValues', xDaiValues);
+ // console.log('gnosisValues', gnosisValues);
// useEffect(() => {
// if (!library) return;
// library.on('block', (evt: any) => {
diff --git a/src/components/GIVeconomyPages/GIVbacks.tsx b/src/components/GIVeconomyPages/GIVbacks.tsx
index 1acc3130e5..55b5aa860c 100644
--- a/src/components/GIVeconomyPages/GIVbacks.tsx
+++ b/src/components/GIVeconomyPages/GIVbacks.tsx
@@ -51,14 +51,14 @@ export const TabGIVbacksTop = () => {
const [showGivBackExplain, setShowGivBackExplain] = useState(false);
const [givBackStream, setGivBackStream] = useState(0);
const { givTokenDistroHelper } = useGIVTokenDistroHelper(showHarvestModal);
- const xDaiValues = useAppSelector(
- state => state.subgraph.xDaiValues,
+ const gnosisValues = useAppSelector(
+ state => state.subgraph.gnosisValues,
() => (showHarvestModal ? true : false),
);
const givTokenDistroBalance = useMemo(() => {
- const sdh = new SubgraphDataHelper(xDaiValues);
+ const sdh = new SubgraphDataHelper(gnosisValues);
return sdh.getGIVTokenDistroBalance();
- }, [xDaiValues]);
+ }, [gnosisValues]);
const { chainId } = useWeb3React();
useEffect(() => {
diff --git a/src/components/GIVeconomyPages/GIVpower.tsx b/src/components/GIVeconomyPages/GIVpower.tsx
index e2d31c5969..e7ebca92d2 100644
--- a/src/components/GIVeconomyPages/GIVpower.tsx
+++ b/src/components/GIVeconomyPages/GIVpower.tsx
@@ -68,7 +68,7 @@ export function TabPowerTop() {
const { formatMessage } = useIntl();
const { account } = useWeb3React();
const sdh = new SubgraphDataHelper(
- useAppSelector(state => state.subgraph.xDaiValues),
+ useAppSelector(state => state.subgraph.gnosisValues),
);
const givPower = sdh.getUserGIVPowerBalance();
const givPowerFormatted = formatWeiHelper(givPower.balance);
diff --git a/src/components/givfarm/RegenStreamCard.tsx b/src/components/givfarm/RegenStreamCard.tsx
index 0fa4dd15da..65d42375d4 100644
--- a/src/components/givfarm/RegenStreamCard.tsx
+++ b/src/components/givfarm/RegenStreamCard.tsx
@@ -78,7 +78,7 @@ export const RegenStreamCard: FC = ({ streamConfig }) => {
const currentValues = useAppSelector(
state =>
streamNetwork === config.XDAI_NETWORK_NUMBER
- ? state.subgraph.xDaiValues
+ ? state.subgraph.gnosisValues
: state.subgraph.mainnetValues,
() => (showModal ? true : false),
);
diff --git a/src/components/modals/Boost/BoostModal.test.tsx b/src/components/modals/Boost/BoostModal.test.tsx
index 57dbd0d8c1..3c8f569f4f 100644
--- a/src/components/modals/Boost/BoostModal.test.tsx
+++ b/src/components/modals/Boost/BoostModal.test.tsx
@@ -26,8 +26,8 @@ test('showing the ZeroGivpowerModal if the user GIVpower balance is zero', async
const setStateMock = jest.fn();
const useStateMock: any = (state: any) => [state, setStateMock];
jest.spyOn(React, 'useState').mockImplementation(useStateMock);
- const xDaiValues: ISubgraphState = {};
- xDaiValues[
+ const gnosisValues: ISubgraphState = {};
+ gnosisValues[
`unipoolBalance_${config.XDAI_CONFIG.GIV.LM_ADDRESS.toLowerCase()}`
] = {
balance: '0',
@@ -39,7 +39,7 @@ test('showing the ZeroGivpowerModal if the user GIVpower balance is zero', async
{
preloadedState: {
subgraph: {
- xDaiValues: xDaiValues,
+ gnosisValues: gnosisValues,
mainnetValues: {},
currentValues: {},
},
@@ -53,8 +53,8 @@ test('showing the BoostModal if the user GIVpower balance is not zero', async ()
const setStateMock = jest.fn();
const useStateMock: any = (state: any) => [state, setStateMock];
jest.spyOn(React, 'useState').mockImplementation(useStateMock);
- const xDaiValues: ISubgraphState = {};
- xDaiValues[
+ const gnosisValues: ISubgraphState = {};
+ gnosisValues[
`unipoolBalance_${config.XDAI_CONFIG.GIV.LM_ADDRESS.toLowerCase()}`
] = {
balance: '1',
@@ -66,7 +66,7 @@ test('showing the BoostModal if the user GIVpower balance is not zero', async ()
{
preloadedState: {
subgraph: {
- xDaiValues: xDaiValues,
+ gnosisValues: gnosisValues,
mainnetValues: {},
currentValues: {},
},
diff --git a/src/components/modals/Boost/BoostModal.tsx b/src/components/modals/Boost/BoostModal.tsx
index 9fd4dc8e9c..26ea1e51c0 100644
--- a/src/components/modals/Boost/BoostModal.tsx
+++ b/src/components/modals/Boost/BoostModal.tsx
@@ -30,7 +30,7 @@ const BoostModal: FC = ({ setShowModal, projectId }) => {
const [percentage, setPercentage] = useState(0);
const [state, setState] = useState(EBoostModalState.BOOSTING);
const sdh = new SubgraphDataHelper(
- useAppSelector(state => state.subgraph.xDaiValues),
+ useAppSelector(state => state.subgraph.gnosisValues),
);
const givPower = sdh.getUserGIVPowerBalance();
diff --git a/src/components/modals/StakeLock/LockSlider.tsx b/src/components/modals/StakeLock/LockSlider.tsx
index c38c9835ae..405cfc9db3 100644
--- a/src/components/modals/StakeLock/LockSlider.tsx
+++ b/src/components/modals/StakeLock/LockSlider.tsx
@@ -27,7 +27,7 @@ const LockSlider: FC = ({ round, setRound }) => {
const { formatMessage, locale } = useIntl();
const [isChanged, setIsChanged] = useState(false);
const givpowerInfo = useAppSelector(
- state => state.subgraph.xDaiValues.givpowerInfo,
+ state => state.subgraph.gnosisValues.givpowerInfo,
) as IGIVpower;
const unlockDate = new Date(getUnlockDate(givpowerInfo, round));
return (
diff --git a/src/components/modals/StakeLock/LockingBrief.tsx b/src/components/modals/StakeLock/LockingBrief.tsx
index b489632042..fcd4790320 100644
--- a/src/components/modals/StakeLock/LockingBrief.tsx
+++ b/src/components/modals/StakeLock/LockingBrief.tsx
@@ -19,7 +19,7 @@ const LockingBrief: FC = ({
onLocking = false,
}) => {
const givpowerInfo = useAppSelector(
- state => state.subgraph.xDaiValues.givpowerInfo,
+ state => state.subgraph.gnosisValues.givpowerInfo,
) as IGIVpower;
const unlockDate = new Date(getUnlockDate(givpowerInfo, round));
return (
diff --git a/src/components/modals/StakeLock/TotalGIVpowerBox.tsx b/src/components/modals/StakeLock/TotalGIVpowerBox.tsx
index e0b9eb7125..29ce923977 100644
--- a/src/components/modals/StakeLock/TotalGIVpowerBox.tsx
+++ b/src/components/modals/StakeLock/TotalGIVpowerBox.tsx
@@ -20,7 +20,7 @@ import LottieControl from '@/components/LottieControl';
const TotalGIVpowerBox = () => {
const [totalGIVpower, setTotalGIVpower] = useState();
const { account, library, chainId } = useWeb3React();
- const xDaiValues = useAppSelector(state => state.subgraph.xDaiValues);
+ const gnosisValues = useAppSelector(state => state.subgraph.gnosisValues);
useEffect(() => {
async function fetchTotalGIVpower() {
@@ -39,7 +39,7 @@ const TotalGIVpowerBox = () => {
}
} catch (err) {
console.log({ err });
- const sdh = new SubgraphDataHelper(xDaiValues);
+ const sdh = new SubgraphDataHelper(gnosisValues);
const userGIVPowerBalance = sdh.getUserGIVPowerBalance();
setTotalGIVpower(new BigNumber(userGIVPowerBalance.balance));
}
diff --git a/src/components/views/claim/cards/Govern.tsx b/src/components/views/claim/cards/Govern.tsx
index af784a008e..b039255a84 100644
--- a/src/components/views/claim/cards/Govern.tsx
+++ b/src/components/views/claim/cards/Govern.tsx
@@ -109,7 +109,7 @@ const GovernCard: FC = ({ index }) => {
const [earnEstimate, setEarnEstimate] = useState(Zero);
const [apr, setApr] = useState(null);
const { givTokenDistroHelper } = useGIVTokenDistroHelper();
- const xDaiValues = useAppSelector(state => state.subgraph.xDaiValues);
+ const gnosisValues = useAppSelector(state => state.subgraph.gnosisValues);
useEffect(() => {
let _stacked = 0;
@@ -148,7 +148,7 @@ const GovernCard: FC = ({ index }) => {
useEffect(() => {
const cb = () => {
- getGivStakingAPR(config.XDAI_NETWORK_NUMBER, xDaiValues, null)
+ getGivStakingAPR(config.XDAI_NETWORK_NUMBER, gnosisValues, null)
.then(_apr => {
mounted.current && setApr(_apr);
})
@@ -166,7 +166,7 @@ const GovernCard: FC = ({ index }) => {
const interval = setInterval(cb, 120 * 1000);
return () => clearInterval(interval);
- }, [stacked, xDaiValues]);
+ }, [stacked, gnosisValues]);
return (
diff --git a/src/components/views/claim/cards/Stake.tsx b/src/components/views/claim/cards/Stake.tsx
index b8ce682719..74984cc1bf 100644
--- a/src/components/views/claim/cards/Stake.tsx
+++ b/src/components/views/claim/cards/Stake.tsx
@@ -98,7 +98,7 @@ const InvestCard: FC = ({ index }) => {
const [earnEstimate, setEarnEstimate] = useState(Zero);
const [APR, setAPR] = useState(Zero);
const { givTokenDistroHelper } = useGIVTokenDistroHelper();
- const { xDaiValues, mainnetValues } = useAppSelector(
+ const { gnosisValues, mainnetValues } = useAppSelector(
state => state.subgraph,
);
@@ -153,7 +153,7 @@ const InvestCard: FC = ({ index }) => {
const promise: Promise = getLPStakingAPR(
poolStakingConfig as SimplePoolStakingConfig,
networkProviders[config.XDAI_NETWORK_NUMBER],
- xDaiValues,
+ gnosisValues,
);
promiseQueue.push(promise);
});
@@ -176,7 +176,7 @@ const InvestCard: FC = ({ index }) => {
promiseQueue.push(promise);
});
getMaxAPR(promiseQueue);
- }, [mainnetValues, xDaiValues]);
+ }, [mainnetValues, gnosisValues]);
return (
diff --git a/src/components/views/userProfile/ProfileOverviewTab.tsx b/src/components/views/userProfile/ProfileOverviewTab.tsx
index 259e96c15c..8f2b4c820b 100644
--- a/src/components/views/userProfile/ProfileOverviewTab.tsx
+++ b/src/components/views/userProfile/ProfileOverviewTab.tsx
@@ -97,7 +97,7 @@ const ProfileOverviewTab: FC = ({ user, myAccount }) => {
const [section, setSection] = useState(_sections.getGiv);
const sdh = new SubgraphDataHelper(
- useAppSelector(state => state.subgraph.xDaiValues),
+ useAppSelector(state => state.subgraph.gnosisValues),
);
const { userData } = useAppSelector(state => state.user);
const boostedProjectsCount = userData?.boostedProjectsCount ?? 0;
diff --git a/src/components/views/userProfile/boostedTab/EmptyPowerBoosting.tsx b/src/components/views/userProfile/boostedTab/EmptyPowerBoosting.tsx
index 25c945e306..bc4b574e85 100644
--- a/src/components/views/userProfile/boostedTab/EmptyPowerBoosting.tsx
+++ b/src/components/views/userProfile/boostedTab/EmptyPowerBoosting.tsx
@@ -13,7 +13,7 @@ interface IEmptyPowerBoosting {
export const EmptyPowerBoosting: FC = ({ myAccount }) => {
const sdh = new SubgraphDataHelper(
- useAppSelector(state => state.subgraph.xDaiValues),
+ useAppSelector(state => state.subgraph.gnosisValues),
);
const givPower = sdh.getUserGIVPowerBalance();
const { formatMessage } = useIntl();
diff --git a/src/components/views/userProfile/boostedTab/ProfileBoostedTab.tsx b/src/components/views/userProfile/boostedTab/ProfileBoostedTab.tsx
index 5c122c5a33..2e69b95ebf 100644
--- a/src/components/views/userProfile/boostedTab/ProfileBoostedTab.tsx
+++ b/src/components/views/userProfile/boostedTab/ProfileBoostedTab.tsx
@@ -53,7 +53,7 @@ export const ProfileBoostedTab: FC = ({
});
const sdh = new SubgraphDataHelper(
- useAppSelector(state => state.subgraph.xDaiValues),
+ useAppSelector(state => state.subgraph.gnosisValues),
);
const { userData } = useAppSelector(state => state.user);
const boostedProjectsCount = userData?.boostedProjectsCount ?? 0;
diff --git a/src/config/production.ts b/src/config/production.ts
index 8bef4a8bce..09cea54903 100644
--- a/src/config/production.ts
+++ b/src/config/production.ts
@@ -359,6 +359,18 @@ const config: EnvConfig = {
},
blockExplorerName: ['OptimismScan'],
subgraphAddress: '',
+ TOKEN_ADDRESS: '0xc916Ce4025Cb479d9BA9D798A80094a449667F5D',
+ tokenAddressOnUniswapV2: '0x4f4F9b8D5B4d0Dc10506e5551B0513B61fD59e75',
+ TOKEN_DISTRO_ADDRESS: '0x8D2cBce8ea0256bFFBa6fa4bf7CEC46a1d9b43f6',
+ pools: [],
+ regenPools: [],
+ regenStreams: [],
+ GIV: {
+ network: OPTIMISM_NETWORK_NUMBER,
+ LM_ADDRESS: '',
+ BUY_LINK: 'https://',
+ },
+ uniswapV2Subgraph: '',
},
CELO_CONFIG: {
diff --git a/src/features/hooks.ts b/src/features/hooks.ts
index 9ed4d646a4..bfb2a7c9b8 100644
--- a/src/features/hooks.ts
+++ b/src/features/hooks.ts
@@ -6,4 +6,6 @@ import type { RootState, AppDispatch } from './store';
export const useAppDispatch = () => useDispatch();
export const useAppSelector: TypedUseSelectorHook = useSelector;
export const currentValuesHelper = (chainId?: number) =>
- chainId === config.MAINNET_NETWORK_NUMBER ? 'mainnetValues' : 'xDaiValues';
+ chainId === config.MAINNET_NETWORK_NUMBER
+ ? 'mainnetValues'
+ : 'gnosisValues';
diff --git a/src/features/subgraph/subgraph.slice.ts b/src/features/subgraph/subgraph.slice.ts
index 8859d8d62b..3086be4801 100644
--- a/src/features/subgraph/subgraph.slice.ts
+++ b/src/features/subgraph/subgraph.slice.ts
@@ -7,16 +7,6 @@ import {
} from './subgraph.thunks';
import type { ISubgraphState } from './subgraph.types';
-const defaultGIVpowerInfo = {
- id: '',
- initialDate: '0',
- locksCreated: 0,
- roundDuration: 1,
- totalGIVLocked: '0',
- currentRound: 0,
- nextRoundDate: '0',
-};
-
export const defaultSubgraphValues: ISubgraphState = {
userNotStakedPositions: [],
userStakedPositions: [],
@@ -36,11 +26,11 @@ export const defaultXdaiSubgraphValues: ISubgraphState = {
const initialState: {
currentValues: ISubgraphState;
mainnetValues: ISubgraphState;
- xDaiValues: ISubgraphState;
+ gnosisValues: ISubgraphState;
} = {
currentValues: defaultSubgraphValues,
mainnetValues: defaultSubgraphValues,
- xDaiValues: defaultXdaiSubgraphValues,
+ gnosisValues: defaultXdaiSubgraphValues,
};
export const subgraphSlice = createSlice({
@@ -55,11 +45,11 @@ export const subgraphSlice = createSlice({
state.mainnetValues = action.payload.response;
}
if (action.payload.chainId === config.XDAI_NETWORK_NUMBER) {
- state.xDaiValues = action.payload.response;
+ state.gnosisValues = action.payload.response;
}
})
.addCase(fetchXDaiInfoAsync.fulfilled, (state, action) => {
- state.xDaiValues = action.payload;
+ state.gnosisValues = action.payload;
})
.addCase(fetchMainnetInfoAsync.fulfilled, (state, action) => {
state.mainnetValues = action.payload;
diff --git a/src/hooks/useStakingPool.tsx b/src/hooks/useStakingPool.tsx
index a23738e99b..b9ebe972a0 100644
--- a/src/hooks/useStakingPool.tsx
+++ b/src/hooks/useStakingPool.tsx
@@ -36,7 +36,7 @@ export const useStakingPool = (
const currentValues = useAppSelector(
state =>
poolStakingConfig.network === config.XDAI_NETWORK_NUMBER
- ? state.subgraph.xDaiValues
+ ? state.subgraph.gnosisValues
: state.subgraph.mainnetValues,
() => (hold ? true : false),
);
diff --git a/src/hooks/useTokenDistroHelper.tsx b/src/hooks/useTokenDistroHelper.tsx
index 9c2d498774..d3ee6d04f9 100644
--- a/src/hooks/useTokenDistroHelper.tsx
+++ b/src/hooks/useTokenDistroHelper.tsx
@@ -16,7 +16,7 @@ export const useTokenDistroHelper = (
const currentValues = useAppSelector(
state =>
poolNetwork === config.XDAI_NETWORK_NUMBER
- ? state.subgraph.xDaiValues
+ ? state.subgraph.gnosisValues
: state.subgraph.mainnetValues,
() => (hold ? true : false),
);
From 5c7115d31fe4037e80013238b6965265ee1cad2e Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 26 Jun 2023 17:27:32 +0330
Subject: [PATCH 029/175] add fetchOptimismInfo
---
src/features/subgraph/subgraph.services.ts | 29 +++++++++++++++++++---
1 file changed, 25 insertions(+), 4 deletions(-)
diff --git a/src/features/subgraph/subgraph.services.ts b/src/features/subgraph/subgraph.services.ts
index d34ced9a7d..95e3b9e789 100644
--- a/src/features/subgraph/subgraph.services.ts
+++ b/src/features/subgraph/subgraph.services.ts
@@ -26,10 +26,10 @@ export const fetchMainnetInfo = async (userAddress?: string) => {
}
};
-export const fetchXDaiInfo = async (userAddress?: string) => {
+export const fetchGnosisInfo = async (userAddress?: string) => {
try {
const response = await fetchSubgraph(
- SubgraphQueryBuilder.getXDaiQuery(userAddress),
+ SubgraphQueryBuilder.getGnosisQuery(userAddress),
config.XDAI_NETWORK_NUMBER,
);
return transformSubgraphData({
@@ -37,10 +37,31 @@ export const fetchXDaiInfo = async (userAddress?: string) => {
networkNumber: config.XDAI_NETWORK_NUMBER,
});
} catch (e) {
- console.error('Error on query xDai subgraph:', e);
+ console.error('Error on query Gnosis subgraph:', e);
captureException(e, {
tags: {
- section: 'fetchxDaiSubgraph',
+ section: 'fetchGnosisSubgraph',
+ },
+ });
+ return defaultSubgraphValues;
+ }
+};
+
+export const fetchOptimismInfo = async (userAddress?: string) => {
+ try {
+ const response = await fetchSubgraph(
+ SubgraphQueryBuilder.getOptimismQuery(userAddress),
+ config.OPTIMISM_NETWORK_NUMBER,
+ );
+ return transformSubgraphData({
+ ...response,
+ networkNumber: config.OPTIMISM_NETWORK_NUMBER,
+ });
+ } catch (e) {
+ console.error('Error on query Optimism subgraph:', e);
+ captureException(e, {
+ tags: {
+ section: 'fetchOptimismSubgraph',
},
});
return defaultSubgraphValues;
From 372c79fdac71613deea2d5cc6a4fc42280551c7e Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 26 Jun 2023 17:27:52 +0330
Subject: [PATCH 030/175] add fetchOptimismInfoAsync
---
src/features/subgraph/subgraph.thunks.ts | 24 +++++++++++++++++++-----
1 file changed, 19 insertions(+), 5 deletions(-)
diff --git a/src/features/subgraph/subgraph.thunks.ts b/src/features/subgraph/subgraph.thunks.ts
index 1a5381b5f6..d0638c0095 100644
--- a/src/features/subgraph/subgraph.thunks.ts
+++ b/src/features/subgraph/subgraph.thunks.ts
@@ -1,12 +1,24 @@
import { createAsyncThunk } from '@reduxjs/toolkit';
import config from '@/configuration';
-import { fetchMainnetInfo, fetchXDaiInfo } from './subgraph.services';
+import {
+ fetchMainnetInfo,
+ fetchGnosisInfo,
+ fetchOptimismInfo,
+} from './subgraph.services';
import { ICurrentInfo } from './subgraph.types';
-export const fetchXDaiInfoAsync = createAsyncThunk(
- 'subgraph/fetchXDaiInfo',
+export const fetchOptimismInfoAsync = createAsyncThunk(
+ 'subgraph/fetchOptimismInfo',
async (userAddress?: string) => {
- const response = await fetchXDaiInfo(userAddress);
+ const response = await fetchOptimismInfo(userAddress);
+ return { ...response, isLoaded: true };
+ },
+);
+
+export const fetchGnosisInfoAsync = createAsyncThunk(
+ 'subgraph/fetchGnosisInfo',
+ async (userAddress?: string) => {
+ const response = await fetchGnosisInfo(userAddress);
return { ...response, isLoaded: true };
},
);
@@ -25,7 +37,9 @@ export const fetchCurrentInfoAsync = createAsyncThunk(
const response =
props.chainId === config.MAINNET_NETWORK_NUMBER
? await fetchMainnetInfo(props.userAddress)
- : await fetchXDaiInfo(props.userAddress);
+ : config.OPTIMISM_NETWORK_NUMBER
+ ? fetchOptimismInfo(props.userAddress)
+ : await fetchGnosisInfo(props.userAddress);
return {
response: { ...response, isLoaded: true },
chainId: props.chainId,
From 996bb0593eca6b3ae765becf47902afd2d005dbd Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 26 Jun 2023 17:28:26 +0330
Subject: [PATCH 031/175] add optimism to currentValuesHelper
---
src/features/hooks.ts | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/features/hooks.ts b/src/features/hooks.ts
index bfb2a7c9b8..1e34965c55 100644
--- a/src/features/hooks.ts
+++ b/src/features/hooks.ts
@@ -8,4 +8,6 @@ export const useAppSelector: TypedUseSelectorHook = useSelector;
export const currentValuesHelper = (chainId?: number) =>
chainId === config.MAINNET_NETWORK_NUMBER
? 'mainnetValues'
+ : chainId === config.OPTIMISM_NETWORK_NUMBER
+ ? 'optimismValues'
: 'gnosisValues';
From fd5d21a78df5412107eb8bc1d8768a021b534338 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 26 Jun 2023 17:28:49 +0330
Subject: [PATCH 032/175] add getOptimismQuery
---
src/lib/subgraph/subgraphQueryBuilder.ts | 34 +++++++++++++++++++++---
1 file changed, 30 insertions(+), 4 deletions(-)
diff --git a/src/lib/subgraph/subgraphQueryBuilder.ts b/src/lib/subgraph/subgraphQueryBuilder.ts
index 84a28b18b2..7765f7d089 100644
--- a/src/lib/subgraph/subgraphQueryBuilder.ts
+++ b/src/lib/subgraph/subgraphQueryBuilder.ts
@@ -213,8 +213,8 @@ export class SubgraphQueryBuilder {
.join();
};
- private static getGIVPowersInfoQuery = (): string => {
- return `givpower(id: "${config.XDAI_CONFIG.GIV.LM_ADDRESS.toLowerCase()}"){
+ private static getGIVPowersInfoQuery = (lmAddress: string): string => {
+ return `givpower(id: "${lmAddress.toLowerCase()}"){
id
initialDate
locksCreated
@@ -285,7 +285,7 @@ export class SubgraphQueryBuilder {
`;
};
- static getXDaiQuery = (userAddress?: string): string => {
+ static getGnosisQuery = (userAddress?: string): string => {
return `
{
${SubgraphQueryBuilder.getBalanceQuery(config.XDAI_CONFIG, userAddress)}
@@ -302,7 +302,33 @@ export class SubgraphQueryBuilder {
],
userAddress,
)}
- givpowerInfo: ${SubgraphQueryBuilder.getGIVPowersInfoQuery()},
+ givpowerInfo: ${SubgraphQueryBuilder.getGIVPowersInfoQuery(
+ config.XDAI_CONFIG.GIV.LM_ADDRESS,
+ )},
+ }
+ `;
+ };
+
+ static getOptimismQuery = (userAddress?: string): string => {
+ return `
+ {
+ ${SubgraphQueryBuilder.getBalanceQuery(config.OPTIMISM_CONFIG, userAddress)}
+ ${SubgraphQueryBuilder.generateTokenDistroQueries(
+ config.OPTIMISM_CONFIG,
+ userAddress,
+ )}
+ ${SubgraphQueryBuilder.generateFarmingQueries(
+ [
+ getGivStakingConfig(config.OPTIMISM_CONFIG),
+ ...(config.OPTIMISM_CONFIG
+ .pools as Array),
+ ...config.OPTIMISM_CONFIG.regenPools,
+ ],
+ userAddress,
+ )}
+ givpowerInfo: ${SubgraphQueryBuilder.getGIVPowersInfoQuery(
+ config.OPTIMISM_CONFIG.GIV.LM_ADDRESS,
+ )},
}
`;
};
From cff9056cdb73e4333f26c5762bbb5d17bedfd100 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 26 Jun 2023 17:34:19 +0330
Subject: [PATCH 033/175] add current subgraph full fill
---
src/features/subgraph/subgraph.slice.ts | 23 +++++++++++++++++------
src/features/subgraph/subgraph.thunks.ts | 12 ++++++------
2 files changed, 23 insertions(+), 12 deletions(-)
diff --git a/src/features/subgraph/subgraph.slice.ts b/src/features/subgraph/subgraph.slice.ts
index 3086be4801..931b443a17 100644
--- a/src/features/subgraph/subgraph.slice.ts
+++ b/src/features/subgraph/subgraph.slice.ts
@@ -2,8 +2,9 @@ import { createSlice } from '@reduxjs/toolkit';
import config from '@/configuration';
import {
fetchCurrentInfoAsync,
- fetchXDaiInfoAsync,
fetchMainnetInfoAsync,
+ fetchGnosisInfoAsync,
+ fetchOptimismInfoAsync,
} from './subgraph.thunks';
import type { ISubgraphState } from './subgraph.types';
@@ -27,10 +28,12 @@ const initialState: {
currentValues: ISubgraphState;
mainnetValues: ISubgraphState;
gnosisValues: ISubgraphState;
+ optimismValues: ISubgraphState;
} = {
currentValues: defaultSubgraphValues,
mainnetValues: defaultSubgraphValues,
gnosisValues: defaultXdaiSubgraphValues,
+ optimismValues: defaultSubgraphValues,
};
export const subgraphSlice = createSlice({
@@ -43,16 +46,24 @@ export const subgraphSlice = createSlice({
state.currentValues = action.payload.response;
if (action.payload.chainId === config.MAINNET_NETWORK_NUMBER) {
state.mainnetValues = action.payload.response;
- }
- if (action.payload.chainId === config.XDAI_NETWORK_NUMBER) {
+ } else if (
+ action.payload.chainId === config.XDAI_NETWORK_NUMBER
+ ) {
state.gnosisValues = action.payload.response;
+ } else if (
+ action.payload.chainId === config.OPTIMISM_NETWORK_NUMBER
+ ) {
+ state.optimismValues = action.payload.response;
}
})
- .addCase(fetchXDaiInfoAsync.fulfilled, (state, action) => {
- state.gnosisValues = action.payload;
- })
.addCase(fetchMainnetInfoAsync.fulfilled, (state, action) => {
state.mainnetValues = action.payload;
+ })
+ .addCase(fetchGnosisInfoAsync.fulfilled, (state, action) => {
+ state.gnosisValues = action.payload;
+ })
+ .addCase(fetchOptimismInfoAsync.fulfilled, (state, action) => {
+ state.optimismValues = action.payload;
});
},
});
diff --git a/src/features/subgraph/subgraph.thunks.ts b/src/features/subgraph/subgraph.thunks.ts
index d0638c0095..01b3d7589c 100644
--- a/src/features/subgraph/subgraph.thunks.ts
+++ b/src/features/subgraph/subgraph.thunks.ts
@@ -33,16 +33,16 @@ export const fetchMainnetInfoAsync = createAsyncThunk(
export const fetchCurrentInfoAsync = createAsyncThunk(
'subgraph/fetchCurrentInfo',
- async (props: ICurrentInfo) => {
+ async ({ userAddress, chainId }: ICurrentInfo) => {
const response =
- props.chainId === config.MAINNET_NETWORK_NUMBER
- ? await fetchMainnetInfo(props.userAddress)
+ chainId === config.MAINNET_NETWORK_NUMBER
+ ? await fetchMainnetInfo(userAddress)
: config.OPTIMISM_NETWORK_NUMBER
- ? fetchOptimismInfo(props.userAddress)
- : await fetchGnosisInfo(props.userAddress);
+ ? await fetchOptimismInfo(userAddress)
+ : await fetchGnosisInfo(userAddress);
return {
response: { ...response, isLoaded: true },
- chainId: props.chainId,
+ chainId: chainId,
};
},
);
From 30465cc67f5bf7d2e1d7992e3d16def15acc9497 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 26 Jun 2023 19:05:35 +0330
Subject: [PATCH 034/175] add optimism to fetchSubgraph
---
src/services/subgraph.service.ts | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/services/subgraph.service.ts b/src/services/subgraph.service.ts
index 492177afb6..e19a76c757 100644
--- a/src/services/subgraph.service.ts
+++ b/src/services/subgraph.service.ts
@@ -13,6 +13,8 @@ export const fetchSubgraph = async (
uri = config.MAINNET_CONFIG.subgraphAddress;
} else if (network === config.XDAI_NETWORK_NUMBER) {
uri = config.XDAI_CONFIG.subgraphAddress;
+ } else if (network === config.OPTIMISM_NETWORK_NUMBER) {
+ uri = config.OPTIMISM_CONFIG.subgraphAddress;
} else {
console.error('Network is not Defined!');
return {};
From e3c3a8813fdf094f944959fed4c6e5413b9bf254 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 26 Jun 2023 19:05:55 +0330
Subject: [PATCH 035/175] handle undefined givpower info
---
src/lib/subgraph/subgraphDataTransform.ts | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/src/lib/subgraph/subgraphDataTransform.ts b/src/lib/subgraph/subgraphDataTransform.ts
index ff99fb7079..a306b0a635 100644
--- a/src/lib/subgraph/subgraphDataTransform.ts
+++ b/src/lib/subgraph/subgraphDataTransform.ts
@@ -177,11 +177,11 @@ export const transformTokenDistroBalance = (info: any): ITokenDistroBalance => {
};
const transformGIVpowerInfo = (info: any = {}): IGIVpower => {
- const id = info.id || '';
- const initialDate = info.initialDate || '0';
- const locksCreated = Number(info.locksCreated || 0);
- const totalGIVLocked = info.totalGIVLocked || '0';
- const roundDuration = Number(info.roundDuration || 0);
+ const id = info?.id || '';
+ const initialDate = info?.initialDate || '0';
+ const locksCreated = Number(info?.locksCreated || 0);
+ const totalGIVLocked = info?.totalGIVLocked || '0';
+ const roundDuration = Number(info?.roundDuration || 0);
return {
id,
initialDate,
@@ -221,6 +221,7 @@ export const transformSubgraphData = (data: any = {}): ISubgraphState => {
case key.startsWith('tokenDistroBalance_'):
result[key] = transformTokenDistroBalance(value);
break;
+
case key === 'givpowerInfo':
result[key] = transformGIVpowerInfo(value);
break;
From 34fc491846157e94f5b316170f5aef68fd7349e8 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 26 Jun 2023 19:06:07 +0330
Subject: [PATCH 036/175] fix fetchCurrentInfoAsync
---
src/features/subgraph/subgraph.thunks.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/features/subgraph/subgraph.thunks.ts b/src/features/subgraph/subgraph.thunks.ts
index 01b3d7589c..23b35a1ef6 100644
--- a/src/features/subgraph/subgraph.thunks.ts
+++ b/src/features/subgraph/subgraph.thunks.ts
@@ -37,7 +37,7 @@ export const fetchCurrentInfoAsync = createAsyncThunk(
const response =
chainId === config.MAINNET_NETWORK_NUMBER
? await fetchMainnetInfo(userAddress)
- : config.OPTIMISM_NETWORK_NUMBER
+ : chainId === config.OPTIMISM_NETWORK_NUMBER
? await fetchOptimismInfo(userAddress)
: await fetchGnosisInfo(userAddress);
return {
From 6b7711cef9f2bbda4a0f5e81f8fed2c8f9873f6d Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 26 Jun 2023 19:06:19 +0330
Subject: [PATCH 037/175] update subgraphAddress
---
src/config/development.ts | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/config/development.ts b/src/config/development.ts
index 5e693750fe..b6871f388e 100644
--- a/src/config/development.ts
+++ b/src/config/development.ts
@@ -262,7 +262,8 @@ const config: EnvConfig = {
// Keep it empty for automatic configuration
},
blockExplorerName: ['GoerliOptimismScan'],
- subgraphAddress: '',
+ subgraphAddress:
+ 'https://api.thegraph.com/subgraphs/name/giveth/giveth-economy-optim-staging',
TOKEN_ADDRESS: '0xc916Ce4025Cb479d9BA9D798A80094a449667F5D',
tokenAddressOnUniswapV2: '0x4f4F9b8D5B4d0Dc10506e5551B0513B61fD59e75',
TOKEN_DISTRO_ADDRESS: '0x8D2cBce8ea0256bFFBa6fa4bf7CEC46a1d9b43f6',
From 8d7938fe34741cd622380bc796a88c7492d03cdd Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 26 Jun 2023 19:06:36 +0330
Subject: [PATCH 038/175] add optimism to SubgraphController
---
src/components/controller/subgraph.ctrl.tsx | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/src/components/controller/subgraph.ctrl.tsx b/src/components/controller/subgraph.ctrl.tsx
index 208c6869f8..9976527549 100644
--- a/src/components/controller/subgraph.ctrl.tsx
+++ b/src/components/controller/subgraph.ctrl.tsx
@@ -3,9 +3,10 @@ import { useEffect } from 'react';
import { useAppDispatch } from '@/features/hooks';
import config from '@/configuration';
import {
- fetchXDaiInfoAsync,
+ fetchGnosisInfoAsync,
fetchMainnetInfoAsync,
fetchCurrentInfoAsync,
+ fetchOptimismInfoAsync,
} from '@/features/subgraph/subgraph.thunks';
const SubgraphController = () => {
@@ -16,9 +17,11 @@ const SubgraphController = () => {
const _account = account ? account : undefined;
const _chainID = chainId || config.MAINNET_NETWORK_NUMBER;
if (chainId !== config.XDAI_NETWORK_NUMBER)
- dispatch(fetchXDaiInfoAsync(_account));
+ dispatch(fetchGnosisInfoAsync(_account));
if (chainId !== config.MAINNET_NETWORK_NUMBER)
dispatch(fetchMainnetInfoAsync(_account));
+ if (chainId !== config.OPTIMISM_NETWORK_NUMBER)
+ dispatch(fetchOptimismInfoAsync(_account));
dispatch(
fetchCurrentInfoAsync({
userAddress: _account,
From 9848797854ec81bef4d7b312677ba9f1df32bfa6 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 26 Jun 2023 19:12:43 +0330
Subject: [PATCH 039/175] fix build issue
---
pages/test1.tsx | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pages/test1.tsx b/pages/test1.tsx
index 736f041b75..845445a459 100644
--- a/pages/test1.tsx
+++ b/pages/test1.tsx
@@ -9,7 +9,7 @@ import { useRouter } from 'next/router';
import { Container } from '@giveth/ui-design-system';
import { gToast, ToastType } from '@/components/toasts';
import { useAppDispatch } from '@/features/hooks';
-import { fetchXDaiInfoAsync } from '@/features/subgraph/subgraph.thunks';
+import { fetchGnosisInfoAsync } from '@/features/subgraph/subgraph.thunks';
import { FlowRateTooltip } from '@/components/GIVeconomyPages/GIVstream.sc';
import { IconWithTooltip } from '@/components/IconWithToolTip';
import { removeQueryParamAndRedirect } from '@/helpers/url';
@@ -114,7 +114,7 @@ const TestIndex = () => {
{
if (account) {
- dispatch(fetchXDaiInfoAsync(account));
+ dispatch(fetchGnosisInfoAsync(account));
}
}}
>
From f920c421e7de2da935ee8ec33ae8e142f5ff4380 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 26 Jun 2023 19:22:14 +0330
Subject: [PATCH 040/175] fix build issue
---
src/lib/claim.ts | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/lib/claim.ts b/src/lib/claim.ts
index b027478524..d332a764c4 100644
--- a/src/lib/claim.ts
+++ b/src/lib/claim.ts
@@ -9,7 +9,7 @@ import TOKEN_DISTRO_JSON from '../artifacts/TokenDistro.json';
import { transformSubgraphData } from '@/lib/subgraph/subgraphDataTransform';
import { getGasPreference } from '@/lib/helpers';
import { MerkleDistro } from '@/types/contracts';
-import { fetchXDaiInfo } from '@/features/subgraph/subgraph.services';
+import { fetchGnosisInfo } from '@/features/subgraph/subgraph.services';
import { SubgraphDataHelper } from '@/lib/subgraph/subgraphDataHelper';
const { abi: MERKLE_ABI } = MerkleDropJson;
@@ -48,7 +48,7 @@ export const fetchAirDropClaimData = async (
export const hasClaimedAirDrop = async (address: string): Promise => {
try {
- const response = await fetchXDaiInfo(address);
+ const response = await fetchGnosisInfo(address);
const sdh = new SubgraphDataHelper(transformSubgraphData(response));
const balances = sdh.getGIVTokenDistroBalance();
From e2ebf76383ccbbe7c279d0b5bb2b797c9ef0d65a Mon Sep 17 00:00:00 2001
From: Vyom Jain
Date: Fri, 14 Jul 2023 17:31:11 +0530
Subject: [PATCH 041/175] fix: remove console log in UserWithPFPInCell.tsx
---
src/components/UserWithPFPInCell.tsx | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/components/UserWithPFPInCell.tsx b/src/components/UserWithPFPInCell.tsx
index a7f3e3f919..613b3f1e07 100644
--- a/src/components/UserWithPFPInCell.tsx
+++ b/src/components/UserWithPFPInCell.tsx
@@ -14,16 +14,16 @@ interface IUserWithPFPInCell {
export const UserWithPFPInCell: FC = ({ user }) => {
const pfpToken = useGiverPFPToken(user?.walletAddress, user?.avatar);
- console.log(addressToUserView(user?.walletAddress?.toLowerCase()));
+ const userProfileLink = addressToUserView(user?.walletAddress?.toLowerCase()) || "";
const name =
- user?.name || shortenAddress(user?.walletAddress?.toLowerCase());
+ user?.name || shortenAddress(user?.walletAddress?.toLowerCase()) || '\u200C';
return pfpToken ? (
- {name || '\u200C'}
+ {name}
) : (
- {name || '\u200C'}
+ {name}
);
};
const StyledPFP = styled(PFP)`
From 4082c290d97cf8ac351800e1a28004f423e75f16 Mon Sep 17 00:00:00 2001
From: Vy
Date: Fri, 14 Jul 2023 17:33:51 +0530
Subject: [PATCH 042/175] format code
---
src/components/UserWithPFPInCell.tsx | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/src/components/UserWithPFPInCell.tsx b/src/components/UserWithPFPInCell.tsx
index 613b3f1e07..fe0fc04998 100644
--- a/src/components/UserWithPFPInCell.tsx
+++ b/src/components/UserWithPFPInCell.tsx
@@ -14,16 +14,21 @@ interface IUserWithPFPInCell {
export const UserWithPFPInCell: FC = ({ user }) => {
const pfpToken = useGiverPFPToken(user?.walletAddress, user?.avatar);
- const userProfileLink = addressToUserView(user?.walletAddress?.toLowerCase()) || "";
+ const userProfileLink =
+ addressToUserView(user?.walletAddress?.toLowerCase()) || '';
const name =
- user?.name || shortenAddress(user?.walletAddress?.toLowerCase()) || '\u200C';
+ user?.name ||
+ shortenAddress(user?.walletAddress?.toLowerCase()) ||
+ '\u200C';
return pfpToken ? (
{name}
) : (
- {name}
+
+ {name}
+
);
};
const StyledPFP = styled(PFP)`
From e7be1426f4f6564406851d95f838b11f36c56ca3 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 18 Jul 2023 19:27:13 +0330
Subject: [PATCH 043/175] add findSameKeyValue
---
lang/find.js | 34 ++++++++++++++++++++++++++++++++++
1 file changed, 34 insertions(+)
create mode 100644 lang/find.js
diff --git a/lang/find.js b/lang/find.js
new file mode 100644
index 0000000000..9b75d423f6
--- /dev/null
+++ b/lang/find.js
@@ -0,0 +1,34 @@
+const fs = require('fs');
+
+// Read the JSON file
+const enJsonData = fs.readFileSync('en.json');
+const en = JSON.parse(enJsonData);
+
+const esJsonData = fs.readFileSync('es.json');
+const es = JSON.parse(esJsonData);
+
+const caJsonData = fs.readFileSync('ca.json');
+const ca = JSON.parse(caJsonData);
+
+function findSameKeyValue(obj) {
+ const sameKeyValue = {};
+ for (let key in obj) {
+ if (obj.hasOwnProperty(key) && en[key] === obj[key]) {
+ sameKeyValue[key] = obj[key];
+ }
+ }
+ return sameKeyValue;
+}
+
+function save(obj, name) {
+ // Write the sorted data back to the JSON file
+ fs.writeFileSync(name, JSON.stringify(obj, null, 2));
+
+ console.log('Saving completed!');
+}
+
+const ntEs = findSameKeyValue(es);
+const ntCa = findSameKeyValue(ca);
+
+save(ntEs, 'nt_es.json');
+save(ntCa, 'nt_ca.json');
From e9b90b8640917fd1aebb387e2920d0b945be3ee1 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 18 Jul 2023 19:27:33 +0330
Subject: [PATCH 044/175] add translateds and not translateds
---
lang/nt_ca.json | 178 ++++++++++++++++++++++++++++++++++++++++++++++++
lang/nt_es.json | 145 +++++++++++++++++++++++++++++++++++++++
lang/t_ca.json | 178 ++++++++++++++++++++++++++++++++++++++++++++++++
lang/t_es.json | 145 +++++++++++++++++++++++++++++++++++++++
4 files changed, 646 insertions(+)
create mode 100644 lang/nt_ca.json
create mode 100644 lang/nt_es.json
create mode 100644 lang/t_ca.json
create mode 100644 lang/t_es.json
diff --git a/lang/nt_ca.json b/lang/nt_ca.json
new file mode 100644
index 0000000000..e4c1e8c6e9
--- /dev/null
+++ b/lang/nt_ca.json
@@ -0,0 +1,178 @@
+{
+ "animals": "Animals",
+ "art": "Art",
+ "component.archive_cover.archived": "ARCHIVED",
+ "component.donation_section.100_to_the_project": "100% goes to the project.",
+ "component.donation_section.desc": "Every donation is peer-to-peer, with no fees and no middlemen.",
+ "component.donation_section.learn_zero_fee": "Learn about our zero-fee policy",
+ "component.passport_card.desc": "Verify your Gitcoin Passport to prove your donor uniqueness and ensure your donations get matched in quadratic funding rounds.",
+ "component.project-stats.listing.tooltip": "If a project is listed, it is included on the Projects page, and can be found using our search and filter functions. Unlisted projects can only be found via direct link.",
+ "component.project-stats.status.tooltip": "Projects status refers to if the project is active and raising funds, deactivated, canceled or in draft phase.",
+ "component.project-stats.verification.tooltip": "Verified projects have been reviewed by our team and found to be providing a public good, with a history of impact and reputation at stake.",
+ "component.qf-section.tooltip": "This estimation is the matching funds that this project would get if the round ended now, disregarding fraud analysis.",
+ "component.qf_middle_banner.desc": "Amplify your impact on verified projects! Donate on any of our 5 supported networks, earn rewards, and get your donations matched with the power of quadratic funding.",
+ "component.qf_middle_banner.title": "Giveth Alpha Round",
+ "component.regenstream_card.harvest_caption": "Use the Harvest button to claim liquid rewards from this RegenStream",
+ "component.title.commons_stack": "Commons Stack",
+ "component.title.giveth_trace": "Giveth Trace",
+ "desci": "Desci",
+ "general": "General",
+ "giveconomy": "GIVeconomy",
+ "giveth": "Giveth",
+ "label.add_new_address": "Add new address",
+ "label.all_donations": "All Donations",
+ "label.all_time_donations_received": "All time donations received",
+ "label.already_a_giver": "Already own a Giver?",
+ "label.always": "Always",
+ "label.amount_raised": "Amount raised",
+ "label.amount_raised_in_this_round": "Amount raised in this round",
+ "label.amplify_your_donation": "Amplify your donation",
+ "label.amplify_your_donation_desc": "Unlock matching for your donation by verifying your identity! Connect your wallet to Gitcoin Passport to check your identity score and maximize your donation power. Passport is designed to proactively verify users' identities to protect against Sybil attacks.",
+ "label.anonymous": "Anonymous",
+ "label.an_equivalent_of_up_to_40%": "An equivalent of up to 40% of the donation amount in GIV tokens!",
+ "label.be_the_first_booster": "Be the first one to boost this project with GIVpower.",
+ "label.connect_passport": "Conenct Passport",
+ "label.connect_your_wallet_and_generate_your_link": "Connect your wallet and generate your unique referral link.",
+ "label.connect_your_wallet_and_get_your_link": "Connect your wallet and get your unique link to share on social media and favourite community channels.",
+ "label.connet_your_wallet_and_sign_in_to_get_your_referral": "Connect your wallet and sign in to get your referral link and start earning.",
+ "label.contribution": "Contribution",
+ "label.contributors": "{count, plural, one { contributor} other { contributors} }",
+ "label.create_referrral_id_again": "Create referral Id again",
+ "label.current_givpower": "current GIVpower",
+ "label.docs": "docs",
+ "label.domain_name_at": "domain name at a 50% discount, thanks to Punk Domains. Reserve your name (e.g.",
+ "label.donate_first_lead_the_way": "Donate first & lead the way!",
+ "label.donation_received": "Donation Received",
+ "label.donors_to_verified": "Donors to verified projects are rewarded with GIV. Boost this project to increase its rewards % and make it more visible on the projects page!",
+ "label.duration_ago": "{duration} ago",
+ "label.eligible_for_matching": "Eligible for Matching",
+ "label.ends_on": "ends on",
+ "label.estimated_matching": "Estimated matching",
+ "label.expected_rank_for_next_round": "This is the expected rank for the next round based on",
+ "label.get_rewarded_with": "Get rewarded with up to ",
+ "label.get_your_giveth_name": "Get your Giveth Name.",
+ "label.gitcoin_passport": "Gitcoin Passport",
+ "label.givbacks": "GIVbacks",
+ "label.givback_distributed_afer_round": "GIV rewards from the GIVbacks program will be distributed after the end of the current round.",
+ "label.giveconomy": "GIVeconomy",
+ "label.givers_pfp_holders": "Givers PFP Holders will be able to claim their own unique ",
+ "label.givpower": "GIVpower",
+ "label.heres_your_referral": "Here’s your unique referral link to {projectTitle}",
+ "label.heres_your_unique_referral": "Earn GIV when someone donates to any verified project through your referral.",
+ "label.here_is_your_link": "Here's your link",
+ "label.how_does_this_work": "How does this work?",
+ "label.how_it_works?": "How it works?",
+ "label.how_referrals_work": "How referrals work",
+ "label.if_you_hold_a_giver": "If you hold a Giver, you can set it as your profile picture on the Giveth.io DApp. With your Giver equipped, whatever you do on on Giveth, boosting with GIVpower, donating or owning a project, you will be shown prominently on the platform along with your unique Giver NFT badge.",
+ "label.keep_an_eye_on_the_projects_page": "Keep an eye on the projects page, its position in the default sort will change within 5 minutes or less.",
+ "label.learn_more_about": "Learn more about the benefits.",
+ "label.loading": "Loading",
+ "label.look_for_the_share_and_get_rewarded": "Look for the 'Share & get rewarded' button to generate links to specific pages across the Giveth site.",
+ "label.manage_addresses": "Manage addresses",
+ "label.matching": "Matching",
+ "label.n/a": "N/A",
+ "label.name": "name",
+ "label.new_update": "NEW UPDATE",
+ "label.no": "No",
+ "label.note": "Note:",
+ "label.no_active_qf_round": "There is no active round!",
+ "label.ofـyourـdonationـvalue": " of your donation value!",
+ "label.oh_no": "Oh no!",
+ "label.on_gnosis_and": "on Gnosis Chain and on top of that, 80% of the registration fees go to the Giveth Matching Pool!",
+ "label.passport.eligible": "Your donations are eligible to be matched!",
+ "label.passport.ended": "This round has ended. Thank you for your support.",
+ "label.passport.error": "An error occurred while loading your Gitcoin Passport. Please try again later.",
+ "label.passport.invalid": "Passport Profile not detected. Please open Passport to troubleshoot.",
+ "label.passport.link.go_to_passport": "Go to Passport",
+ "label.passport.loading": "Loading Passport...",
+ "label.passport.not_connected": "Connect your wallet to verify your eligibility for donation matching.",
+ "label.passport.not_created": "Get your donation matched with quadratic funding! Verify your Gitcoin Passport before ",
+ "label.passport.not_eligible": "Get your donation matched with quadratic funding! Increase your Gitcoin Passport score before ",
+ "label.passport.not_signed": "Sign the message with your wallet to connect to Passport",
+ "label.passport.no_active_round": "There is no active round!",
+ "label.passport_score": "Passport Score",
+ "label.please_connect_your_wallet": "Please connect your wallet",
+ "label.project_status": "Project status",
+ "label.qf_no_donations": "There have been no donations in this round.",
+ "label.qf_round_projects": "QF round's projects",
+ "label.raised_from": "Raised from ",
+ "label.read_more_on_our_docs": "Read more on our docs",
+ "label.receiving_address_on": "Receiving address on {chainName}",
+ "label.recipient_addresses": "recipient addresses",
+ "label.refer_your_friends": "Refer your friends",
+ "label.refer_your_friends_and_earn_giv": "Refer your friends and earn GIV when they donate",
+ "label.refresh_score": "Refresh score",
+ "label.register_your": "Register your",
+ "label.required_score": "Required score",
+ "label.round_ends_in": "Round ends in",
+ "label.round_starts_in": "Round starts in",
+ "label.save_on_gas_fees": "Save on gas fees, switch network.",
+ "label.say_hello_to": "Say Hello to...",
+ "label.share_and_earn_rewards": "Share and earn rewards",
+ "label.share_and_get_rewarded": "Share & get rewarded",
+ "label.share_on_facebook": "Share on Facebook",
+ "label.share_on_linkedin": "Share on LinkedIn",
+ "label.share_on_social_media": "Share on social media",
+ "label.share_on_twitter_linkedin_or_facebook": "Share on Twitter, LinkedIn or Facebook, or copy your link to share anywhere!",
+ "label.share_this_page_with_your_friends": "Share this page with your friends, and get rewarded when they donate to verified projects!",
+ "label.share_your_referral_link_with_your_friends": "Share your referral link with your friends, family, and community.",
+ "label.share_your_unique_link_to_get_started": " Share your unique link to get started:",
+ "label.show_your_support": "Show your support for the Future of Giving and unlock your unique Giveth flair by minting one of the first NFT PFP artworks inspired by Giveth.",
+ "label.sign_message": "Sign Message",
+ "label.stake": "Stake",
+ "label.start_referring!": "Start Referring!",
+ "label.streaming": "Streaming",
+ "label.support_upcoming_qf_round": "Support upcoming rounds and donate the matching pool.",
+ "label.switch_to_archive_cards": "Switch to Archive Cards",
+ "label.take_control_online_identity": "Taking control of your online identity and your decentralized credentials",
+ "label.thank_you_for_supporting_project": "Thank you for supporting {title}. Your contribution goes a long way!",
+ "label.thank_you_for_supporting_project_and_giveth": "Thank you for supporting {title} and thanks for your donation to the Giveth DAO! You can check out the Giveth DAO project",
+ "label.there_are_no_projects_matching_your_search": "There are no projects matching your search",
+ "label.the_givers_are": "The Givers are a limited collection of 1,250 artworks inspired by the Giveth Galaxy. Each NFT tells a unique story of Giveth, in its own fun and vibrant style.",
+ "label.the_rank_will_be_updated_on": "The rank will be updated on",
+ "label.this_stream_has_ended": "This stream has ended",
+ "label.total_amount_raised": "Total amount raised",
+ "label.try_removing_some_filters_keyword": "Try removing some filters or using another keyword.",
+ "label.tutorial": "tutorial",
+ "label.tx": "Tx",
+ "label.unlock_your": "Unlock your Giveth Flair.",
+ "label.use_as_profile_picture": "Use as profile picture",
+ "label.view_on_block_explorer": "View on block explorer",
+ "label.we_ran_into_an_issue_and_couldnt_generate_your_referral": "We ran into an issue and couldn’t generate your referral ID. Please try again.",
+ "label.when_someone_donates_using_your_link": "When someone donates to a verified project via your link, you’ll earn GIV!",
+ "label.wrong_network": "You are currently connected to {chainName} switch to {targetChain} to interact with this farm.",
+ "label.youre_eligible_for_givbacks": "You're eligible for GIVbacks!",
+ "label.youre_giver_now": "You're a giver now!",
+ "label.your_giv_rewards_become_claimable": "Your GIV rewards become claimable within two weeks from our GIVbacks page.",
+ "label.your_passport_score": "Your Passport score",
+ "label.your_transactions_have_been_submitted": "Your transactions have been submitted",
+ "label.you_can_view_them_on_a_blockchain_explorer_here": "You can view them on a blockchain explorer here:",
+ "other": "Other",
+ "other_desc": " ",
+ "page.donate.matching_toast.bottom": "Matching funds will be sent to the selected project after the round ends.",
+ "page.donate.matching_toast.upper": "Estimated matching",
+ "page.donate.passport_toast.description.eligible": "Your donation is eligible to be matched! After the",
+ "page.donate.passport_toast.description.eligible_2": ", all donations will be reviewed for fraud protection and matching funds will be sent to the projects. Stay tuned for notifications :)",
+ "page.donate.passport_toast.description.non_eligible": "Get your donation matched with quadratic funding!\nIncrease your Gitcoin Passport score before",
+ "page.donate.passport_toast.description.not_connected": "Get your donation matched with quadratic funding!\nVerify your Gitcoin Passport before",
+ "page.donate.passport_toast.title.eligible": "Quadratic Funding",
+ "page.donate.passport_toast.title.non_eligible": "Don’t miss out on matching!",
+ "page.passport.step1": "1. Create a Gitcoin Passport if you don’t have one already. You will be taken to a new window to begin verifying your identity.",
+ "page.passport.step2": "2. Verify your identity by collecting various stamps.",
+ "page.passport.step3": "3. Return back to this screen and Refresh your score.",
+ "page.project.preview_hint": "This is a preview of your project.",
+ "project.givback_toast.description.non_verified_owner": "Can you prove that your project is providing a public good? Getting verified gives you access to a wealth of benefits like donor rewards, increased visibility and extra ways to get raise funds!",
+ "project.givback_toast.description.non_verified_public": "GIVbacks are currently only awarded for donations made to verified projects. Your contribution still matters, even if it doesn't generate GIVbacks!",
+ "project.givback_toast.description.verified_owner": "Boost your project to increase its rewards percentage and make it more visible on the projects page!",
+ "project.givback_toast.description.verified_owner.note": "As the owner of this project, you won’t get GIV for donating to it.",
+ "project.givback_toast.description.verified_public": "Donors to verified projects are rewarded with GIV. Boost this project to increase its rewards percentage and make it more visible on the projects page!",
+ "project.givback_toast.title.non_verified_owner": "Take your project to the next level with Verification!",
+ "project.givback_toast.title.non_verified_public": "Why no GIVbacks?",
+ "project.givback_toast.title.verified_owner_1": "Donors get rewarded with up to ",
+ "project.givback_toast.title.verified_owner_2": " of the donation value!",
+ "project.givback_toast.title.verified_public_1": "Get rewarded with up to ",
+ "project.givback_toast.title.verified_public_2": " of your donation value!",
+ "refi": "Refi",
+ "testfilter": "testfilter",
+ "tooltip.donation.matching": "This estimation is based on the donations made so far this quadratic funding round and is not considering fraud analysis. Actual matching amount vary."
+}
\ No newline at end of file
diff --git a/lang/nt_es.json b/lang/nt_es.json
new file mode 100644
index 0000000000..9c83d78ec0
--- /dev/null
+++ b/lang/nt_es.json
@@ -0,0 +1,145 @@
+{
+ "component.archive_cover.archived": "ARCHIVED",
+ "component.donation_section.100_to_the_project": "100% goes to the project.",
+ "component.donation_section.desc": "Every donation is peer-to-peer, with no fees and no middlemen.",
+ "component.donation_section.learn_zero_fee": "Learn about our zero-fee policy",
+ "component.passport_card.desc": "Verify your Gitcoin Passport to prove your donor uniqueness and ensure your donations get matched in quadratic funding rounds.",
+ "component.project-stats.listing.tooltip": "If a project is listed, it is included on the Projects page, and can be found using our search and filter functions. Unlisted projects can only be found via direct link.",
+ "component.project-stats.status.tooltip": "Projects status refers to if the project is active and raising funds, deactivated, canceled or in draft phase.",
+ "component.project-stats.verification.tooltip": "Verified projects have been reviewed by our team and found to be providing a public good, with a history of impact and reputation at stake.",
+ "component.qf-section.tooltip": "This estimation is the matching funds that this project would get if the round ended now, disregarding fraud analysis.",
+ "component.qf_middle_banner.desc": "Amplify your impact on verified projects! Donate on any of our 5 supported networks, earn rewards, and get your donations matched with the power of quadratic funding.",
+ "component.qf_middle_banner.title": "Giveth Alpha Round",
+ "component.regenstream_card.harvest_caption": "Use the Harvest button to claim liquid rewards from this RegenStream",
+ "component.title.commons_stack": "Commons Stack",
+ "component.title.faq": "FAQ",
+ "component.title.giveth_trace": "Giveth Trace",
+ "desci": "Desci",
+ "general": "General",
+ "giveconomy": "GIVeconomy",
+ "giveth": "Giveth",
+ "label.add_new_address": "Add new address",
+ "label.all_donations": "All Donations",
+ "label.all_time_donations_received": "All time donations received",
+ "label.already_a_giver": "Already own a Giver?",
+ "label.always": "Always",
+ "label.amount_raised": "Amount raised",
+ "label.amount_raised_in_this_round": "Amount raised in this round",
+ "label.amplify_your_donation": "Amplify your donation",
+ "label.amplify_your_donation_desc": "Unlock matching for your donation by verifying your identity! Connect your wallet to Gitcoin Passport to check your identity score and maximize your donation power. Passport is designed to proactively verify users' identities to protect against Sybil attacks.",
+ "label.anonymous": "Anonymous",
+ "label.be_the_first_booster": "Be the first one to boost this project with GIVpower.",
+ "label.connect_passport": "Conenct Passport",
+ "label.contribution": "Contribution",
+ "label.contributors": "{count, plural, one { contributor} other { contributors} }",
+ "label.current_givpower": "current GIVpower",
+ "label.docs": "docs",
+ "label.domain_name_at": "domain name at a 50% discount, thanks to Punk Domains. Reserve your name (e.g.",
+ "label.donate_first_lead_the_way": "Donate first & lead the way!",
+ "label.donors_to_verified": "Donors to verified projects are rewarded with GIV. Boost this project to increase its rewards % and make it more visible on the projects page!",
+ "label.eligible_for_matching": "Eligible for Matching",
+ "label.ends_on": "ends on",
+ "label.estimated_matching": "Estimated matching",
+ "label.expected_rank_for_next_round": "This is the expected rank for the next round based on",
+ "label.get_rewarded_with": "Get rewarded with up to ",
+ "label.get_your_giveth_name": "Get your Giveth Name.",
+ "label.gitcoin_passport": "Gitcoin Passport",
+ "label.givback_distributed_afer_round": "GIV rewards from the GIVbacks program will be distributed after the end of the current round.",
+ "label.giveconomy": "GIVeconomy",
+ "label.givers_pfp_holders": "Givers PFP Holders will be able to claim their own unique ",
+ "label.givpower": "GIVpower",
+ "label.how_it_works?": "How it works?",
+ "label.if_you_hold_a_giver": "If you hold a Giver, you can set it as your profile picture on the Giveth.io DApp. With your Giver equipped, whatever you do on on Giveth, boosting with GIVpower, donating or owning a project, you will be shown prominently on the platform along with your unique Giver NFT badge.",
+ "label.keep_an_eye_on_the_projects_page": "Keep an eye on the projects page, its position in the default sort will change within 5 minutes or less.",
+ "label.learn_more_about": "Learn more about the benefits.",
+ "label.loading": "Loading",
+ "label.manage_addresses": "Manage addresses",
+ "label.matching": "Matching",
+ "label.max": "Max",
+ "label.n/a": "N/A",
+ "label.name": "name",
+ "label.new_update": "NEW UPDATE",
+ "label.no": "No",
+ "label.note": "Note:",
+ "label.no_active_qf_round": "There is no active round!",
+ "label.ofـyourـdonationـvalue": " of your donation value!",
+ "label.oh_no": "Oh no!",
+ "label.on_gnosis_and": "on Gnosis Chain and on top of that, 80% of the registration fees go to the Giveth Matching Pool!",
+ "label.passport.eligible": "Your donations are eligible to be matched!",
+ "label.passport.ended": "This round has ended. Thank you for your support.",
+ "label.passport.error": "An error occurred while loading your Gitcoin Passport. Please try again later.",
+ "label.passport.invalid": "Passport Profile not detected. Please open Passport to troubleshoot.",
+ "label.passport.link.go_to_passport": "Go to Passport",
+ "label.passport.loading": "Loading Passport...",
+ "label.passport.not_connected": "Connect your wallet to verify your eligibility for donation matching.",
+ "label.passport.not_created": "Get your donation matched with quadratic funding! Verify your Gitcoin Passport before ",
+ "label.passport.not_eligible": "Get your donation matched with quadratic funding! Increase your Gitcoin Passport score before ",
+ "label.passport.not_signed": "Sign the message with your wallet to connect to Passport",
+ "label.passport.no_active_round": "There is no active round!",
+ "label.passport_score": "Passport Score",
+ "label.please_connect_your_wallet": "Please connect your wallet",
+ "label.project_status": "Project status",
+ "label.qf_no_donations": "There have been no donations in this round.",
+ "label.qf_round_projects": "QF round's projects",
+ "label.raised_from": "Raised from ",
+ "label.recipient_addresses": "recipient addresses",
+ "label.refresh_score": "Refresh score",
+ "label.register_your": "Register your",
+ "label.required_score": "Required score",
+ "label.round_ends_in": "Round ends in",
+ "label.round_starts_in": "Round starts in",
+ "label.save_on_gas_fees": "Save on gas fees, switch network.",
+ "label.say_hello_to": "Say Hello to...",
+ "label.stake_giv": "Stake GIV",
+ "label.support_upcoming_qf_round": "Support upcoming rounds and donate the matching pool.",
+ "label.switch_to_archive_cards": "Switch to Archive Cards",
+ "label.take_control_online_identity": "Taking control of your online identity and your decentralized credentials",
+ "label.thank_you_for_supporting_project": "Thank you for supporting {title}. Your contribution goes a long way!",
+ "label.thank_you_for_supporting_project_and_giveth": "Thank you for supporting {title} and thanks for your donation to the Giveth DAO! You can check out the Giveth DAO project",
+ "label.there_are_no_projects_matching_your_search": "There are no projects matching your search",
+ "label.the_givers_are": "The Givers are a limited collection of 1,250 artworks inspired by the Giveth Galaxy. Each NFT tells a unique story of Giveth, in its own fun and vibrant style.",
+ "label.the_rank_will_be_updated_on": "The rank will be updated on",
+ "label.this_stream_has_ended": "This stream has ended",
+ "label.total_amount_raised": "Total amount raised",
+ "label.try_removing_some_filters_keyword": "Try removing some filters or using another keyword.",
+ "label.tutorial": "tutorial",
+ "label.tx": "Tx",
+ "label.uh_oh": "Uh Oh !",
+ "label.unlock_your": "Unlock your Giveth Flair.",
+ "label.use_as_profile_picture": "Use as profile picture",
+ "label.view_on_block_explorer": "View on block explorer",
+ "label.wrong_network": "You are currently connected to {chainName} switch to {targetChain} to interact with this farm.",
+ "label.youre_eligible_for_givbacks": "You're eligible for GIVbacks!",
+ "label.youre_giver_now": "You're a giver now!",
+ "label.your_passport_score": "Your Passport score",
+ "label.your_transactions_have_been_submitted": "Your transactions have been submitted",
+ "label.you_can_view_them_on_a_blockchain_explorer_here": "You can view them on a blockchain explorer here:",
+ "other_desc": " ",
+ "page.donate.matching_toast.bottom": "Matching funds will be sent to the selected project after the round ends.",
+ "page.donate.matching_toast.upper": "Estimated matching",
+ "page.donate.passport_toast.description.eligible": "Your donation is eligible to be matched! After the",
+ "page.donate.passport_toast.description.eligible_2": ", all donations will be reviewed for fraud protection and matching funds will be sent to the projects. Stay tuned for notifications :)",
+ "page.donate.passport_toast.description.non_eligible": "Get your donation matched with quadratic funding!\nIncrease your Gitcoin Passport score before",
+ "page.donate.passport_toast.description.not_connected": "Get your donation matched with quadratic funding!\nVerify your Gitcoin Passport before",
+ "page.donate.passport_toast.title.eligible": "Quadratic Funding",
+ "page.donate.passport_toast.title.non_eligible": "Don’t miss out on matching!",
+ "page.passport.step1": "1. Create a Gitcoin Passport if you don’t have one already. You will be taken to a new window to begin verifying your identity.",
+ "page.passport.step2": "2. Verify your identity by collecting various stamps.",
+ "page.passport.step3": "3. Return back to this screen and Refresh your score.",
+ "page.project.preview_hint": "This is a preview of your project.",
+ "project.givback_toast.description.non_verified_owner": "Can you prove that your project is providing a public good? Getting verified gives you access to a wealth of benefits like donor rewards, increased visibility and extra ways to get raise funds!",
+ "project.givback_toast.description.non_verified_public": "GIVbacks are currently only awarded for donations made to verified projects. Your contribution still matters, even if it doesn't generate GIVbacks!",
+ "project.givback_toast.description.verified_owner": "Boost your project to increase its rewards percentage and make it more visible on the projects page!",
+ "project.givback_toast.description.verified_owner.note": "As the owner of this project, you won’t get GIV for donating to it.",
+ "project.givback_toast.description.verified_public": "Donors to verified projects are rewarded with GIV. Boost this project to increase its rewards percentage and make it more visible on the projects page!",
+ "project.givback_toast.title.non_verified_owner": "Take your project to the next level with Verification!",
+ "project.givback_toast.title.non_verified_public": "Why no GIVbacks?",
+ "project.givback_toast.title.verified_owner_1": "Donors get rewarded with up to ",
+ "project.givback_toast.title.verified_owner_2": " of the donation value!",
+ "project.givback_toast.title.verified_public_1": "Get rewarded with up to ",
+ "project.givback_toast.title.verified_public_2": " of your donation value!",
+ "refi": "Refi",
+ "testfilter": "testfilter",
+ "tooltip.donation.matching": "This estimation is based on the donations made so far this quadratic funding round and is not considering fraud analysis. Actual matching amount vary.",
+ "ubi": "UBI"
+}
\ No newline at end of file
diff --git a/lang/t_ca.json b/lang/t_ca.json
new file mode 100644
index 0000000000..924736f081
--- /dev/null
+++ b/lang/t_ca.json
@@ -0,0 +1,178 @@
+{
+ "animals": "Animals",
+ "art": "Art",
+ "component.archive_cover.archived": "ARXIVAT",
+ "component.donation_section.100_to_the_project": "El 100% va al projecte.",
+ "component.donation_section.desc": "Cada donació és de persona a persona, sense comissions ni intermediaris.",
+ "component.donation_section.learn_zero_fee": "Apreneu sobre la nostra política de zero comissions",
+ "component.passport_card.desc": "Verifiqueu el vostre Passaport Gitcoin per demostrar la vostra singularitat com a donant i assegureu-vos que les vostres donacions es coincideixin en les rondes de finançament quadràtic.",
+ "component.project-stats.listing.tooltip": "Si un projecte està llistat, està inclòs a la pàgina de Projectes i es pot trobar utilitzant les nostres funcions de cerca i filtre. Els projectes no llistats només es poden trobar a través d'un enllaç directe.",
+ "component.project-stats.status.tooltip": "L'estat dels projectes es refereix a si el projecte està actiu i recaptant fons, desactivat, cancel·lat o en fase d'esborrany.",
+ "component.project-stats.verification.tooltip": "Els projectes verificats han estat revisats pel nostre equip i s'ha comprovat que proporcionen un bé públic, amb una història d'impacte i reputació en joc.",
+ "component.qf-section.tooltip": "Aquesta estimació són els fons de coincidència que aquest projecte obtindria si la ronda acabés ara, sense tenir en compte l'anàlisi de frau.",
+ "component.qf_middle_banner.desc": "Amplieu el vostre impacte en projectes verificats! Doneu en qualsevol de les nostres 5 xarxes suportades, guanyeu recompenses i feu que les vostres donacions coincideixin amb el poder del finançament quadràtic.",
+ "component.qf_middle_banner.title": "Ronda Alpha de Giveth",
+ "component.regenstream_card.harvest_caption": "Utilitzeu el botó de Collita per reclamar recompenses líquides d'aquest RegenStream",
+ "component.title.commons_stack": "Commons Stack",
+ "component.title.giveth_trace": "Giveth Trace",
+ "desci": "Desci",
+ "general": "General",
+ "giveconomy": "GIVeconomia",
+ "giveth": "Giveth",
+ "label.add_new_address": "Afegir una nova adreça",
+ "label.all_donations": "Totes les donacions",
+ "label.all_time_donations_received": "Donacions rebudes de tots els temps",
+ "label.already_a_giver": "Ja tens un Giver?",
+ "label.always": "Sempre",
+ "label.amount_raised": "Quantitat recaptada",
+ "label.amount_raised_in_this_round": "Quantitat recaptada en aquesta ronda",
+ "label.amplify_your_donation": "Amplieu la vostra donació",
+ "label.amplify_your_donation_desc": "Desbloquegeu la coincidència per a la vostra donació verificant la vostra identitat! Connecteu la vostra cartera a Gitcoin Passport per comprovar la vostra puntuació d'identitat i maximitzar el poder de la vostra donació. Passport està dissenyat per verificar proactivament les identitats dels usuaris per protegir-se contra els atacs Sybil.",
+ "label.anonymous": "Anònim",
+ "label.an_equivalent_of_up_to_40%": "Un equivalent de fins al 40% de l'import de la donació en tokens GIV!",
+ "label.be_the_first_booster": "Sigues el primer a impulsar aquest projecte amb GIVpower.",
+ "label.connect_passport": "Connecta el Passaport",
+ "label.connect_your_wallet_and_generate_your_link": "Connecta la teva cartera i genera el teu enllaç de referència únic.",
+ "label.connect_your_wallet_and_get_your_link": "Connecta la teva cartera i obtén el teu enllaç únic per compartir a les xarxes socials i als teus canals de comunitat preferits.",
+ "label.connet_your_wallet_and_sign_in_to_get_your_referral": "Connecta la teva cartera i inicia sessió per obtenir el teu enllaç de referència i comença a guanyar.",
+ "label.contribution": "Contribució",
+ "label.contributors": "{count, plural, one { col·laborador} other { col·laboradors} }",
+ "label.create_referrral_id_again": "Crea de nou l'ID de referència",
+ "label.current_givpower": "GIVpower actual",
+ "label.docs": "docs",
+ "label.domain_name_at": "nom de domini amb un 50% de descompte, gràcies a Punk Domains. Reserva el teu nom (p. ex.",
+ "label.donate_first_lead_the_way": "Doneu primer i lidereu el camí!",
+ "label.donation_received": "Donació rebuda",
+ "label.donors_to_verified": "Els donants de projectes verificats són recompensats amb GIV. Impulsa aquest projecte per augmentar el seu percentatge de recompenses i fer-lo més visible a la pàgina de projectes!",
+ "label.duration_ago": "fa {duration}",
+ "label.eligible_for_matching": "Elegible per a la coincidència",
+ "label.ends_on": "acaba el",
+ "label.estimated_matching": "Coincidència estimada",
+ "label.expected_rank_for_next_round": "Aquesta és la posició esperada per a la pròxima ronda basada en",
+ "label.get_rewarded_with": "Obtén recompenses de fins a ",
+ "label.get_your_giveth_name": "Obtén el teu nom de Giveth.",
+ "label.gitcoin_passport": "Passaport Gitcoin",
+ "label.givbacks": "GIVbacks",
+ "label.givback_distributed_afer_round": "Les recompenses GIV del programa GIVbacks es distribuiran després de la fi de la ronda actual.",
+ "label.giveconomy": "GIVeconomia",
+ "label.givers_pfp_holders": "Els titulars de Givers PFP podran reclamar el seu propi únic ",
+ "label.givpower": "GIVpower",
+ "label.heres_your_referral": "Aquí tens el teu enllaç de referència únic per a {projectTitle}",
+ "label.heres_your_unique_referral": "Guanya GIV quan algú fa una donació a qualsevol projecte verificat a través de la teva referència.",
+ "label.here_is_your_link": "Aquí tens el teu enllaç",
+ "label.how_does_this_work": "Com funciona això?",
+ "label.how_it_works?": "Com funciona?",
+ "label.how_referrals_work": "Com funcionen les referències",
+ "label.if_you_hold_a_giver": "Si tens un Giver, pots establir-lo com a foto de perfil a la DApp de Giveth. Amb el teu Giver equipat, el que facis a Giveth, impulsant amb GIVpower, donant o posseint un projecte, es mostrarà prominentment a la plataforma juntament amb la teva insígnia única de Giver NFT.",
+ "label.keep_an_eye_on_the_projects_page": "Mantingueu un ull a la pàgina de projectes, la seva posició en l'ordenació per defecte canviarà en 5 minuts o menys.",
+ "label.learn_more_about": "Apreneu més sobre els beneficis.",
+ "label.loading": "Carregant",
+ "label.look_for_the_share_and_get_rewarded": "Busqueu el botó 'Comparteix i guanya recompenses' per generar enllaços a pàgines específiques de tot el lloc de Giveth.",
+ "label.manage_addresses": "Gestiona les adreces",
+ "label.matching": "Coincidència",
+ "label.n/a": "N/A",
+ "label.name": "nom",
+ "label.new_update": "NOVA ACTUALITZACIÓ",
+ "label.no": "No",
+ "label.note": "Nota:",
+ "label.no_active_qf_round": "No hi ha cap ronda activa!",
+ "label.ofـyourـdonationـvalue": " del valor de la teva donació!",
+ "label.oh_no": "Oh no!",
+ "label.on_gnosis_and": "a Gnosis Chain i a més a més, el 80% de les taxes de registre van al Pool de Coincidència de Giveth!",
+ "label.passport.eligible": "Les teves donacions són elegibles per ser coincidides!",
+ "label.passport.ended": "Aquesta ronda ha acabat. Gràcies pel teu suport.",
+ "label.passport.error": "S'ha produït un error en carregar el teu Passaport Gitcoin. Si us plau, torna-ho a intentar més tard.",
+ "label.passport.invalid": "Perfil de Passaport no detectat. Si us plau, obre Passaport per solucionar-ho.",
+ "label.passport.link.go_to_passport": "Vés a Passaport",
+ "label.passport.loading": "Carregant Passaport...",
+ "label.passport.not_connected": "Connecta la teva cartera per verificar la teva elegibilitat per a la coincidència de donacions.",
+ "label.passport.not_created": "Fes que la teva donació coincideixi amb el finançament quadràtic! Verifica el teu Passaport Gitcoin abans ",
+ "label.passport.not_eligible": "Fes que la teva donació coincideixi amb el finançament quadràtic! Augmenta la teva puntuació de Passaport Gitcoin abans ",
+ "label.passport.not_signed": "Signa el missatge amb la teva cartera per connectar-te a Passaport",
+ "label.passport.no_active_round": "No hi ha cap ronda activa!",
+ "label.passport_score": "Puntuació de Passaport",
+ "label.please_connect_your_wallet": "Si us plau, connecta la teva cartera",
+ "label.project_status": "Estat del projecte",
+ "label.qf_no_donations": "No hi ha hagut cap donació en aquesta ronda.",
+ "label.qf_round_projects": "Projectes de la ronda QF",
+ "label.raised_from": "Recaptat de ",
+ "label.read_more_on_our_docs": "Llegeix més en els nostres docs",
+ "label.receiving_address_on": "Adreça de recepció a {chainName}",
+ "label.recipient_addresses": "adreces del destinatari",
+ "label.refer_your_friends": "Referiu els vostres amics",
+ "label.refer_your_friends_and_earn_giv": "Referiu els vostres amics i guanyeu GIV quan donen",
+ "label.refresh_score": "Actualitza la puntuació",
+ "label.register_your": "Registra el teu",
+ "label.required_score": "Puntuació requerida",
+ "label.round_ends_in": "La ronda acaba en",
+ "label.round_starts_in": "La ronda comença en",
+ "label.save_on_gas_fees": "Estalvia en comissions de gas, canvia de xarxa.",
+ "label.say_hello_to": "Digues hola a...",
+ "label.share_and_earn_rewards": "Comparteix i guanya recompenses",
+ "label.share_and_get_rewarded": "Comparteix i guanya recompenses",
+ "label.share_on_facebook": "Comparteix a Facebook",
+ "label.share_on_linkedin": "Comparteix a LinkedIn",
+ "label.share_on_social_media": "Comparteix a les xarxes socials",
+ "label.share_on_twitter_linkedin_or_facebook": "Comparteix a Twitter, LinkedIn o Facebook, o copia el teu enllaç per compartir-lo a qualsevol lloc!",
+ "label.share_this_page_with_your_friends": "Comparteix aquesta pàgina amb els teus amics, i guanya recompenses quan donen a projectes verificats!",
+ "label.share_your_referral_link_with_your_friends": "Comparteix el teu enllaç de referència amb els teus amics, família i comunitat.",
+ "label.share_your_unique_link_to_get_started": " Comparteix el teu enllaç únic per començar:",
+ "label.show_your_support": "Mostra el teu suport al Futur de la Donació i desbloqueja el teu flair únic de Giveth acunyant una de les primeres obres d'art NFT PFP inspirades en Giveth.",
+ "label.sign_message": "Signa el missatge",
+ "label.stake": "Aposta",
+ "label.start_referring!": "Comença a referir!",
+ "label.streaming": "Streaming",
+ "label.support_upcoming_qf_round": "Suporta les properes rondes i dona al pool de coincidència.",
+ "label.switch_to_archive_cards": "Canvia a les targetes d'arxiu",
+ "label.take_control_online_identity": "Pren el control de la teva identitat en línia i les teves credencials descentralitzades",
+ "label.thank_you_for_supporting_project": "Gràcies per donar suport a {title}. La teva contribució té un gran impacte!",
+ "label.thank_you_for_supporting_project_and_giveth": "Gràcies per donar suport a {title} i gràcies per la teva donació a la DAO de Giveth! Pots consultar el projecte de la DAO de Giveth",
+ "label.there_are_no_projects_matching_your_search": "No hi ha cap projecte que coincideixi amb la teva cerca",
+ "label.the_givers_are": "Els Givers són una col·lecció limitada de 1.250 obres d'art inspirades en la Galàxia de Giveth. Cada NFT explica una història única de Giveth, en el seu propi estil divertit i vibrant.",
+ "label.the_rank_will_be_updated_on": "El rang s'actualitzarà el",
+ "label.this_stream_has_ended": "Aquest stream ha acabat",
+ "label.total_amount_raised": "Quantitat total recaptada",
+ "label.try_removing_some_filters_keyword": "Prova a eliminar alguns filtres o a utilitzar una altra paraula clau.",
+ "label.tutorial": "tutorial",
+ "label.tx": "Tx",
+ "label.unlock_your": "Desbloqueja el teu Giveth Flair.",
+ "label.use_as_profile_picture": "Utilitza com a foto de perfil",
+ "label.view_on_block_explorer": "Veure a l'explorador de blocs",
+ "label.we_ran_into_an_issue_and_couldnt_generate_your_referral": "Hem tingut un problema i no hem pogut generar el teu ID de referència. Si us plau, torna-ho a intentar.",
+ "label.when_someone_donates_using_your_link": "Quan algú fa una donació a un projecte verificat a través del teu enllaç, guanyaràs GIV!",
+ "label.wrong_network": "Actualment estàs connectat a {chainName} canvia a {targetChain} per interactuar amb aquesta granja.",
+ "label.youre_eligible_for_givbacks": "Ets elegible per a GIVbacks!",
+ "label.youre_giver_now": "Ara ets un donant!",
+ "label.your_giv_rewards_become_claimable": "Les teves recompenses GIV es poden reclamar dins de dues setmanes des de la nostra pàgina de GIVbacks.",
+ "label.your_passport_score": "La teva puntuació de Passaport",
+ "label.your_transactions_have_been_submitted": "Les teves transaccions s'han enviat",
+ "label.you_can_view_them_on_a_blockchain_explorer_here": "Pots veure-les en un explorador de blocs aquí:",
+ "other": "Altres",
+ "other_desc": " ",
+ "page.donate.matching_toast.bottom": "Els fons de coincidència es enviaran al projecte seleccionat quan acabi la ronda.",
+ "page.donate.matching_toast.upper": "Coincidència estimada",
+ "page.donate.passport_toast.description.eligible": "La teva donació és elegible per ser coincidida! Després de la",
+ "page.donate.passport_toast.description.eligible_2": ", totes les donacions seran revisades per a la protecció contra el frau i els fons de coincidència es enviaran als projectes. Estigueu atents a les notificacions :)",
+ "page.donate.passport_toast.description.non_eligible": "Fes que la teva donació coincideixi amb el finançament quadràtic!\nAugmenta la teva puntuació de Passaport Gitcoin abans",
+ "page.donate.passport_toast.description.not_connected": "Fes que la teva donació coincideixi amb el finançament quadràtic!\nVerifica el teu Passaport Gitcoin abans",
+ "page.donate.passport_toast.title.eligible": "Finançament Quadràtic",
+ "page.donate.passport_toast.title.non_eligible": "No et perdis la coincidència!",
+ "page.passport.step1": "1. Crea un Passaport Gitcoin si encara no en tens un. Se t'obrirà una nova finestra per començar a verificar la teva identitat.",
+ "page.passport.step2": "2. Verifica la teva identitat recollint diversos segells.",
+ "page.passport.step3": "3. Torna a aquesta pantalla i actualitza la teva puntuació.",
+ "page.project.preview_hint": "Aquesta és una previsualització del teu projecte.",
+ "project.givback_toast.description.non_verified_owner": "Pots demostrar que el teu projecte està proporcionant un bé públic? La verificació et dóna accés a una gran quantitat de beneficis com recompenses per a donants, major visibilitat i formes addicionals d'obtenir fons!",
+ "project.givback_toast.description.non_verified_public": "Actualment, els GIVbacks només es concedeixen per donacions fetes a projectes verificats. La teva contribució encara és important, encara que no generi GIVbacks!",
+ "project.givback_toast.description.verified_owner": "Impulsa el teu projecte per augmentar el seu percentatge de recompenses i fer-lo més visible a la pàgina de projectes!",
+ "project.givback_toast.description.verified_owner.note": "Com a propietari d'aquest projecte, no obtindràs GIV per donar-hi.",
+ "project.givback_toast.description.verified_public": "Els donants de projectes verificats són recompensats amb GIV. Impulsa aquest projecte per augmentar el seu percentatge de recompenses i fer-lo més visible a la pàgina de projectes!",
+ "project.givback_toast.title.non_verified_owner": "Porta el teu projecte al següent nivell amb la Verificació!",
+ "project.givback_toast.title.non_verified_public": "Per què no hi ha GIVbacks?",
+ "project.givback_toast.title.verified_owner_1": "Els donants són recompensats amb fins a ",
+ "project.givback_toast.title.verified_owner_2": " del valor de la donació!",
+ "project.givback_toast.title.verified_public_1": "Obtén recompenses amb fins a ",
+ "project.givback_toast.title.verified_public_2": " del valor de la teva donació!",
+ "refi": "Refi",
+ "testfilter": "testfilter",
+ "tooltip.donation.matching": "Aquesta estimació es basa en les donacions fetes fins ara aquesta ronda de finançament quadràtic i no està considerant l'anàlisi de frau. La quantitat real de coincidència pot variar."
+}
diff --git a/lang/t_es.json b/lang/t_es.json
new file mode 100644
index 0000000000..3037ab6f3e
--- /dev/null
+++ b/lang/t_es.json
@@ -0,0 +1,145 @@
+{
+ "component.archive_cover.archived": "ARCHIVADO",
+ "component.donation_section.100_to_the_project": "El 100% va al proyecto.",
+ "component.donation_section.desc": "Cada donación es de igual a igual, sin tarifas ni intermediarios.",
+ "component.donation_section.learn_zero_fee": "Aprenda sobre nuestra política de cero tarifas",
+ "component.passport_card.desc": "Verifica tu Pasaporte Gitcoin para probar la singularidad de tu donante y asegurarte de que tus donaciones sean igualadas en las rondas de financiación cuadrática.",
+ "component.project-stats.listing.tooltip": "Si un proyecto está listado, se incluye en la página de Proyectos y se puede encontrar utilizando nuestras funciones de búsqueda y filtro. Los proyectos no listados solo se pueden encontrar a través de un enlace directo.",
+ "component.project-stats.status.tooltip": "El estado de los proyectos se refiere a si el proyecto está activo y recaudando fondos, desactivado, cancelado o en fase de borrador.",
+ "component.project-stats.verification.tooltip": "Los proyectos verificados han sido revisados por nuestro equipo y se ha encontrado que proporcionan un bien público, con un historial de impacto y reputación en juego.",
+ "component.qf-section.tooltip": "Esta estimación son los fondos de igualación que este proyecto obtendría si la ronda terminara ahora, sin tener en cuenta el análisis de fraude.",
+ "component.qf_middle_banner.desc": "¡Amplifica tu impacto en proyectos verificados! Dona en cualquiera de nuestras 5 redes soportadas, gana recompensas y haz que tus donaciones sean igualadas con el poder de la financiación cuadrática.",
+ "component.qf_middle_banner.title": "Ronda Alfa de Giveth",
+ "component.regenstream_card.harvest_caption": "Usa el botón Cosechar para reclamar recompensas líquidas de este RegenStream",
+ "component.title.commons_stack": "Commons Stack",
+ "component.title.faq": "Preguntas Frecuentes",
+ "component.title.giveth_trace": "Rastro de Giveth",
+ "desci": "Desci",
+ "general": "General",
+ "giveconomy": "Economía de Giveth",
+ "giveth": "Giveth",
+ "label.add_new_address": "Añadir nueva dirección",
+ "label.all_donations": "Todas las Donaciones",
+ "label.all_time_donations_received": "Donaciones recibidas de todos los tiempos",
+ "label.already_a_giver": "¿Ya posees un Giver?",
+ "label.always": "Siempre",
+ "label.amount_raised": "Cantidad recaudada",
+ "label.amount_raised_in_this_round": "Cantidad recaudada en esta ronda",
+ "label.amplify_your_donation": "Amplifica tu donación",
+ "label.amplify_your_donation_desc": "¡Desbloquea la igualación para tu donación verificando tu identidad! Conecta tu cartera a Gitcoin Passport para verificar tu puntuación de identidad y maximizar el poder de tu donación. Passport está diseñado para verificar proactivamente las identidades de los usuarios para proteger contra los ataques Sybil.",
+ "label.anonymous": "Anónimo",
+ "label.be_the_first_booster": "Sé el primero en impulsar este proyecto con GIVpower.",
+ "label.connect_passport": "Conectar Pasaporte",
+ "label.contribution": "Contribución",
+ "label.contributors": "{count, plural, one { colaborador} other { colaboradores} }",
+ "label.current_givpower": "GIVpower actual",
+ "label.docs": "documentos",
+ "label.domain_name_at": "nombre de dominio con un 50% de descuento, gracias a Punk Domains. Reserva tu nombre (por ejemplo,",
+ "label.donate_first_lead_the_way": "¡Dona primero y lidera el camino!",
+ "label.donors_to_verified": "Los donantes a proyectos verificados son recompensados con GIV. ¡Impulsa este proyecto para aumentar su porcentaje de recompensas y hacerlo más visible en la página de proyectos!",
+ "label.eligible_for_matching": "Elegible para Igualación",
+ "label.ends_on": "termina el",
+ "label.estimated_matching": "Igualación estimada",
+ "label.expected_rank_for_next_round": "Este es el rango esperado para la próxima ronda basado en",
+ "label.get_rewarded_with": "Obtén recompensas de hasta ",
+ "label.get_your_giveth_name": "Obtén tu Nombre de Giveth.",
+ "label.gitcoin_passport": "Pasaporte de Gitcoin",
+ "label.givback_distributed_afer_round": "Las recompensas GIV del programa GIVbacks se distribuirán después del final de la ronda actual.",
+ "label.giveconomy": "Economía de Giveth",
+ "label.givers_pfp_holders": "Los titulares de Givers PFP podrán reclamar su propio ",
+ "label.givpower": "GIVpower",
+ "label.how_it_works?": "¿Cómo funciona?",
+ "label.if_you_hold_a_giver": "Si tienes un Giver, puedes establecerlo como tu foto de perfil en la DApp de Giveth.io. Con tu Giver equipado, lo que hagas en Giveth, impulsando con GIVpower, donando o poseyendo un proyecto, se mostrará de manera prominente en la plataforma junto con tu insignia única de Giver NFT.",
+ "label.keep_an_eye_on_the_projects_page": "Mantén un ojo en la página de proyectos, su posición en el orden predeterminado cambiará en 5 minutos o menos.",
+ "label.learn_more_about": "Aprende más sobre los beneficios.",
+ "label.loading": "Cargando",
+ "label.manage_addresses": "Gestionar direcciones",
+ "label.matching": "Igualación",
+ "label.max": "Máximo",
+ "label.n/a": "N/A",
+ "label.name": "nombre",
+ "label.new_update": "NUEVA ACTUALIZACIÓN",
+ "label.no": "No",
+ "label.note": "Nota:",
+ "label.no_active_qf_round": "¡No hay ronda activa!",
+ "label.ofـyourـdonationـvalue": " del valor de tu donación!",
+ "label.oh_no": "¡Oh no!",
+ "label.on_gnosis_and": "en Gnosis Chain y además, el 80% de las tarifas de registro van al Pool de Igualación de Giveth!",
+ "label.passport.eligible": "¡Tus donaciones son elegibles para ser igualadas!",
+ "label.passport.ended": "Esta ronda ha terminado. Gracias por tu apoyo.",
+ "label.passport.error": "Ocurrió un error al cargar tu Pasaporte Gitcoin. Por favor, inténtalo de nuevo más tarde.",
+ "label.passport.invalid": "Perfil de Pasaporte no detectado. Por favor, abre Passport para solucionar problemas.",
+ "label.passport.link.go_to_passport": "Ir a Passport",
+ "label.passport.loading": "Cargando Passport...",
+ "label.passport.not_connected": "Conecta tu cartera para verificar tu elegibilidad para la igualación de donaciones.",
+ "label.passport.not_created": "¡Haz que tu donación sea igualada con financiación cuadrática! Verifica tu Pasaporte Gitcoin antes ",
+ "label.passport.not_eligible": "¡Haz que tu donación sea igualada con financiación cuadrática! Aumenta tu puntuación de Pasaporte Gitcoin antes ",
+ "label.passport.not_signed": "Firma el mensaje con tu cartera para conectarte a Passport",
+ "label.passport.no_active_round": "¡No hay ronda activa!",
+ "label.passport_score": "Puntuación de Pasaporte",
+ "label.please_connect_your_wallet": "Por favor, conecta tu cartera",
+ "label.project_status": "Estado del proyecto",
+ "label.qf_no_donations": "No ha habido donaciones en esta ronda.",
+ "label.qf_round_projects": "Proyectos de la ronda QF",
+ "label.raised_from": "Recaudado de ",
+ "label.recipient_addresses": "direcciones de los destinatarios",
+ "label.refresh_score": "Actualizar puntuación",
+ "label.register_your": "Registra tu",
+ "label.required_score": "Puntuación requerida",
+ "label.round_ends_in": "La ronda termina en",
+ "label.round_starts_in": "La ronda comienza en",
+ "label.save_on_gas_fees": "Ahorra en tarifas de gas, cambia de red.",
+ "label.say_hello_to": "Di hola a...",
+ "label.stake_giv": "Apuesta GIV",
+ "label.support_upcoming_qf_round": "Apoya las próximas rondas y dona al pool de igualación.",
+ "label.switch_to_archive_cards": "Cambiar a Tarjetas de Archivo",
+ "label.take_control_online_identity": "Tomando control de tu identidad en línea y tus credenciales descentralizadas",
+ "label.thank_you_for_supporting_project": "Gracias por apoyar a {title}. ¡Tu contribución tiene un gran impacto!",
+ "label.thank_you_for_supporting_project_and_giveth": "Gracias por apoyar a {title} y gracias por tu donación a la DAO de Giveth! Puedes ver el proyecto de la DAO de Giveth",
+ "label.there_are_no_projects_matching_your_search": "No hay proyectos que coincidan con tu búsqueda",
+ "label.the_givers_are": "Los Givers son una colección limitada de 1,250 obras de arte inspiradas en la Galaxia Giveth. Cada NFT cuenta una historia única de Giveth, en su propio estilo divertido y vibrante.",
+ "label.the_rank_will_be_updated_on": "El rango se actualizará en",
+ "label.this_stream_has_ended": "Esta transmisión ha terminado",
+ "label.total_amount_raised": "Cantidad total recaudada",
+ "label.try_removing_some_filters_keyword": "Intenta eliminar algunos filtros o usar otra palabra clave.",
+ "label.tutorial": "tutorial",
+ "label.tx": "Tx",
+ "label.uh_oh": "¡Uh Oh!",
+ "label.unlock_your": "Desbloquea tu Flair de Giveth.",
+ "label.use_as_profile_picture": "Usar como foto de perfil",
+ "label.view_on_block_explorer": "Ver en el explorador de bloques",
+ "label.wrong_network": "Actualmente estás conectado a {chainName}, cambia a {targetChain} para interactuar con esta granja.",
+ "label.youre_eligible_for_givbacks": "¡Eres elegible para GIVbacks!",
+ "label.youre_giver_now": "¡Ahora eres un donante!",
+ "label.your_passport_score": "Tu puntuación de Pasaporte",
+ "label.your_transactions_have_been_submitted": "Tus transacciones han sido enviadas",
+ "label.you_can_view_them_on_a_blockchain_explorer_here": "Puedes verlas en un explorador de blockchain aquí:",
+ "other_desc": " ",
+ "page.donate.matching_toast.bottom": "Los fondos de igualación se enviarán al proyecto seleccionado después de que termine la ronda.",
+ "page.donate.matching_toast.upper": "Igualación estimada",
+ "page.donate.passport_toast.description.eligible": "¡Tu donación es elegible para ser igualada! Después de la",
+ "page.donate.passport_toast.description.eligible_2": ", todas las donaciones serán revisadas para la protección contra fraudes y los fondos de igualación serán enviados a los proyectos. Mantente atento a las notificaciones :)",
+ "page.donate.passport_toast.description.non_eligible": "¡Haz que tu donación sea igualada con financiación cuadrática!\nAumenta tu puntuación de Pasaporte Gitcoin antes",
+ "page.donate.passport_toast.description.not_connected": "¡Haz que tu donación sea igualada con financiación cuadrática!\nVerifica tu Pasaporte Gitcoin antes",
+ "page.donate.passport_toast.title.eligible": "Financiación Cuadrática",
+ "page.donate.passport_toast.title.non_eligible": "¡No te pierdas la igualación!",
+ "page.passport.step1": "1. Crea un Pasaporte Gitcoin si aún no tienes uno. Se te llevará a una nueva ventana para comenzar a verificar tu identidad.",
+ "page.passport.step2": "2. Verifica tu identidad recogiendo varios sellos.",
+ "page.passport.step3": "3. Vuelve a esta pantalla y actualiza tu puntuación.",
+ "page.project.preview_hint": "Esta es una vista previa de tu proyecto.",
+ "project.givback_toast.description.non_verified_owner": "¿Puedes demostrar que tu proyecto está proporcionando un bien público? ¡La verificación te da acceso a una gran cantidad de beneficios como recompensas para los donantes, mayor visibilidad y formas adicionales de recaudar fondos!",
+ "project.givback_toast.description.non_verified_public": "Los GIVbacks se otorgan actualmente solo por donaciones realizadas a proyectos verificados. ¡Tu contribución sigue siendo importante, incluso si no genera GIVbacks!",
+ "project.givback_toast.description.verified_owner": "¡Impulsa tu proyecto para aumentar su porcentaje de recompensas y hacerlo más visible en la página de proyectos!",
+ "project.givback_toast.description.verified_owner.note": "Como propietario de este proyecto, no obtendrás GIV por donar a él.",
+ "project.givback_toast.description.verified_public": "Los donantes a proyectos verificados son recompensados con GIV. ¡Impulsa este proyecto para aumentar su porcentaje de recompensas y hacerlo más visible en la página de proyectos!",
+ "project.givback_toast.title.non_verified_owner": "¡Lleva tu proyecto al siguiente nivel con la Verificación!",
+ "project.givback_toast.title.non_verified_public": "¿Por qué no hay GIVbacks?",
+ "project.givback_toast.title.verified_owner_1": "Los donantes son recompensados con hasta ",
+ "project.givback_toast.title.verified_owner_2": " del valor de la donación!",
+ "project.givback_toast.title.verified_public_1": "Obtén recompensas de hasta ",
+ "project.givback_toast.title.verified_public_2": " del valor de tu donación!",
+ "refi": "Refi",
+ "testfilter": "testfilter",
+ "tooltip.donation.matching": "Esta estimación se basa en las donaciones realizadas hasta ahora en esta ronda de financiación cuadrática y no está considerando el análisis de fraude. La cantidad de igualación real puede variar.",
+ "ubi": "RBI"
+}
From 4aca56baea81e4acfa5e496910a65279898c73e7 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Tue, 25 Jul 2023 14:48:35 +0330
Subject: [PATCH 045/175] removed isSameAddress functionality and checkbox
---
src/components/views/create/CreateProject.tsx | 72 ++++++++-----------
1 file changed, 28 insertions(+), 44 deletions(-)
diff --git a/src/components/views/create/CreateProject.tsx b/src/components/views/create/CreateProject.tsx
index 92873c8859..a2aec689a8 100644
--- a/src/components/views/create/CreateProject.tsx
+++ b/src/components/views/create/CreateProject.tsx
@@ -47,7 +47,6 @@ import { Shadow } from '@/components/styled-components/Shadow';
import { deviceSize, mediaQueries } from '@/lib/constants/constants';
// import useLeaveConfirm from '@/hooks/useLeaveConfirm';
import config from '@/configuration';
-import CheckBox from '@/components/Checkbox';
import Guidelines from '@/components/views/create/Guidelines';
import useDetectDevice from '@/hooks/useDetectDevice';
import { setShowFooter } from '@/features/general/general.slice';
@@ -173,9 +172,7 @@ const CreateProject: FC = ({ project }) => {
const [optimismAddressActive, setOptimismAddressActive] = useState(
isEditMode ? !!prevOptimismAddress : true,
);
- const [isSameAddress, setIsSameAddress] = useState(
- isEditMode ? isSamePrevAddresses : true,
- );
+
const [isLoading, setIsLoading] = useState(false);
const [resolvedENS, setResolvedENS] = useState('');
@@ -199,34 +196,33 @@ const CreateProject: FC = ({ project }) => {
draft,
} = formData;
- if (isSameAddress) {
- const address = isAddressENS(mainAddress)
- ? resolvedENS
- : mainAddress;
- const checksumAddress = utils.getAddress(address);
- addresses.push(
- {
- address: checksumAddress,
- networkId: MAINNET_NETWORK_NUMBER,
- },
- {
- address: checksumAddress,
- networkId: XDAI_NETWORK_NUMBER,
- },
- {
- address: checksumAddress,
- networkId: POLYGON_NETWORK_NUMBER,
- },
- {
- address: checksumAddress,
- networkId: CELO_NETWORK_NUMBER,
- },
- {
- address: checksumAddress,
- networkId: OPTIMISM_NETWORK_NUMBER,
- },
- );
- } else {
+ const address = isAddressENS(mainAddress)
+ ? resolvedENS
+ : mainAddress;
+ const checksumAddress = utils.getAddress(address);
+ addresses.push(
+ {
+ address: checksumAddress,
+ networkId: MAINNET_NETWORK_NUMBER,
+ },
+ {
+ address: checksumAddress,
+ networkId: XDAI_NETWORK_NUMBER,
+ },
+ {
+ address: checksumAddress,
+ networkId: POLYGON_NETWORK_NUMBER,
+ },
+ {
+ address: checksumAddress,
+ networkId: CELO_NETWORK_NUMBER,
+ },
+ {
+ address: checksumAddress,
+ networkId: OPTIMISM_NETWORK_NUMBER,
+ },
+ );
+ {
if (mainnetAddressActive) {
const address = isAddressENS(mainAddress)
? resolvedENS
@@ -370,16 +366,8 @@ const CreateProject: FC = ({ project }) => {
id: 'label.you_can_set_a_custom_ethereum_address',
})}
-
= ({ project }) => {
/>
{}}
@@ -426,7 +413,6 @@ const CreateProject: FC = ({ project }) => {
/>
{}}
@@ -449,7 +435,6 @@ const CreateProject: FC = ({ project }) => {
/>
{}}
@@ -472,7 +457,6 @@ const CreateProject: FC = ({ project }) => {
/>
{}}
From f9430276ea73d185521afdd19f0d0efa50f6ca70 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Tue, 25 Jul 2023 14:49:10 +0330
Subject: [PATCH 046/175] Made isSame address value false on walletAddressInput
---
src/components/views/create/WalletAddressInput.tsx | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/components/views/create/WalletAddressInput.tsx b/src/components/views/create/WalletAddressInput.tsx
index 6046e52dd5..2fa46b9970 100644
--- a/src/components/views/create/WalletAddressInput.tsx
+++ b/src/components/views/create/WalletAddressInput.tsx
@@ -31,7 +31,7 @@ import { networksParams } from '@/helpers/blockchain';
interface IProps {
networkId: number;
userAddresses: string[];
- sameAddress: boolean;
+ sameAddress?: boolean;
isActive: boolean;
setIsActive: (active: boolean) => void;
resolvedENS?: string;
@@ -41,7 +41,7 @@ interface IProps {
const WalletAddressInput: FC = ({
networkId,
userAddresses,
- sameAddress,
+ sameAddress = false,
isActive,
setIsActive,
resolvedENS,
From b01161362f3654eb8ff9f4c3f9d23200ccd73bd9 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Tue, 25 Jul 2023 16:08:47 +0330
Subject: [PATCH 047/175] Created CreateProjectAddAddressModal
---
.../create/CreateProjectAddAddressModal.tsx | 28 +++++++++++++++++++
1 file changed, 28 insertions(+)
create mode 100644 src/components/views/create/CreateProjectAddAddressModal.tsx
diff --git a/src/components/views/create/CreateProjectAddAddressModal.tsx b/src/components/views/create/CreateProjectAddAddressModal.tsx
new file mode 100644
index 0000000000..fc06f9a4da
--- /dev/null
+++ b/src/components/views/create/CreateProjectAddAddressModal.tsx
@@ -0,0 +1,28 @@
+import { IconWalletOutline24 } from '@giveth/ui-design-system';
+import React from 'react';
+import { Modal } from '@/components/modals/Modal';
+import { useModalAnimation } from '@/hooks/useModalAnimation';
+
+interface ICreateProjectAddAddressModal {
+ setShowModal: (show: boolean) => void;
+}
+
+const CreateProjectAddAddressModal = ({
+ setShowModal,
+}: ICreateProjectAddAddressModal) => {
+ const { isAnimating, closeModal } = useModalAnimation(setShowModal);
+
+ return (
+ }
+ >
+ CreateProjectAddAddressModal
+
+ );
+};
+
+export default CreateProjectAddAddressModal;
From 1916a339499bc62e778b861dc15f50d5119adfa4 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Wed, 26 Jul 2023 13:01:18 +0330
Subject: [PATCH 048/175] Added walletAddressInput to
CreateProjectAddAddressModal
---
.../create/CreateProjectAddAddressModal.tsx | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/src/components/views/create/CreateProjectAddAddressModal.tsx b/src/components/views/create/CreateProjectAddAddressModal.tsx
index fc06f9a4da..4daaa94ae8 100644
--- a/src/components/views/create/CreateProjectAddAddressModal.tsx
+++ b/src/components/views/create/CreateProjectAddAddressModal.tsx
@@ -2,13 +2,22 @@ import { IconWalletOutline24 } from '@giveth/ui-design-system';
import React from 'react';
import { Modal } from '@/components/modals/Modal';
import { useModalAnimation } from '@/hooks/useModalAnimation';
+import WalletAddressInput from './WalletAddressInput';
interface ICreateProjectAddAddressModal {
setShowModal: (show: boolean) => void;
+ networkId: number;
+ isActive: boolean;
+ setIsActive: (active: boolean) => void;
+ userAddresses: string[];
}
const CreateProjectAddAddressModal = ({
setShowModal,
+ networkId,
+ isActive,
+ setIsActive,
+ userAddresses,
}: ICreateProjectAddAddressModal) => {
const { isAnimating, closeModal } = useModalAnimation(setShowModal);
@@ -20,7 +29,13 @@ const CreateProjectAddAddressModal = ({
headerTitle='Add an Address'
headerIcon={}
>
- CreateProjectAddAddressModal
+ {}}
+ />
);
};
From f596bbb81b0c1e7454bf22abb3c9260a69f69d65 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Wed, 26 Jul 2023 13:03:41 +0330
Subject: [PATCH 049/175] Removed Active checkbox from WalletAddressInput
---
.../views/create/WalletAddressInput.tsx | 18 +-----------------
1 file changed, 1 insertion(+), 17 deletions(-)
diff --git a/src/components/views/create/WalletAddressInput.tsx b/src/components/views/create/WalletAddressInput.tsx
index 2fa46b9970..33067a9264 100644
--- a/src/components/views/create/WalletAddressInput.tsx
+++ b/src/components/views/create/WalletAddressInput.tsx
@@ -20,7 +20,6 @@ import { gqlAddressValidation } from '@/components/views/create/helpers';
import { IconGnosisChain } from '@/components/Icons/GnosisChain';
import { Shadow } from '@/components/styled-components/Shadow';
import { Flex, FlexCenter } from '@/components/styled-components/Flex';
-import CheckBox from '@/components/Checkbox';
import { getAddressFromENS, isAddressENS } from '@/lib/wallet';
import InlineToast, { EToastType } from '@/components/toasts/InlineToast';
import useDelay from '@/hooks/useDelay';
@@ -33,7 +32,6 @@ interface IProps {
userAddresses: string[];
sameAddress?: boolean;
isActive: boolean;
- setIsActive: (active: boolean) => void;
resolvedENS?: string;
setResolvedENS: (resolvedENS: string) => void;
}
@@ -42,8 +40,7 @@ const WalletAddressInput: FC = ({
networkId,
userAddresses,
sameAddress = false,
- isActive,
- setIsActive,
+ isActive = true,
resolvedENS,
setResolvedENS,
}) => {
@@ -272,19 +269,6 @@ const WalletAddressInput: FC = ({
})}
- {!isHidden && (
-
-
-
- )}
);
};
From 2889e238b486a0b8dcfa2439303ee5879d64e013 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Wed, 26 Jul 2023 14:43:18 +0330
Subject: [PATCH 050/175] fix passport banner responsive
---
src/components/PassportBanner.tsx | 50 +++++++++++++++++++------------
1 file changed, 31 insertions(+), 19 deletions(-)
diff --git a/src/components/PassportBanner.tsx b/src/components/PassportBanner.tsx
index cec781d7b0..c749eaef8b 100644
--- a/src/components/PassportBanner.tsx
+++ b/src/components/PassportBanner.tsx
@@ -8,6 +8,7 @@ import {
IconWalletOutline16,
P,
brandColors,
+ mediaQueries,
semanticColors,
} from '@giveth/ui-design-system';
import React, { ReactNode } from 'react';
@@ -131,24 +132,28 @@ export const PassportBanner = () => {
return (
- {PassportBannerData[passportState].icon}
-
- {formatMessage({
- id: PassportBannerData[passportState].content,
- })}
- {currentRound &&
- (passportState === EPassportState.NOT_CREATED ||
- passportState === EPassportState.NOT_ELIGIBLE) && (
-
- {new Date(currentRound.endDate)
- .toLocaleString(locale || 'en-US', {
- day: 'numeric',
- month: 'short',
- })
- .replace(/,/g, '')}
-
- )}
-
+
+
+ {PassportBannerData[passportState].icon}
+
+
+ {formatMessage({
+ id: PassportBannerData[passportState].content,
+ })}
+ {currentRound &&
+ (passportState === EPassportState.NOT_CREATED ||
+ passportState === EPassportState.NOT_ELIGIBLE) && (
+
+ {new Date(currentRound.endDate)
+ .toLocaleString(locale || 'en-US', {
+ day: 'numeric',
+ month: 'short',
+ })
+ .replace(/,/g, '')}
+
+ )}
+
+
{PassportBannerData[passportState].link && (
`
- height: 56px;
+ flex-direction: column;
background-color: ${props => bgColor[props.bgColor]};
padding: 16px;
align-items: center;
justify-content: center;
gap: 8px;
position: relative;
+ ${mediaQueries.tablet} {
+ flex-direction: row;
+ }
+`;
+
+const IconWrapper = styled.div`
+ width: 24px;
`;
const StyledLink = styled(Flex)`
From 455247563540ec3251cc67164c7b62d0cd41e126 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Wed, 26 Jul 2023 14:44:16 +0330
Subject: [PATCH 051/175] align items
---
src/components/PassportBanner.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/PassportBanner.tsx b/src/components/PassportBanner.tsx
index c749eaef8b..49bcace9c0 100644
--- a/src/components/PassportBanner.tsx
+++ b/src/components/PassportBanner.tsx
@@ -132,7 +132,7 @@ export const PassportBanner = () => {
return (
-
+
{PassportBannerData[passportState].icon}
From ed494bd4bd1baec6377c362e290c8d27f22a1d6c Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Wed, 26 Jul 2023 15:08:01 +0330
Subject: [PATCH 052/175] removed extra codes
---
src/components/views/create/CreateProject.tsx | 118 ++++--------------
1 file changed, 23 insertions(+), 95 deletions(-)
diff --git a/src/components/views/create/CreateProject.tsx b/src/components/views/create/CreateProject.tsx
index a2aec689a8..76fbb5baf2 100644
--- a/src/components/views/create/CreateProject.tsx
+++ b/src/components/views/create/CreateProject.tsx
@@ -98,6 +98,7 @@ const CreateProject: FC = ({ project }) => {
const [editProjectMutation] = useMutation(UPDATE_PROJECT);
const router = useRouter();
const dispatch = useAppDispatch();
+ const [showAddressModal, setShowAddressModal] = useState(false);
const isEditMode = !!project;
const { title, description, categories, impactLocation, image, addresses } =
@@ -153,31 +154,15 @@ const CreateProject: FC = ({ project }) => {
[EInputs.optimismAddress]: prevOptimismAddress || '',
},
});
-
+ console.log('Formmm', formMethods.getValues());
const { unregister, handleSubmit, setValue } = formMethods;
const [creationSuccessful, setCreationSuccessful] = useState();
- const [mainnetAddressActive, setMainnetAddressActive] = useState(
- isEditMode ? !!prevMainAddress : true,
- );
- const [gnosisAddressActive, setGnosisAddressActive] = useState(
- isEditMode ? !!prevGnosisAddress : true,
- );
- const [polygonAddressActive, setPolygonAddressActive] = useState(
- isEditMode ? !!prevPolygonAddress : true,
- );
- const [celoAddressActive, setCeloAddressActive] = useState(
- isEditMode ? !!prevCeloAddress : true,
- );
- const [optimismAddressActive, setOptimismAddressActive] = useState(
- isEditMode ? !!prevOptimismAddress : true,
- );
const [isLoading, setIsLoading] = useState(false);
const [resolvedENS, setResolvedENS] = useState('');
// useLeaveConfirm({ shouldConfirm: formChange });
-
const onSubmit = async (formData: TInputs) => {
try {
setIsLoading(true);
@@ -195,7 +180,7 @@ const CreateProject: FC = ({ project }) => {
image,
draft,
} = formData;
-
+ console.log('Formdataaddress', formData);
const address = isAddressENS(mainAddress)
? resolvedENS
: mainAddress;
@@ -223,7 +208,7 @@ const CreateProject: FC = ({ project }) => {
},
);
{
- if (mainnetAddressActive) {
+ if (mainAddress) {
const address = isAddressENS(mainAddress)
? resolvedENS
: mainAddress;
@@ -233,28 +218,28 @@ const CreateProject: FC = ({ project }) => {
networkId: MAINNET_NETWORK_NUMBER,
});
}
- if (gnosisAddressActive) {
+ if (gnosisAddress) {
const checksumAddress = utils.getAddress(gnosisAddress);
addresses.push({
address: checksumAddress,
networkId: XDAI_NETWORK_NUMBER,
});
}
- if (polygonAddressActive) {
+ if (polygonAddress) {
const checksumAddress = utils.getAddress(polygonAddress);
addresses.push({
address: checksumAddress,
networkId: POLYGON_NETWORK_NUMBER,
});
}
- if (celoAddressActive) {
+ if (celoAddress) {
const checksumAddress = utils.getAddress(celoAddress);
addresses.push({
address: checksumAddress,
networkId: CELO_NETWORK_NUMBER,
});
}
- if (optimismAddressActive) {
+ if (optimismAddress) {
const checksumAddress = utils.getAddress(optimismAddress);
addresses.push({
address: checksumAddress,
@@ -327,14 +312,17 @@ const CreateProject: FC = ({ project }) => {
dispatch(setShowFooter(true));
};
}, []);
-
+ // const addAddress = (addressObj: IAddress) => {
+ // setAddresses([...addresses, addressObj]);
+ // };
const { isTablet, isMobile } = useDetectDevice();
const isSmallScreen = isTablet || isMobile;
if (creationSuccessful) {
return ;
}
-
+ console.log('addresses', addresses);
+ console.log('userAddresses', userAddresses);
return (
@@ -368,113 +356,43 @@ const CreateProject: FC = ({ project }) => {
{
- if (
- !e &&
- !gnosisAddressActive &&
- !polygonAddressActive &&
- !celoAddressActive &&
- !optimismAddressActive
- )
- return showToastError(
- formatMessage({
- id: 'label.you_must_select_at_least_one_address',
- }),
- );
if (!e) unregister(EInputs.mainAddress);
- setMainnetAddressActive(e);
}}
/>
{}}
setIsActive={e => {
- if (
- !e &&
- !mainnetAddressActive &&
- !polygonAddressActive &&
- !celoAddressActive &&
- !optimismAddressActive
- )
- return showToastError(
- formatMessage({
- id: 'label.you_must_select_at_least_one_address',
- }),
- );
if (!e) unregister(EInputs.gnosisAddress);
- setGnosisAddressActive(e);
}}
/>
{}}
setIsActive={e => {
- if (
- !e &&
- !mainnetAddressActive &&
- !gnosisAddressActive &&
- !celoAddressActive &&
- !optimismAddressActive
- )
- return showToastError(
- formatMessage({
- id: 'label.you_must_select_at_least_one_address',
- }),
- );
if (!e) unregister(EInputs.polygonAddress);
- setPolygonAddressActive(e);
}}
/>
{}}
setIsActive={e => {
- if (
- !e &&
- !mainnetAddressActive &&
- !gnosisAddressActive &&
- !polygonAddressActive &&
- !optimismAddressActive
- )
- return showToastError(
- formatMessage({
- id: 'label.you_must_select_at_least_one_address',
- }),
- );
if (!e) unregister(EInputs.celoAddress);
- setCeloAddressActive(e);
}}
/>
{}}
setIsActive={e => {
- if (
- !e &&
- !mainnetAddressActive &&
- !gnosisAddressActive &&
- !polygonAddressActive &&
- !celoAddressActive
- )
- return showToastError(
- formatMessage({
- id: 'label.you_must_select_at_least_one_address',
- }),
- );
if (!e) unregister(EInputs.optimismAddress);
- setOptimismAddressActive(e);
}}
/>
@@ -546,7 +464,17 @@ const CreateProject: FC = ({ project }) => {
)}
+ {/* {showAddressModal && (
+
+ )} */}
+ setShowAddressModal(true)}>
+ HELLLLLO
+
{!isSmallScreen && (
From 469e21033a25a2f257d4fed3fe75c552dcbfdb18 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Wed, 26 Jul 2023 15:09:48 +0330
Subject: [PATCH 053/175] removed extra codes
---
src/components/views/create/CreateProject.tsx | 15 ---------------
.../views/create/WalletAddressInput.tsx | 2 +-
2 files changed, 1 insertion(+), 16 deletions(-)
diff --git a/src/components/views/create/CreateProject.tsx b/src/components/views/create/CreateProject.tsx
index 76fbb5baf2..b2243a7e6d 100644
--- a/src/components/views/create/CreateProject.tsx
+++ b/src/components/views/create/CreateProject.tsx
@@ -359,41 +359,26 @@ const CreateProject: FC = ({ project }) => {
userAddresses={userAddresses}
resolvedENS={resolvedENS}
setResolvedENS={setResolvedENS}
- setIsActive={e => {
- if (!e) unregister(EInputs.mainAddress);
- }}
/>
{}}
- setIsActive={e => {
- if (!e) unregister(EInputs.gnosisAddress);
- }}
/>
{}}
- setIsActive={e => {
- if (!e) unregister(EInputs.polygonAddress);
- }}
/>
{}}
- setIsActive={e => {
- if (!e) unregister(EInputs.celoAddress);
- }}
/>
{}}
- setIsActive={e => {
- if (!e) unregister(EInputs.optimismAddress);
- }}
/>
{isEditMode
diff --git a/src/components/views/create/WalletAddressInput.tsx b/src/components/views/create/WalletAddressInput.tsx
index 33067a9264..85a9b3e6d7 100644
--- a/src/components/views/create/WalletAddressInput.tsx
+++ b/src/components/views/create/WalletAddressInput.tsx
@@ -31,7 +31,7 @@ interface IProps {
networkId: number;
userAddresses: string[];
sameAddress?: boolean;
- isActive: boolean;
+ isActive?: boolean;
resolvedENS?: string;
setResolvedENS: (resolvedENS: string) => void;
}
From 6bf550ac74ee1756a435a5df6c8d48ebb78b87a0 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Wed, 26 Jul 2023 16:06:16 +0330
Subject: [PATCH 054/175] update addresses
---
src/config/development.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/config/development.ts b/src/config/development.ts
index 9283e681f2..62f8800e0d 100644
--- a/src/config/development.ts
+++ b/src/config/development.ts
@@ -279,7 +279,7 @@ const config: EnvConfig = {
regenStreams: [],
GIV: {
network: OPTIMISM_NETWORK_NUMBER,
- LM_ADDRESS: '',
+ LM_ADDRESS: '0x632AC305ed88817480d12155A7F1244cC182C298',
BUY_LINK: 'https://',
},
uniswapV2Subgraph: '',
From 6a98ae1dbf18e8a31741409f93d846ade10759ae Mon Sep 17 00:00:00 2001
From: Cherik
Date: Wed, 26 Jul 2023 16:42:21 +0330
Subject: [PATCH 055/175] add optimism pools
---
.../views/givfarm/GIVfarmBottom.tsx | 36 +++++++++++++++----
1 file changed, 29 insertions(+), 7 deletions(-)
diff --git a/src/components/views/givfarm/GIVfarmBottom.tsx b/src/components/views/givfarm/GIVfarmBottom.tsx
index 9f9a5ad2ea..1bbdfe6570 100644
--- a/src/components/views/givfarm/GIVfarmBottom.tsx
+++ b/src/components/views/givfarm/GIVfarmBottom.tsx
@@ -49,12 +49,25 @@ const renderPools = (chainId?: number, showArchivedPools?: boolean) => {
...config.XDAI_CONFIG.regenPools,
...config.MAINNET_CONFIG.pools,
...config.MAINNET_CONFIG.regenPools,
+ ...config.OPTIMISM_CONFIG.pools,
+ ...config.OPTIMISM_CONFIG.regenPools,
+ ]
+ : chainId === config.OPTIMISM_NETWORK_NUMBER
+ ? [
+ ...config.OPTIMISM_CONFIG.pools,
+ ...config.OPTIMISM_CONFIG.regenPools,
+ ...config.XDAI_CONFIG.pools,
+ ...config.XDAI_CONFIG.regenPools,
+ ...config.MAINNET_CONFIG.pools,
+ ...config.MAINNET_CONFIG.regenPools,
]
: [
...config.MAINNET_CONFIG.pools,
...config.MAINNET_CONFIG.regenPools,
...config.XDAI_CONFIG.pools,
...config.XDAI_CONFIG.regenPools,
+ ...config.OPTIMISM_CONFIG.pools,
+ ...config.OPTIMISM_CONFIG.regenPools,
];
const now = getNowUnixMS();
@@ -153,13 +166,22 @@ export const GIVfarmBottom = () => {
{!showArchivedPools && (
-
-
-
+ <>
+
+
+
+
+
+
+ >
)}
{showArchivedPools && (
From 70255574c2ffb39e3fb9c727ed07cb21f4c029df Mon Sep 17 00:00:00 2001
From: Cherik
Date: Wed, 26 Jul 2023 16:57:02 +0330
Subject: [PATCH 056/175] add givpower stake card
---
.../cards/StakingCards/BaseStakingCard/BaseStakingCard.tsx | 4 +++-
src/components/views/givfarm/GIVfarmBottom.tsx | 4 ++--
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/src/components/cards/StakingCards/BaseStakingCard/BaseStakingCard.tsx b/src/components/cards/StakingCards/BaseStakingCard/BaseStakingCard.tsx
index 8e64256469..4532a6fcdf 100644
--- a/src/components/cards/StakingCards/BaseStakingCard/BaseStakingCard.tsx
+++ b/src/components/cards/StakingCards/BaseStakingCard/BaseStakingCard.tsx
@@ -60,7 +60,9 @@ const BaseStakingCard: FC = ({
const isGIVStaking = type === StakingType.GIV_LM;
const isGIVpower =
- isGIVStaking && poolNetwork === config.XDAI_NETWORK_NUMBER;
+ isGIVStaking &&
+ (poolNetwork === config.XDAI_NETWORK_NUMBER ||
+ poolNetwork === config.OPTIMISM_NETWORK_NUMBER);
const isDiscontinued = farmEndTimeMS
? getNowUnixMS() > farmEndTimeMS
diff --git a/src/components/views/givfarm/GIVfarmBottom.tsx b/src/components/views/givfarm/GIVfarmBottom.tsx
index 1bbdfe6570..a4caa49642 100644
--- a/src/components/views/givfarm/GIVfarmBottom.tsx
+++ b/src/components/views/givfarm/GIVfarmBottom.tsx
@@ -167,14 +167,14 @@ export const GIVfarmBottom = () => {
{!showArchivedPools && (
<>
-
+
-
+
Date: Wed, 26 Jul 2023 17:20:09 +0330
Subject: [PATCH 057/175] make usd amount default sort
---
.../views/project/projectDonations/ProjectDonationTable.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/views/project/projectDonations/ProjectDonationTable.tsx b/src/components/views/project/projectDonations/ProjectDonationTable.tsx
index 9216b3bcc2..f4de29730b 100644
--- a/src/components/views/project/projectDonations/ProjectDonationTable.tsx
+++ b/src/components/views/project/projectDonations/ProjectDonationTable.tsx
@@ -62,7 +62,7 @@ const ProjectDonationTable = ({ selectedQF }: IProjectDonationTable) => {
const [pageDonations, setPageDonations] = useState();
const [page, setPage] = useState(0);
const [order, setOrder] = useState({
- by: EOrderBy.CreationDate,
+ by: EOrderBy.UsdAmount,
direction: EDirection.DESC,
});
const { projectData } = useProjectContext();
From bf698a67b71ee8c4b611093ce28745b7cd132b82 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Wed, 26 Jul 2023 17:50:29 +0330
Subject: [PATCH 058/175] show givbacks for optimism
---
src/components/GIVeconomyPages/GIVbacks.tsx | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/src/components/GIVeconomyPages/GIVbacks.tsx b/src/components/GIVeconomyPages/GIVbacks.tsx
index e4f2b1ce8e..823708a182 100644
--- a/src/components/GIVeconomyPages/GIVbacks.tsx
+++ b/src/components/GIVeconomyPages/GIVbacks.tsx
@@ -51,15 +51,19 @@ export const TabGIVbacksTop = () => {
const [showGivBackExplain, setShowGivBackExplain] = useState(false);
const [givBackStream, setGivBackStream] = useState(0);
const { givTokenDistroHelper } = useGIVTokenDistroHelper(showHarvestModal);
- const gnosisValues = useAppSelector(
- state => state.subgraph.gnosisValues,
+ const { chainId } = useWeb3React();
+ const values = useAppSelector(
+ state =>
+ chainId === config.OPTIMISM_NETWORK_NUMBER
+ ? state.subgraph.optimismValues
+ : state.subgraph.gnosisValues,
() => (showHarvestModal ? true : false),
);
+
const givTokenDistroBalance = useMemo(() => {
- const sdh = new SubgraphDataHelper(gnosisValues);
+ const sdh = new SubgraphDataHelper(values);
return sdh.getGIVTokenDistroBalance();
- }, [gnosisValues]);
- const { chainId } = useWeb3React();
+ }, [values]);
useEffect(() => {
const _givback = BN(givTokenDistroBalance.givback);
From f1a05e9851a784567563c1aef8602e59942bf244 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Wed, 26 Jul 2023 18:25:02 +0330
Subject: [PATCH 059/175] add givgarden
---
src/config/development.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/config/development.ts b/src/config/development.ts
index 62f8800e0d..bfb068e0cd 100644
--- a/src/config/development.ts
+++ b/src/config/development.ts
@@ -280,6 +280,7 @@ const config: EnvConfig = {
GIV: {
network: OPTIMISM_NETWORK_NUMBER,
LM_ADDRESS: '0x632AC305ed88817480d12155A7F1244cC182C298',
+ GARDEN_ADDRESS: '0x632AC305ed88817480d12155A7F1244cC182C298',
BUY_LINK: 'https://',
},
uniswapV2Subgraph: '',
From 8c60f7eb20a4a6622a4c2a6aba69e864a19cd27f Mon Sep 17 00:00:00 2001
From: Cherik
Date: Wed, 26 Jul 2023 18:25:15 +0330
Subject: [PATCH 060/175] update useTokenDistroHelper
---
src/hooks/useTokenDistroHelper.tsx | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/hooks/useTokenDistroHelper.tsx b/src/hooks/useTokenDistroHelper.tsx
index d3ee6d04f9..cd387d1e78 100644
--- a/src/hooks/useTokenDistroHelper.tsx
+++ b/src/hooks/useTokenDistroHelper.tsx
@@ -17,6 +17,8 @@ export const useTokenDistroHelper = (
state =>
poolNetwork === config.XDAI_NETWORK_NUMBER
? state.subgraph.gnosisValues
+ : poolNetwork === config.OPTIMISM_NETWORK_NUMBER
+ ? state.subgraph.optimismValues
: state.subgraph.mainnetValues,
() => (hold ? true : false),
);
From 7576df86ff6860d5c89708e60b7dace74ffd7664 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Wed, 26 Jul 2023 18:25:27 +0330
Subject: [PATCH 061/175] update useStakingPool
---
src/hooks/useStakingPool.tsx | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/hooks/useStakingPool.tsx b/src/hooks/useStakingPool.tsx
index b9ebe972a0..7b72074d33 100644
--- a/src/hooks/useStakingPool.tsx
+++ b/src/hooks/useStakingPool.tsx
@@ -37,6 +37,8 @@ export const useStakingPool = (
state =>
poolStakingConfig.network === config.XDAI_NETWORK_NUMBER
? state.subgraph.gnosisValues
+ : poolStakingConfig.network === config.OPTIMISM_NETWORK_NUMBER
+ ? state.subgraph.optimismValues
: state.subgraph.mainnetValues,
() => (hold ? true : false),
);
From 8d9ae9fbf81cccbe76e1c426cca3cffc43c6d1c7 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Mon, 31 Jul 2023 11:56:49 +0330
Subject: [PATCH 062/175] added CreateProjectAddAddressModal for Mainnet
---
src/components/views/create/CreateProject.tsx | 23 +++++++++++--------
1 file changed, 13 insertions(+), 10 deletions(-)
diff --git a/src/components/views/create/CreateProject.tsx b/src/components/views/create/CreateProject.tsx
index b2243a7e6d..ac43990f71 100644
--- a/src/components/views/create/CreateProject.tsx
+++ b/src/components/views/create/CreateProject.tsx
@@ -52,6 +52,8 @@ import useDetectDevice from '@/hooks/useDetectDevice';
import { setShowFooter } from '@/features/general/general.slice';
import { useAppDispatch } from '@/features/hooks';
import NameInput from '@/components/views/create/NameInput';
+import { IAddress } from '../verification/manageFunds/ManageFundsIndex';
+import CreateProjectAddAddressModal from './CreateProjectAddAddressModal';
const {
MAINNET_NETWORK_NUMBER,
@@ -312,9 +314,10 @@ const CreateProject: FC = ({ project }) => {
dispatch(setShowFooter(true));
};
}, []);
- // const addAddress = (addressObj: IAddress) => {
- // setAddresses([...addresses, addressObj]);
- // };
+ const addAddress = (addressObj: IAddress) => {
+ // setAddresses([...addresses, addressObj]);
+ console.log('AddressObj', addressObj);
+ };
const { isTablet, isMobile } = useDetectDevice();
const isSmallScreen = isTablet || isMobile;
@@ -448,14 +451,14 @@ const CreateProject: FC = ({ project }) => {
/>
)}
+ {showAddressModal && (
+
+ )}
- {/* {showAddressModal && (
-
- )} */}
setShowAddressModal(true)}>
HELLLLLO
From 672e7176747ffd9a360a25920b95e287cc11e200 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Mon, 31 Jul 2023 11:59:05 +0330
Subject: [PATCH 063/175] Added AddressContainer
---
.../create/CreateProjectAddAddressModal.tsx | 33 +++++++++++--------
1 file changed, 19 insertions(+), 14 deletions(-)
diff --git a/src/components/views/create/CreateProjectAddAddressModal.tsx b/src/components/views/create/CreateProjectAddAddressModal.tsx
index 4daaa94ae8..982353a389 100644
--- a/src/components/views/create/CreateProjectAddAddressModal.tsx
+++ b/src/components/views/create/CreateProjectAddAddressModal.tsx
@@ -1,5 +1,5 @@
-import { IconWalletOutline24 } from '@giveth/ui-design-system';
import React from 'react';
+import styled from 'styled-components';
import { Modal } from '@/components/modals/Modal';
import { useModalAnimation } from '@/hooks/useModalAnimation';
import WalletAddressInput from './WalletAddressInput';
@@ -7,16 +7,14 @@ import WalletAddressInput from './WalletAddressInput';
interface ICreateProjectAddAddressModal {
setShowModal: (show: boolean) => void;
networkId: number;
- isActive: boolean;
- setIsActive: (active: boolean) => void;
+ isActive?: boolean;
userAddresses: string[];
}
const CreateProjectAddAddressModal = ({
setShowModal,
networkId,
- isActive,
- setIsActive,
+ isActive = true,
userAddresses,
}: ICreateProjectAddAddressModal) => {
const { isAnimating, closeModal } = useModalAnimation(setShowModal);
@@ -26,18 +24,25 @@ const CreateProjectAddAddressModal = ({
closeModal={closeModal}
isAnimating={isAnimating}
headerTitlePosition='left'
- headerTitle='Add an Address'
- headerIcon={}
+ headerTitle='Add new Address'
>
- {}}
- />
+
+ {}}
+ />
+
);
};
+const AddressContainer = styled.div`
+ max-width: 558px;
+ height: 558px;
+ padding: 0 8px;
+ text-align: left;
+`;
+
export default CreateProjectAddAddressModal;
From 230f1d37b63c39805110388b8237048937cf2fff Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Mon, 31 Jul 2023 13:52:48 +0330
Subject: [PATCH 064/175] Created AddressInterface component
---
.../views/create/AddressInterface.tsx | 156 ++++++++++++++++++
1 file changed, 156 insertions(+)
create mode 100644 src/components/views/create/AddressInterface.tsx
diff --git a/src/components/views/create/AddressInterface.tsx b/src/components/views/create/AddressInterface.tsx
new file mode 100644
index 0000000000..bf2eb568cd
--- /dev/null
+++ b/src/components/views/create/AddressInterface.tsx
@@ -0,0 +1,156 @@
+import { useFormContext } from 'react-hook-form';
+import { useIntl } from 'react-intl';
+import styled from 'styled-components';
+import {
+ Button,
+ IconArrowRight16,
+ neutralColors,
+} from '@giveth/ui-design-system';
+import config from '@/configuration';
+import { EInputs } from '@/components/views/create/CreateProject';
+import { networksParams } from '@/helpers/blockchain';
+import { IconEthereum } from '@/components/Icons/Eth';
+import { IconGnosisChain } from '@/components/Icons/GnosisChain';
+import NetworkLogo from '@/components/NetworkLogo';
+import { Shadow } from '@/components/styled-components/Shadow';
+import { Flex } from '@/components/styled-components/Flex';
+
+interface IAddressInterfaceProps {
+ networkId: number;
+ address: string;
+}
+
+const AddressInterface = ({ networkId, address }: IAddressInterfaceProps) => {
+ const {
+ register,
+ formState: { errors },
+ getValues,
+ clearErrors,
+ } = useFormContext();
+
+ const isMainnet = networkId === config.MAINNET_NETWORK_NUMBER;
+ const isGnosis = networkId === config.XDAI_NETWORK_NUMBER;
+ const isPolygon = networkId === config.POLYGON_NETWORK_NUMBER;
+ const isCelo = networkId === config.CELO_NETWORK_NUMBER;
+ const isOptimism = networkId === config.OPTIMISM_NETWORK_NUMBER;
+ const inputName = isGnosis
+ ? EInputs.gnosisAddress
+ : isPolygon
+ ? EInputs.polygonAddress
+ : isCelo
+ ? EInputs.celoAddress
+ : isOptimism
+ ? EInputs.optimismAddress
+ : EInputs.mainAddress;
+ const value = getValues(inputName);
+ console.log('Value', value);
+ console.log('inputName', inputName);
+ const { formatMessage } = useIntl();
+
+ let caption: string = '';
+ if (!value) {
+ caption = `${formatMessage({
+ id: 'label.you_can_enter_a_new_address',
+ })} ${
+ isGnosis
+ ? 'Gnosis Chain'
+ : isPolygon
+ ? 'Polygon Mainnet'
+ : isCelo
+ ? 'Celo Mainnet'
+ : isOptimism
+ ? 'Optimism'
+ : 'Mainnet'
+ }.`;
+ }
+
+ const NetworkIcon = isGnosis ? (
+
+ ) : isPolygon ? (
+
+ ) : isCelo ? (
+
+ ) : isOptimism ? (
+
+ ) : (
+
+ );
+
+ return (
+
+
+
+
+ {NetworkIcon}
+ {formatMessage(
+ { id: 'label.chain_address' },
+ {
+ chainName: networksParams[networkId].chainName,
+ },
+ )}
+
+ }
+ />
+
+
+
+
+ );
+};
+
+const OptimismIcon = () => (
+
+
+
+);
+
+const CeloIcon = () => (
+
+
+
+);
+
+const PolygonIcon = () => (
+
+
+
+);
+
+const GnosisIcon = () => (
+
+
+
+);
+
+const MainnetIcon = () => (
+
+
+
+);
+
+const Container = styled.div`
+ margin-top: 25px;
+ background: ${neutralColors.gray[100]};
+ border-radius: 12px;
+ padding: 16px;
+`;
+
+const ChainIconShadow = styled.div`
+ height: 24px;
+ width: fit-content;
+ border-radius: 50%;
+ box-shadow: ${Shadow.Giv[400]};
+`;
+
+const TopContainer = styled.div`
+ border-bottom: 1px solid ${neutralColors.gray[300]};
+`;
+
+const MiddleContainer = styled.div`
+ border-bottom: 1px solid ${neutralColors.gray[300]};
+`;
+
+export default AddressInterface;
From 010fbb61dd1e00bc7ff84a9beff6c5d5be184f3e Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Mon, 31 Jul 2023 14:16:40 +0330
Subject: [PATCH 065/175] Added Middle section
---
.../views/create/AddressInterface.tsx | 42 ++++++++++++++++++-
1 file changed, 40 insertions(+), 2 deletions(-)
diff --git a/src/components/views/create/AddressInterface.tsx b/src/components/views/create/AddressInterface.tsx
index bf2eb568cd..5eb63dfaf6 100644
--- a/src/components/views/create/AddressInterface.tsx
+++ b/src/components/views/create/AddressInterface.tsx
@@ -3,6 +3,7 @@ import { useIntl } from 'react-intl';
import styled from 'styled-components';
import {
Button,
+ GLink,
IconArrowRight16,
neutralColors,
} from '@giveth/ui-design-system';
@@ -47,6 +48,8 @@ const AddressInterface = ({ networkId, address }: IAddressInterfaceProps) => {
console.log('inputName', inputName);
const { formatMessage } = useIntl();
+ const hasAddress = !!address;
+
let caption: string = '';
if (!value) {
caption = `${formatMessage({
@@ -91,12 +94,36 @@ const AddressInterface = ({ networkId, address }: IAddressInterfaceProps) => {
}
/>
-
+
+ {hasAddress && (
+
+ {formatMessage(
+ {
+ id: 'label.receiving_address_on',
+ },
+ {
+ chainName: isGnosis
+ ? 'Gnosis Chain'
+ : isPolygon
+ ? 'Polygon Mainnet'
+ : isCelo
+ ? 'Celo Mainnet'
+ : isOptimism
+ ? 'Optimism Mainnet'
+ : 'Mainnet',
+ },
+ )}
+
+ )}
+
+ {address ? address : 'No address added yet!'}
+
+
);
};
@@ -151,6 +178,17 @@ const TopContainer = styled.div`
const MiddleContainer = styled.div`
border-bottom: 1px solid ${neutralColors.gray[300]};
+ padding: 24px 0;
+`;
+
+const AddressContainer = styled.div<{ hasAddress: boolean }>`
+ border: 2px solid ${neutralColors.gray[300]};
+ background-color: ${props =>
+ props.hasAddress ? neutralColors.gray[100] : neutralColors.gray[300]};
+ border-radius: 8px;
+ color: ${props =>
+ props.hasAddress ? neutralColors.gray[900] : neutralColors.gray[500]};
+ padding: 16px;
`;
export default AddressInterface;
From c71f6a041a5b522d64682983ab5e86312cd9a857 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Mon, 31 Jul 2023 15:52:10 +0330
Subject: [PATCH 066/175] added modals
---
src/components/views/create/CreateProject.tsx | 83 +++++++++++++++++--
1 file changed, 74 insertions(+), 9 deletions(-)
diff --git a/src/components/views/create/CreateProject.tsx b/src/components/views/create/CreateProject.tsx
index ac43990f71..3f9af710fd 100644
--- a/src/components/views/create/CreateProject.tsx
+++ b/src/components/views/create/CreateProject.tsx
@@ -36,7 +36,6 @@ import {
DescriptionInput,
ImageInput,
LocationIndex,
- WalletAddressInput,
} from './Inputs';
import SuccessfulCreation from './SuccessfulCreation';
import { compareAddressesArray, showToastError } from '@/lib/helpers';
@@ -54,6 +53,7 @@ import { useAppDispatch } from '@/features/hooks';
import NameInput from '@/components/views/create/NameInput';
import { IAddress } from '../verification/manageFunds/ManageFundsIndex';
import CreateProjectAddAddressModal from './CreateProjectAddAddressModal';
+import AddressInterface from './AddressInterface';
const {
MAINNET_NETWORK_NUMBER,
@@ -100,7 +100,14 @@ const CreateProject: FC = ({ project }) => {
const [editProjectMutation] = useMutation(UPDATE_PROJECT);
const router = useRouter();
const dispatch = useAppDispatch();
- const [showAddressModal, setShowAddressModal] = useState(false);
+ const [showMainnetAddressModal, setShowMainnetAddressModal] =
+ useState(false);
+ const [showGnosisAddressModal, setShowGnosisAddressModal] = useState(false);
+ const [showPolygonAddressModal, setShowPolygonAddressModal] =
+ useState(false);
+ const [showCeloAddressModal, setShowCeloAddressModal] = useState(false);
+ const [showOptimismAddressModal, setShowOptimismAddressModal] =
+ useState(false);
const isEditMode = !!project;
const { title, description, categories, impactLocation, image, addresses } =
@@ -156,7 +163,7 @@ const CreateProject: FC = ({ project }) => {
[EInputs.optimismAddress]: prevOptimismAddress || '',
},
});
- console.log('Formmm', formMethods.getValues());
+
const { unregister, handleSubmit, setValue } = formMethods;
const [creationSuccessful, setCreationSuccessful] = useState();
@@ -357,7 +364,7 @@ const CreateProject: FC = ({ project }) => {
id: 'label.you_can_set_a_custom_ethereum_address',
})}
- = ({ project }) => {
networkId={OPTIMISM_NETWORK_NUMBER}
userAddresses={userAddresses}
setResolvedENS={() => {}}
+ /> */}
+
+ setShowMainnetAddressModal(true)
+ }
+ />
+
+ setShowGnosisAddressModal(true)
+ }
+ />
+
+ setShowPolygonAddressModal(true)
+ }
+ />
+ setShowCeloAddressModal(true)}
+ />
+
+ setShowOptimismAddressModal(true)
+ }
/>
{isEditMode
@@ -451,18 +491,43 @@ const CreateProject: FC = ({ project }) => {
/>
)}
- {showAddressModal && (
+ {showMainnetAddressModal && (
+ )}
+ {showGnosisAddressModal && (
+
+ )}
+ {showPolygonAddressModal && (
+
+ )}
+ {showCeloAddressModal && (
+
+ )}
+ {showOptimismAddressModal && (
+
)}
- setShowAddressModal(true)}>
- HELLLLLO
-
{!isSmallScreen && (
From 6cbe643ace9f8fd5a7beed924b352329f43c32c6 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Mon, 31 Jul 2023 15:52:21 +0330
Subject: [PATCH 067/175] added new props
---
src/components/views/create/AddressInterface.tsx | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/src/components/views/create/AddressInterface.tsx b/src/components/views/create/AddressInterface.tsx
index 5eb63dfaf6..e1f5e934ed 100644
--- a/src/components/views/create/AddressInterface.tsx
+++ b/src/components/views/create/AddressInterface.tsx
@@ -18,10 +18,15 @@ import { Flex } from '@/components/styled-components/Flex';
interface IAddressInterfaceProps {
networkId: number;
- address: string;
+ address?: string;
+ onButtonClick?: () => void;
}
-const AddressInterface = ({ networkId, address }: IAddressInterfaceProps) => {
+const AddressInterface = ({
+ networkId,
+ address,
+ onButtonClick,
+}: IAddressInterfaceProps) => {
const {
register,
formState: { errors },
@@ -44,8 +49,6 @@ const AddressInterface = ({ networkId, address }: IAddressInterfaceProps) => {
? EInputs.optimismAddress
: EInputs.mainAddress;
const value = getValues(inputName);
- console.log('Value', value);
- console.log('inputName', inputName);
const { formatMessage } = useIntl();
const hasAddress = !!address;
@@ -96,6 +99,7 @@ const AddressInterface = ({ networkId, address }: IAddressInterfaceProps) => {
buttonType='texty-secondary'
label={hasAddress ? 'Edit Address' : 'Add Address'}
icon={}
+ onClick={onButtonClick}
/>
@@ -177,7 +181,6 @@ const TopContainer = styled.div`
`;
const MiddleContainer = styled.div`
- border-bottom: 1px solid ${neutralColors.gray[300]};
padding: 24px 0;
`;
From ce9e34cfcf4d0d0b12708116099e01f78a9da014 Mon Sep 17 00:00:00 2001
From: Ramin
Date: Mon, 31 Jul 2023 17:42:41 +0330
Subject: [PATCH 068/175] create new route: Public Goods in Crypto and Web3 :
Funding the Future
---
src/components/views/landings/publicGoods/index.tsx | 5 +++++
1 file changed, 5 insertions(+)
create mode 100644 src/components/views/landings/publicGoods/index.tsx
diff --git a/src/components/views/landings/publicGoods/index.tsx b/src/components/views/landings/publicGoods/index.tsx
new file mode 100644
index 0000000000..2462fc42b1
--- /dev/null
+++ b/src/components/views/landings/publicGoods/index.tsx
@@ -0,0 +1,5 @@
+const PublicGoods = () => {
+ return Public Goods
;
+};
+
+export default PublicGoods;
From f9ab7cd273282e07cbc3972969690521005e8530 Mon Sep 17 00:00:00 2001
From: Ramin
Date: Mon, 31 Jul 2023 17:43:12 +0330
Subject: [PATCH 069/175] add Public Goods route to next pages
---
pages/landings/public-goods.tsx | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
create mode 100644 pages/landings/public-goods.tsx
diff --git a/pages/landings/public-goods.tsx b/pages/landings/public-goods.tsx
new file mode 100644
index 0000000000..b5f536cda9
--- /dev/null
+++ b/pages/landings/public-goods.tsx
@@ -0,0 +1,19 @@
+import { FC } from 'react';
+import Head from 'next/head';
+import PublicGoods from '@/components/views/landings/publicGoods';
+
+const PublicGoodsRoute: FC = () => {
+ return (
+ <>
+
+
+ Giveth - Public Goods in Crypto and Web3 : Funding the
+ Future
+
+
+
+ >
+ );
+};
+
+export default PublicGoodsRoute;
From 8d014fba56a06d4a058b7fa4d3435f2ffc275fa9 Mon Sep 17 00:00:00 2001
From: Ramin
Date: Mon, 31 Jul 2023 18:02:24 +0330
Subject: [PATCH 070/175] create header
---
.../views/landings/publicGoods/header.tsx | 37 +++++++++++++++++++
1 file changed, 37 insertions(+)
create mode 100644 src/components/views/landings/publicGoods/header.tsx
diff --git a/src/components/views/landings/publicGoods/header.tsx b/src/components/views/landings/publicGoods/header.tsx
new file mode 100644
index 0000000000..05c9247077
--- /dev/null
+++ b/src/components/views/landings/publicGoods/header.tsx
@@ -0,0 +1,37 @@
+import styled from 'styled-components';
+import { neutralColors } from '@giveth/ui-design-system';
+import { mediaQueries } from '@/lib/constants/constants';
+
+const PublicGoodsHeader = () => {
+ return (
+
+
+
+ );
+};
+
+const OuterWrapper = styled.div`
+ background: ${neutralColors.gray[200]};
+ padding: 40px 10px;
+ ${mediaQueries.tablet} {
+ padding: 40px;
+ }
+`;
+
+const Wrapper = styled.div`
+ max-width: 1200px;
+ margin: 40px auto;
+ border-radius: 16px;
+ background-image: url('/images/banners/categories/all.png');
+ background-size: cover;
+ height: 630px;
+ width: 100%;
+ display: flex;
+ position: relative;
+ align-items: flex-end;
+ > h1 {
+ margin: 0 50px;
+ }
+`;
+
+export default PublicGoodsHeader;
From e29f8dde9920e291806558769fb5188fedbc66f0 Mon Sep 17 00:00:00 2001
From: Ramin
Date: Mon, 31 Jul 2023 18:02:37 +0330
Subject: [PATCH 071/175] add header to index
---
.../views/landings/publicGoods/index.tsx | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/src/components/views/landings/publicGoods/index.tsx b/src/components/views/landings/publicGoods/index.tsx
index 2462fc42b1..ea1764f1a3 100644
--- a/src/components/views/landings/publicGoods/index.tsx
+++ b/src/components/views/landings/publicGoods/index.tsx
@@ -1,5 +1,18 @@
+import styled from 'styled-components';
+import { neutralColors } from '@giveth/ui-design-system';
+import PublicGoodsHeader from '@/components/views/landings/publicGoods/header';
+
const PublicGoods = () => {
- return Public Goods
;
+ return (
+
+
+
+ );
};
+const Wrapper = styled.div`
+ background: ${neutralColors.gray[200]};
+ color: ${neutralColors.gray[900]};
+`;
+
export default PublicGoods;
From 3c555c02eed3cdbb6394fc900ad621c3eae848a5 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Tue, 1 Aug 2023 12:12:03 +0330
Subject: [PATCH 072/175] added resolvedENS to mainnet
---
src/components/views/create/CreateProject.tsx | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/components/views/create/CreateProject.tsx b/src/components/views/create/CreateProject.tsx
index 3f9af710fd..86f4b013c9 100644
--- a/src/components/views/create/CreateProject.tsx
+++ b/src/components/views/create/CreateProject.tsx
@@ -496,6 +496,8 @@ const CreateProject: FC = ({ project }) => {
networkId={MAINNET_NETWORK_NUMBER}
setShowModal={setShowMainnetAddressModal}
userAddresses={userAddresses}
+ setResolvedENS={setResolvedENS}
+ resolvedENS={resolvedENS}
/>
)}
{showGnosisAddressModal && (
From 7105294f656e80ea54e8603d6dc46796e8cedf2b Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Tue, 1 Aug 2023 12:12:17 +0330
Subject: [PATCH 073/175] added resolvedENS
---
.../views/create/CreateProjectAddAddressModal.tsx | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/src/components/views/create/CreateProjectAddAddressModal.tsx b/src/components/views/create/CreateProjectAddAddressModal.tsx
index 982353a389..5c07aac0c1 100644
--- a/src/components/views/create/CreateProjectAddAddressModal.tsx
+++ b/src/components/views/create/CreateProjectAddAddressModal.tsx
@@ -9,6 +9,8 @@ interface ICreateProjectAddAddressModal {
networkId: number;
isActive?: boolean;
userAddresses: string[];
+ setResolvedENS?: (resolvedENS: string) => void;
+ resolvedENS?: string;
}
const CreateProjectAddAddressModal = ({
@@ -16,6 +18,8 @@ const CreateProjectAddAddressModal = ({
networkId,
isActive = true,
userAddresses,
+ setResolvedENS = () => {},
+ resolvedENS,
}: ICreateProjectAddAddressModal) => {
const { isAnimating, closeModal } = useModalAnimation(setShowModal);
@@ -31,7 +35,8 @@ const CreateProjectAddAddressModal = ({
networkId={networkId}
isActive={isActive}
userAddresses={userAddresses}
- setResolvedENS={() => {}}
+ setResolvedENS={setResolvedENS}
+ resolvedENS={resolvedENS ?? undefined}
/>
From e31618a3e092c44009da53b6e67f8690b0994dc3 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Tue, 1 Aug 2023 12:47:41 +0330
Subject: [PATCH 074/175] changed hasAddress condition
---
src/components/views/create/AddressInterface.tsx | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/src/components/views/create/AddressInterface.tsx b/src/components/views/create/AddressInterface.tsx
index e1f5e934ed..5743ec8027 100644
--- a/src/components/views/create/AddressInterface.tsx
+++ b/src/components/views/create/AddressInterface.tsx
@@ -28,10 +28,8 @@ const AddressInterface = ({
onButtonClick,
}: IAddressInterfaceProps) => {
const {
- register,
formState: { errors },
getValues,
- clearErrors,
} = useFormContext();
const isMainnet = networkId === config.MAINNET_NETWORK_NUMBER;
@@ -51,7 +49,7 @@ const AddressInterface = ({
const value = getValues(inputName);
const { formatMessage } = useIntl();
- const hasAddress = !!address;
+ const hasAddress = !!address && !errors[inputName]?.message;
let caption: string = '';
if (!value) {
@@ -125,7 +123,7 @@ const AddressInterface = ({
)}
- {address ? address : 'No address added yet!'}
+ {hasAddress ? address : 'No address added yet!'}
From a64bb9150c72d2d2d310f33da7c34909f6197341 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Tue, 1 Aug 2023 12:47:59 +0330
Subject: [PATCH 075/175] added onsubmit condition
---
src/components/views/create/CreateProject.tsx | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/src/components/views/create/CreateProject.tsx b/src/components/views/create/CreateProject.tsx
index 86f4b013c9..936b0c8a5b 100644
--- a/src/components/views/create/CreateProject.tsx
+++ b/src/components/views/create/CreateProject.tsx
@@ -498,6 +498,9 @@ const CreateProject: FC = ({ project }) => {
userAddresses={userAddresses}
setResolvedENS={setResolvedENS}
resolvedENS={resolvedENS}
+ onSubmit={() =>
+ setShowMainnetAddressModal(false)
+ }
/>
)}
{showGnosisAddressModal && (
@@ -505,6 +508,9 @@ const CreateProject: FC = ({ project }) => {
networkId={XDAI_NETWORK_NUMBER}
setShowModal={setShowGnosisAddressModal}
userAddresses={userAddresses}
+ onSubmit={() =>
+ setShowGnosisAddressModal(false)
+ }
/>
)}
{showPolygonAddressModal && (
@@ -512,6 +518,9 @@ const CreateProject: FC = ({ project }) => {
networkId={POLYGON_NETWORK_NUMBER}
setShowModal={setShowPolygonAddressModal}
userAddresses={userAddresses}
+ onSubmit={() =>
+ setShowPolygonAddressModal(false)
+ }
/>
)}
{showCeloAddressModal && (
@@ -519,6 +528,7 @@ const CreateProject: FC = ({ project }) => {
networkId={CELO_NETWORK_NUMBER}
setShowModal={setShowCeloAddressModal}
userAddresses={userAddresses}
+ onSubmit={() => setShowCeloAddressModal(false)}
/>
)}
{showOptimismAddressModal && (
@@ -526,6 +536,9 @@ const CreateProject: FC = ({ project }) => {
networkId={OPTIMISM_NETWORK_NUMBER}
setShowModal={setShowOptimismAddressModal}
userAddresses={userAddresses}
+ onSubmit={() =>
+ setShowOptimismAddressModal(false)
+ }
/>
)}
From 8cb789e4f5252d4e058e179fd285b508c70bf856 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Tue, 1 Aug 2023 12:48:10 +0330
Subject: [PATCH 076/175] added onsubmit
---
src/components/views/create/CreateProjectAddAddressModal.tsx | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/components/views/create/CreateProjectAddAddressModal.tsx b/src/components/views/create/CreateProjectAddAddressModal.tsx
index 5c07aac0c1..c5bc483acc 100644
--- a/src/components/views/create/CreateProjectAddAddressModal.tsx
+++ b/src/components/views/create/CreateProjectAddAddressModal.tsx
@@ -11,6 +11,7 @@ interface ICreateProjectAddAddressModal {
userAddresses: string[];
setResolvedENS?: (resolvedENS: string) => void;
resolvedENS?: string;
+ onSubmit?: () => void;
}
const CreateProjectAddAddressModal = ({
@@ -20,6 +21,7 @@ const CreateProjectAddAddressModal = ({
userAddresses,
setResolvedENS = () => {},
resolvedENS,
+ onSubmit,
}: ICreateProjectAddAddressModal) => {
const { isAnimating, closeModal } = useModalAnimation(setShowModal);
@@ -37,6 +39,7 @@ const CreateProjectAddAddressModal = ({
userAddresses={userAddresses}
setResolvedENS={setResolvedENS}
resolvedENS={resolvedENS ?? undefined}
+ onSubmit={onSubmit}
/>
From b54633e66667f641017395fbb36e765cf8171cdf Mon Sep 17 00:00:00 2001
From: Ramin
Date: Tue, 1 Aug 2023 15:41:26 +0330
Subject: [PATCH 077/175] add GIVGIVGIV background
---
public/images/banners/GIVGIVGIV-purple.png | Bin 0 -> 1778806 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 public/images/banners/GIVGIVGIV-purple.png
diff --git a/public/images/banners/GIVGIVGIV-purple.png b/public/images/banners/GIVGIVGIV-purple.png
new file mode 100644
index 0000000000000000000000000000000000000000..688e52e2ac6eac07899a0b3f6fbf18815b211dfc
GIT binary patch
literal 1778806
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