From 63701e8245c66f59c22d917b5827fa452f3a0ecd Mon Sep 17 00:00:00 2001 From: Hrithik Sampson Date: Tue, 20 Aug 2024 16:30:05 +0530 Subject: [PATCH 1/4] Dont allow OFAC sanctioned address to enter the project donation page --- .../views/donate/OnTime/DonateModal.tsx | 44 ++++++------------- .../donate/OnTime/OneTimeDonationCard.tsx | 26 +++++++++++ 2 files changed, 39 insertions(+), 31 deletions(-) diff --git a/src/components/views/donate/OnTime/DonateModal.tsx b/src/components/views/donate/OnTime/DonateModal.tsx index 6c11bb30d3..aabb6957e3 100644 --- a/src/components/views/donate/OnTime/DonateModal.tsx +++ b/src/components/views/donate/OnTime/DonateModal.tsx @@ -150,38 +150,20 @@ const DonateModal: FC = props => { // this function is used to validate the token and check if the wallet is sanctioned const validateTokenThenDonate = async () => { setDonating(true); - try { - if ( - project?.organization?.label === ORGANIZATION.endaoment && - address - ) { - // We just need to check if the wallet is sanctioned for endaoment projects - const sanctioned = await isWalletSanctioned(address); - if (sanctioned) { - setIsSanctioned(true); - setDonating(false); - return; + client + .query({ + query: VALIDATE_TOKEN, + fetchPolicy: 'no-cache', + }) + .then((res: IMeGQL) => { + const _address = res.data?.me?.walletAddress; + if (compareAddresses(_address, address)) { + handleDonate(); + } else { + handleFailedValidation(); } - } - - client - .query({ - query: VALIDATE_TOKEN, - fetchPolicy: 'no-cache', - }) - .then((res: IMeGQL) => { - const _address = res.data?.me?.walletAddress; - if (compareAddresses(_address, address)) { - handleDonate(); - } else { - handleFailedValidation(); - } - }) - .catch(handleFailedValidation); - } catch (error) { - setDonating(false); - showToastError('Error validating wallet address'); - } + }) + .catch(handleFailedValidation); }; const handleFailedValidation = () => { diff --git a/src/components/views/donate/OnTime/OneTimeDonationCard.tsx b/src/components/views/donate/OnTime/OneTimeDonationCard.tsx index 21230d4729..16ca051f82 100644 --- a/src/components/views/donate/OnTime/OneTimeDonationCard.tsx +++ b/src/components/views/donate/OnTime/OneTimeDonationCard.tsx @@ -54,6 +54,8 @@ import { TokenIcon } from '../TokenIcon/TokenIcon'; import { SelectTokenModal } from './SelectTokenModal/SelectTokenModal'; import { Spinner } from '@/components/Spinner'; import { useSolanaBalance } from '@/hooks/useSolanaBalance'; +import { isWalletSanctioned } from '@/services/donation'; +import SanctionModal from '@/components/modals/SanctionedModal'; const CryptoDonation: FC<{ setIsQRDonation: (isQRDonation: boolean) => void; @@ -90,6 +92,7 @@ const CryptoDonation: FC<{ const [showDonateModal, setShowDonateModal] = useState(false); const [showInsufficientModal, setShowInsufficientModal] = useState(false); const [showChangeNetworkModal, setShowChangeNetworkModal] = useState(false); + const [isSanctioned, setIsSanctioned] = useState(false); const [acceptedChains, setAcceptedChains] = useState( [], ); @@ -141,6 +144,10 @@ const CryptoDonation: FC<{ address => address.chainType === ChainType.STELLAR, ); + useEffect(()=> { + validateSanctions(); + },[project, address]); + useEffect(() => { if ( (networkId || @@ -309,6 +316,17 @@ const CryptoDonation: FC<{ } }, [selectedTokenBalance, amount, selectedOneTimeToken?.address, gasfee]); + const validateSanctions = async () => { + if (project?.organization?.label === 'endaoment' && address) { + // We just need to check if the wallet is sanctioned for endaoment projects + const sanctioned = await isWalletSanctioned(address); + if (sanctioned) { + setIsSanctioned(true); + return; + } + } + } + const amountErrorText = useMemo(() => { const totalAmount = Number(formatUnits(gasfee, tokenDecimals)).toFixed( 10, @@ -325,6 +343,7 @@ const CryptoDonation: FC<{ return ( + {showQFModal && ( )} + {isSanctioned && ( + { + setIsSanctioned(false); + }} + /> + )} {showInsufficientModal && ( Date: Tue, 20 Aug 2024 16:35:58 +0530 Subject: [PATCH 2/4] chore: run linter --- src/components/views/donate/OnTime/DonateModal.tsx | 2 -- .../views/donate/OnTime/OneTimeDonationCard.tsx | 9 ++++----- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/components/views/donate/OnTime/DonateModal.tsx b/src/components/views/donate/OnTime/DonateModal.tsx index aabb6957e3..ec16eb5bb5 100644 --- a/src/components/views/donate/OnTime/DonateModal.tsx +++ b/src/components/views/donate/OnTime/DonateModal.tsx @@ -40,9 +40,7 @@ import { calcDonationShare } from '@/components/views/donate/helpers'; import { Spinner } from '@/components/Spinner'; import { FETCH_GIVETH_PROJECT_BY_ID } from '@/apollo/gql/gqlProjects'; import createGoogleTagEventPurchase from '@/helpers/googleAnalytics'; -import { isWalletSanctioned } from '@/services/donation'; import SanctionModal from '@/components/modals/SanctionedModal'; -import { ORGANIZATION } from '@/lib/constants/organizations'; interface IDonateModalProps extends IModal { token: IProjectAcceptedToken; diff --git a/src/components/views/donate/OnTime/OneTimeDonationCard.tsx b/src/components/views/donate/OnTime/OneTimeDonationCard.tsx index 16ca051f82..1ad968a73d 100644 --- a/src/components/views/donate/OnTime/OneTimeDonationCard.tsx +++ b/src/components/views/donate/OnTime/OneTimeDonationCard.tsx @@ -144,9 +144,9 @@ const CryptoDonation: FC<{ address => address.chainType === ChainType.STELLAR, ); - useEffect(()=> { + useEffect(() => { validateSanctions(); - },[project, address]); + }, [project, address]); useEffect(() => { if ( @@ -318,14 +318,14 @@ const CryptoDonation: FC<{ const validateSanctions = async () => { if (project?.organization?.label === 'endaoment' && address) { - // We just need to check if the wallet is sanctioned for endaoment projects + // We just need to check if the wallet is sanctioned for endaoment projects const sanctioned = await isWalletSanctioned(address); if (sanctioned) { setIsSanctioned(true); return; } } - } + }; const amountErrorText = useMemo(() => { const totalAmount = Number(formatUnits(gasfee, tokenDecimals)).toFixed( @@ -343,7 +343,6 @@ const CryptoDonation: FC<{ return ( - {showQFModal && ( Date: Tue, 20 Aug 2024 16:43:12 +0530 Subject: [PATCH 3/4] Always return true for all addresses to test endaoment projects to not allow sanctioned wallets --- src/services/donation.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/donation.ts b/src/services/donation.ts index e49ce7edaa..9e6383bf60 100644 --- a/src/services/donation.ts +++ b/src/services/donation.ts @@ -386,7 +386,7 @@ export async function isWalletSanctioned( // Check the response and determine if the address is sanctioned const result = data && data[0]; - return Boolean(result && result.isSanctioned); + return true; } catch (error) { console.error('Error checking wallet sanction status:', error); return false; From f5855298c5749aaa89cf2583f05406dedb19f480 Mon Sep 17 00:00:00 2001 From: Hrithik Sampson Date: Tue, 20 Aug 2024 17:35:55 +0530 Subject: [PATCH 4/4] fix: Dont allow Sanction Modal and DonateWrongNetwork Modal overshadowing --- .../views/donate/OnTime/OneTimeDonationCard.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/components/views/donate/OnTime/OneTimeDonationCard.tsx b/src/components/views/donate/OnTime/OneTimeDonationCard.tsx index 1ad968a73d..3317519923 100644 --- a/src/components/views/donate/OnTime/OneTimeDonationCard.tsx +++ b/src/components/views/donate/OnTime/OneTimeDonationCard.tsx @@ -343,13 +343,20 @@ const CryptoDonation: FC<{ return ( + {isSanctioned && ( + { + setIsSanctioned(false); + }} + /> + )} {showQFModal && ( )} - {showChangeNetworkModal && acceptedChains && ( + {!isSanctioned && showChangeNetworkModal && acceptedChains && ( )} - {isSanctioned && ( - { - setIsSanctioned(false); - }} - /> - )} {showInsufficientModal && (