@hyperlane-xyz/widgets
Version:
Common react components for Hyperlane projects
60 lines • 2.87 kB
JavaScript
import { useCallback } from 'react';
import { assert, retryAsync } from '@hyperlane-xyz/utils';
import { useGatewayApi } from './radix/hooks/useGatewayApi.js';
import { useRdt } from './radix/hooks/useRdt.js';
export { useRadixAccount, useRadixActiveChain, useRadixConnectFn, useRadixDisconnectFn, useRadixWalletDetails, } from './radixWallet.js';
export function useRadixSwitchNetwork(multiProvider) {
const onSwitchNetwork = useCallback(async (chainName) => {
const displayName = multiProvider.getChainMetadata(chainName).displayName || chainName;
// Radix does not have switch capability
throw new Error(`Radix wallet must be connected to origin chain ${displayName}`);
}, [multiProvider]);
return { switchNetwork: onSwitchNetwork };
}
export function useRadixWatchAsset(_multiProvider) {
const onAddAsset = useCallback(async (_token, _activeChainName) => {
throw new Error('Watch asset not available for Radix');
}, []);
return { addAsset: onAddAsset };
}
export function useRadixTransactionFns(multiProvider) {
const rdt = useRdt();
const gatewayApi = useGatewayApi();
const { switchNetwork } = useRadixSwitchNetwork(multiProvider);
const onSendTx = useCallback(async ({ tx, chainName: _, activeChainName: __, }) => {
assert(rdt, `radix dapp toolkit is not defined`);
assert(gatewayApi, `gateway api is not defined`);
const transaction = tx.transaction;
assert(typeof transaction.manifest === 'string', `transaction manifests needs to be a string`);
const transactionResult = await rdt.walletApi.sendTransaction({
transactionManifest: transaction.manifest,
version: 1,
});
if (transactionResult.isErr()) {
throw new Error(String(transactionResult.error), {
cause: transactionResult.error,
});
}
const confirm = async () => {
assert(transactionResult.isOk(), `Radix tx failed: ${transactionResult}`);
const receipt = await retryAsync(() => gatewayApi.transaction.getCommittedDetails(transactionResult.value.transactionIntentHash), 5, 5000);
return {
type: tx.type,
receipt: {
...receipt,
transactionHash: transactionResult.value.transactionIntentHash,
},
};
};
return { hash: transactionResult.value.transactionIntentHash, confirm };
}, [rdt, gatewayApi]);
const onMultiSendTx = useCallback(async ({ txs: _, chainName: __, activeChainName: ___, }) => {
throw new Error('Multi Transactions not supported on Radix');
}, []);
return {
sendTransaction: onSendTx,
sendMultiTransaction: onMultiSendTx,
switchNetwork,
};
}
//# sourceMappingURL=radix.js.map