Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Chore(entropy) deploy on abstract #2056

Merged
merged 5 commits into from
Oct 25, 2024
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion contract_manager/store/chains/EvmChains.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -662,7 +662,7 @@
- id: cronos_zkevm_testnet
mainnet: false
rpcUrl: https://testnet.zkevm.cronos.org
networkId: 282
networkId: 240
type: EvmChain
- id: reya_testnet
mainnet: false
Expand Down
3 changes: 3 additions & 0 deletions contract_manager/store/contracts/EvmEntropyContracts.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -115,3 +115,6 @@
- chain: sanko_testnet
address: "0x5744Cbf430D99456a0A8771208b674F27f8EF0Fb"
type: EvmEntropyContract
- chain: abstract_testnet
address: "0x858687fD592112f7046E394A3Bf10D0C11fF9e63"
type: EvmEntropyContract
6 changes: 3 additions & 3 deletions contract_manager/store/contracts/EvmPriceFeedContracts.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -361,15 +361,15 @@
- chain: kinto
address: "0x2880aB155794e7179c9eE2e38200202908C17B43"
type: EvmPriceFeedContract
- chain: cronos_zkevm_testnet
address: "0x67DFF3D12dFDCeC9f85fd86f4cBDb0a111fF721A"
type: EvmPriceFeedContract
- chain: reya_testnet
address: "0x2880aB155794e7179c9eE2e38200202908C17B43"
type: EvmPriceFeedContract
- chain: cronos_zkevm_mainnet
address: "0x056f829183Ec806A78c26C98961678c24faB71af"
type: EvmPriceFeedContract
- chain: cronos_zkevm_testnet
address: "0xB1DB1498902F08E16E11F1a423ec9CCB9537E1D6"
type: EvmPriceFeedContract
- chain: movement_evm_devnet_imola
address: "0x2880aB155794e7179c9eE2e38200202908C17B43"
type: EvmPriceFeedContract
Expand Down
6 changes: 3 additions & 3 deletions contract_manager/store/contracts/EvmWormholeContracts.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -349,9 +349,6 @@
- chain: kinto
address: "0xb27e5ca259702f209a29225d0eDdC131039C9933"
type: EvmWormholeContract
- chain: cronos_zkevm_testnet
address: "0x3f5bB93eEC6E3D6784274291A5816Bc34E851dc8"
type: EvmWormholeContract
- chain: reya_testnet
address: "0xb27e5ca259702f209a29225d0eDdC131039C9933"
type: EvmWormholeContract
Expand All @@ -361,6 +358,9 @@
- chain: cronos_zkevm_mainnet
address: "0xc10F5BE78E464BB0E1f534D66E5A6ecaB150aEFa"
type: EvmWormholeContract
- chain: cronos_zkevm_testnet
address: "0x470d1c91b1b1d9295815A2357FB0D20E7350ab71"
type: EvmWormholeContract
- chain: movement_evm_devnet_imola
address: "0xb27e5ca259702f209a29225d0eDdC131039C9933"
type: EvmWormholeContract
Expand Down
2 changes: 1 addition & 1 deletion target_chains/ethereum/contracts/.env.template
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Network Config
MIGRATIONS_DIR= # ./migrations/prod-receiver
MIGRATIONS_NETWORK= # xyz

MAINNET=

# The duration that a price feed stored in the contract is considered to be
# valid, after this duration, the price feed is stale and will be invalid.
Expand Down
168 changes: 168 additions & 0 deletions target_chains/ethereum/contracts/deploy/zkSyncDeployEntropy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
require("dotenv").config({ path: ".env" });
import { utils, Wallet } from "zksync-web3";
import { HardhatRuntimeEnvironment } from "hardhat/types";
import { Deployer } from "@matterlabs/hardhat-zksync-deploy";
import { CHAINS } from "@pythnetwork/xc-admin-common";
import { assert } from "chai";
import {
DefaultStore,
EvmChain,
EvmWormholeContract,
} from "@pythnetwork/contract-manager";
import {
findWormholeContract,
deployWormholeContract,
} from "./zkSyncDeployWormhole";

// import {Wallet as ZkWallet} from "zksync-ethers"; // Use These packages if "zksync-web3" doesn't work
// import { Deployer as ZkDeployer } from "@matterlabs/hardhat-zksync";

const { getDefaultConfig } = require("../scripts/contractManagerConfig");

function envOrErr(name: string): string {
const res = process.env[name];
if (res === undefined) {
throw new Error(`${name} environment variable is not set.`);
}
return res;
}
export const ENTROPY_DEFAULT_PROVIDER = {
mainnet: "0x52DeaA1c84233F7bb8C8A45baeDE41091c616506",
testnet: "0x6CC14824Ea2918f5De5C2f75A9Da968ad4BD6344",
};
export const ENTROPY_DEFAULT_KEEPER = {
aditya520 marked this conversation as resolved.
Show resolved Hide resolved
mainnet: "0xbcab779fca45290288c35f5e231c37f9fa87b130",
testnet: "0xa5A68ed167431Afe739846A22597786ba2da85df",
};

export default async function (hre: HardhatRuntimeEnvironment) {
// Initialize the wallet.
const wallet = Wallet.fromMnemonic(envOrErr("MNEMONIC"));
const isMainnet = envOrErr("MAINNET") === "true";

// Create deployer object and load the artifact of the contract we want to deploy.
const deployer = new Deployer(hre, wallet);

const {
wormholeGovernanceChainId,
wormholeGovernanceContract,
wormholeInitialSigners,
governanceEmitter,
governanceChainId,
} = getDefaultConfig(envOrErr("MIGRATIONS_NETWORK"));

const chainName = envOrErr("MIGRATIONS_NETWORK");
aditya520 marked this conversation as resolved.
Show resolved Hide resolved

const wormholeReceiverChainId = CHAINS[chainName];
assert(wormholeReceiverChainId !== undefined);

let wormholeReceiverContractAddress = await findWormholeContract(chainName);
if (!wormholeReceiverContractAddress) {
console.log(`Wormhole contract not found for chain ${chainName}`);
console.log("Deploying Wormhole contract...");
wormholeReceiverContractAddress = await deployWormholeContract(
deployer,
chainName,
wormholeGovernanceChainId,
wormholeGovernanceContract,
wormholeInitialSigners,
wormholeReceiverChainId
);
}

console.log(
"WormholeReceiver contract address:",
wormholeReceiverContractAddress
);

// // TODO: Top up accounts if necessary

const executorContractAddress = await deployExecutorContract(
deployer,
wormholeReceiverContractAddress,
wormholeReceiverChainId,
governanceChainId,
governanceEmitter
);

console.log("Executor contract address:", executorContractAddress);

const entropyContractAddress = await deployEntropyContract(
deployer,
executorContractAddress,
wormholeReceiverChainId,
isMainnet
);

console.log("Entropy contract address:", entropyContractAddress);
}

async function deployExecutorContract(
deployer: Deployer,
wormholeReceiverContractAddress: string,
wormholeReceiverChainId: number,
governanceChainId: string,
governanceEmitter: string
) {
const executorImplArtifact = await deployer.loadArtifact(
"ExecutorUpgradable"
);
const executorImplContract = await deployer.deploy(executorImplArtifact);
console.log(
"Deployed ExecutorImpl contract on",
executorImplContract.address
);

const executorInitData = executorImplContract.interface.encodeFunctionData(
"initialize",
[
wormholeReceiverContractAddress,
0, // lastExecutedSequence,
wormholeReceiverChainId,
governanceChainId,
governanceEmitter,
]
);

const executorProxyArtifact = await deployer.loadArtifact("ERC1967Proxy");

const executorProxyContract = await deployer.deploy(executorProxyArtifact, [
executorImplContract.address,
executorInitData,
]);

console.log(`Deployed Executor contract on ${executorProxyContract.address}`);

return executorProxyContract.address;
}

async function deployEntropyContract(
deployer: Deployer,
executorContractAddress: string,
chainId: number,
isMainnet: boolean
) {
const entropyImplArtifact = await deployer.loadArtifact("EntropyUpgradable");
const entropyImplContract = await deployer.deploy(entropyImplArtifact);

const entropyInitData = entropyImplContract.interface.encodeFunctionData(
"initialize",
[
executorContractAddress,
executorContractAddress,
1,
aditya520 marked this conversation as resolved.
Show resolved Hide resolved
isMainnet
? ENTROPY_DEFAULT_PROVIDER.mainnet
: ENTROPY_DEFAULT_PROVIDER.testnet,
true,
]
);

const entropyProxyArtifact = await deployer.loadArtifact("ERC1967Proxy");
const entropyProxyContract = await deployer.deploy(entropyProxyArtifact, [
entropyImplContract.address,
entropyInitData,
]);

return entropyProxyContract.address;
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ import { Deployer } from "@matterlabs/hardhat-zksync-deploy";
import { CHAINS } from "@pythnetwork/xc-admin-common";
import { assert } from "chai";
import { writeFileSync } from "fs";
import {
deployWormholeContract,
findWormholeContract,
} from "./zkSyncDeployWormhole";
// import {Wallet as ZkWallet} from "zksync-ethers"; // Use These packages if "zksync-web3" doesn't work
// import { Deployer as ZkDeployer } from "@matterlabs/hardhat-zksync";

Expand Down Expand Up @@ -49,50 +53,23 @@ export default async function (hre: HardhatRuntimeEnvironment) {
emitterChainIds,
} = getDefaultConfig(envOrErr("MIGRATIONS_NETWORK"));
const chainName = envOrErr("MIGRATIONS_NETWORK");

const wormholeReceiverChainId = CHAINS[chainName];
assert(wormholeReceiverChainId !== undefined);

const receiverSetupArtifact = await deployer.loadArtifact("ReceiverSetup");
const receiverImplArtifact = await deployer.loadArtifact(
"ReceiverImplementation"
);
const wormholeReceiverArtifact = await deployer.loadArtifact(
"WormholeReceiver"
);

console.log("Deploying WormholeReceiver contract...");
const receiverSetupContract = await deployer.deploy(receiverSetupArtifact);
console.log("Deployed ReceiverSetup on", receiverSetupContract.address);

console.log("Deploying ReceiverImplementation contract...");
// deploy implementation
const receiverImplContract = await deployer.deploy(receiverImplArtifact);
console.log(
"Deployed ReceiverImplementation on",
receiverImplContract.address
);

// encode initialisation data
const whInitData = receiverSetupContract.interface.encodeFunctionData(
"setup",
[
receiverImplContract.address,
wormholeInitialSigners,
let wormholeReceiverContractAddress = await findWormholeContract(chainName);
if (!wormholeReceiverContractAddress) {
console.log(`Wormhole contract not found for chain ${chainName}`);
console.log("Deploying Wormhole contract...");
wormholeReceiverContractAddress = await deployWormholeContract(
deployer,
chainName,
wormholeReceiverChainId,
wormholeGovernanceChainId,
wormholeGovernanceContract,
]
);

// deploy proxy
const wormholeReceiverContract = await deployer.deploy(
wormholeReceiverArtifact,
[receiverSetupContract.address, whInitData]
);

console.log(
`Deployed WormholeReceiver on ${wormholeReceiverContract.address}`
);
wormholeInitialSigners
);
}

// Hardcoding the initial sequence number for governance messages.
const governanceInitialSequence = Number("0");
Expand All @@ -110,7 +87,7 @@ export default async function (hre: HardhatRuntimeEnvironment) {
const pythInitData = pythImplContract.interface.encodeFunctionData(
"initialize",
[
wormholeReceiverContract.address,
wormholeReceiverContractAddress,
emitterChainIds,
emitterAddresses,
governanceChainId,
Expand Down
72 changes: 72 additions & 0 deletions target_chains/ethereum/contracts/deploy/zkSyncDeployWormhole.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import {
DefaultStore,
EvmChain,
EvmWormholeContract,
} from "@pythnetwork/contract-manager";
import { Deployer } from "@matterlabs/hardhat-zksync-deploy";
import { CHAINS } from "@pythnetwork/xc-admin-common";
import { assert } from "chai";

export function findWormholeContract(chainId: string): string | undefined {
for (const contract of Object.values(DefaultStore.wormhole_contracts)) {
if (
contract instanceof EvmWormholeContract &&
contract.getChain().getId() === chainId
) {
return contract.address;
}
}
}

export async function deployWormholeContract(
deployer: Deployer,
chainName: string,
wormholeGovernanceChainId: string,
wormholeGovernanceContract: string,
wormholeInitialSigners: string[],
wormholeReceiverChainId: number
): Promise<string> {
const receiverSetupArtifact = await deployer.loadArtifact("ReceiverSetup");
const receiverImplArtifact = await deployer.loadArtifact(
"ReceiverImplementation"
);
const wormholeReceiverArtifact = await deployer.loadArtifact(
"WormholeReceiver"
);
console.log("Deploying WormholeReceiver contract...");

const receiverSetupContract = await deployer.deploy(receiverSetupArtifact);
console.log("Deployed ReceiverSetup on", receiverSetupContract.address);
console.log("Deploying ReceiverImplementation contract...");

// deploy implementation
const receiverImplContract = await deployer.deploy(receiverImplArtifact);
console.log(
"Deployed ReceiverImplementation on",
receiverImplContract.address
);

// encode initialisation data
const whInitData = receiverSetupContract.interface.encodeFunctionData(
"setup",
[
receiverImplContract.address,
wormholeInitialSigners,
wormholeReceiverChainId,
wormholeGovernanceChainId,
wormholeGovernanceContract,
]
);

// deploy proxy
const wormholeReceiverContract = await deployer.deploy(
wormholeReceiverArtifact,
[receiverSetupContract.address, whInitData]
);

console.log(
`Deployed WormholeReceiver on ${wormholeReceiverContract.address}`
);

return wormholeReceiverContract.address;
}
2 changes: 1 addition & 1 deletion target_chains/ethereum/sdk/js/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@pythnetwork/pyth-evm-js",
"version": "1.73.0",
"version": "1.74.0",
"description": "Pyth Network EVM Utils in JS",
"homepage": "https://pyth.network",
"author": {
Expand Down
Loading
Loading