ethers/lib/utils#isAddress TypeScript Examples
The following examples show how to use
ethers/lib/utils#isAddress.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: index.ts From ccip-read with MIT License | 6 votes |
async handleRequest(req: express.Request, res: express.Response) {
let sender: string;
let callData: string;
if (req.method === 'GET') {
sender = req.params.sender;
callData = req.params.callData;
} else {
sender = req.body.sender;
callData = req.body.data;
}
if (!isAddress(sender) || !isBytesLike(callData)) {
res.status(400).json({
message: 'Invalid request format',
});
return;
}
try {
const response = await this.call({ to: sender, data: callData });
res.status(response.status).json(response.body);
} catch (e) {
res.status(500).json({
message: `Internal server error: ${(e as any).toString()}`,
});
}
}
Example #2
Source File: strategiesHelper.ts From yearn-watch-legacy with GNU Affero General Public License v3.0 | 6 votes |
getStrategyAddresses = async (
namesOrAddresses: string[],
network: Network
) => {
const addresses = new Array<string>();
for (const nameOrAddress of namesOrAddresses) {
if (isAddress(nameOrAddress)) {
if (!addresses.includes(nameOrAddress.toLowerCase())) {
addresses.push(nameOrAddress.toLowerCase());
}
} else {
const nameAddresses =
await getAssetsStrategiesAddressesByFilterNames(
[nameOrAddress],
network
);
addresses.push(...nameAddresses);
}
}
return Array.from(new Set<string>(addresses));
}
Example #3
Source File: index.ts From yearn-watch-legacy with GNU Affero General Public License v3.0 | 6 votes |
public getVault = async (address: string): Promise<Vault> => {
if (!address || !isAddress(address)) {
throw new Error('Invalid vault address');
}
const vaults = await this.getVaults(
[address],
DEFAULT_QUERY_PARAM,
false,
[address]
);
if (vaults.length > 0) {
return vaults[0];
}
// Try experimental vaults if not found in endorsed
const experimentalVaults = await this.getVaults(
[address],
DEFAULT_QUERY_PARAM,
true,
[address]
);
if (experimentalVaults.length > 0) {
return experimentalVaults[0];
}
throw new Error('Address not recognized as a Yearn vault');
};
Example #4
Source File: hooks.ts From luaswap-interface with GNU General Public License v3.0 | 6 votes |
export function useDelegateCallback(): (delegatee: string | undefined) => undefined | Promise<string> {
const { account, chainId, library } = useActiveWeb3React()
const addTransaction = useTransactionAdder()
const uniContract = useUniContract()
return useCallback(
(delegatee: string | undefined) => {
if (!library || !chainId || !account || !isAddress(delegatee ?? '')) return undefined
const args = [delegatee]
if (!uniContract) throw new Error('No UNI Contract!')
return uniContract.estimateGas.delegate(...args, {}).then(estimatedGasLimit => {
return uniContract
.delegate(...args, { value: null, gasLimit: calculateGasMargin(estimatedGasLimit) })
.then((response: TransactionResponse) => {
addTransaction(response, {
summary: `Delegated votes`
})
return response.hash
})
})
},
[account, addTransaction, chainId, library, uniContract]
)
}
Example #5
Source File: hooks.ts From forward.swaps with GNU General Public License v3.0 | 6 votes |
export function useDelegateCallback(): (delegatee: string | undefined) => undefined | Promise<string> {
const { account, chainId, library } = useActiveWeb3React()
const addTransaction = useTransactionAdder()
const uniContract = useUniContract()
return useCallback(
(delegatee: string | undefined) => {
if (!library || !chainId || !account || !isAddress(delegatee ?? '')) return undefined
const args = [delegatee]
if (!uniContract) throw new Error('No UNI Contract!')
return uniContract.estimateGas.delegate(...args, {}).then(estimatedGasLimit => {
return uniContract
.delegate(...args, { value: null, gasLimit: calculateGasMargin(estimatedGasLimit) })
.then((response: TransactionResponse) => {
addTransaction(response, {
summary: `Delegated votes`
})
return response.hash
})
})
},
[account, addTransaction, chainId, library, uniContract]
)
}
Example #6
Source File: hooks.ts From interface-v2 with GNU General Public License v3.0 | 6 votes |
export function useDelegateCallback(): (
delegatee: string | undefined,
) => undefined | Promise<string> {
const { account, chainId, library } = useActiveWeb3React();
const addTransaction = useTransactionAdder();
const uniContract = useUniContract();
return useCallback(
(delegatee: string | undefined) => {
if (!library || !chainId || !account || !isAddress(delegatee ?? ''))
return undefined;
const args = [delegatee];
if (!uniContract) throw new Error('No QUICK Contract!');
return uniContract.estimateGas
.delegate(...args, {})
.then((estimatedGasLimit) => {
return uniContract
.delegate(...args, {
value: null,
gasLimit: calculateGasMargin(estimatedGasLimit),
})
.then((response: TransactionResponse) => {
addTransaction(response, {
summary: `Delegated votes`,
});
return response.hash;
});
});
},
[account, addTransaction, chainId, library, uniContract],
);
}
Example #7
Source File: AddressInput.tsx From mStable-apps with GNU Lesser General Public License v3.0 | 6 votes |
AddressInput: FC<Props> = ({ onClick, title, className }) => {
const inputValue = useRef<string | undefined>()
const [invalid, setInvalid] = useState(false)
const handleChange = useCallback<ChangeEventHandler<HTMLInputElement>>(event => {
inputValue.current = event.target.value
}, [])
const handleClick = useCallback(() => {
const address = inputValue.current ?? ''
if (!isAddress(address)) {
setInvalid(true)
setTimeout(() => setInvalid(false), 200)
return
}
onClick(address)
}, [onClick])
return (
<Container className={className}>
<CSSTransition in={invalid} timeout={200}>
{className => <StyledInput className={className} placeholder="0x0000…0000" onChange={handleChange} />}
</CSSTransition>
<Button onClick={handleClick}>{title}</Button>
</Container>
)
}
Example #8
Source File: Delegatee.tsx From mStable-apps with GNU Lesser General Public License v3.0 | 6 votes |
Delegatee: FC = () => {
useLayoutEffect(() => {
window.scrollTo({ top: 0 })
}, [])
const { delegatee: addressOrENSName } = useParams<{ delegatee: string }>()
return isAddress(addressOrENSName) ? (
<Content address={addressOrENSName} addressOrENSName={addressOrENSName} />
) : (
<ResolveENS
ensName={addressOrENSName}
render={({ resolvedENSName }) => <Content addressOrENSName={addressOrENSName} resolvedENSName={resolvedENSName} />}
/>
)
}
Example #9
Source File: redirects.tsx From glide-frontend with GNU General Public License v3.0 | 6 votes |
RedirectInvalidToken = (props: RouteComponentProps<{ address: string }>) => {
const {
match: {
params: { address },
},
} = props
// In case somebody pastes checksummed address into url (since GraphQL expects lowercase address)
if (!isAddress(address.toLowerCase())) {
return <Redirect to="/" />
}
return <TokenPage {...props} />
}
Example #10
Source File: hooks.ts From dyp with Do What The F*ck You Want To Public License | 6 votes |
export function useDelegateCallback(): (delegatee: string | undefined) => undefined | Promise<string> {
const { account, chainId, library } = useActiveWeb3React()
const addTransaction = useTransactionAdder()
const uniContract = useUniContract()
return useCallback(
(delegatee: string | undefined) => {
if (!library || !chainId || !account || !isAddress(delegatee ?? '')) return undefined
const args = [delegatee]
if (!uniContract) throw new Error('No UNI Contract!')
return uniContract.estimateGas.delegate(...args, {}).then(estimatedGasLimit => {
return uniContract
.delegate(...args, { value: null, gasLimit: calculateGasMargin(estimatedGasLimit) })
.then((response: TransactionResponse) => {
addTransaction(response, {
summary: `Delegated votes`
})
return response.hash
})
})
},
[account, addTransaction, chainId, library, uniContract]
)
}
Example #11
Source File: AddressClaimModal.tsx From forward.swaps with GNU General Public License v3.0 | 4 votes |
export default function AddressClaimModal({ isOpen, onDismiss }: { isOpen: boolean; onDismiss: () => void }) {
const { chainId } = useActiveWeb3React()
// state for smart contract input
const [typed, setTyped] = useState('')
function handleRecipientType(val: string) {
setTyped(val)
}
// monitor for third party recipient of claim
const { address: parsedAddress } = useENS(typed)
// used for UI loading states
const [attempting, setAttempting] = useState<boolean>(false)
// monitor the status of the claim from contracts and txns
const { claimCallback } = useClaimCallback(parsedAddress)
const unclaimedAmount: TokenAmount | undefined = useUserUnclaimedAmount(parsedAddress)
// check if the user has something available
const hasAvailableClaim = useUserHasAvailableClaim(parsedAddress)
const [hash, setHash] = useState<string | undefined>()
// monitor the status of the claim from contracts and txns
const claimPending = useIsTransactionPending(hash ?? '')
const claimConfirmed = hash && !claimPending
// use the hash to monitor this txn
function onClaim() {
setAttempting(true)
claimCallback()
.then(hash => {
setHash(hash)
})
// reset modal and log error
.catch(error => {
setAttempting(false)
console.log(error)
})
}
function wrappedOnDismiss() {
setAttempting(false)
setHash(undefined)
setTyped('')
onDismiss()
}
return (
<Modal isOpen={isOpen} onDismiss={wrappedOnDismiss} maxHeight={90}>
<Confetti start={Boolean(isOpen && claimConfirmed && attempting)} />
{!attempting && (
<ContentWrapper gap="lg">
<ModalUpper>
<CardBGImage />
<CardNoise />
<CardSection gap="md">
<RowBetween>
<TYPE.white fontWeight={500}>Claim UNI Token</TYPE.white>
<CloseIcon onClick={wrappedOnDismiss} style={{ zIndex: 99 }} stroke="white" />
</RowBetween>
<TYPE.white fontWeight={700} fontSize={36}>
{unclaimedAmount?.toFixed(0, { groupSeparator: ',' } ?? '-')} UNI
</TYPE.white>
</CardSection>
<Break />
</ModalUpper>
<AutoColumn gap="md" style={{ padding: '1rem', paddingTop: '0' }} justify="center">
<TYPE.subHeader fontWeight={500}>
Enter an address to trigger a UNI claim. If the address has any claimable UNI it will be sent to them on
submission.
</TYPE.subHeader>
<AddressInputPanel value={typed} onChange={handleRecipientType} />
{parsedAddress && !hasAvailableClaim && (
<TYPE.error error={true}>Address has no available claim</TYPE.error>
)}
<ButtonPrimary
disabled={!isAddress(parsedAddress ?? '') || !hasAvailableClaim}
padding="16px 16px"
width="100%"
borderRadius="12px"
mt="1rem"
onClick={onClaim}
>
Claim UNI
</ButtonPrimary>
</AutoColumn>
</ContentWrapper>
)}
{(attempting || claimConfirmed) && (
<ConfirmOrLoadingWrapper activeBG={true}>
<CardNoise />
<CardBGImageSmaller desaturate />
<RowBetween>
<div />
<CloseIcon onClick={wrappedOnDismiss} style={{ zIndex: 99 }} stroke="black" />
</RowBetween>
<ConfirmedIcon>
{!claimConfirmed ? (
<CustomLightSpinner src={Circle} alt="loader" size={'90px'} />
) : (
<UniTokenAnimated width="72px" src={tokenLogo} />
)}
</ConfirmedIcon>
<AutoColumn gap="100px" justify={'center'}>
<AutoColumn gap="12px" justify={'center'}>
<TYPE.largeHeader fontWeight={600} color="black">
{claimConfirmed ? 'Claimed' : 'Claiming'}
</TYPE.largeHeader>
{!claimConfirmed && (
<Text fontSize={36} color={'#ff007a'} fontWeight={800}>
{unclaimedAmount?.toFixed(0, { groupSeparator: ',' } ?? '-')} UNI
</Text>
)}
{parsedAddress && (
<TYPE.largeHeader fontWeight={600} color="black">
for {shortenAddress(parsedAddress)}
</TYPE.largeHeader>
)}
</AutoColumn>
{claimConfirmed && (
<>
<TYPE.subHeader fontWeight={500} color="black">
<span role="img" aria-label="party-hat">
?{' '}
</span>
Welcome to team Unicorn :){' '}
<span role="img" aria-label="party-hat">
?
</span>
</TYPE.subHeader>
</>
)}
{attempting && !hash && (
<TYPE.subHeader color="black">Confirm this transaction in your wallet</TYPE.subHeader>
)}
{attempting && hash && !claimConfirmed && chainId && hash && (
<ExternalLink href={getEtherscanLink(chainId, hash, 'transaction')} style={{ zIndex: 99 }}>
View transaction on Etherscan
</ExternalLink>
)}
</AutoColumn>
</ConfirmOrLoadingWrapper>
)}
</Modal>
)
}
Example #12
Source File: AddressClaimModal.tsx From luaswap-interface with GNU General Public License v3.0 | 4 votes |
export default function AddressClaimModal({ isOpen, onDismiss }: { isOpen: boolean; onDismiss: () => void }) {
const { chainId } = useActiveWeb3React()
// state for smart contract input
const [typed, setTyped] = useState('')
function handleRecipientType(val: string) {
setTyped(val)
}
// monitor for third party recipient of claim
const { address: parsedAddress } = useENS(typed)
// used for UI loading states
const [attempting, setAttempting] = useState<boolean>(false)
// monitor the status of the claim from contracts and txns
const { claimCallback } = useClaimCallback(parsedAddress)
const unclaimedAmount: TokenAmount | undefined = useUserUnclaimedAmount(parsedAddress)
// check if the user has something available
const hasAvailableClaim = useUserHasAvailableClaim(parsedAddress)
const [hash, setHash] = useState<string | undefined>()
// monitor the status of the claim from contracts and txns
const claimPending = useIsTransactionPending(hash ?? '')
const claimConfirmed = hash && !claimPending
// use the hash to monitor this txn
function onClaim() {
setAttempting(true)
claimCallback()
.then(hash => {
setHash(hash)
})
// reset modal and log error
.catch(error => {
setAttempting(false)
console.log(error)
})
}
function wrappedOnDismiss() {
setAttempting(false)
setHash(undefined)
setTyped('')
onDismiss()
}
return (
<Modal isOpen={isOpen} onDismiss={wrappedOnDismiss} maxHeight={90}>
<Confetti start={Boolean(isOpen && claimConfirmed && attempting)} />
{!attempting && (
<ContentWrapper gap="lg">
<ModalUpper>
<CardBGImage />
<CardNoise />
<CardSection gap="md">
<RowBetween>
<TYPE.white fontWeight={500}>Claim LUA Token</TYPE.white>
<CloseIcon onClick={wrappedOnDismiss} style={{ zIndex: 99 }} stroke="white" />
</RowBetween>
<TYPE.white fontWeight={700} fontSize={36}>
{unclaimedAmount?.toFixed(0, { groupSeparator: ',' } ?? '-')} LUA
</TYPE.white>
</CardSection>
<Break />
</ModalUpper>
<AutoColumn gap="md" style={{ padding: '1rem', paddingTop: '0' }} justify="center">
<TYPE.subHeader fontWeight={500}>
Enter an address to trigger a LUA claim. If the address has any claimable LUA it will be sent to them on
submission.
</TYPE.subHeader>
<AddressInputPanel value={typed} onChange={handleRecipientType} />
{parsedAddress && !hasAvailableClaim && (
<TYPE.error error={true}>Address has no available claim</TYPE.error>
)}
<ButtonPrimary
disabled={!isAddress(parsedAddress ?? '') || !hasAvailableClaim}
padding="16px 16px"
width="100%"
borderRadius="12px"
mt="1rem"
onClick={onClaim}
>
Claim LUA
</ButtonPrimary>
</AutoColumn>
</ContentWrapper>
)}
{(attempting || claimConfirmed) && (
<ConfirmOrLoadingWrapper activeBG={true}>
<CardNoise />
<CardBGImageSmaller desaturate />
<RowBetween>
<div />
<CloseIcon onClick={wrappedOnDismiss} style={{ zIndex: 99 }} stroke="black" />
</RowBetween>
<ConfirmedIcon>
{!claimConfirmed ? (
<CustomLightSpinner src={Circle} alt="loader" size={'90px'} />
) : (
<UniTokenAnimated width="72px" src={tokenLogo} />
)}
</ConfirmedIcon>
<AutoColumn gap="100px" justify={'center'}>
<AutoColumn gap="12px" justify={'center'}>
<TYPE.largeHeader fontWeight={600} color="black">
{claimConfirmed ? 'Claimed' : 'Claiming'}
</TYPE.largeHeader>
{!claimConfirmed && (
<Text fontSize={36} color={'#ff007a'} fontWeight={800}>
{unclaimedAmount?.toFixed(0, { groupSeparator: ',' } ?? '-')} LUA
</Text>
)}
{parsedAddress && (
<TYPE.largeHeader fontWeight={600} color="black">
for {shortenAddress(parsedAddress)}
</TYPE.largeHeader>
)}
</AutoColumn>
{claimConfirmed && (
<>
<TYPE.subHeader fontWeight={500} color="black">
<span role="img" aria-label="party-hat">
?{' '}
</span>
Welcome to team Unicorn :){' '}
<span role="img" aria-label="party-hat">
?
</span>
</TYPE.subHeader>
</>
)}
{attempting && !hash && (
<TYPE.subHeader color="black">Confirm this transaction in your wallet</TYPE.subHeader>
)}
{attempting && hash && !claimConfirmed && chainId && hash && (
<ExternalLink href={getEtherscanLink(chainId, hash, 'transaction')} style={{ zIndex: 99 }}>
View transaction on Etherscan
</ExternalLink>
)}
</AutoColumn>
</ConfirmOrLoadingWrapper>
)}
</Modal>
)
}
Example #13
Source File: ClaimModal.tsx From luaswap-interface with GNU General Public License v3.0 | 4 votes |
export default function ClaimModal() {
const isOpen = useModalOpen(ApplicationModal.SELF_CLAIM)
const toggleClaimModal = useToggleSelfClaimModal()
const { account, chainId } = useActiveWeb3React()
// used for UI loading states
const [attempting, setAttempting] = useState<boolean>(false)
// get user claim data
const userClaimData = useUserClaimData(account)
// monitor the status of the claim from contracts and txns
const { claimCallback } = useClaimCallback(account)
const unclaimedAmount: TokenAmount | undefined = useUserUnclaimedAmount(account)
const { claimSubmitted, claimTxn } = useUserHasSubmittedClaim(account ?? undefined)
const claimConfirmed = Boolean(claimTxn?.receipt)
function onClaim() {
setAttempting(true)
claimCallback()
// reset modal and log error
.catch(error => {
setAttempting(false)
console.log(error)
})
}
// once confirmed txn is found, if modal is closed open, mark as not attempting regradless
useEffect(() => {
if (claimConfirmed && claimSubmitted && attempting) {
setAttempting(false)
if (!isOpen) {
toggleClaimModal()
}
}
}, [attempting, claimConfirmed, claimSubmitted, isOpen, toggleClaimModal])
const nonLPAmount = JSBI.multiply(
JSBI.BigInt((userClaimData?.flags?.isSOCKS ? SOCKS_AMOUNT : 0) + (userClaimData?.flags?.isUser ? USER_AMOUNT : 0)),
JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(18))
)
return (
<Modal isOpen={isOpen} onDismiss={toggleClaimModal} maxHeight={90}>
<Confetti start={Boolean(isOpen && claimConfirmed)} />
{!attempting && !claimConfirmed && (
<ContentWrapper gap="lg">
<ModalUpper>
<CardBGImage />
<CardNoise />
<CardSection gap="md">
<RowBetween>
<TYPE.white fontWeight={500}>Claim LUA</TYPE.white>
<CloseIcon onClick={toggleClaimModal} style={{ zIndex: 99 }} color="white" />
</RowBetween>
<TYPE.white fontWeight={700} fontSize={36}>
{unclaimedAmount?.toFixed(0, { groupSeparator: ',' } ?? '-')} LUA
</TYPE.white>
</CardSection>
<Break />
<CardSection gap="sm">
{userClaimData?.flags?.isSOCKS && (
<RowBetween>
<TYPE.subHeader color="white">SOCKS</TYPE.subHeader>
<TYPE.subHeader color="white">{SOCKS_AMOUNT} LUA</TYPE.subHeader>
</RowBetween>
)}
{userClaimData?.flags?.isLP &&
unclaimedAmount &&
JSBI.greaterThanOrEqual(unclaimedAmount.raw, nonLPAmount) && (
<RowBetween>
<TYPE.subHeader color="white">Liquidity</TYPE.subHeader>
<TYPE.subHeader color="white">
{unclaimedAmount
.subtract(new TokenAmount(unclaimedAmount.token, nonLPAmount))
.toFixed(0, { groupSeparator: ',' })}{' '}
LUA
</TYPE.subHeader>
</RowBetween>
)}
{userClaimData?.flags?.isUser && (
<RowBetween>
<TYPE.subHeader color="white">User</TYPE.subHeader>
<TYPE.subHeader color="white">{USER_AMOUNT} LUA</TYPE.subHeader>
</RowBetween>
)}
</CardSection>
</ModalUpper>
<AutoColumn gap="md" style={{ padding: '1rem', paddingTop: '0' }} justify="center">
<TYPE.subHeader fontWeight={500}>
As a member of the LuaSwap community you may claim LUA to be used for voting and governance. <br /> <br />
<ExternalLink href="https://luaswap.org/blog/lua">Read more about LUA</ExternalLink>
</TYPE.subHeader>
<ButtonPrimary
disabled={!isAddress(account ?? '')}
padding="16px 16px"
width="100%"
borderRadius="12px"
mt="1rem"
onClick={onClaim}
>
Claim LUA
</ButtonPrimary>
</AutoColumn>
</ContentWrapper>
)}
{(attempting || claimConfirmed) && (
<ConfirmOrLoadingWrapper activeBG={true}>
<CardNoise />
<CardBGImageSmaller desaturate />
<RowBetween>
<div />
<CloseIcon onClick={toggleClaimModal} style={{ zIndex: 99 }} stroke="black" />
</RowBetween>
<ConfirmedIcon>
{!claimConfirmed ? (
<CustomLightSpinner src={Circle} alt="loader" size={'90px'} />
) : (
<UniTokenAnimated width="72px" src={tokenLogo} />
)}
</ConfirmedIcon>
<AutoColumn gap="100px" justify={'center'}>
<AutoColumn gap="12px" justify={'center'}>
<TYPE.largeHeader fontWeight={600} color="black">
{claimConfirmed ? 'Claimed!' : 'Claiming'}
</TYPE.largeHeader>
{!claimConfirmed && (
<Text fontSize={36} color={'#ff007a'} fontWeight={800}>
{unclaimedAmount?.toFixed(0, { groupSeparator: ',' } ?? '-')} LUA
</Text>
)}
</AutoColumn>
{claimConfirmed && (
<>
<TYPE.subHeader fontWeight={500} color="black">
<span role="img" aria-label="party-hat">
?{' '}
</span>
Welcome to team Unicorn :){' '}
<span role="img" aria-label="party-hat">
?
</span>
</TYPE.subHeader>
</>
)}
{attempting && !claimSubmitted && (
<TYPE.subHeader color="black">Confirm this transaction in your wallet</TYPE.subHeader>
)}
{attempting && claimSubmitted && !claimConfirmed && chainId && claimTxn?.hash && (
<ExternalLink href={getEtherscanLink(chainId, claimTxn?.hash, 'transaction')} style={{ zIndex: 99 }}>
View transaction on Etherscan
</ExternalLink>
)}
</AutoColumn>
</ConfirmOrLoadingWrapper>
)}
</Modal>
)
}
Example #14
Source File: DelegateModal.tsx From luaswap-interface with GNU General Public License v3.0 | 4 votes |
export default function DelegateModal({ isOpen, onDismiss, title }: VoteModalProps) {
const { account, chainId } = useActiveWeb3React()
// state for delegate input
const [usingDelegate, setUsingDelegate] = useState(false)
const [typed, setTyped] = useState('')
function handleRecipientType(val: string) {
setTyped(val)
}
// monitor for self delegation or input for third part delegate
// default is self delegation
const activeDelegate = usingDelegate ? typed : account
const { address: parsedAddress } = useENS(activeDelegate)
// get the number of votes available to delegate
const uniBalance = useTokenBalance(account ?? undefined, chainId ? UNI[chainId] : undefined)
const delegateCallback = useDelegateCallback()
// monitor call to help UI loading state
const [hash, setHash] = useState<string | undefined>()
const [attempting, setAttempting] = useState(false)
// wrapper to reset state on modal close
function wrappedOndismiss() {
setHash(undefined)
setAttempting(false)
onDismiss()
}
async function onDelegate() {
setAttempting(true)
// if callback not returned properly ignore
if (!delegateCallback) return
// try delegation and store hash
const hash = await delegateCallback(parsedAddress ?? undefined)?.catch(error => {
setAttempting(false)
console.log(error)
})
if (hash) {
setHash(hash)
}
}
return (
<Modal isOpen={isOpen} onDismiss={wrappedOndismiss} maxHeight={90}>
{!attempting && !hash && (
<ContentWrapper gap="lg">
<AutoColumn gap="lg" justify="center">
<RowBetween>
<TYPE.mediumHeader fontWeight={500}>{title}</TYPE.mediumHeader>
<StyledClosed stroke="black" onClick={wrappedOndismiss} />
</RowBetween>
<TYPE.body>Earned LUA tokens represent voting shares in LuaSwap governance.</TYPE.body>
<TYPE.body>
You can either vote on each proposal yourself or delegate your votes to a third party.
</TYPE.body>
{usingDelegate && <AddressInputPanel value={typed} onChange={handleRecipientType} />}
<ButtonPrimary disabled={!isAddress(parsedAddress ?? '')} onClick={onDelegate}>
<TYPE.mediumHeader color="white">{usingDelegate ? 'Delegate Votes' : 'Self Delegate'}</TYPE.mediumHeader>
</ButtonPrimary>
<TextButton onClick={() => setUsingDelegate(!usingDelegate)}>
<TYPE.blue>
{usingDelegate ? 'Remove' : 'Add'} Delegate {!usingDelegate && '+'}
</TYPE.blue>
</TextButton>
</AutoColumn>
</ContentWrapper>
)}
{attempting && !hash && (
<LoadingView onDismiss={wrappedOndismiss}>
<AutoColumn gap="12px" justify={'center'}>
<TYPE.largeHeader>{usingDelegate ? 'Delegating votes' : 'Unlocking Votes'}</TYPE.largeHeader>
<TYPE.main fontSize={36}>{uniBalance?.toSignificant(4)}</TYPE.main>
</AutoColumn>
</LoadingView>
)}
{hash && (
<SubmittedView onDismiss={wrappedOndismiss} hash={hash}>
<AutoColumn gap="12px" justify={'center'}>
<TYPE.largeHeader>Transaction Submitted</TYPE.largeHeader>
<TYPE.main fontSize={36}>{uniBalance?.toSignificant(4)}</TYPE.main>
</AutoColumn>
</SubmittedView>
)}
</Modal>
)
}
Example #15
Source File: DelegateModal.tsx From dyp with Do What The F*ck You Want To Public License | 4 votes |
export default function DelegateModal({ isOpen, onDismiss, title }: VoteModalProps) {
const { account, chainId } = useActiveWeb3React()
// state for delegate input
const [usingDelegate, setUsingDelegate] = useState(false)
const [typed, setTyped] = useState('')
function handleRecipientType(val: string) {
setTyped(val)
}
// monitor for self delegation or input for third part delegate
// default is self delegation
const activeDelegate = usingDelegate ? typed : account
const { address: parsedAddress } = useENS(activeDelegate)
// get the number of votes available to delegate
const uniBalance = useTokenBalance(account ?? undefined, chainId ? UNI[chainId] : undefined)
const delegateCallback = useDelegateCallback()
// monitor call to help UI loading state
const [hash, setHash] = useState<string | undefined>()
const [attempting, setAttempting] = useState(false)
// wrapper to reset state on modal close
function wrappedOndismiss() {
setHash(undefined)
setAttempting(false)
onDismiss()
}
async function onDelegate() {
setAttempting(true)
// if callback not returned properly ignore
if (!delegateCallback) return
// try delegation and store hash
const hash = await delegateCallback(parsedAddress ?? undefined)?.catch(error => {
setAttempting(false)
console.log(error)
})
if (hash) {
setHash(hash)
}
}
return (
<Modal isOpen={isOpen} onDismiss={wrappedOndismiss} maxHeight={90}>
{!attempting && !hash && (
<ContentWrapper gap="lg">
<AutoColumn gap="lg" justify="center">
<RowBetween>
<TYPE.mediumHeader fontWeight={500}>{title}</TYPE.mediumHeader>
<StyledClosed stroke="black" onClick={wrappedOndismiss} />
</RowBetween>
<TYPE.body>Earned UNI tokens represent voting shares in Uniswap governance.</TYPE.body>
<TYPE.body>
You can either vote on each proposal yourself or delegate your votes to a third party.
</TYPE.body>
{usingDelegate && <AddressInputPanel value={typed} onChange={handleRecipientType} />}
<ButtonPrimary disabled={!isAddress(parsedAddress ?? '')} onClick={onDelegate}>
<TYPE.mediumHeader color="white">{usingDelegate ? 'Delegate Votes' : 'Self Delegate'}</TYPE.mediumHeader>
</ButtonPrimary>
<TextButton onClick={() => setUsingDelegate(!usingDelegate)}>
<TYPE.blue>
{usingDelegate ? 'Remove' : 'Add'} Delegate {!usingDelegate && '+'}
</TYPE.blue>
</TextButton>
</AutoColumn>
</ContentWrapper>
)}
{attempting && !hash && (
<LoadingView onDismiss={wrappedOndismiss}>
<AutoColumn gap="12px" justify={'center'}>
<TYPE.largeHeader>{usingDelegate ? 'Delegating votes' : 'Unlocking Votes'}</TYPE.largeHeader>
<TYPE.main fontSize={36}>{uniBalance?.toSignificant(4)}</TYPE.main>
</AutoColumn>
</LoadingView>
)}
{hash && (
<SubmittedView onDismiss={wrappedOndismiss} hash={hash}>
<AutoColumn gap="12px" justify={'center'}>
<TYPE.largeHeader>Transaction Submitted</TYPE.largeHeader>
<TYPE.main fontSize={36}>{uniBalance?.toSignificant(4)}</TYPE.main>
</AutoColumn>
</SubmittedView>
)}
</Modal>
)
}
Example #16
Source File: ClaimModal.tsx From dyp with Do What The F*ck You Want To Public License | 4 votes |
export default function ClaimModal() {
const isOpen = useModalOpen(ApplicationModal.SELF_CLAIM)
const toggleClaimModal = useToggleSelfClaimModal()
const { account, chainId } = useActiveWeb3React()
// used for UI loading states
const [attempting, setAttempting] = useState<boolean>(false)
// get user claim data
const userClaimData = useUserClaimData(account)
// monitor the status of the claim from contracts and txns
const { claimCallback } = useClaimCallback(account)
const unclaimedAmount: TokenAmount | undefined = useUserUnclaimedAmount(account)
const { claimSubmitted, claimTxn } = useUserHasSubmittedClaim(account ?? undefined)
const claimConfirmed = Boolean(claimTxn?.receipt)
function onClaim() {
setAttempting(true)
claimCallback()
// reset modal and log error
.catch(error => {
setAttempting(false)
console.log(error)
})
}
// once confirmed txn is found, if modal is closed open, mark as not attempting regradless
useEffect(() => {
if (claimConfirmed && claimSubmitted && attempting) {
setAttempting(false)
if (!isOpen) {
toggleClaimModal()
}
}
}, [attempting, claimConfirmed, claimSubmitted, isOpen, toggleClaimModal])
const nonLPAmount = JSBI.multiply(
JSBI.BigInt((userClaimData?.flags?.isSOCKS ? SOCKS_AMOUNT : 0) + (userClaimData?.flags?.isUser ? USER_AMOUNT : 0)),
JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(18))
)
return (
<Modal isOpen={isOpen} onDismiss={toggleClaimModal} maxHeight={90}>
<Confetti start={Boolean(isOpen && claimConfirmed)} />
{!attempting && !claimConfirmed && (
<ContentWrapper gap="lg">
<ModalUpper>
<CardBGImage />
<CardNoise />
<CardSection gap="md">
<RowBetween>
<TYPE.white fontWeight={500}>Claim UNI</TYPE.white>
<CloseIcon onClick={toggleClaimModal} style={{ zIndex: 99 }} color="white" />
</RowBetween>
<TYPE.white fontWeight={700} fontSize={36}>
{unclaimedAmount?.toFixed(0, { groupSeparator: ',' } ?? '-')} UNI
</TYPE.white>
</CardSection>
<Break />
<CardSection gap="sm">
{userClaimData?.flags?.isSOCKS && (
<RowBetween>
<TYPE.subHeader color="white">SOCKS</TYPE.subHeader>
<TYPE.subHeader color="white">{SOCKS_AMOUNT} UNI</TYPE.subHeader>
</RowBetween>
)}
{userClaimData?.flags?.isLP &&
unclaimedAmount &&
JSBI.greaterThanOrEqual(unclaimedAmount.raw, nonLPAmount) && (
<RowBetween>
<TYPE.subHeader color="white">Liquidity</TYPE.subHeader>
<TYPE.subHeader color="white">
{unclaimedAmount
.subtract(new TokenAmount(unclaimedAmount.token, nonLPAmount))
.toFixed(0, { groupSeparator: ',' })}{' '}
UNI
</TYPE.subHeader>
</RowBetween>
)}
{userClaimData?.flags?.isUser && (
<RowBetween>
<TYPE.subHeader color="white">User</TYPE.subHeader>
<TYPE.subHeader color="white">{USER_AMOUNT} UNI</TYPE.subHeader>
</RowBetween>
)}
</CardSection>
</ModalUpper>
<AutoColumn gap="md" style={{ padding: '1rem', paddingTop: '0' }} justify="center">
<TYPE.subHeader fontWeight={500}>
As a member of the Uniswap community you may claim UNI to be used for voting and governance. <br /> <br />
<ExternalLink href="https://uniswap.org/blog/uni">Read more about UNI</ExternalLink>
</TYPE.subHeader>
<ButtonPrimary
disabled={!isAddress(account ?? '')}
padding="16px 16px"
width="100%"
borderRadius="12px"
mt="1rem"
onClick={onClaim}
>
Claim UNI
</ButtonPrimary>
</AutoColumn>
</ContentWrapper>
)}
{(attempting || claimConfirmed) && (
<ConfirmOrLoadingWrapper activeBG={true}>
<CardNoise />
<CardBGImageSmaller desaturate />
<RowBetween>
<div />
<CloseIcon onClick={toggleClaimModal} style={{ zIndex: 99 }} stroke="black" />
</RowBetween>
<ConfirmedIcon>
{!claimConfirmed ? (
<CustomLightSpinner src={Circle} alt="loader" size={'90px'} />
) : (
<UniTokenAnimated width="72px" src={tokenLogo} />
)}
</ConfirmedIcon>
<AutoColumn gap="100px" justify={'center'}>
<AutoColumn gap="12px" justify={'center'}>
<TYPE.largeHeader fontWeight={600} color="black">
{claimConfirmed ? 'Claimed!' : 'Claiming'}
</TYPE.largeHeader>
{!claimConfirmed && (
<Text fontSize={36} color={'#ff007a'} fontWeight={800}>
{unclaimedAmount?.toFixed(0, { groupSeparator: ',' } ?? '-')} UNI
</Text>
)}
</AutoColumn>
{claimConfirmed && (
<>
<TYPE.subHeader fontWeight={500} color="black">
<span role="img" aria-label="party-hat">
?{' '}
</span>
Welcome to team Unicorn :){' '}
<span role="img" aria-label="party-hat">
?
</span>
</TYPE.subHeader>
</>
)}
{attempting && !claimSubmitted && (
<TYPE.subHeader color="black">Confirm this transaction in your wallet</TYPE.subHeader>
)}
{attempting && claimSubmitted && !claimConfirmed && chainId && claimTxn?.hash && (
<ExternalLink href={getEtherscanLink(chainId, claimTxn?.hash, 'transaction')} style={{ zIndex: 99 }}>
View transaction on Etherscan
</ExternalLink>
)}
</AutoColumn>
</ConfirmOrLoadingWrapper>
)}
</Modal>
)
}
Example #17
Source File: DelegateModal.tsx From sybil-interface with GNU General Public License v3.0 | 4 votes |
export default function DelegateModal({ isOpen, onDismiss, title }: VoteModalProps) {
const { account } = useActiveWeb3React()
const [prefilledDelegate] = useModalDelegatee()
// state for delegate input
const [usingDelegate, setUsingDelegate] = useState(!!!prefilledDelegate)
const [typed, setTyped] = useState('')
function handleRecipientType(val: string) {
setTyped(val)
}
// reset modal based on prefilled value or not
useEffect(() => {
if (prefilledDelegate) {
setUsingDelegate(true)
setTyped(prefilledDelegate)
} else {
setTyped('')
setUsingDelegate(false)
}
}, [prefilledDelegate])
// monitor for self delegation or input for third part delegate
// default is self delegation
const activeDelegate = usingDelegate ? typed : account
const { address: parsedAddress } = useENS(activeDelegate)
const [activeProtocol] = useActiveProtocol()
const govToken = useGovernanceToken()
// get the number of votes available to delegate
const govTokenBalance = useTokenBalance(account ?? undefined, govToken)
const delegateCallback = useDelegateCallback()
// monitor call to help UI loading state
const [hash, setHash] = useState<string | undefined>()
const [attempting, setAttempting] = useState(false)
// wrapper to reset state on modal close
function wrappedOndismiss() {
setHash(undefined)
setAttempting(false)
onDismiss()
}
async function onDelegate() {
setAttempting(true)
// if callback not returned properly ignore
if (!delegateCallback) return
// try delegation and store hash
const hash = await delegateCallback(parsedAddress ?? undefined)?.catch(() => {
setAttempting(false)
})
if (hash) {
setHash(hash)
}
}
return (
<Modal isOpen={isOpen} onDismiss={wrappedOndismiss} maxHeight={90}>
{!attempting && !hash && (
<ContentWrapper gap="lg">
<AutoColumn gap="lg" justify="center">
<RowBetween>
<TYPE.mediumHeader fontWeight={500}>{title}</TYPE.mediumHeader>
<StyledClosed stroke="black" onClick={wrappedOndismiss} />
</RowBetween>
<TYPE.body>
{activeProtocol?.token?.symbol} tokens represent voting shares in {activeProtocol?.name}.
</TYPE.body>
<TYPE.body>
You can either vote on each proposal yourself or delegate your votes to a third party.
</TYPE.body>
{usingDelegate && <AddressInputPanel value={typed} onChange={handleRecipientType} />}
<ButtonPrimary disabled={!isAddress(parsedAddress ?? '')} onClick={onDelegate}>
<TYPE.mediumHeader color="white">{usingDelegate ? 'Delegate Votes' : 'Self Delegate'}</TYPE.mediumHeader>
</ButtonPrimary>
<TextButton onClick={() => setUsingDelegate(!usingDelegate)}>
<TYPE.blue>{usingDelegate ? 'Change Delegate' : 'Delegate to an address'}</TYPE.blue>
</TextButton>
</AutoColumn>
</ContentWrapper>
)}
{attempting && !hash && (
<LoadingView onDismiss={wrappedOndismiss}>
<AutoColumn gap="12px" justify={'center'}>
<TYPE.largeHeader>{usingDelegate ? 'Delegating votes' : 'Unlocking Votes'}</TYPE.largeHeader>
<TYPE.main fontSize={36}>{govTokenBalance?.toSignificant(4)}</TYPE.main>
</AutoColumn>
</LoadingView>
)}
{hash && (
<SubmittedView onDismiss={wrappedOndismiss} hash={hash}>
<AutoColumn gap="12px" justify={'center'}>
<TYPE.largeHeader>Transaction Submitted</TYPE.largeHeader>
<TYPE.main fontSize={36} textAlign="center">
{govTokenBalance?.toSignificant(4)} Votes Delegated
</TYPE.main>
<ButtonPrimary onClick={wrappedOndismiss} style={{ margin: '20px 0 0 0' }}>
<Text fontWeight={500} fontSize={20}>
Close
</Text>
</ButtonPrimary>
</AutoColumn>
</SubmittedView>
)}
</Modal>
)
}