-
Notifications
You must be signed in to change notification settings - Fork 22
Feature/mpb bridge widget #243
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
romeoscript
wants to merge
88
commits into
GoodDollar:master
Choose a base branch
from
romeoscript:feature/mpb-bridge-widget
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from 29 commits
Commits
Show all changes
88 commits
Select commit
Hold shift + click to select a range
e82c697
feat: Add MPB bridge widget with cross-chain bridging
romeoscript 28b610f
feat: Add bridge provider selection and improved transaction history UI
romeoscript c812b66
fix: Replace hardcoded transaction history with real SDK data
romeoscript c430e59
feat: Add bridging status and real-time transaction feedback
romeoscript 629cd7b
feat: integrate GoodDollar Bridge API for real-time fees
romeoscript 1756d36
refactor: remove redundant MPBBridgeController component
romeoscript 0b37dd0
feat: implement MPB (Main Bridge) UI and SDK for cross-chain G$ trans…
romeoscript dab3ac2
fix source chain attribute
romeoscript c14a198
update price impact on mpb
romeoscript c24371c
fix: Set MPBBridge minimum amount to 1000 G$ and fix validation
romeoscript 3586a9c
fix(mpb-bridge): validate against chain-decimal limits and use BigNumber
romeoscript 99d21e1
fix:bridge fees
romeoscript 3ade989
fix:change mpbbridge transaction card
romeoscript e7ecf97
feat: replace fake MPB transaction history with real blockchain events
romeoscript 1da5276
fix(mpbridge): increase Celo gas fees to 100 gwei
romeoscript fe8b76d
fix: resolve TypeScript errors and fee routing in MPB bridge
romeoscript 0d10a29
fix: update onBridgeStart prop type to accept chain parameters
romeoscript 589e005
feat: add bridge transaction debug logging for gas estimation trouble…
romeoscript 5a48b42
feat: use transferAndCall for MPB bridge and dynamic API fees
romeoscript d1cc2e2
feat: use transferAndCall for MPB bridge with dynamic API fees
romeoscript 845340a
feat: improve balance display UX in MPB bridge interface
romeoscript 5790bf4
refactor: break down large MPB bridge file into focused modules
romeoscript 5c5eafb
refactor: break down large MPBBridge component into focused modules
romeoscript bd63322
fix: resolve SDK build conflicts and restore transaction history
romeoscript d331f70
refactor: replace hardcoded MPB contract data with @gooddollar/bridg…
romeoscript ad0d72b
feat: enhance MPB bridge transaction UI with full-width cards and cus…
romeoscript 0291ad2
feat: enhance MPB bridge transaction modal with custom styling
romeoscript 3bc7612
Merge branch 'master' into feature/mpb-bridge-widget
romeoscript 3c70c24
feat: update MPB bridge widget components and SDK integration
romeoscript 4b5ff40
perf(mpb-bridge): reduce re-renders, debounce input, cache fees, remo…
romeoscript 5602f93
refactor: consolidate mpbridge files and apply DRY principles
romeoscript 4be4ec6
Merge branch 'feature/mpb-bridge-widget' of https://github.com/romeos…
romeoscript ff4f5b8
Simplify getContractIcon function to always return GoodDollar
romeoscript 2c99e4a
Fix MPBridge loading issue caused by API rate limiting
romeoscript 27ecab9
Clean up MPBridge code and remove debug stories
romeoscript cbd1791
fix: use dynamic minimum amount from contract instead of hardcoded value
romeoscript 355e5c8
refactor: centralize contract ABIs and improve bridge code quality
romeoscript be55e2a
fix: resolve bridge amount issues and improve dropdown UX
romeoscript e727e3a
refactor: remove hardcoded bridge fees and improve error handling
romeoscript 8bb5652
fix(bridge): resolve transaction state issues and improve UX
romeoscript 4970aed
feat(bridge): replace hardcoded values with contract calls
romeoscript 5c00b83
feat(bridge): de-duplicate provider routes and auto-adjust on provide…
romeoscript 2b986d3
fix: MPB bridge contract integration - use mpb.json and approve+bridg…
romeoscript d57a289
Merge branch 'master' of https://github.com/GoodDollar/GoodWeb3-Mono …
L03TJ3 731642e
feat(mpbridge): add error decoding and improved error logging
romeoscript 17fbdd7
feat(mpbridge): add comprehensive pre-flight validation checks
romeoscript e0d812a
fix(mpbridge): use correct proxy contract and production G$ token
romeoscript 2663ba8
fix(mpbridge): allow automatic approval flow when allowance is insuff…
romeoscript fbd0e3f
fix: revert the brige service mapping to use the correct values
romeoscript 31a36f0
fix: MPB bridge transaction history - amounts, source chain, status, …
romeoscript b16ff66
fix: executed transaction history
romeoscript a85cd0c
fix(mpbridge): improve error handling and ui feedback
romeoscript 6d5cc91
Merge branch 'master' of https://github.com/GoodDollar/GoodWeb3-Mono …
L03TJ3 10ef07d
fix(sdk-v2): correct relative import paths in MPBridge hooks
romeoscript 2b56448
feat(mpbridge): optimize approval flow and fix error handling
romeoscript cda8caa
chore: remove console logs from MPBridge for production
romeoscript 78f0047
Merge branch 'master' of https://github.com/GoodDollar/GoodWeb3-Mono …
L03TJ3 d5c75bd
fix: explorer link base-env destructure
L03TJ3 c79031a
remove duplicate comment
romeoscript 32d8bc2
feat(mpbridge): add success modal for bridge transactions
romeoscript c94100d
fix(good-design): show bridge success modal immediately after transac…
romeoscript fdcaed4
fix: linting and formatting issues in bridge components
romeoscript 3ea80e3
fix: correct balance fetching for MPBBridge with chain-specific G$ ad…
romeoscript 9d069d4
refactor: improve MPBBridge UI and code organization
romeoscript 90f399f
feat: separate transaction history into own card with improved styling
romeoscript 6eb0b3a
fix: improve transaction status detection and display consistency
romeoscript dbe82c0
fix: reduce block ranges to comply with RPC provider 10k limit
romeoscript 4a102b3
fix(mpbridge): use selected route for validation and show pre-executi…
romeoscript e186658
fix:modify constants
romeoscript f4d4e56
fix(mpbridge): chain switching, min amount validation, and env backen…
romeoscript d3eea0b
fix(mpbridge): remove no-op allowance check in useBridgeValidators
romeoscript 92654de
refactor(sdk-v2): useBridgeValidators early checks, single bridgeLimi…
romeoscript 3fc4299
refactor(sdk-v2): use shared normalizeAmountTo18 and useG in mpbridge
romeoscript 74604f3
feat(good-design): MPB bridge network icons (Celo dark, Fuse, Mainnet)
romeoscript f6b514d
feat(good-design): simpler transaction details copy and align styling…
romeoscript 0d4a423
fix(good-design): avoid using current time as fallback when tx date i…
romeoscript d576a68
fix: Transaction Details modal styling and progress line
romeoscript 68d9803
fix: prevent double bridgeTo execution after approval
romeoscript e2c3b20
refactor: centralize MPBBridge via useGetContract, remove useGetMPBCo…
romeoscript 8a7ae9d
Merge upstream/master into feature/mpb-bridge-widget
romeoscript 1ed512a
fix(mpbridge): prevent duplicate bridgeTo execution with single lock
romeoscript 82d6956
fix: resolve MPBBridge contract key mismatch and add loading state gu…
romeoscript 9e82973
refactor: remove verbose comments, split static/dynamic data fetching…
romeoscript 66e08f4
perf: remove canBridge polling from useGetMPBBridgeData
romeoscript 5761e5f
fix: address PR review - remove wrapper, fix default chain, remove ha…
romeoscript 077810f
refactor(MPBBridgeTransactionCard): wrap helper functions in useCallb…
romeoscript 8a7b7f8
revert: remove unrelated formatting and config changes from MPBBridge PR
romeoscript 157695b
fix: surface bridge exceptions to user and fix typechain import path
romeoscript File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
50 changes: 50 additions & 0 deletions
50
packages/good-design/src/apps/bridge/mpbridge/AmountInput.tsx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,50 @@ | ||
| import React from "react"; | ||
| import { HStack, Text, VStack } from "native-base"; | ||
| import { TokenInput } from "../../../core"; | ||
| import { CurrencyValue } from "@usedapp/core"; | ||
|
|
||
| interface AmountInputProps { | ||
| wei: string; | ||
| gdValue: CurrencyValue; | ||
| bridgeWeiAmount: string; | ||
| setBridgeAmount: (amount: string) => void; | ||
| minimumAmount: CurrencyValue; | ||
| isValid: boolean; | ||
| reason: string; | ||
| balance: CurrencyValue; | ||
| } | ||
|
|
||
| export const AmountInput: React.FC<AmountInputProps> = ({ | ||
| wei, | ||
| gdValue, | ||
| bridgeWeiAmount, | ||
| setBridgeAmount, | ||
| minimumAmount, | ||
| isValid, | ||
| reason, | ||
| balance | ||
| }) => { | ||
| return ( | ||
| <VStack space={3}> | ||
| <HStack justifyContent="space-between" alignItems="center"> | ||
| <Text fontFamily="subheading" fontSize="md" color="goodGrey.600" fontWeight="600"> | ||
| Amount to send | ||
| </Text> | ||
| <Text color="goodGrey.500" fontSize="sm" fontWeight="400"> | ||
| Balance: {balance.format()} | ||
| </Text> | ||
| </HStack> | ||
| <TokenInput | ||
| balanceWei={wei} | ||
| onChange={setBridgeAmount} | ||
| gdValue={gdValue} | ||
| minAmountWei={minimumAmount?.toString()} | ||
| /> | ||
| {!isValid && bridgeWeiAmount && ( | ||
| <Text color="red.500" fontSize="sm" fontWeight="500"> | ||
| {reason === "minAmount" ? " Minimum amount is 1000 G$" : undefined} | ||
| </Text> | ||
| )} | ||
| </VStack> | ||
| ); | ||
| }; |
48 changes: 48 additions & 0 deletions
48
packages/good-design/src/apps/bridge/mpbridge/BridgeProviderSelector.tsx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,48 @@ | ||
| import React from "react"; | ||
| import { HStack, Pressable, Text, VStack } from "native-base"; | ||
| import type { BridgeProvider } from "./types"; | ||
|
|
||
| interface BridgeProviderSelectorProps { | ||
| bridgeProvider: BridgeProvider; | ||
| onProviderChange: (provider: BridgeProvider) => void; | ||
| } | ||
|
|
||
| export const BridgeProviderSelector: React.FC<BridgeProviderSelectorProps> = ({ bridgeProvider, onProviderChange }) => { | ||
| return ( | ||
| <VStack space={4}> | ||
| <Text fontFamily="heading" fontSize="xl" fontWeight="700" color="goodGrey.800"> | ||
| Select Bridge Provider | ||
| </Text> | ||
| <HStack space={4}> | ||
| <Pressable | ||
| flex={1} | ||
| onPress={() => onProviderChange("axelar")} | ||
| bg={bridgeProvider === "axelar" ? "rgb(59, 130, 246)" : "goodGrey.100"} | ||
| borderRadius="lg" | ||
| padding={5} | ||
| alignItems="center" | ||
| borderWidth={bridgeProvider === "axelar" ? 2 : 1} | ||
| borderColor={bridgeProvider === "axelar" ? "rgb(59, 130, 246)" : "goodGrey.300"} | ||
| > | ||
| <Text color={bridgeProvider === "axelar" ? "white" : "goodGrey.700"} fontWeight="600" fontSize="lg"> | ||
| Axelar | ||
| </Text> | ||
| </Pressable> | ||
| <Pressable | ||
| flex={1} | ||
| onPress={() => onProviderChange("layerzero")} | ||
| bg={bridgeProvider === "layerzero" ? "rgb(59, 130, 246)" : "goodGrey.100"} | ||
| borderRadius="lg" | ||
| padding={5} | ||
| alignItems="center" | ||
| borderWidth={bridgeProvider === "layerzero" ? 2 : 1} | ||
| borderColor={bridgeProvider === "layerzero" ? "rgb(59, 130, 246)" : "goodGrey.300"} | ||
| > | ||
| <Text color={bridgeProvider === "layerzero" ? "white" : "goodGrey.700"} fontWeight="600" fontSize="lg"> | ||
| LayerZero | ||
| </Text> | ||
| </Pressable> | ||
| </HStack> | ||
| </VStack> | ||
| ); | ||
| }; |
22 changes: 22 additions & 0 deletions
22
packages/good-design/src/apps/bridge/mpbridge/BridgingStatusBanner.tsx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,22 @@ | ||
| import React from "react"; | ||
| import { Box, HStack, Spinner, Text } from "native-base"; | ||
|
|
||
| interface BridgingStatusBannerProps { | ||
| isBridging: boolean; | ||
| bridgingStatus: string; | ||
| } | ||
|
|
||
| export const BridgingStatusBanner: React.FC<BridgingStatusBannerProps> = ({ isBridging, bridgingStatus }) => { | ||
| if (!isBridging) return null; | ||
|
|
||
| return ( | ||
| <Box borderRadius="lg" padding={4} backgroundColor="goodBlue.100" borderWidth="1" borderColor="goodBlue.300"> | ||
| <HStack space={3} alignItems="center"> | ||
| <Spinner size="sm" color="goodBlue.500" /> | ||
| <Text color="goodBlue.700" fontSize="sm" fontWeight="500"> | ||
| {bridgingStatus} | ||
| </Text> | ||
| </HStack> | ||
| </Box> | ||
| ); | ||
| }; |
207 changes: 207 additions & 0 deletions
207
packages/good-design/src/apps/bridge/mpbridge/ChainSelector.tsx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,207 @@ | ||
| import React, { memo, useMemo } from "react"; | ||
| import { Box, HStack, Pressable, ChevronDownIcon, Text, VStack } from "native-base"; | ||
| import { getChainIcon, getChainColor, getChainLabel, getValidTargetChains } from "./utils"; | ||
|
|
||
| // Style objects defined outside component for reusability and cleaner renders | ||
| const chainContainerStyles = { | ||
| flex: 1, | ||
| bg: "white", | ||
| borderRadius: "lg", | ||
| padding: 2, | ||
| borderWidth: "1", | ||
| borderColor: "goodGrey.300", | ||
| position: "relative", | ||
| style: { overflow: "visible" } | ||
| } as const; | ||
|
|
||
| const chainIconStyles = { | ||
| borderRadius: "full", | ||
| width: "8", | ||
| height: "8", | ||
| alignItems: "center", | ||
| justifyContent: "center", | ||
| shadow: "sm" | ||
| } as const; | ||
|
|
||
| const chainPressableStyles = { | ||
| flex: 1, | ||
| flexDirection: "row", | ||
| alignItems: "center", | ||
| justifyContent: "space-between" | ||
| } as const; | ||
|
|
||
| const dropdownStyles = { | ||
| position: "absolute", | ||
| top: "100%", | ||
| left: 0, | ||
| right: 0, | ||
| bg: "white", | ||
| borderRadius: "lg", | ||
| borderWidth: "1", | ||
| borderColor: "goodGrey.300", | ||
| shadow: "xl", | ||
| zIndex: 999999, | ||
| mt: 1, | ||
| minWidth: "200px", | ||
| maxWidth: "300px" | ||
| } as const; | ||
|
|
||
| const dropdownItemStyles = { | ||
| padding: 4, | ||
| borderBottomWidth: 1, | ||
| borderBottomColor: "goodGrey.200", | ||
| _pressed: { bg: "goodGrey.100" } | ||
| } as const; | ||
|
|
||
| const swapButtonStyles = { | ||
| bg: "goodGrey.200", | ||
| borderRadius: "full", | ||
| width: "8", | ||
| height: "8", | ||
| alignItems: "center", | ||
| justifyContent: "center", | ||
| shadow: "sm", | ||
| _pressed: { bg: "goodGrey.300" } | ||
| } as const; | ||
|
|
||
| interface ChainSelectorProps { | ||
| sourceChain: string; | ||
| targetChain: string; | ||
| showSourceDropdown: boolean; | ||
| showTargetDropdown: boolean; | ||
| bridgeFees: any; | ||
| bridgeProvider: string; | ||
| feesLoading: boolean; | ||
| onSourceChainSelect: (chain: string) => void; | ||
| onTargetChainSelect: (chain: string) => void; | ||
| onSwap: () => void; | ||
| onSourceDropdownToggle: () => void; | ||
| onTargetDropdownToggle: () => void; | ||
| } | ||
|
|
||
| export const ChainSelector: React.FC<ChainSelectorProps> = memo( | ||
| ({ | ||
| sourceChain, | ||
| targetChain, | ||
| showSourceDropdown, | ||
| showTargetDropdown, | ||
| bridgeFees, | ||
| bridgeProvider, | ||
| feesLoading, | ||
| onSourceChainSelect, | ||
| onTargetChainSelect, | ||
| onSwap, | ||
| onSourceDropdownToggle, | ||
| onTargetDropdownToggle | ||
| }) => { | ||
| const availableChains = useMemo(() => ["fuse", "celo", "mainnet"], []); | ||
|
|
||
| const validTargetChains = useMemo( | ||
| () => getValidTargetChains(sourceChain, bridgeFees, bridgeProvider, feesLoading), | ||
| [sourceChain, bridgeFees, bridgeProvider, feesLoading] | ||
| ); | ||
|
|
||
| return ( | ||
| <HStack space={4} alignItems="center" zIndex={1000}> | ||
| {/* Source Chain */} | ||
| <VStack {...chainContainerStyles}> | ||
| <HStack space={3} alignItems="center"> | ||
| <Box bg={getChainColor(sourceChain)} {...chainIconStyles}> | ||
| <Text color="white" fontSize="sm" fontWeight="bold"> | ||
| {getChainIcon(sourceChain)} | ||
| </Text> | ||
| </Box> | ||
| <Pressable onPress={onSourceDropdownToggle} {...chainPressableStyles}> | ||
| <Text color="goodGrey.700" fontSize="md" fontWeight="600"> | ||
| {getChainLabel(sourceChain)} | ||
| </Text> | ||
| <Box style={{ transform: [{ rotate: showSourceDropdown ? "180deg" : "0deg" }] }}> | ||
| <ChevronDownIcon size="sm" color="goodGrey.400" /> | ||
| </Box> | ||
| </Pressable> | ||
| </HStack> | ||
|
|
||
| {/* Source Chain Dropdown */} | ||
| {showSourceDropdown && ( | ||
| <Box {...dropdownStyles}> | ||
| {availableChains.map(chain => ( | ||
| <Pressable | ||
| key={chain} | ||
| onPress={() => onSourceChainSelect(chain)} | ||
| {...dropdownItemStyles} | ||
| borderBottomWidth={chain === availableChains[availableChains.length - 1] ? 0 : 1} | ||
| > | ||
| <HStack space={3} alignItems="center"> | ||
| <Box bg={getChainColor(chain)} {...chainIconStyles} width="6" height="6"> | ||
| <Text color="white" fontSize="xs" fontWeight="bold"> | ||
| {getChainIcon(chain)} | ||
| </Text> | ||
| </Box> | ||
| <Text color="goodGrey.700" fontSize="md" fontWeight="500"> | ||
| {getChainLabel(chain)} | ||
| </Text> | ||
| </HStack> | ||
| </Pressable> | ||
| ))} | ||
| </Box> | ||
| )} | ||
| </VStack> | ||
|
|
||
| {/* Swap Arrow */} | ||
| <Pressable onPress={onSwap} {...swapButtonStyles}> | ||
| <Text fontSize="xl" color="goodGrey.600" fontWeight="bold"> | ||
| ⇄ | ||
| </Text> | ||
| </Pressable> | ||
|
|
||
| {/* Target Chain */} | ||
| <VStack {...chainContainerStyles}> | ||
| <HStack space={3} alignItems="center"> | ||
| <Box bg={getChainColor(targetChain)} {...chainIconStyles}> | ||
| <Text color="white" fontSize="sm" fontWeight="bold"> | ||
| {getChainIcon(targetChain)} | ||
| </Text> | ||
| </Box> | ||
| <Pressable onPress={onTargetDropdownToggle} {...chainPressableStyles}> | ||
| <Text color="goodGrey.700" fontSize="md" fontWeight="600"> | ||
| {getChainLabel(targetChain)} | ||
| </Text> | ||
| <Box style={{ transform: [{ rotate: showTargetDropdown ? "180deg" : "0deg" }] }}> | ||
| <ChevronDownIcon size="sm" color="goodGrey.400" /> | ||
| </Box> | ||
| </Pressable> | ||
| </HStack> | ||
|
|
||
| {/* Target Chain Dropdown */} | ||
| {showTargetDropdown && ( | ||
| <Box {...dropdownStyles}> | ||
| {validTargetChains.map(chain => { | ||
| const isLastItem = chain === validTargetChains[validTargetChains.length - 1]; | ||
|
|
||
| return ( | ||
| <Pressable | ||
| key={chain} | ||
| onPress={() => onTargetChainSelect(chain)} | ||
| {...dropdownItemStyles} | ||
| borderBottomWidth={isLastItem ? 0 : 1} | ||
| > | ||
| <HStack space={3} alignItems="center"> | ||
| <Box bg={getChainColor(chain)} {...chainIconStyles} width="6" height="6"> | ||
| <Text color="white" fontSize="xs" fontWeight="bold"> | ||
| {getChainIcon(chain)} | ||
| </Text> | ||
| </Box> | ||
| <Text color="goodGrey.700" fontSize="md" fontWeight="500"> | ||
| {getChainLabel(chain)} | ||
| </Text> | ||
| </HStack> | ||
| </Pressable> | ||
| ); | ||
| })} | ||
| </Box> | ||
| )} | ||
| </VStack> | ||
| </HStack> | ||
| ); | ||
| } | ||
| ); |
34 changes: 34 additions & 0 deletions
34
packages/good-design/src/apps/bridge/mpbridge/ExpectedOutput.tsx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,34 @@ | ||
| import React from "react"; | ||
| import { HStack, Text, VStack, Input } from "native-base"; | ||
| import { CurrencyValue } from "@usedapp/core"; | ||
|
|
||
| interface ExpectedOutputProps { | ||
| expectedToReceive: CurrencyValue; | ||
| targetChain: string; | ||
| balance: CurrencyValue; | ||
| } | ||
|
|
||
| export const ExpectedOutput: React.FC<ExpectedOutputProps> = ({ expectedToReceive, targetChain, balance }) => { | ||
| return ( | ||
| <VStack space={3}> | ||
| <HStack justifyContent="space-between" alignItems="center"> | ||
| <Text fontFamily="subheading" fontSize="md" color="goodGrey.600" fontWeight="600"> | ||
| You will receive on {targetChain.toUpperCase()} | ||
| </Text> | ||
| <Text color="goodGrey.500" fontSize="sm" fontWeight="400"> | ||
| Balance: {balance.format()} | ||
| </Text> | ||
| </HStack> | ||
| <Input | ||
| value={expectedToReceive ? expectedToReceive.format() : "0"} | ||
| isReadOnly | ||
| borderRadius="lg" | ||
| borderColor="goodGrey.300" | ||
| bg="goodGrey.50" | ||
| fontSize="md" | ||
| padding={2} | ||
| fontWeight="500" | ||
| /> | ||
| </VStack> | ||
| ); | ||
| }; |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.