Skip to content

Commit 1391a95

Browse files
committed
chore: working tx submission
1 parent d4d33ed commit 1391a95

File tree

8 files changed

+128
-6
lines changed

8 files changed

+128
-6
lines changed

shared/modules/bridge-utils/bridge.util.ts

+1
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ export async function fetchBridgeQuotes(
152152
insufficientBal: request.insufficientBal ? 'true' : 'false',
153153
resetApproval: request.resetApproval ? 'true' : 'false',
154154
aggIds: isMultichainRequest(request) ? 'lifi' : 'lifi,squid,socket',
155+
destWalletAddress: request.destWalletAddress,
155156
});
156157
const url = `${BRIDGE_API_BASE_URL}/getQuote?${queryParams}`;
157158
const quotes = await fetchWithCache({

shared/types/bridge.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ export type Quote = {
124124
export type QuoteResponse = {
125125
quote: Quote;
126126
approval: TxData | null;
127-
trade: TxData;
127+
trade: TxData | string;
128128
estimatedProcessingTimeInSeconds: number;
129129
};
130130

ui/hooks/accounts/useMultichainWalletSnapClient.ts

+16
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { HandlerType } from '@metamask/snaps-utils';
33
import { CaipChainId, Json, JsonRpcRequest } from '@metamask/utils';
44
import { SnapId } from '@metamask/snaps-sdk';
55
import { useMemo } from 'react';
6+
import { KeyringRequest } from '@metamask/keyring-api';
67
import {
78
handleSnapRequest,
89
multichainUpdateBalance,
@@ -63,6 +64,21 @@ export class MultichainWalletSnapClient {
6364
// fetch explicitly here (since we are already in a `async` call) and wait for it to be updated!
6465
await multichainUpdateBalance(account.id);
6566
}
67+
68+
async submitRequest(request: KeyringRequest) {
69+
// This will trigger the Snap account creation flow (+ account renaming)
70+
const accounts = await this.#client.submitRequest({
71+
origin: 'metamask',
72+
handler: HandlerType.OnRpcRequest,
73+
request,
74+
params: {
75+
scope: request.scope,
76+
account: request.account,
77+
id: request.id,
78+
},
79+
});
80+
return accounts;
81+
}
6682
}
6783

6884
export function useMultichainWalletSnapClient(clientType: WalletClientType) {

ui/pages/bridge/hooks/useHandleBridgeTx.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
import { BigNumber } from 'bignumber.js';
22
import { TransactionType } from '@metamask/transaction-controller';
3+
import { useSelector } from 'react-redux';
34
import { Numeric } from '../../../../shared/modules/Numeric';
45
import { FeeType, type QuoteResponse } from '../../../../shared/types/bridge';
6+
import { getMultichainIsSolana } from '../../../selectors/multichain';
57
import useHandleTx from './useHandleTx';
68

79
export default function useHandleBridgeTx() {
8-
const { handleTx } = useHandleTx();
10+
const { handleTx, handleSolanaTx } = useHandleTx();
11+
const isSolana = useSelector(getMultichainIsSolana);
912

1013
const handleBridgeTx = async ({
1114
quoteResponse,
@@ -21,6 +24,12 @@ export default function useHandleBridgeTx() {
2124
.shiftedBy(quoteResponse.quote.srcAsset.decimals)
2225
.toString();
2326

27+
if (isSolana) {
28+
return await handleSolanaTx({
29+
txType: TransactionType.bridge,
30+
trade: quoteResponse.trade,
31+
});
32+
}
2433
const txMeta = await handleTx({
2534
txType: TransactionType.bridge,
2635
txParams: quoteResponse.trade,

ui/pages/bridge/hooks/useHandleTx.ts

+32-2
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,21 @@ import {
88
addTransaction,
99
updateTransaction,
1010
addTransactionAndWaitForPublish,
11+
bridgeMultichainTransaction,
1112
} from '../../../store/actions';
1213
import {
1314
getHexMaxGasLimit,
1415
getTxGasEstimates,
1516
} from '../../../ducks/bridge/utils';
1617
import { getGasFeeEstimates } from '../../../ducks/metamask/metamask';
17-
import { checkNetworkAndAccountSupports1559 } from '../../../selectors';
18+
import {
19+
checkNetworkAndAccountSupports1559,
20+
getSelectedInternalAccount,
21+
} from '../../../selectors';
1822
import type { ChainId } from '../../../../shared/types/bridge';
1923
import { decimalToPrefixedHex } from '../../../../shared/modules/conversion.utils';
2024
import { getIsSmartTransaction } from '../../../../shared/modules/selectors';
25+
import { useMultichainSelector } from '../../../hooks/useMultichainSelector';
2126

2227
export default function useHandleTx() {
2328
const dispatch = useDispatch();
@@ -88,5 +93,30 @@ export default function useHandleTx() {
8893
return txMeta;
8994
};
9095

91-
return { handleTx };
96+
const selectedAccount = useMultichainSelector(getSelectedInternalAccount);
97+
98+
const handleSolanaTx = async ({
99+
txType,
100+
trade,
101+
fieldsToAddToTxMeta,
102+
}: {
103+
txType: TransactionType.bridge;
104+
trade: string;
105+
fieldsToAddToTxMeta: Omit<Partial<TransactionMeta>, 'status'>; // We don't add status, so omit it to fix the type error
106+
}) => {
107+
const res = await bridgeMultichainTransaction(
108+
selectedAccount.metadata.snap.id,
109+
{
110+
account: selectedAccount.id,
111+
scope: selectedAccount.options.scope,
112+
base64EncodedTransactionMessage: trade,
113+
},
114+
);
115+
console.log('=======res', res);
116+
// await dispatch(setDefaultHomeActiveTabName('activity'));
117+
await forceUpdateMetamaskState(dispatch);
118+
119+
return {};
120+
};
121+
return { handleTx, handleSolanaTx };
92122
}

ui/pages/bridge/hooks/useSubmitBridgeTransaction.ts

+39-1
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,17 @@ import {
1515
} from '../../../helpers/constants/routes';
1616
import { setDefaultHomeActiveTabName } from '../../../store/actions';
1717
import { startPollingForBridgeTxStatus } from '../../../ducks/bridge-status/actions';
18-
import { isHardwareWallet } from '../../../selectors';
18+
import {
19+
getMemoizedUnapprovedTemplatedConfirmations,
20+
getSelectedInternalAccount,
21+
isHardwareWallet,
22+
} from '../../../selectors';
1923
import { getQuoteRequest } from '../../../ducks/bridge/selectors';
2024
import { CHAIN_IDS } from '../../../../shared/constants/network';
2125
import { getCurrentChainId } from '../../../../shared/modules/selectors/networks';
2226
import { setWasTxDeclined } from '../../../ducks/bridge/actions';
27+
import { getMultichainIsSolana } from '../../../selectors/multichain';
28+
import { useMultichainSelector } from '../../../hooks/useMultichainSelector';
2329
import useAddToken from './useAddToken';
2430
import useHandleApprovalTx from './useHandleApprovalTx';
2531
import useHandleBridgeTx from './useHandleBridgeTx';
@@ -57,9 +63,41 @@ export default function useSubmitBridgeTransaction() {
5763
const hardwareWalletUsed = useSelector(isHardwareWallet);
5864
const { slippage } = useSelector(getQuoteRequest);
5965

66+
const isSolana = useSelector(getMultichainIsSolana);
67+
const unapprovedTemplatedConfirmations = useSelector(
68+
getMemoizedUnapprovedTemplatedConfirmations,
69+
);
70+
const selectedAccount = useMultichainSelector(getSelectedInternalAccount);
71+
// Navigate to confirmation page on submit
72+
// We don't need this since only one approval is required
73+
/*
74+
useEffect(() => {
75+
const templatedSnapApproval = unapprovedTemplatedConfirmations.find(
76+
(approval) => {
77+
return (
78+
approval.type === 'snap_dialog' &&
79+
selectedAccount.metadata.snap &&
80+
selectedAccount.metadata.snap.id === approval.origin &&
81+
isMultichainWalletSnap(selectedAccount.metadata.snap.id)
82+
);
83+
},
84+
);
85+
86+
if (templatedSnapApproval) {
87+
history.push(`${CONFIRMATION_V_NEXT_ROUTE}/${templatedSnapApproval.id}`);
88+
}
89+
}, [unapprovedTemplatedConfirmations, history, selectedAccount]);
90+
*/
91+
6092
const submitBridgeTransaction = async (
6193
quoteResponse: QuoteResponse & QuoteMetadata,
6294
) => {
95+
if (isSolana) {
96+
console.log('=======submitting this trade', quoteResponse.trade);
97+
await handleBridgeTx({ quoteResponse, approvalTxId: undefined });
98+
// TODO fetch the tx status afterwards and mabe show the tx in the activity tab
99+
return;
100+
}
63101
if (hardwareWalletUsed) {
64102
history.push(`${CROSS_CHAIN_SWAP_ROUTE}${AWAITING_SIGNATURES_ROUTE}`);
65103
}

ui/store/actions.ts

+28
Original file line numberDiff line numberDiff line change
@@ -6062,3 +6062,31 @@ export async function sendMultichainTransaction(
60626062
},
60636063
});
60646064
}
6065+
6066+
export async function bridgeMultichainTransaction(
6067+
snapId: string,
6068+
{
6069+
account,
6070+
scope,
6071+
base64EncodedTransactionMessage,
6072+
}: {
6073+
account: string;
6074+
scope: string;
6075+
base64EncodedTransactionMessage: string;
6076+
},
6077+
) {
6078+
await handleSnapRequest({
6079+
snapId,
6080+
origin: 'metamask',
6081+
handler: HandlerType.OnRpcRequest,
6082+
request: {
6083+
id: crypto.randomUUID(),
6084+
method: 'submitBridgeTx',
6085+
params: {
6086+
account,
6087+
scope,
6088+
base64EncodedTransactionMessage,
6089+
},
6090+
},
6091+
});
6092+
}

ui/store/store.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ export default function configureStore(preloadedState: any) {
154154
immutableCheck: false,
155155
}).concat((store: any) => (next: any) => (action: any) => {
156156
console.groupCollapsed(action.type);
157-
console.log('=====bridgeState', store.getState().metamask.bridgeState);
157+
console.log('=====', store.getState().metamask);
158158
const result = next(action);
159159
console.log('=====bridge', store.getState().bridge);
160160
console.groupEnd(action.type);

0 commit comments

Comments
 (0)