cosmic-interchain-cli
Version:
A command-line utility for Cosmic Wire's interchain messaging protocol
47 lines • 2.48 kB
JavaScript
import { stringify as yamlStringify } from 'yaml';
import { PopulatedTransactionsSchema, } from '@hyperlane-xyz/sdk';
import { assert, errorToString } from '@hyperlane-xyz/utils';
import { logGray, logRed } from '../logger.js';
import { getSubmitterBuilder } from '../submit/submit.js';
import { indentYamlOrJson, readYamlOrJson, writeYamlOrJson, } from '../utils/files.js';
export async function runSubmit({ context, transactionsFilepath, receiptsFilepath, submissionStrategy, }) {
const { chainMetadata, multiProvider } = context;
assert(submissionStrategy, 'Submission strategy required to submit transactions.\nPlease create a submission strategy. See examples in cli/examples/submit/strategy/*.');
const transactions = getTransactions(transactionsFilepath);
const chain = getChainFromTxs(multiProvider, transactions);
const protocol = chainMetadata[chain].protocol;
const submitterBuilder = await getSubmitterBuilder({
submissionStrategy,
multiProvider,
});
try {
const transactionReceipts = await submitterBuilder.submit(...transactions);
if (transactionReceipts) {
logGray('🧾 Transaction receipts:\n\n', indentYamlOrJson(yamlStringify(transactionReceipts, null, 2), 4));
writeYamlOrJson(receiptsFilepath, transactionReceipts, 'yaml');
}
}
catch (error) {
logRed(`⛔️ Failed to submit ${transactions.length} transactions:`, errorToString(error));
throw new Error('Failed to submit transactions.');
}
}
/**
* Retrieves the chain name from transactions[0].
*
* @param multiProvider - The MultiProvider instance to use for chain name lookup.
* @param transactions - The list of populated transactions.
* @returns The name of the chain that the transactions are submitted on.
* @throws If the transactions are not all on the same chain or chain is not found
*/
function getChainFromTxs(multiProvider, transactions) {
const firstTransaction = transactions[0];
const sameChainIds = transactions.every((t) => t.chainId === firstTransaction.chainId);
assert(sameChainIds, 'Transactions must be submitted on the same chains');
return multiProvider.getChainName(firstTransaction.chainId);
}
function getTransactions(transactionsFilepath) {
const transactionsFileContent = readYamlOrJson(transactionsFilepath.trim());
return PopulatedTransactionsSchema.parse(transactionsFileContent);
}
//# sourceMappingURL=submit.js.map