Skip to content

Commit

Permalink
switch to non-factory deployment
Browse files Browse the repository at this point in the history
  • Loading branch information
aroralanuk committed Dec 1, 2023
1 parent 9f2c7ce commit 340bc5d
Show file tree
Hide file tree
Showing 16 changed files with 166 additions and 90 deletions.
16 changes: 0 additions & 16 deletions solidity/contracts/isms/routing/DomainRoutingIsmFactory.sol
Original file line number Diff line number Diff line change
Expand Up @@ -51,19 +51,3 @@ contract DomainRoutingIsmFactory is AbstractDomainRoutingIsmFactory {
return _implementation;
}
}

/**
* @title DefaultFallbackRoutingIsmFactory
*/
contract DefaultFallbackRoutingIsmFactory is AbstractDomainRoutingIsmFactory {
// ============ Immutables ============
address internal immutable _implementation;

constructor(address mailbox) {
_implementation = address(new DefaultFallbackRoutingIsm(mailbox));
}

function implementation() public view override returns (address) {
return _implementation;
}
}
2 changes: 1 addition & 1 deletion solidity/test/isms/DomainRoutingIsm.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import "forge-std/Test.sol";

import {DomainRoutingIsm} from "../../contracts/isms/routing/DomainRoutingIsm.sol";
import {DefaultFallbackRoutingIsm} from "../../contracts/isms/routing/DefaultFallbackRoutingIsm.sol";
import {DefaultFallbackRoutingIsmFactory, DomainRoutingIsmFactory} from "../../contracts/isms/routing/DomainRoutingIsmFactory.sol";
import {DomainRoutingIsmFactory} from "../../contracts/isms/routing/DomainRoutingIsmFactory.sol";
import {IInterchainSecurityModule} from "../../contracts/interfaces/IInterchainSecurityModule.sol";
import {MessageUtils, TestIsm} from "./IsmTestUtils.sol";
import {TestMailbox} from "../../contracts/test/TestMailbox.sol";
Expand Down
2 changes: 1 addition & 1 deletion typescript/cli/examples/ism-advanced.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
anvil1:
type: domainRoutingIsm
type: defaultFallbackRoutingIsm
owner: '0xa0ee7a142d267c1f36714e4a8f75612f20a79720'
domains:
anvil2:
Expand Down
11 changes: 7 additions & 4 deletions typescript/cli/src/config/ism.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { confirm, input, select } from '@inquirer/prompts';
import { z } from 'zod';

import { ChainMap, ChainName, IsmType } from '@hyperlane-xyz/sdk';
import { ChainMap, ChainName, IsmType, ZHash } from '@hyperlane-xyz/sdk';

import { errorRed, log, logBlue, logGreen } from '../../logger.js';
import { runMultiChainSelectionStep } from '../utils/chains.js';
Expand All @@ -15,13 +15,16 @@ const MultisigIsmConfigSchema = z.object({
z.literal(IsmType.MESSAGE_ID_MULTISIG),
]),
threshold: z.number(),
validators: z.array(z.string()),
validators: z.array(ZHash),
});

const RoutingIsmConfigSchema: z.ZodSchema<any> = z.lazy(() =>
z.object({
type: z.literal(IsmType.ROUTING),
owner: z.string(),
type: z.union([
z.literal(IsmType.ROUTING),
z.literal(IsmType.FALLBACK_ROUTING),
]),
owner: ZHash,
domains: z.record(IsmConfigSchema),
}),
);
Expand Down
4 changes: 2 additions & 2 deletions typescript/cli/src/config/multisig.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { input } from '@inquirer/prompts';
import { z } from 'zod';

import { ChainMap, MultisigConfig } from '@hyperlane-xyz/sdk';
import { ChainMap, MultisigConfig, ZHash } from '@hyperlane-xyz/sdk';
import {
Address,
isValidAddress,
Expand All @@ -18,7 +18,7 @@ import { readChainConfigsIfExists } from './chain.js';
const MultisigConfigMapSchema = z.object({}).catchall(
z.object({
threshold: z.number(),
validators: z.array(z.string()),
validators: z.array(ZHash),
}),
);
export type MultisigConfigMap = z.infer<typeof MultisigConfigMapSchema>;
Expand Down
10 changes: 5 additions & 5 deletions typescript/cli/src/config/warp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { confirm, input } from '@inquirer/prompts';
import { ethers } from 'ethers';
import { z } from 'zod';

import { TokenType } from '@hyperlane-xyz/sdk';
import { TokenType, ZHash } from '@hyperlane-xyz/sdk';

import { errorRed, logBlue, logGreen } from '../../logger.js';
import {
Expand All @@ -14,17 +14,17 @@ import { FileFormat, readYamlOrJson, writeYamlOrJson } from '../utils/files.js';
import { readChainConfigsIfExists } from './chain.js';

const ConnectionConfigSchema = {
mailbox: z.string().optional(),
interchainGasPaymaster: z.string().optional(),
interchainSecurityModule: z.string().optional(),
mailbox: ZHash.optional(),
interchainGasPaymaster: ZHash.optional(),
interchainSecurityModule: ZHash.optional(),
foreignDeployment: z.string().optional(),
};

export const WarpRouteConfigSchema = z.object({
base: z.object({
type: z.literal(TokenType.native).or(z.literal(TokenType.collateral)),
chainName: z.string(),
address: z.string().optional(),
address: ZHash.optional(),
isNft: z.boolean().optional(),
name: z.string().optional(),
symbol: z.string().optional(),
Expand Down
30 changes: 16 additions & 14 deletions typescript/cli/src/deploy/core.ts
Original file line number Diff line number Diff line change
Expand Up @@ -293,21 +293,13 @@ async function executeDeploy({
mergedContractAddrs,
multiProvider,
);

// 3. Deploy ISM contracts to remote deployable chains
logBlue('Deploying ISMs');
// 3. Construct ISM configs for all deployable chains
const ismContracts: ChainMap<{ interchainSecurityModule: DeployedIsm }> = {};
const defaultIsms: ChainMap<Address> = {};
const defaultIsms: ChainMap<IsmConfig> = {};
for (const ismOrigin of chains) {
logBlue(`Deploying ISM to ${ismOrigin}`);
const ismConfig =
defaultIsms[ismOrigin] =
ismConfigs[ismOrigin] ??
buildIsmConfig(owner, ismOrigin, chains, multisigConfigs);
ismContracts[ismOrigin] = {
interchainSecurityModule: await ismFactory.deploy(ismOrigin, ismConfig),
};
defaultIsms[ismOrigin] =
ismContracts[ismOrigin].interchainSecurityModule.address;
}
artifacts = writeMergedAddresses(contractsFilePath, artifacts, ismContracts);
logGreen('ISM contracts deployed');
Expand All @@ -323,8 +315,18 @@ async function executeDeploy({
multisigConfigs ?? defaultMultisigConfigs, // TODO: fix https://github.com/hyperlane-xyz/issues/issues/773
);
const coreContracts = await coreDeployer.deploy(coreConfigs);

// 4.5 recover the toplevel ISM address
const isms: HyperlaneAddressesMap<any> = {};
for (const chain of chains) {
isms[chain] = {
interchainSecurityModule:
coreDeployer.cachedAddresses[chain].interchainSecurityModule,
};
}
artifacts = objMerge(artifacts, isms);
artifacts = writeMergedAddresses(contractsFilePath, artifacts, coreContracts);
logGreen('Core contracts deployed');
logGreen('Core contracts deployed - artifacts');

// 5. Deploy TestRecipients to all deployable chains
log('Deploying test recipient contracts');
Expand Down Expand Up @@ -371,7 +373,7 @@ function buildIsmConfig(
function buildCoreConfigMap(
owner: Address,
chains: ChainName[],
defaultIsms: ChainMap<Address>,
defaultIsms: ChainMap<IsmConfig>,
multisigConfig: ChainMap<MultisigConfig>,
): ChainMap<CoreConfig> {
return chains.reduce<ChainMap<CoreConfig>>((config, chain) => {
Expand Down Expand Up @@ -403,7 +405,7 @@ function buildCoreConfigMap(
}, {});
}

function buildTestRecipientConfigMap(
export function buildTestRecipientConfigMap(
chains: ChainName[],
addressesMap: HyperlaneAddressesMap<any>,
): ChainMap<TestRecipientConfig> {
Expand Down
8 changes: 4 additions & 4 deletions typescript/infra/src/govern/HyperlaneCoreGovernor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,10 @@ export class HyperlaneCoreGovernor extends HyperlaneAppGovernor<
case MailboxViolationType.DefaultIsm: {
let ismAddress: string;
if (typeof violation.expected === 'object') {
const ism = await this.checker.ismFactory.deploy(
violation.chain,
violation.expected,
);
const ism = await this.checker.ismFactory.deploy({
chain: violation.chain,
config: violation.expected,
});
ismAddress = ism.address;
} else if (typeof violation.expected === 'string') {
ismAddress = violation.expected;
Expand Down
24 changes: 16 additions & 8 deletions typescript/sdk/src/core/HyperlaneCoreDeployer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ export class HyperlaneCoreDeployer extends HyperlaneDeployer<
CoreConfig,
CoreFactories
> {
startingBlockNumbers: ChainMap<number | undefined> = {};
hookDeployer: HyperlaneHookDeployer;

constructor(
Expand Down Expand Up @@ -69,8 +68,13 @@ export class HyperlaneCoreDeployer extends HyperlaneDeployer<
);
if (!matches) {
this.logger('Deploying default ISM');
defaultIsm = await this.deployIsm(chain, config.defaultIsm);
defaultIsm = await this.deployIsm(
chain,
config.defaultIsm,
mailbox.address,
);
}
this.cachedAddresses[chain].interchainSecurityModule = defaultIsm;

const hookAddresses = { mailbox: mailbox.address, proxyAdmin };

Expand Down Expand Up @@ -168,8 +172,16 @@ export class HyperlaneCoreDeployer extends HyperlaneDeployer<
return hooks[config.type].address;
}

async deployIsm(chain: ChainName, config: IsmConfig): Promise<Address> {
const ism = await this.ismFactory.deploy(chain, config);
async deployIsm(
chain: ChainName,
config: IsmConfig,
mailbox: Address,
): Promise<Address> {
const ism = await this.ismFactory.deploy({
chain,
config,
mailbox,
});
this.addDeployedContracts(chain, this.ismFactory.deployedIsms[chain]);
return ism.address;
}
Expand All @@ -187,10 +199,6 @@ export class HyperlaneCoreDeployer extends HyperlaneDeployer<

const mailbox = await this.deployMailbox(chain, config, proxyAdmin.address);

// TODO: remove once agents fetch deployedBlock from mailbox
const deployedBlock = await mailbox.deployedBlock();
this.startingBlockNumbers[chain] = deployedBlock.toNumber();

const validatorAnnounce = await this.deployValidatorAnnounce(
chain,
mailbox.address,
Expand Down
3 changes: 1 addition & 2 deletions typescript/sdk/src/deploy/HyperlaneDeployer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@ export abstract class HyperlaneDeployer<
this.multiProvider,
ismFactory.getContracts(chain),
);
targetIsm = (await ismFactory.deploy(chain, config)).address;
targetIsm = (await ismFactory.deploy({ chain, config })).address;
}
if (!matches) {
await this.runIfOwner(chain, contract, async () => {
Expand Down Expand Up @@ -269,7 +269,6 @@ export abstract class HyperlaneDeployer<
config: MailboxClientConfig,
): Promise<void> {
this.logger(`Initializing mailbox client (if not already) on ${local}...`);
this.logger(`MailboxClient Config: ${JSON.stringify(config)}`);
if (config.hook) {
await this.configureHook(
local,
Expand Down
4 changes: 0 additions & 4 deletions typescript/sdk/src/deploy/contracts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,6 @@ export const proxyFactoryFactories = {
aggregationIsmFactory: new StaticAggregationIsmFactory__factory(),
aggregationHookFactory: new StaticAggregationHookFactory__factory(),
routingIsmFactory: new DomainRoutingIsmFactory__factory(),
// TODO: https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/2895
// defaultFallbackRoutingIsmFactory:
// new DefaultFallbackRoutingIsmFactory__factory(),
};

export type ProxyFactoryFactories = typeof proxyFactoryFactories;
Expand All @@ -29,5 +26,4 @@ export const proxyFactoryImplementations: ProxyFactoryImplementations = {
aggregationIsmFactory: 'StaticAggregationIsm',
aggregationHookFactory: 'StaticAggregationHook',
routingIsmFactory: 'DomaingRoutingIsm',
// defaultFallbackRoutingIsmFactory: 'DefaultFallbackRoutingIsm',
};
10 changes: 5 additions & 5 deletions typescript/sdk/src/hook/HyperlaneHookDeployer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -182,11 +182,11 @@ export class HyperlaneHookDeployer extends HyperlaneDeployer<
origin: chain,
nativeBridge: l2Messenger,
};
const opstackIsm = (await this.ismFactory.deploy(
config.destinationChain,
ismConfig,
chain,
)) as OPStackIsm;
const opstackIsm = (await this.ismFactory.deploy({
chain: config.destinationChain,
config: ismConfig,
origin: chain,
})) as OPStackIsm;
// deploy opstack hook
const hook = await this.deployContract(chain, HookType.OP_STACK, [
mailbox,
Expand Down
1 change: 1 addition & 0 deletions typescript/sdk/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,7 @@ export {
getDomainId,
isValidChainMetadata,
} from './metadata/chainMetadataTypes';
export { ZHash } from './metadata/customZodTypes';
export {
HyperlaneDeploymentArtifacts,
HyperlaneDeploymentArtifactsSchema,
Expand Down
4 changes: 2 additions & 2 deletions typescript/sdk/src/ism/HyperlaneIsmFactory.hardhat-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ describe('HyperlaneIsmFactory', async () => {

it('deploys a simple ism', async () => {
const config = randomMultisigIsmConfig(3, 5);
const ism = await factory.deploy(chain, config);
const ism = await factory.deploy({ chain, config });
const matches = await moduleMatchesConfig(
chain,
ism.address,
Expand All @@ -103,7 +103,7 @@ describe('HyperlaneIsmFactory', async () => {
const config = randomIsmConfig();
let ismAddress: string;
try {
const ism = await factory.deploy(chain, config);
const ism = await factory.deploy({ chain, config });
ismAddress = ism.address;
} catch (e) {
error('Failed to deploy random ism config', e);
Expand Down
Loading

0 comments on commit 340bc5d

Please sign in to comment.