@hyperlane-xyz/sdk
Version:
The official SDK for the Hyperlane Network
65 lines • 4.48 kB
JavaScript
import { assert } from '@hyperlane-xyz/utils';
import { EvmIcaTxSubmitter } from './IcaTxSubmitter.js';
import { TxSubmitterType } from './TxSubmitterTypes.js';
import { TxSubmitterBuilder } from './builder/TxSubmitterBuilder.js';
import { EV5GnosisSafeTxBuilder } from './ethersV5/EV5GnosisSafeTxBuilder.js';
import { EV5GnosisSafeTxSubmitter } from './ethersV5/EV5GnosisSafeTxSubmitter.js';
import { EV5ImpersonatedAccountTxSubmitter } from './ethersV5/EV5ImpersonatedAccountTxSubmitter.js';
import { EV5JsonRpcTxSubmitter } from './ethersV5/EV5JsonRpcTxSubmitter.js';
import { EV5TimelockSubmitter } from './ethersV5/EV5TimelockSubmitter.js';
export async function getSubmitterBuilder({ submissionStrategy, multiProvider, coreAddressesByChain, additionalSubmitterFactories, }) {
const submitter = await getSubmitter(multiProvider, submissionStrategy.submitter, coreAddressesByChain, additionalSubmitterFactories);
return new TxSubmitterBuilder(submitter);
}
const defaultSubmitterFactories = {
[TxSubmitterType.JSON_RPC]: (multiProvider, metadata) => {
// Used to type narrow metadata
assert(metadata.type === TxSubmitterType.JSON_RPC, `Invalid metadata type: ${metadata.type}, expected ${TxSubmitterType.JSON_RPC}`);
return new EV5JsonRpcTxSubmitter(multiProvider, metadata);
},
[TxSubmitterType.IMPERSONATED_ACCOUNT]: (multiProvider, metadata) => {
assert(metadata.type === TxSubmitterType.IMPERSONATED_ACCOUNT, `Invalid metadata type: ${metadata.type}, expected ${TxSubmitterType.IMPERSONATED_ACCOUNT}`);
return new EV5ImpersonatedAccountTxSubmitter(multiProvider, metadata);
},
[TxSubmitterType.GNOSIS_SAFE]: (multiProvider, metadata) => {
assert(metadata.type === TxSubmitterType.GNOSIS_SAFE, `Invalid metadata type: ${metadata.type}, expected ${TxSubmitterType.GNOSIS_SAFE}`);
return EV5GnosisSafeTxSubmitter.create(multiProvider, metadata);
},
[TxSubmitterType.GNOSIS_TX_BUILDER]: (multiProvider, metadata) => {
assert(metadata.type === TxSubmitterType.GNOSIS_TX_BUILDER, `Invalid metadata type: ${metadata.type}, expected ${TxSubmitterType.GNOSIS_TX_BUILDER}`);
return EV5GnosisSafeTxBuilder.create(multiProvider, metadata);
},
[TxSubmitterType.INTERCHAIN_ACCOUNT]: (multiProvider, metadata, coreAddressesByChain) => {
assert(metadata.type === TxSubmitterType.INTERCHAIN_ACCOUNT, `Invalid metadata type: ${metadata.type}, expected ${TxSubmitterType.INTERCHAIN_ACCOUNT}`);
return EvmIcaTxSubmitter.fromConfig(metadata, multiProvider, coreAddressesByChain);
},
[TxSubmitterType.TIMELOCK_CONTROLLER]: (multiProvider, metadata, coreAddressesByChain) => {
assert(metadata.type === TxSubmitterType.TIMELOCK_CONTROLLER, `Invalid metadata type: ${metadata.type}, expected ${TxSubmitterType.TIMELOCK_CONTROLLER}`);
return EV5TimelockSubmitter.fromConfig(metadata, multiProvider, coreAddressesByChain);
},
};
/**
* Retrieves a transaction submitter instance based on the provided metadata.
* This function acts as a factory, using a registry of submitter builders
* to construct the appropriate submitter for the given protocol and submission strategy.
* It allows for extending the default registry with custom submitter types.
*
* @param multiProvider - The MultiProvider instance
* @param submitterMetadata - The metadata defining the type and configuration of the submitter.
* @param coreAddressesByChain - The address of the core Hyperlane deployments by chain. Used for filling some default values for the submission strategies.
* @param additionalSubmitterFactories optional extension to extend the default registry. Can override if specifying the the same key.
* @returns A promise that resolves to an instance of a TxSubmitterInterface.
* @throws If no submitter factory is registered for the type specified in the metadata.
*/
export async function getSubmitter(multiProvider, submitterMetadata, coreAddressesByChain, additionalSubmitterFactories = {}) {
const mergedSubmitterRegistry = {
...defaultSubmitterFactories,
...additionalSubmitterFactories,
};
const factory = mergedSubmitterRegistry[submitterMetadata.type];
if (!factory) {
throw new Error(`No submitter factory registered for type ${submitterMetadata.type}`);
}
return factory(multiProvider, submitterMetadata, coreAddressesByChain);
}
//# sourceMappingURL=submitterBuilderGetter.js.map