From 44dccf744b3a7ffb4ba3c1cc2477b45947fcec1e Mon Sep 17 00:00:00 2001 From: bigboydiamonds <57741810+bigboydiamonds@users.noreply.github.com> Date: Wed, 19 Jun 2024 17:23:55 -0700 Subject: [PATCH 01/13] Save progress on tracking tx refunds --- .../helpers/getTransactionReceipt.ts | 49 +++++++++++++++++++ .../_Transaction/helpers/useIsTxRefunded.ts | 32 ++++++++++++ .../pages/state-managed-bridge/index.tsx | 10 ++++ 3 files changed, 91 insertions(+) create mode 100644 packages/synapse-interface/components/_Transaction/helpers/useIsTxRefunded.ts diff --git a/packages/synapse-interface/components/_Transaction/helpers/getTransactionReceipt.ts b/packages/synapse-interface/components/_Transaction/helpers/getTransactionReceipt.ts index 0b8833451c..fd13adcecc 100644 --- a/packages/synapse-interface/components/_Transaction/helpers/getTransactionReceipt.ts +++ b/packages/synapse-interface/components/_Transaction/helpers/getTransactionReceipt.ts @@ -1,5 +1,6 @@ import { createPublicClient, + parseAbiItem, http, type Address, type Chain as ViemChain, @@ -28,3 +29,51 @@ export const getTransactionReceipt = async ( return null } } + +export const getTransactionRefundLogs = async ( + bridgeContract: Address, + chainId: number +) => { + const viemChain = supportedChains.find((c) => c.id === chainId) + + const publicClient = createPublicClient({ + chain: viemChain as ViemChain, + transport: http(), + }) + + try { + const logs = await publicClient.getLogs({ + address: bridgeContract, + // event: { + // name: 'BridgeDepositRefunded', + // type: 'function', + // inputs: [ + // { type: 'bytes32', indexed: true, name: 'transactionId' }, + // { type: 'address', indexed: true, name: 'to' }, + // { type: 'address', indexed: false, name: 'token' }, + // { type: 'uint256', indexed: false, name: 'amount' }, + // ], + // }, + // event: parseAbiItem( + // 'event BridgeDepositRefunded(bytes32 indexed transactionId, address indexed to, address token, uint256 amount)' + // ), + fromBlock: 15975605n, + toBlock: 16009420n, + }) + console.log('logs: ', logs) + } catch (error) { + console.error('Error in getTransactionRefundLogs: ', error) + } +} + +// ;[ +// { +// name: 'transactionId', +// type: 'bytes32', +// indexed: true, +// internalType: 'bytes32', +// }, +// { name: 'to', type: 'address', indexed: true, internalType: 'address' }, +// { name: 'token', type: 'address', indexed: false, internalType: 'address' }, +// { name: 'amount', type: 'uint256', indexed: false, internalType: 'uint256' }, +// ] diff --git a/packages/synapse-interface/components/_Transaction/helpers/useIsTxRefunded.ts b/packages/synapse-interface/components/_Transaction/helpers/useIsTxRefunded.ts new file mode 100644 index 0000000000..4b26a397bf --- /dev/null +++ b/packages/synapse-interface/components/_Transaction/helpers/useIsTxRefunded.ts @@ -0,0 +1,32 @@ +import { Address } from 'viem' +import { useEffect, useState } from 'react' + +import { Chain } from '@/utils/types' +import { getTransactionRefundLogs } from './getTransactionReceipt' +import { useIntervalTimer } from '@/utils/hooks/useIntervalTimer' + +export const useIsTxRefunded = ( + txId: Address | undefined, + bridgeContract: Address, + chain: Chain, + checkForRefund: boolean +) => { + const [isRefunded, setIsRefunded] = useState(false) + const currentTime = useIntervalTimer(60000) + + const getTxRefundStatus = async () => { + try { + await getTransactionRefundLogs(bridgeContract, chain?.id) + } catch (error) { + console.error('Failed to fetch transaction receipt:', error) + } + } + + useEffect(() => { + if (checkForRefund) { + getTxRefundStatus() + } + }, [checkForRefund, txId, chain, currentTime]) + + return isRefunded +} diff --git a/packages/synapse-interface/pages/state-managed-bridge/index.tsx b/packages/synapse-interface/pages/state-managed-bridge/index.tsx index 585e65b19e..4de32609cf 100644 --- a/packages/synapse-interface/pages/state-managed-bridge/index.tsx +++ b/packages/synapse-interface/pages/state-managed-bridge/index.tsx @@ -74,6 +74,9 @@ import { } from '@/components/Maintenance/Maintenance' import { wagmiConfig } from '@/wagmiConfig' import { useStaleQuoteRefresher } from '@/utils/hooks/useStaleQuoteRefresher' +import { getTransactionRefundLogs } from '@/components/_Transaction/helpers/getTransactionReceipt' +import { useIsTxRefunded } from '@/components/_Transaction/helpers/useIsTxRefunded' +import { BASE } from '@/constants/chains/master' const StateManagedBridge = () => { const { address } = useAccount() @@ -104,6 +107,13 @@ const StateManagedBridge = () => { const dispatch = useAppDispatch() + useIsTxRefunded( + undefined, + '0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E', + BASE, + true + ) + useEffect(() => { segmentAnalyticsEvent(`[Bridge page] arrives`, { fromChainId, From 0def0a81a40bd7c6df35246401f64474a62ac4c3 Mon Sep 17 00:00:00 2001 From: bigboydiamonds <57741810+bigboydiamonds@users.noreply.github.com> Date: Thu, 20 Jun 2024 11:25:25 -0700 Subject: [PATCH 02/13] Query FastBridge contract for `bridgeStatuses` to find refund status --- .../helpers/getTransactionReceipt.ts | 49 - .../_Transaction/helpers/useIsTxRefunded.ts | 28 +- .../constants/abis/fastBridge.json | 851 ++++++++++++++++++ .../pages/state-managed-bridge/index.tsx | 2 +- 4 files changed, 877 insertions(+), 53 deletions(-) create mode 100644 packages/synapse-interface/constants/abis/fastBridge.json diff --git a/packages/synapse-interface/components/_Transaction/helpers/getTransactionReceipt.ts b/packages/synapse-interface/components/_Transaction/helpers/getTransactionReceipt.ts index fd13adcecc..0b8833451c 100644 --- a/packages/synapse-interface/components/_Transaction/helpers/getTransactionReceipt.ts +++ b/packages/synapse-interface/components/_Transaction/helpers/getTransactionReceipt.ts @@ -1,6 +1,5 @@ import { createPublicClient, - parseAbiItem, http, type Address, type Chain as ViemChain, @@ -29,51 +28,3 @@ export const getTransactionReceipt = async ( return null } } - -export const getTransactionRefundLogs = async ( - bridgeContract: Address, - chainId: number -) => { - const viemChain = supportedChains.find((c) => c.id === chainId) - - const publicClient = createPublicClient({ - chain: viemChain as ViemChain, - transport: http(), - }) - - try { - const logs = await publicClient.getLogs({ - address: bridgeContract, - // event: { - // name: 'BridgeDepositRefunded', - // type: 'function', - // inputs: [ - // { type: 'bytes32', indexed: true, name: 'transactionId' }, - // { type: 'address', indexed: true, name: 'to' }, - // { type: 'address', indexed: false, name: 'token' }, - // { type: 'uint256', indexed: false, name: 'amount' }, - // ], - // }, - // event: parseAbiItem( - // 'event BridgeDepositRefunded(bytes32 indexed transactionId, address indexed to, address token, uint256 amount)' - // ), - fromBlock: 15975605n, - toBlock: 16009420n, - }) - console.log('logs: ', logs) - } catch (error) { - console.error('Error in getTransactionRefundLogs: ', error) - } -} - -// ;[ -// { -// name: 'transactionId', -// type: 'bytes32', -// indexed: true, -// internalType: 'bytes32', -// }, -// { name: 'to', type: 'address', indexed: true, internalType: 'address' }, -// { name: 'token', type: 'address', indexed: false, internalType: 'address' }, -// { name: 'amount', type: 'uint256', indexed: false, internalType: 'uint256' }, -// ] diff --git a/packages/synapse-interface/components/_Transaction/helpers/useIsTxRefunded.ts b/packages/synapse-interface/components/_Transaction/helpers/useIsTxRefunded.ts index 4b26a397bf..e93b1f20b2 100644 --- a/packages/synapse-interface/components/_Transaction/helpers/useIsTxRefunded.ts +++ b/packages/synapse-interface/components/_Transaction/helpers/useIsTxRefunded.ts @@ -1,9 +1,11 @@ -import { Address } from 'viem' +import { type Address } from 'viem' import { useEffect, useState } from 'react' +import { readContract } from '@wagmi/core' import { Chain } from '@/utils/types' -import { getTransactionRefundLogs } from './getTransactionReceipt' import { useIntervalTimer } from '@/utils/hooks/useIntervalTimer' +import fastBridgeAbi from '@/constants/abis/fastBridge.json' +import { wagmiConfig } from '@/wagmiConfig' export const useIsTxRefunded = ( txId: Address | undefined, @@ -16,7 +18,12 @@ export const useIsTxRefunded = ( const getTxRefundStatus = async () => { try { - await getTransactionRefundLogs(bridgeContract, chain?.id) + const status = await checkRFQTxBridgeStatus( + txId, + bridgeContract, + chain?.id + ) + console.log('status: ', status) } catch (error) { console.error('Failed to fetch transaction receipt:', error) } @@ -30,3 +37,18 @@ export const useIsTxRefunded = ( return isRefunded } + +const checkRFQTxBridgeStatus = async ( + txId: Address, + bridgeContract: Address, + chainId: number +) => { + const result = await readContract(wagmiConfig, { + abi: fastBridgeAbi, + address: bridgeContract, + functionName: 'bridgeStatuses', + args: [txId], + chainId, + }) + return result +} diff --git a/packages/synapse-interface/constants/abis/fastBridge.json b/packages/synapse-interface/constants/abis/fastBridge.json new file mode 100644 index 0000000000..2efeb97a4b --- /dev/null +++ b/packages/synapse-interface/constants/abis/fastBridge.json @@ -0,0 +1,851 @@ +[ + { + "type": "constructor", + "inputs": [ + { "name": "_owner", "type": "address", "internalType": "address" } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "DEFAULT_ADMIN_ROLE", + "inputs": [], + "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "DISPUTE_PERIOD", + "inputs": [], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "FEE_BPS", + "inputs": [], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "FEE_RATE_MAX", + "inputs": [], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "GOVERNOR_ROLE", + "inputs": [], + "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "GUARD_ROLE", + "inputs": [], + "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "MIN_DEADLINE_PERIOD", + "inputs": [], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "REFUNDER_ROLE", + "inputs": [], + "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "REFUND_DELAY", + "inputs": [], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "RELAYER_ROLE", + "inputs": [], + "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "bridge", + "inputs": [ + { + "name": "params", + "type": "tuple", + "internalType": "struct IFastBridge.BridgeParams", + "components": [ + { + "name": "dstChainId", + "type": "uint32", + "internalType": "uint32" + }, + { "name": "sender", "type": "address", "internalType": "address" }, + { "name": "to", "type": "address", "internalType": "address" }, + { + "name": "originToken", + "type": "address", + "internalType": "address" + }, + { + "name": "destToken", + "type": "address", + "internalType": "address" + }, + { + "name": "originAmount", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "destAmount", + "type": "uint256", + "internalType": "uint256" + }, + { "name": "sendChainGas", "type": "bool", "internalType": "bool" }, + { "name": "deadline", "type": "uint256", "internalType": "uint256" } + ] + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "bridgeProofs", + "inputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }], + "outputs": [ + { "name": "timestamp", "type": "uint96", "internalType": "uint96" }, + { "name": "relayer", "type": "address", "internalType": "address" } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "bridgeRelays", + "inputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }], + "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "bridgeStatuses", + "inputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "enum FastBridge.BridgeStatus" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "canClaim", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "internalType": "bytes32" + }, + { "name": "relayer", "type": "address", "internalType": "address" } + ], + "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "chainGasAmount", + "inputs": [], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "claim", + "inputs": [ + { "name": "request", "type": "bytes", "internalType": "bytes" }, + { "name": "to", "type": "address", "internalType": "address" } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "deployBlock", + "inputs": [], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "dispute", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getBridgeTransaction", + "inputs": [ + { "name": "request", "type": "bytes", "internalType": "bytes" } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IFastBridge.BridgeTransaction", + "components": [ + { + "name": "originChainId", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "destChainId", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "originSender", + "type": "address", + "internalType": "address" + }, + { + "name": "destRecipient", + "type": "address", + "internalType": "address" + }, + { + "name": "originToken", + "type": "address", + "internalType": "address" + }, + { + "name": "destToken", + "type": "address", + "internalType": "address" + }, + { + "name": "originAmount", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "destAmount", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "originFeeAmount", + "type": "uint256", + "internalType": "uint256" + }, + { "name": "sendChainGas", "type": "bool", "internalType": "bool" }, + { + "name": "deadline", + "type": "uint256", + "internalType": "uint256" + }, + { "name": "nonce", "type": "uint256", "internalType": "uint256" } + ] + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "getRoleAdmin", + "inputs": [ + { "name": "role", "type": "bytes32", "internalType": "bytes32" } + ], + "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRoleMember", + "inputs": [ + { "name": "role", "type": "bytes32", "internalType": "bytes32" }, + { "name": "index", "type": "uint256", "internalType": "uint256" } + ], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRoleMemberCount", + "inputs": [ + { "name": "role", "type": "bytes32", "internalType": "bytes32" } + ], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "grantRole", + "inputs": [ + { "name": "role", "type": "bytes32", "internalType": "bytes32" }, + { "name": "account", "type": "address", "internalType": "address" } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "hasRole", + "inputs": [ + { "name": "role", "type": "bytes32", "internalType": "bytes32" }, + { "name": "account", "type": "address", "internalType": "address" } + ], + "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "nonce", + "inputs": [], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "protocolFeeRate", + "inputs": [], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "protocolFees", + "inputs": [{ "name": "", "type": "address", "internalType": "address" }], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "prove", + "inputs": [ + { "name": "request", "type": "bytes", "internalType": "bytes" }, + { "name": "destTxHash", "type": "bytes32", "internalType": "bytes32" } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "refund", + "inputs": [ + { "name": "request", "type": "bytes", "internalType": "bytes" } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "relay", + "inputs": [ + { "name": "request", "type": "bytes", "internalType": "bytes" } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "renounceRole", + "inputs": [ + { "name": "role", "type": "bytes32", "internalType": "bytes32" }, + { + "name": "callerConfirmation", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "revokeRole", + "inputs": [ + { "name": "role", "type": "bytes32", "internalType": "bytes32" }, + { "name": "account", "type": "address", "internalType": "address" } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setChainGasAmount", + "inputs": [ + { + "name": "newChainGasAmount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setProtocolFeeRate", + "inputs": [ + { "name": "newFeeRate", "type": "uint256", "internalType": "uint256" } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "supportsInterface", + "inputs": [ + { "name": "interfaceId", "type": "bytes4", "internalType": "bytes4" } + ], + "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "sweepProtocolFees", + "inputs": [ + { "name": "token", "type": "address", "internalType": "address" }, + { "name": "recipient", "type": "address", "internalType": "address" } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "BridgeDepositClaimed", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "relayer", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "token", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "BridgeDepositRefunded", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "token", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "BridgeProofDisputed", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "relayer", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "BridgeProofProvided", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "relayer", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "transactionHash", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "BridgeRelayed", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "relayer", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "originChainId", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + }, + { + "name": "originToken", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "destToken", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "originAmount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "destAmount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "chainGasAmount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "BridgeRequested", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "sender", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "request", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + }, + { + "name": "destChainId", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + }, + { + "name": "originToken", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "destToken", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "originAmount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "destAmount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "sendChainGas", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ChainGasAmountUpdated", + "inputs": [ + { + "name": "oldChainGasAmount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "newChainGasAmount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "FeeRateUpdated", + "inputs": [ + { + "name": "oldFeeRate", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "newFeeRate", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "FeesSwept", + "inputs": [ + { + "name": "token", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "recipient", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleAdminChanged", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "previousAdminRole", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "newAdminRole", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleGranted", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "account", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "sender", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleRevoked", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "account", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "sender", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { "type": "error", "name": "AccessControlBadConfirmation", "inputs": [] }, + { + "type": "error", + "name": "AccessControlUnauthorizedAccount", + "inputs": [ + { "name": "account", "type": "address", "internalType": "address" }, + { "name": "neededRole", "type": "bytes32", "internalType": "bytes32" } + ] + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { "name": "target", "type": "address", "internalType": "address" } + ] + }, + { + "type": "error", + "name": "AddressInsufficientBalance", + "inputs": [ + { "name": "account", "type": "address", "internalType": "address" } + ] + }, + { "type": "error", "name": "AmountIncorrect", "inputs": [] }, + { "type": "error", "name": "ChainIncorrect", "inputs": [] }, + { "type": "error", "name": "DeadlineExceeded", "inputs": [] }, + { "type": "error", "name": "DeadlineNotExceeded", "inputs": [] }, + { "type": "error", "name": "DeadlineTooShort", "inputs": [] }, + { "type": "error", "name": "DisputePeriodNotPassed", "inputs": [] }, + { "type": "error", "name": "DisputePeriodPassed", "inputs": [] }, + { "type": "error", "name": "FailedInnerCall", "inputs": [] }, + { "type": "error", "name": "MsgValueIncorrect", "inputs": [] }, + { + "type": "error", + "name": "SafeERC20FailedOperation", + "inputs": [ + { "name": "token", "type": "address", "internalType": "address" } + ] + }, + { "type": "error", "name": "SenderIncorrect", "inputs": [] }, + { "type": "error", "name": "StatusIncorrect", "inputs": [] }, + { "type": "error", "name": "TokenNotContract", "inputs": [] }, + { "type": "error", "name": "TransactionRelayed", "inputs": [] }, + { "type": "error", "name": "ZeroAddress", "inputs": [] } +] diff --git a/packages/synapse-interface/pages/state-managed-bridge/index.tsx b/packages/synapse-interface/pages/state-managed-bridge/index.tsx index 4de32609cf..88eb6e5ee8 100644 --- a/packages/synapse-interface/pages/state-managed-bridge/index.tsx +++ b/packages/synapse-interface/pages/state-managed-bridge/index.tsx @@ -108,7 +108,7 @@ const StateManagedBridge = () => { const dispatch = useAppDispatch() useIsTxRefunded( - undefined, + '0x6DE56AB01E5C9D1D411918BFCE2FB222E53E4F45BCDAFD8892F6649C1E27AEA6', '0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E', BASE, true From 2265a3ad40dc93f413502d2f0689ea6fe4f0a984 Mon Sep 17 00:00:00 2001 From: bigboydiamonds <57741810+bigboydiamonds@users.noreply.github.com> Date: Thu, 20 Jun 2024 11:28:24 -0700 Subject: [PATCH 03/13] Return rfq tx refunded status in hook --- .../_Transaction/helpers/useIsTxRefunded.ts | 13 ++++++++++++- .../pages/state-managed-bridge/index.tsx | 4 +++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/packages/synapse-interface/components/_Transaction/helpers/useIsTxRefunded.ts b/packages/synapse-interface/components/_Transaction/helpers/useIsTxRefunded.ts index e93b1f20b2..3918e9e443 100644 --- a/packages/synapse-interface/components/_Transaction/helpers/useIsTxRefunded.ts +++ b/packages/synapse-interface/components/_Transaction/helpers/useIsTxRefunded.ts @@ -7,6 +7,14 @@ import { useIntervalTimer } from '@/utils/hooks/useIntervalTimer' import fastBridgeAbi from '@/constants/abis/fastBridge.json' import { wagmiConfig } from '@/wagmiConfig' +enum BridgeStatus { + NULL, + REQUESTED, + RELAYER_PROVED, + RELAYER_CLAIMED, + REFUNDED, +} + export const useIsTxRefunded = ( txId: Address | undefined, bridgeContract: Address, @@ -14,7 +22,7 @@ export const useIsTxRefunded = ( checkForRefund: boolean ) => { const [isRefunded, setIsRefunded] = useState(false) - const currentTime = useIntervalTimer(60000) + const currentTime = useIntervalTimer(600000) const getTxRefundStatus = async () => { try { @@ -24,6 +32,9 @@ export const useIsTxRefunded = ( chain?.id ) console.log('status: ', status) + if (status === BridgeStatus.REFUNDED) { + setIsRefunded(true) + } } catch (error) { console.error('Failed to fetch transaction receipt:', error) } diff --git a/packages/synapse-interface/pages/state-managed-bridge/index.tsx b/packages/synapse-interface/pages/state-managed-bridge/index.tsx index 88eb6e5ee8..f492776967 100644 --- a/packages/synapse-interface/pages/state-managed-bridge/index.tsx +++ b/packages/synapse-interface/pages/state-managed-bridge/index.tsx @@ -107,13 +107,15 @@ const StateManagedBridge = () => { const dispatch = useAppDispatch() - useIsTxRefunded( + const isRefunded = useIsTxRefunded( '0x6DE56AB01E5C9D1D411918BFCE2FB222E53E4F45BCDAFD8892F6649C1E27AEA6', '0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E', BASE, true ) + console.log('isRefunded: ', isRefunded) + useEffect(() => { segmentAnalyticsEvent(`[Bridge page] arrives`, { fromChainId, From c4fe0ca9acbe683b2c9b6e45abfaf06829d3ef52 Mon Sep 17 00:00:00 2001 From: bigboydiamonds <57741810+bigboydiamonds@users.noreply.github.com> Date: Thu, 20 Jun 2024 15:24:48 -0700 Subject: [PATCH 04/13] Track bridge transaction `bridgeQuote.routerAddress` in store --- .../components/_Transaction/helpers/useIsTxRefunded.ts | 4 ++-- .../synapse-interface/pages/state-managed-bridge/index.tsx | 1 + packages/synapse-interface/slices/_transactions/reducer.ts | 1 + packages/synapse-interface/slices/transactions/actions.ts | 1 + .../synapse-interface/utils/hooks/use_TransactionsListener.ts | 1 + 5 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/synapse-interface/components/_Transaction/helpers/useIsTxRefunded.ts b/packages/synapse-interface/components/_Transaction/helpers/useIsTxRefunded.ts index 3918e9e443..fd8783bfa3 100644 --- a/packages/synapse-interface/components/_Transaction/helpers/useIsTxRefunded.ts +++ b/packages/synapse-interface/components/_Transaction/helpers/useIsTxRefunded.ts @@ -2,10 +2,10 @@ import { type Address } from 'viem' import { useEffect, useState } from 'react' import { readContract } from '@wagmi/core' -import { Chain } from '@/utils/types' +import { type Chain } from '@/utils/types' import { useIntervalTimer } from '@/utils/hooks/useIntervalTimer' -import fastBridgeAbi from '@/constants/abis/fastBridge.json' import { wagmiConfig } from '@/wagmiConfig' +import fastBridgeAbi from '@/constants/abis/fastBridge.json' enum BridgeStatus { NULL, diff --git a/packages/synapse-interface/pages/state-managed-bridge/index.tsx b/packages/synapse-interface/pages/state-managed-bridge/index.tsx index f492776967..c212210dd9 100644 --- a/packages/synapse-interface/pages/state-managed-bridge/index.tsx +++ b/packages/synapse-interface/pages/state-managed-bridge/index.tsx @@ -386,6 +386,7 @@ const StateManagedBridge = () => { estimatedTime: bridgeQuote.estimatedTime, bridgeModuleName: bridgeQuote.bridgeModuleName, destinationAddress: destinationAddress, + routerAddress: bridgeQuote.routerAddress, }) ) try { diff --git a/packages/synapse-interface/slices/_transactions/reducer.ts b/packages/synapse-interface/slices/_transactions/reducer.ts index 2225c8ead0..62a93a53c0 100644 --- a/packages/synapse-interface/slices/_transactions/reducer.ts +++ b/packages/synapse-interface/slices/_transactions/reducer.ts @@ -14,6 +14,7 @@ export interface _TransactionDetails { originValue: string originTxHash: string bridgeModuleName: string + routerAddress: string estimatedTime: number timestamp: number kappa?: string diff --git a/packages/synapse-interface/slices/transactions/actions.ts b/packages/synapse-interface/slices/transactions/actions.ts index cb4ef22cc7..68400faaa9 100644 --- a/packages/synapse-interface/slices/transactions/actions.ts +++ b/packages/synapse-interface/slices/transactions/actions.ts @@ -16,6 +16,7 @@ export interface PendingBridgeTransaction { isSubmitted: boolean estimatedTime: number bridgeModuleName: string + routerAddress: string destinationAddress: Address | null } diff --git a/packages/synapse-interface/utils/hooks/use_TransactionsListener.ts b/packages/synapse-interface/utils/hooks/use_TransactionsListener.ts index b82d6ca8fe..e2f7b85697 100644 --- a/packages/synapse-interface/utils/hooks/use_TransactionsListener.ts +++ b/packages/synapse-interface/utils/hooks/use_TransactionsListener.ts @@ -50,6 +50,7 @@ export const use_TransactionsListener = () => { destinationChain: tx.destinationChain, destinationToken: tx.destinationToken, bridgeModuleName: tx.bridgeModuleName, + routerAddress: tx.routerAddress, estimatedTime: tx.estimatedTime, timestamp: tx.id, status: 'pending', From ba6bf36beefcb97374e09872c3434ac390ceb00c Mon Sep 17 00:00:00 2001 From: bigboydiamonds <57741810+bigboydiamonds@users.noreply.github.com> Date: Thu, 20 Jun 2024 15:49:16 -0700 Subject: [PATCH 05/13] Fetch FastBridge contract address when only provided router address --- .../_Transaction/helpers/useIsTxRefunded.ts | 68 ++- .../constants/abis/FastBridgeRouter.json | 387 ++++++++++++++++++ .../pages/state-managed-bridge/index.tsx | 2 +- 3 files changed, 442 insertions(+), 15 deletions(-) create mode 100644 packages/synapse-interface/constants/abis/FastBridgeRouter.json diff --git a/packages/synapse-interface/components/_Transaction/helpers/useIsTxRefunded.ts b/packages/synapse-interface/components/_Transaction/helpers/useIsTxRefunded.ts index fd8783bfa3..4c8a960d13 100644 --- a/packages/synapse-interface/components/_Transaction/helpers/useIsTxRefunded.ts +++ b/packages/synapse-interface/components/_Transaction/helpers/useIsTxRefunded.ts @@ -1,3 +1,4 @@ +import { isNumber, isString } from 'lodash' import { type Address } from 'viem' import { useEffect, useState } from 'react' import { readContract } from '@wagmi/core' @@ -5,7 +6,9 @@ import { readContract } from '@wagmi/core' import { type Chain } from '@/utils/types' import { useIntervalTimer } from '@/utils/hooks/useIntervalTimer' import { wagmiConfig } from '@/wagmiConfig' -import fastBridgeAbi from '@/constants/abis/fastBridge.json' +import fastBridgeAbi from '@/constants/abis/FastBridge.json' +import fastBridgeRouterAbi from '@/constants/abis/FastBridgeRouter.json' +import { isValidAddress } from '@/utils/isValidAddress' enum BridgeStatus { NULL, @@ -17,7 +20,7 @@ enum BridgeStatus { export const useIsTxRefunded = ( txId: Address | undefined, - bridgeContract: Address, + routerAddress: Address, chain: Chain, checkForRefund: boolean ) => { @@ -26,17 +29,23 @@ export const useIsTxRefunded = ( const getTxRefundStatus = async () => { try { + const bridgeContract = await getRFQBridgeContract( + routerAddress, + chain?.id + ) + const status = await checkRFQTxBridgeStatus( txId, - bridgeContract, + bridgeContract as Address, chain?.id ) - console.log('status: ', status) + if (status === BridgeStatus.REFUNDED) { setIsRefunded(true) } + console.log('RFQ Transaction Status: ', status) } catch (error) { - console.error('Failed to fetch transaction receipt:', error) + console.error('Failed to get transaction refund status:', error) } } @@ -49,17 +58,48 @@ export const useIsTxRefunded = ( return isRefunded } +const getRFQBridgeContract = async ( + routerAddress: Address, + chainId: number +): Promise => { + try { + const fastBridgeAddress = await readContract(wagmiConfig, { + abi: fastBridgeRouterAbi, + address: routerAddress, + functionName: 'fastBridge', + chainId, + }) + + if (!isString(fastBridgeAddress)) { + throw new Error('Invalid address') + } + + return fastBridgeAddress + } catch (error) { + throw new Error(error) + } +} + const checkRFQTxBridgeStatus = async ( txId: Address, bridgeContract: Address, chainId: number -) => { - const result = await readContract(wagmiConfig, { - abi: fastBridgeAbi, - address: bridgeContract, - functionName: 'bridgeStatuses', - args: [txId], - chainId, - }) - return result +): Promise => { + try { + const status = await readContract(wagmiConfig, { + abi: fastBridgeAbi, + address: bridgeContract, + functionName: 'bridgeStatuses', + args: [txId], + chainId, + }) + + if (!isNumber(status)) { + throw new Error('Invalid status code') + } + + return status + } catch (error) { + throw new Error(error) + } } diff --git a/packages/synapse-interface/constants/abis/FastBridgeRouter.json b/packages/synapse-interface/constants/abis/FastBridgeRouter.json new file mode 100644 index 0000000000..c5617fe1cf --- /dev/null +++ b/packages/synapse-interface/constants/abis/FastBridgeRouter.json @@ -0,0 +1,387 @@ +[ + { + "type": "constructor", + "inputs": [ + { + "name": "owner_", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "receive", + "stateMutability": "payable" + }, + { + "type": "function", + "name": "GAS_REBATE_FLAG", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes1", + "internalType": "bytes1" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "adapterSwap", + "inputs": [ + { + "name": "recipient", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenIn", + "type": "address", + "internalType": "address" + }, + { + "name": "amountIn", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "tokenOut", + "type": "address", + "internalType": "address" + }, + { + "name": "rawParams", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [ + { + "name": "amountOut", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "bridge", + "inputs": [ + { + "name": "recipient", + "type": "address", + "internalType": "address" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "token", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "originQuery", + "type": "tuple", + "internalType": "struct SwapQuery", + "components": [ + { + "name": "routerAdapter", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenOut", + "type": "address", + "internalType": "address" + }, + { + "name": "minAmountOut", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "deadline", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "rawParams", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "destQuery", + "type": "tuple", + "internalType": "struct SwapQuery", + "components": [ + { + "name": "routerAdapter", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenOut", + "type": "address", + "internalType": "address" + }, + { + "name": "minAmountOut", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "deadline", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "rawParams", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "fastBridge", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getOriginAmountOut", + "inputs": [ + { + "name": "tokenIn", + "type": "address", + "internalType": "address" + }, + { + "name": "rfqTokens", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "amountIn", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "originQueries", + "type": "tuple[]", + "internalType": "struct SwapQuery[]", + "components": [ + { + "name": "routerAdapter", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenOut", + "type": "address", + "internalType": "address" + }, + { + "name": "minAmountOut", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "deadline", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "rawParams", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setFastBridge", + "inputs": [ + { + "name": "fastBridge_", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setSwapQuoter", + "inputs": [ + { + "name": "swapQuoter_", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "swapQuoter", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "FastBridgeSet", + "inputs": [ + { + "name": "newFastBridge", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SwapQuoterSet", + "inputs": [ + { + "name": "newSwapQuoter", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "DeadlineExceeded", + "inputs": [] + }, + { + "type": "error", + "name": "InsufficientOutputAmount", + "inputs": [] + }, + { + "type": "error", + "name": "MsgValueIncorrect", + "inputs": [] + }, + { + "type": "error", + "name": "PoolNotFound", + "inputs": [] + }, + { + "type": "error", + "name": "TokenAddressMismatch", + "inputs": [] + }, + { + "type": "error", + "name": "TokenNotContract", + "inputs": [] + }, + { + "type": "error", + "name": "TokenNotETH", + "inputs": [] + }, + { + "type": "error", + "name": "TokensIdentical", + "inputs": [] + } +] diff --git a/packages/synapse-interface/pages/state-managed-bridge/index.tsx b/packages/synapse-interface/pages/state-managed-bridge/index.tsx index c212210dd9..bbc1b75d49 100644 --- a/packages/synapse-interface/pages/state-managed-bridge/index.tsx +++ b/packages/synapse-interface/pages/state-managed-bridge/index.tsx @@ -109,7 +109,7 @@ const StateManagedBridge = () => { const isRefunded = useIsTxRefunded( '0x6DE56AB01E5C9D1D411918BFCE2FB222E53E4F45BCDAFD8892F6649C1E27AEA6', - '0x5523D3c98809DdDB82C686E152F5C58B1B0fB59E', + '0x0000000000489d89D2B233D3375C045dfD05745F', BASE, true ) From 01bd47c4660bca3ff821531b3ee99c792c0c8360 Mon Sep 17 00:00:00 2001 From: bigboydiamonds <57741810+bigboydiamonds@users.noreply.github.com> Date: Thu, 20 Jun 2024 16:09:14 -0700 Subject: [PATCH 06/13] Update transaction in store when refund found --- .../components/_Transaction/_Transaction.tsx | 14 +++++++++++++- .../helpers/getEstimatedTimeStatus.ts | 3 +++ .../_Transaction/helpers/useBridgeTxUpdater.ts | 13 +++++++++++-- .../{useIsTxRefunded.ts => useTxRefundStatus.ts} | 9 ++++----- .../pages/state-managed-bridge/index.tsx | 1 - .../slices/_transactions/reducer.ts | 16 +++++++++++++++- 6 files changed, 46 insertions(+), 10 deletions(-) rename packages/synapse-interface/components/_Transaction/helpers/{useIsTxRefunded.ts => useTxRefundStatus.ts} (94%) diff --git a/packages/synapse-interface/components/_Transaction/_Transaction.tsx b/packages/synapse-interface/components/_Transaction/_Transaction.tsx index e7f231f32c..f57f1796bb 100644 --- a/packages/synapse-interface/components/_Transaction/_Transaction.tsx +++ b/packages/synapse-interface/components/_Transaction/_Transaction.tsx @@ -17,6 +17,7 @@ import { TransactionSupport } from './components/TransactionSupport' import { RightArrow } from '@/components/icons/RightArrow' import { Address } from 'viem' import { useIsTxReverted } from './helpers/useIsTxReverted' +import { useTxRefundStatus } from './helpers/useTxRefundStatus' interface _TransactionProps { connectedAddress: string @@ -28,6 +29,7 @@ interface _TransactionProps { destinationToken: Token originTxHash: string bridgeModuleName: string + routerAddress: string estimatedTime: number // in seconds timestamp: number currentTime: number @@ -46,6 +48,7 @@ export const _Transaction = ({ destinationToken, originTxHash, bridgeModuleName, + routerAddress, estimatedTime, timestamp, currentTime, @@ -74,6 +77,7 @@ export const _Transaction = ({ isEstimatedTimeReached, isCheckTxStatus, isCheckTxForRevert, + isCheckTxForRefund, } = getEstimatedTimeStatus(currentTime, timestamp, estimatedTime) const [isTxCompleted, _kappa] = useBridgeTxStatus({ @@ -92,13 +96,21 @@ export const _Transaction = ({ isCheckTxForRevert && status === 'pending' ) + const isTxRefunded = useTxRefundStatus( + kappa, + routerAddress as Address, + originChain, + isCheckTxForRefund && bridgeModuleName === 'SynapseRFQ' + ) + useBridgeTxUpdater( connectedAddress, destinationChain, _kappa, originTxHash, isTxCompleted, - isTxReverted + isTxReverted, + isTxRefunded ) // Show transaction support if the transaction is delayed by more than 5 minutes and not finalized or reverted diff --git a/packages/synapse-interface/components/_Transaction/helpers/getEstimatedTimeStatus.ts b/packages/synapse-interface/components/_Transaction/helpers/getEstimatedTimeStatus.ts index 840dfbcc5f..e9e4aafc86 100644 --- a/packages/synapse-interface/components/_Transaction/helpers/getEstimatedTimeStatus.ts +++ b/packages/synapse-interface/components/_Transaction/helpers/getEstimatedTimeStatus.ts @@ -17,10 +17,12 @@ export const getEstimatedTimeStatus = ( const targetTime = initialTime + estimatedTime const oneMinuteInSeconds = 60 + const fourHoursInSeconds = 14400 const isEstimatedTimeReached = remainingTime < 0 const isCheckTxStatus = remainingTime < oneMinuteInSeconds const isCheckTxForRevert = elapsedTime > 30 + const isCheckTxForRefund = elapsedTime > fourHoursInSeconds const delayedTime = isEstimatedTimeReached ? remainingTime : null const delayedTimeInMin = remainingTime ? Math.floor(remainingTime / 60) : null @@ -34,5 +36,6 @@ export const getEstimatedTimeStatus = ( isEstimatedTimeReached, isCheckTxStatus, isCheckTxForRevert, + isCheckTxForRefund, } } diff --git a/packages/synapse-interface/components/_Transaction/helpers/useBridgeTxUpdater.ts b/packages/synapse-interface/components/_Transaction/helpers/useBridgeTxUpdater.ts index 6715605a50..34257042f9 100644 --- a/packages/synapse-interface/components/_Transaction/helpers/useBridgeTxUpdater.ts +++ b/packages/synapse-interface/components/_Transaction/helpers/useBridgeTxUpdater.ts @@ -5,11 +5,12 @@ import { updateTransactionKappa, completeTransaction, revertTransaction, + refundTransaction, _TransactionDetails, } from '@/slices/_transactions/reducer' import { fetchAndStoreSingleNetworkPortfolioBalances } from '@/slices/portfolio/hooks' import { use_TransactionsState } from '@/slices/_transactions/hooks' -import { Chain } from '@/utils/types' +import { type Chain } from '@/utils/types' /** * Hook to update Tx store state based on returned SDK method calls @@ -27,7 +28,8 @@ export const useBridgeTxUpdater = ( kappa: string, originTxHash: string, isTxComplete: boolean, - isTxReverted: boolean + isTxReverted: boolean, + isTxRefunded: boolean ) => { const dispatch = useAppDispatch() const { transactions } = use_TransactionsState() @@ -49,6 +51,13 @@ export const useBridgeTxUpdater = ( } }, [isTxReverted]) + /** Update tx for refunds in store */ + useEffect(() => { + if (isTxRefunded && storedTx.status !== 'refunded') { + dispatch(refundTransaction({ originTxHash })) + } + }, [isTxRefunded]) + /** Update tx for completion in store */ useEffect(() => { if (isTxComplete && originTxHash && kappa) { diff --git a/packages/synapse-interface/components/_Transaction/helpers/useIsTxRefunded.ts b/packages/synapse-interface/components/_Transaction/helpers/useTxRefundStatus.ts similarity index 94% rename from packages/synapse-interface/components/_Transaction/helpers/useIsTxRefunded.ts rename to packages/synapse-interface/components/_Transaction/helpers/useTxRefundStatus.ts index 4c8a960d13..c09fd7bb2f 100644 --- a/packages/synapse-interface/components/_Transaction/helpers/useIsTxRefunded.ts +++ b/packages/synapse-interface/components/_Transaction/helpers/useTxRefundStatus.ts @@ -1,5 +1,5 @@ -import { isNumber, isString } from 'lodash' import { type Address } from 'viem' +import { isNumber, isString } from 'lodash' import { useEffect, useState } from 'react' import { readContract } from '@wagmi/core' @@ -8,7 +8,6 @@ import { useIntervalTimer } from '@/utils/hooks/useIntervalTimer' import { wagmiConfig } from '@/wagmiConfig' import fastBridgeAbi from '@/constants/abis/FastBridge.json' import fastBridgeRouterAbi from '@/constants/abis/FastBridgeRouter.json' -import { isValidAddress } from '@/utils/isValidAddress' enum BridgeStatus { NULL, @@ -18,8 +17,8 @@ enum BridgeStatus { REFUNDED, } -export const useIsTxRefunded = ( - txId: Address | undefined, +export const useTxRefundStatus = ( + txId: string | undefined, routerAddress: Address, chain: Chain, checkForRefund: boolean @@ -81,7 +80,7 @@ const getRFQBridgeContract = async ( } const checkRFQTxBridgeStatus = async ( - txId: Address, + txId: string, bridgeContract: Address, chainId: number ): Promise => { diff --git a/packages/synapse-interface/pages/state-managed-bridge/index.tsx b/packages/synapse-interface/pages/state-managed-bridge/index.tsx index bbc1b75d49..c3c5573ae1 100644 --- a/packages/synapse-interface/pages/state-managed-bridge/index.tsx +++ b/packages/synapse-interface/pages/state-managed-bridge/index.tsx @@ -74,7 +74,6 @@ import { } from '@/components/Maintenance/Maintenance' import { wagmiConfig } from '@/wagmiConfig' import { useStaleQuoteRefresher } from '@/utils/hooks/useStaleQuoteRefresher' -import { getTransactionRefundLogs } from '@/components/_Transaction/helpers/getTransactionReceipt' import { useIsTxRefunded } from '@/components/_Transaction/helpers/useIsTxRefunded' import { BASE } from '@/constants/chains/master' diff --git a/packages/synapse-interface/slices/_transactions/reducer.ts b/packages/synapse-interface/slices/_transactions/reducer.ts index 62a93a53c0..cac413c616 100644 --- a/packages/synapse-interface/slices/_transactions/reducer.ts +++ b/packages/synapse-interface/slices/_transactions/reducer.ts @@ -18,7 +18,7 @@ export interface _TransactionDetails { estimatedTime: number timestamp: number kappa?: string - status: 'pending' | 'completed' | 'reverted' + status: 'pending' | 'completed' | 'reverted' | 'refunded' } export interface _TransactionsState { @@ -88,6 +88,19 @@ export const transactionsSlice = createSlice({ state.transactions[txIndex].status = 'reverted' } }, + refundTransaction: ( + state, + action: PayloadAction<{ originTxHash: string }> + ) => { + const { originTxHash } = action.payload + + const txIndex = state.transactions.findIndex( + (tx) => tx.originTxHash === originTxHash + ) + if (txIndex !== -1) { + state.transactions[txIndex].status = 'refunded' + } + }, clearTransactions: (state) => { state.transactions = [] }, @@ -100,6 +113,7 @@ export const { updateTransactionKappa, completeTransaction, revertTransaction, + refundTransaction, clearTransactions, } = transactionsSlice.actions From 23bacd61cccc3027a4d073cd8297628b5c1670e6 Mon Sep 17 00:00:00 2001 From: bigboydiamonds <57741810+bigboydiamonds@users.noreply.github.com> Date: Thu, 20 Jun 2024 16:13:41 -0700 Subject: [PATCH 07/13] Update _Transaction component to reflect refund --- .../components/_Transaction/_Transaction.tsx | 13 ++++++++++--- .../_Transaction/components/TransactionSupport.tsx | 5 +++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/synapse-interface/components/_Transaction/_Transaction.tsx b/packages/synapse-interface/components/_Transaction/_Transaction.tsx index f57f1796bb..ad20589b49 100644 --- a/packages/synapse-interface/components/_Transaction/_Transaction.tsx +++ b/packages/synapse-interface/components/_Transaction/_Transaction.tsx @@ -34,7 +34,7 @@ interface _TransactionProps { timestamp: number currentTime: number kappa?: string - status: 'pending' | 'completed' | 'reverted' + status: 'pending' | 'completed' | 'reverted' | 'refunded' } /** TODO: Update naming after refactoring existing Activity / Transaction flow */ @@ -100,7 +100,9 @@ export const _Transaction = ({ kappa, routerAddress as Address, originChain, - isCheckTxForRefund && bridgeModuleName === 'SynapseRFQ' + isCheckTxForRefund && + status === 'pending' && + bridgeModuleName === 'SynapseRFQ' ) useBridgeTxUpdater( @@ -116,6 +118,7 @@ export const _Transaction = ({ // Show transaction support if the transaction is delayed by more than 5 minutes and not finalized or reverted const showTransactionSupport = status === 'reverted' || + status === 'refunded' || (status === 'pending' && delayedTimeInMin && delayedTimeInMin <= -5) return ( @@ -187,7 +190,11 @@ export const _Transaction = ({ /> {status !== 'pending' && ( diff --git a/packages/synapse-interface/components/_Transaction/components/TransactionSupport.tsx b/packages/synapse-interface/components/_Transaction/components/TransactionSupport.tsx index 91e8d94f41..42f256a3d5 100644 --- a/packages/synapse-interface/components/_Transaction/components/TransactionSupport.tsx +++ b/packages/synapse-interface/components/_Transaction/components/TransactionSupport.tsx @@ -1,14 +1,15 @@ import { TRANSACTION_SUPPORT_URL, DISCORD_URL } from '@/constants/urls' export const TransactionSupport = ({ status }: { status: string }) => { - const isReverted = status === 'reverted' return (
- {isReverted ? ( + {status === 'reverted' ? (
Transaction reverted, funds returned
+ ) : status === 'refunded' ? ( +
Transaction refunded, funds returned
) : (
What's taking so long?
)} From b81d8e3fb43e822738c5a02d433c7250da261ff3 Mon Sep 17 00:00:00 2001 From: bigboydiamonds <57741810+bigboydiamonds@users.noreply.github.com> Date: Thu, 20 Jun 2024 16:17:00 -0700 Subject: [PATCH 08/13] Update abi file case --- .../abis/{FastBridgeRouter.json => fastBridgeRouter.json} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/synapse-interface/constants/abis/{FastBridgeRouter.json => fastBridgeRouter.json} (100%) diff --git a/packages/synapse-interface/constants/abis/FastBridgeRouter.json b/packages/synapse-interface/constants/abis/fastBridgeRouter.json similarity index 100% rename from packages/synapse-interface/constants/abis/FastBridgeRouter.json rename to packages/synapse-interface/constants/abis/fastBridgeRouter.json From d77079daea506cb370351c8173e7e8fc03df784f Mon Sep 17 00:00:00 2001 From: bigboydiamonds <57741810+bigboydiamonds@users.noreply.github.com> Date: Thu, 20 Jun 2024 16:32:22 -0700 Subject: [PATCH 09/13] Clean --- .../components/_Transaction/_Transactions.tsx | 1 + .../pages/state-managed-bridge/index.tsx | 11 ----------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/packages/synapse-interface/components/_Transaction/_Transactions.tsx b/packages/synapse-interface/components/_Transaction/_Transactions.tsx index 89119cb8fe..93af028414 100644 --- a/packages/synapse-interface/components/_Transaction/_Transactions.tsx +++ b/packages/synapse-interface/components/_Transaction/_Transactions.tsx @@ -54,6 +54,7 @@ export const _Transactions = ({ destinationToken={destinationToken} originTxHash={tx.originTxHash} bridgeModuleName={tx.bridgeModuleName} + routerAddress={tx.routerAddress} estimatedTime={tx.estimatedTime} kappa={tx?.kappa} timestamp={tx.timestamp} diff --git a/packages/synapse-interface/pages/state-managed-bridge/index.tsx b/packages/synapse-interface/pages/state-managed-bridge/index.tsx index c3c5573ae1..0dfea917eb 100644 --- a/packages/synapse-interface/pages/state-managed-bridge/index.tsx +++ b/packages/synapse-interface/pages/state-managed-bridge/index.tsx @@ -74,8 +74,6 @@ import { } from '@/components/Maintenance/Maintenance' import { wagmiConfig } from '@/wagmiConfig' import { useStaleQuoteRefresher } from '@/utils/hooks/useStaleQuoteRefresher' -import { useIsTxRefunded } from '@/components/_Transaction/helpers/useIsTxRefunded' -import { BASE } from '@/constants/chains/master' const StateManagedBridge = () => { const { address } = useAccount() @@ -106,15 +104,6 @@ const StateManagedBridge = () => { const dispatch = useAppDispatch() - const isRefunded = useIsTxRefunded( - '0x6DE56AB01E5C9D1D411918BFCE2FB222E53E4F45BCDAFD8892F6649C1E27AEA6', - '0x0000000000489d89D2B233D3375C045dfD05745F', - BASE, - true - ) - - console.log('isRefunded: ', isRefunded) - useEffect(() => { segmentAnalyticsEvent(`[Bridge page] arrives`, { fromChainId, From 93fb5dd89392f6046e3bcec5c865c71a1daf9ebe Mon Sep 17 00:00:00 2001 From: bigboydiamonds <57741810+bigboydiamonds@users.noreply.github.com> Date: Thu, 20 Jun 2024 16:37:58 -0700 Subject: [PATCH 10/13] Fix import --- .../components/_Transaction/helpers/useTxRefundStatus.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/synapse-interface/components/_Transaction/helpers/useTxRefundStatus.ts b/packages/synapse-interface/components/_Transaction/helpers/useTxRefundStatus.ts index c09fd7bb2f..3a758b21e7 100644 --- a/packages/synapse-interface/components/_Transaction/helpers/useTxRefundStatus.ts +++ b/packages/synapse-interface/components/_Transaction/helpers/useTxRefundStatus.ts @@ -6,8 +6,8 @@ import { readContract } from '@wagmi/core' import { type Chain } from '@/utils/types' import { useIntervalTimer } from '@/utils/hooks/useIntervalTimer' import { wagmiConfig } from '@/wagmiConfig' -import fastBridgeAbi from '@/constants/abis/FastBridge.json' -import fastBridgeRouterAbi from '@/constants/abis/FastBridgeRouter.json' +import fastBridgeAbi from '@/constants/abis/fastBridge.json' +import fastBridgeRouterAbi from '@/constants/abis/fastBridgeRouter.json' enum BridgeStatus { NULL, From 50fa482742d9e5cc19be2f69a4b9702b788281d5 Mon Sep 17 00:00:00 2001 From: bigboydiamonds <57741810+bigboydiamonds@users.noreply.github.com> Date: Thu, 20 Jun 2024 18:08:33 -0700 Subject: [PATCH 11/13] Remove log --- .../components/_Transaction/helpers/useTxRefundStatus.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/synapse-interface/components/_Transaction/helpers/useTxRefundStatus.ts b/packages/synapse-interface/components/_Transaction/helpers/useTxRefundStatus.ts index 3a758b21e7..351f97f04e 100644 --- a/packages/synapse-interface/components/_Transaction/helpers/useTxRefundStatus.ts +++ b/packages/synapse-interface/components/_Transaction/helpers/useTxRefundStatus.ts @@ -42,7 +42,6 @@ export const useTxRefundStatus = ( if (status === BridgeStatus.REFUNDED) { setIsRefunded(true) } - console.log('RFQ Transaction Status: ', status) } catch (error) { console.error('Failed to get transaction refund status:', error) } From c8d23f76bfd535587858d8f7694054fde95bba81 Mon Sep 17 00:00:00 2001 From: bigboydiamonds <57741810+bigboydiamonds@users.noreply.github.com> Date: Thu, 26 Sep 2024 08:30:31 -0700 Subject: [PATCH 12/13] add translations --- packages/synapse-interface/messages/ar.json | 1 + packages/synapse-interface/messages/en-US.json | 1 + packages/synapse-interface/messages/es.json | 1 + packages/synapse-interface/messages/fr.json | 1 + packages/synapse-interface/messages/jp.json | 1 + packages/synapse-interface/messages/tr.json | 1 + packages/synapse-interface/messages/zh-CN.json | 1 + 7 files changed, 7 insertions(+) diff --git a/packages/synapse-interface/messages/ar.json b/packages/synapse-interface/messages/ar.json index fc6571c49e..0fb8c9253a 100644 --- a/packages/synapse-interface/messages/ar.json +++ b/packages/synapse-interface/messages/ar.json @@ -307,6 +307,7 @@ "Complete": "مكتمل", "Reverted": "تم الرجوع", "Transaction reverted, funds returned": "تم الرجوع عن المعاملة، تم إرجاع الأموال", + "Transaction refunded, funds returned": "تم استرداد المعاملة، وتمت إعادة الأموال", "What's taking so long?": "لماذا يستغرق الأمر وقتًا طويلًا؟", "FAQ": "الأسئلة الشائعة", "Support": "الدعم", diff --git a/packages/synapse-interface/messages/en-US.json b/packages/synapse-interface/messages/en-US.json index 7c5a99c5d0..45abfeb124 100644 --- a/packages/synapse-interface/messages/en-US.json +++ b/packages/synapse-interface/messages/en-US.json @@ -307,6 +307,7 @@ "Complete": "Complete", "Reverted": "Reverted", "Transaction reverted, funds returned": "Transaction reverted, funds returned", + "Transaction refunded, funds returned": "Transaction refunded, funds returned", "What's taking so long?": "What's taking so long?", "FAQ": "F.A.Q", "Support": "Support", diff --git a/packages/synapse-interface/messages/es.json b/packages/synapse-interface/messages/es.json index c6ac15e7d8..1c3430570c 100644 --- a/packages/synapse-interface/messages/es.json +++ b/packages/synapse-interface/messages/es.json @@ -307,6 +307,7 @@ "Complete": "Completo", "Reverted": "Revertido", "Transaction reverted, funds returned": "Transacción revertida, fondos devueltos", + "Transaction refunded, funds returned": "Transacción reembolsada, fondos devueltos", "What's taking so long?": "¿Por qué está tardando tanto?", "FAQ": "Preguntas frecuentes", "Support": "Soporte", diff --git a/packages/synapse-interface/messages/fr.json b/packages/synapse-interface/messages/fr.json index b5f249aaf1..a89818bbdf 100644 --- a/packages/synapse-interface/messages/fr.json +++ b/packages/synapse-interface/messages/fr.json @@ -307,6 +307,7 @@ "Complete": "Terminé", "Reverted": "Annulé", "Transaction reverted, funds returned": "Transaction annulée, fonds retournés", + "Transaction refunded, funds returned": "Transaction remboursée, fonds retournés", "What's taking so long?": "Qu'est-ce qui prend tant de temps ?", "FAQ": "FAQ", "Support": "Support", diff --git a/packages/synapse-interface/messages/jp.json b/packages/synapse-interface/messages/jp.json index c187de083b..d6ee99094c 100644 --- a/packages/synapse-interface/messages/jp.json +++ b/packages/synapse-interface/messages/jp.json @@ -307,6 +307,7 @@ "Complete": "完了", "Reverted": "取り消し", "Transaction reverted, funds returned": "取引が取り消されました。資金が返還されました", + "Transaction refunded, funds returned": "取引が返金され、資金が戻されました", "What's taking so long?": "なぜ時間がかかっているのですか?", "FAQ": "よくある質問", "Support": "サポート", diff --git a/packages/synapse-interface/messages/tr.json b/packages/synapse-interface/messages/tr.json index dbe44d71b2..2affd63459 100644 --- a/packages/synapse-interface/messages/tr.json +++ b/packages/synapse-interface/messages/tr.json @@ -307,6 +307,7 @@ "Complete": "Tamamlandı", "Reverted": "Geri Alındı", "Transaction reverted, funds returned": "İşlem geri alındı, fonlar iade edildi", + "Transaction refunded, funds returned": "İşlem iade edildi, fonlar geri gönderildi", "What's taking so long?": "Neden bu kadar uzun sürüyor?", "FAQ": "SSS", "Support": "Destek", diff --git a/packages/synapse-interface/messages/zh-CN.json b/packages/synapse-interface/messages/zh-CN.json index 0d5cb9e02d..9b220cc62d 100644 --- a/packages/synapse-interface/messages/zh-CN.json +++ b/packages/synapse-interface/messages/zh-CN.json @@ -307,6 +307,7 @@ "Complete": "已完成", "Reverted": "已回退", "Transaction reverted, funds returned": "交易已回退,资金已退还", + "Transaction refunded, funds returned": "交易已退款,资金已退还", "What's taking so long?": "为什么这么久?", "FAQ": "常见问题", "Support": "支持", From 446aad36618fe7290458f358e6573a6b03d4c712 Mon Sep 17 00:00:00 2001 From: bigboydiamonds <57741810+bigboydiamonds@users.noreply.github.com> Date: Thu, 26 Sep 2024 08:38:22 -0700 Subject: [PATCH 13/13] add translations --- .../components/_Transaction/components/TimeRemaining.tsx | 2 +- packages/synapse-interface/messages/ar.json | 1 + packages/synapse-interface/messages/en-US.json | 1 + packages/synapse-interface/messages/es.json | 1 + packages/synapse-interface/messages/fr.json | 1 + packages/synapse-interface/messages/jp.json | 1 + packages/synapse-interface/messages/tr.json | 1 + packages/synapse-interface/messages/zh-CN.json | 1 + 8 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/synapse-interface/components/_Transaction/components/TimeRemaining.tsx b/packages/synapse-interface/components/_Transaction/components/TimeRemaining.tsx index 53ec3cfc04..f7920c9473 100644 --- a/packages/synapse-interface/components/_Transaction/components/TimeRemaining.tsx +++ b/packages/synapse-interface/components/_Transaction/components/TimeRemaining.tsx @@ -39,7 +39,7 @@ export const TimeRemaining = ({ if (status === 'refunded') { return ( - Refunded + {t('Refunded')} ) } diff --git a/packages/synapse-interface/messages/ar.json b/packages/synapse-interface/messages/ar.json index 0fb8c9253a..a98de789cf 100644 --- a/packages/synapse-interface/messages/ar.json +++ b/packages/synapse-interface/messages/ar.json @@ -306,6 +306,7 @@ "Began": "بدأ", "Complete": "مكتمل", "Reverted": "تم الرجوع", + "Refunded": "تم استرداده", "Transaction reverted, funds returned": "تم الرجوع عن المعاملة، تم إرجاع الأموال", "Transaction refunded, funds returned": "تم استرداد المعاملة، وتمت إعادة الأموال", "What's taking so long?": "لماذا يستغرق الأمر وقتًا طويلًا؟", diff --git a/packages/synapse-interface/messages/en-US.json b/packages/synapse-interface/messages/en-US.json index 45abfeb124..8ffc76e4a1 100644 --- a/packages/synapse-interface/messages/en-US.json +++ b/packages/synapse-interface/messages/en-US.json @@ -306,6 +306,7 @@ "Began": "Began", "Complete": "Complete", "Reverted": "Reverted", + "Refunded": "Refunded", "Transaction reverted, funds returned": "Transaction reverted, funds returned", "Transaction refunded, funds returned": "Transaction refunded, funds returned", "What's taking so long?": "What's taking so long?", diff --git a/packages/synapse-interface/messages/es.json b/packages/synapse-interface/messages/es.json index 1c3430570c..d19e0158c7 100644 --- a/packages/synapse-interface/messages/es.json +++ b/packages/synapse-interface/messages/es.json @@ -306,6 +306,7 @@ "Began": "Comenzó", "Complete": "Completo", "Reverted": "Revertido", + "Refunded": "Reembolsado", "Transaction reverted, funds returned": "Transacción revertida, fondos devueltos", "Transaction refunded, funds returned": "Transacción reembolsada, fondos devueltos", "What's taking so long?": "¿Por qué está tardando tanto?", diff --git a/packages/synapse-interface/messages/fr.json b/packages/synapse-interface/messages/fr.json index a89818bbdf..8164e65434 100644 --- a/packages/synapse-interface/messages/fr.json +++ b/packages/synapse-interface/messages/fr.json @@ -306,6 +306,7 @@ "Began": "Commencé", "Complete": "Terminé", "Reverted": "Annulé", + "Refunded": "Remboursé", "Transaction reverted, funds returned": "Transaction annulée, fonds retournés", "Transaction refunded, funds returned": "Transaction remboursée, fonds retournés", "What's taking so long?": "Qu'est-ce qui prend tant de temps ?", diff --git a/packages/synapse-interface/messages/jp.json b/packages/synapse-interface/messages/jp.json index d6ee99094c..b5b97ef750 100644 --- a/packages/synapse-interface/messages/jp.json +++ b/packages/synapse-interface/messages/jp.json @@ -306,6 +306,7 @@ "Began": "開始", "Complete": "完了", "Reverted": "取り消し", + "Refunded": "返金済み", "Transaction reverted, funds returned": "取引が取り消されました。資金が返還されました", "Transaction refunded, funds returned": "取引が返金され、資金が戻されました", "What's taking so long?": "なぜ時間がかかっているのですか?", diff --git a/packages/synapse-interface/messages/tr.json b/packages/synapse-interface/messages/tr.json index 2affd63459..2afcf1ec6b 100644 --- a/packages/synapse-interface/messages/tr.json +++ b/packages/synapse-interface/messages/tr.json @@ -306,6 +306,7 @@ "Began": "Başladı", "Complete": "Tamamlandı", "Reverted": "Geri Alındı", + "Refunded": "İade edildi", "Transaction reverted, funds returned": "İşlem geri alındı, fonlar iade edildi", "Transaction refunded, funds returned": "İşlem iade edildi, fonlar geri gönderildi", "What's taking so long?": "Neden bu kadar uzun sürüyor?", diff --git a/packages/synapse-interface/messages/zh-CN.json b/packages/synapse-interface/messages/zh-CN.json index 9b220cc62d..639c863131 100644 --- a/packages/synapse-interface/messages/zh-CN.json +++ b/packages/synapse-interface/messages/zh-CN.json @@ -306,6 +306,7 @@ "Began": "已开始", "Complete": "已完成", "Reverted": "已回退", + "Refunded": "已退款", "Transaction reverted, funds returned": "交易已回退,资金已退还", "Transaction refunded, funds returned": "交易已退款,资金已退还", "What's taking so long?": "为什么这么久?",