Skip to content
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

Redemption improvements #583

Merged
merged 3 commits into from
Jul 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/components/Modal/tBTC/InitiateUnminting.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ import { InlineTokenBalance } from "../../TokenBalance"
import {
TransactionDetailsAmountItem,
TransactionDetailsItem,
} from "../../TransacionDetails"
} from "../../TransactionDetails"
import ModalCloseButton from "../ModalCloseButton"
import withBaseModal from "../withBaseModal"

Expand Down
2 changes: 1 addition & 1 deletion src/hooks/useAddErc20ToMetamask.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ const useAddErc20ToMetamask = (tokenContract?: Contract | null) => {
}
// Based on the docs, the result from request should be `boolean` but it
// returns an object in Chrome. On Firefox browser, this request blocks
// the MM provider and the dapp can't trigger transacion and fetch
// the MM provider and the dapp can't trigger transaction and fetch
// on-chain data. Also the MM provider doesn't return any result from this
// request. On Chrome browser, this request returns a result as an object,
// even if the user does not make any interaction in the MM popup.
Expand Down
2 changes: 1 addition & 1 deletion src/pages/tBTC/Bridge/DepositDetails.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ import { PageComponent } from "../../../types"
import { CurveFactoryPoolId, ExternalHref } from "../../../enums"
import { ExternalPool } from "../../../components/tBTC/ExternalPool"
import { useFetchExternalPoolData } from "../../../hooks/useFetchExternalPoolData"
import { TransactionDetailsAmountItem } from "../../../components/TransacionDetails"
import { TransactionDetailsAmountItem } from "../../../components/TransactionDetails"
import { BridgeProcessDetailsPageSkeleton } from "./components/BridgeProcessDetailsPageSkeleton"

export const DepositDetails: PageComponent = () => {
Expand Down
5 changes: 3 additions & 2 deletions src/pages/tBTC/Bridge/Unmint.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,8 @@ const UnmintFormPage: PageComponent = ({}) => {
subTitle="Unmint your tBTC tokens"
/>
<BodyMd color="gray.500">
Unminting requires one Ethereum transaction and it takes around 3 hours.
Unminting requires one Ethereum transaction and it takes around 3-5
hours.
</BodyMd>
<UnmintForm
maxTokenAmount={balance.toString()}
Expand All @@ -122,7 +123,7 @@ const UnmintAsideLayout = () => {
<LabelSm>Duration</LabelSm>
<HStack mt="4" spacing="4">
<BoxLabel variant="solid" status="primary">
~ 3 Hours
~ 3-5 Hours
</BoxLabel>
<Box>
<BodyXs as="span" color="gray.500">
Expand Down
65 changes: 39 additions & 26 deletions src/pages/tBTC/Bridge/UnmintDetails.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
LabelSm,
List,
ListItem,
ONE_MINUTE_IN_SECONDS,
SkeletonText,
useColorModeValue,
} from "@threshold-network/components"
Expand All @@ -28,7 +29,7 @@ import {
import {
TransactionDetailsAmountItem,
TransactionDetailsItem,
} from "../../../components/TransacionDetails"
} from "../../../components/TransactionDetails"
import { InlineTokenBalance } from "../../../components/TokenBalance"
import ViewInBlockExplorer, {
Chain as ViewInBlockExplorerChain,
Expand All @@ -52,25 +53,8 @@ import { ProcessCompletedBrandGradientIcon } from "./components/BridgeProcessDet
import { featureFlags } from "../../../constants"
import { useFetchRedemptionDetails } from "../../../hooks/tbtc/useFetchRedemptionDetails"
import { BridgeProcessDetailsPageSkeleton } from "./components/BridgeProcessDetailsPageSkeleton"
import { BigNumber } from "ethers"
import { ExternalHref } from "../../../enums"

const pendingRedemption = {
redemptionRequestedTxHash:
"0xf7d0c92c8de4d117d915c2a8a54ee550047f926bc00b91b651c40628751cfe29",
walletPublicKeyHash: "0x03b74d6893ad46dfdd01b9e0e3b3385f4fce2d1e",
redeemerOutputScript: "0x160014751E76E8199196D454941C45D1B3A323F1433BD6",
redeemer: "0x086813525A7dC7dafFf015Cdf03896Fd276eab60",
}

const completedRedemption = {
redemptionRequestedTxHash:
"0x0b5d66b89c5fe276ac5b0fd1874142f99329ea6f66485334a558e2bccd977618",
walletPublicKeyHash: "0x03b74d6893ad46dfdd01b9e0e3b3385f4fce2d1e",
redeemerOutputScript: "0x17A91486884E6BE1525DAB5AE0B451BD2C72CEE67DCF4187",
redeemer: "0x68ad60CC5e8f3B7cC53beaB321cf0e6036962dBc",
}

export const UnmintDetails: PageComponent = () => {
const [searchParams] = useSearchParams()
const walletPublicKeyHash = searchParams.get("walletPublicKeyHash")
Expand All @@ -93,7 +77,7 @@ export const UnmintDetails: PageComponent = () => {

const btcTxHash = data?.redemptionCompletedTxHash?.bitcoin
useEffect(() => {
if (!!btcTxHash) setShouldDisplaySuccessStep(true)
setShouldDisplaySuccessStep(!!btcTxHash)
}, [btcTxHash])

const isProcessCompleted = !!data?.redemptionCompletedTxHash?.bitcoin
Expand All @@ -102,9 +86,38 @@ export const UnmintDetails: PageComponent = () => {

const thresholdNetworkFee = data?.treasuryFee ?? "0"
const btcAddress = data?.btcAddress
const time = dateAs(
(data?.completedAt ?? dateToUnixTimestamp()) - (data?.requestedAt ?? 0)
)
const redemptionCompletedAt = data?.completedAt
const redemptionRequestedAt = data?.requestedAt
const [redemptionTime, setRedemptionTime] = useState<
ReturnType<typeof dateAs>
>({
days: 0,
hours: 0,
minutes: 0,
seconds: 0,
})
useEffect(() => {
let intervalId: ReturnType<typeof setInterval>

if (!redemptionCompletedAt && redemptionRequestedAt) {
intervalId = setInterval(() => {
setRedemptionTime(
dateAs(
redemptionCompletedAt ??
dateToUnixTimestamp() - (data?.requestedAt ?? 0)
)
)
}, ONE_MINUTE_IN_SECONDS)
} else if (redemptionCompletedAt && redemptionRequestedAt) {
setRedemptionTime(dateAs(redemptionCompletedAt - redemptionRequestedAt))
}

return () => {
if (intervalId) {
clearInterval(intervalId)
}
}
}, [redemptionCompletedAt, redemptionRequestedAt])

const transactions: {
label: string
Expand Down Expand Up @@ -167,7 +180,7 @@ export const UnmintDetails: PageComponent = () => {
left="50%"
transform="translateX(-50%)"
>
usual duration - 3 hours
usual duration - 3-5 hours
</Badge>
<TimelineItem status="active">
<TimelineBreakpoint>
Expand Down Expand Up @@ -236,7 +249,7 @@ export const UnmintDetails: PageComponent = () => {
>
<BodyMd mt="6" px="3.5" mb="10" alignSelf="flex-start">
Your redemption request is being processed. This will take
around 5 hours.
around 3-5 hours.
</BodyMd>
</BridgeProcessStep>
)}
Expand All @@ -257,10 +270,10 @@ export const UnmintDetails: PageComponent = () => {
{isProcessCompleted ? "total time" : "elapsed time"}
</LabelSm>
<BodyLg mt="2.5" color="gray.500">
{`${time.days}d ${time.hours}h ${time.minutes}m`}
{`${redemptionTime.days}d ${redemptionTime.hours}h ${redemptionTime.minutes}m`}
</BodyLg>

<LabelSm mt="5">Transacion History</LabelSm>
<LabelSm mt="5">Transaction History</LabelSm>
<List mt="6" color="gray.500" spacing="2" mb="20">
{transactions
.filter((item) => !!item.txHash)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { List } from "@threshold-network/components"
import {
TransactionDetailsAmountItem,
TransactionDetailsItem,
} from "../../../../components/TransacionDetails"
} from "../../../../components/TransactionDetails"
import { useTbtcState } from "../../../../hooks/useTbtcState"
import shortenAddress from "../../../../utils/shortenAddress"

Expand Down
4 changes: 2 additions & 2 deletions src/threshold-ts/tbtc/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1028,10 +1028,10 @@ export class TBTC implements ITBTC {
}

getBitcoinTransaction = async (
transacionHash: string
transactionHash: string
): Promise<BitcoinTransaction> => {
return this._bitcoinClient.getTransaction(
TransactionHash.from(transacionHash)
TransactionHash.from(transactionHash)
)
}

Expand Down
2 changes: 1 addition & 1 deletion src/threshold-ts/utils/bitcoin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ export const isPayToScriptHashTypeAddress = (address: string): boolean => {
* Bitcoin transaction hash is stored on Ethereum in native Bitcoin
* little-endian format but to get the confirmations for this transaction we
* need to reverse its hash.
* @param {string} txHash Transacion hash as string.
* @param {string} txHash Transaction hash as string.
* @return {TransactionHash} Reversed transaction hash.
*/
export const reverseTxHash = (txHash: string): TransactionHash => {
Expand Down
Loading