Skip to content
Closed
Show file tree
Hide file tree
Changes from all 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
57 changes: 38 additions & 19 deletions contract_manager/scripts/common.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import {
DefaultStore,

Check warning on line 2 in contract_manager/scripts/common.ts

View workflow job for this annotation

GitHub Actions / test

'DefaultStore' is defined but never used
EvmChain,
EvmEntropyContract,
EvmWormholeContract,
getDefaultDeploymentConfig,
PrivateKey,
Store,
} from "../src";
import { existsSync, readFileSync, writeFileSync } from "fs";
import { join } from "path";
Expand Down Expand Up @@ -65,7 +66,16 @@
return new web3.eth.Contract(artifact["abi"], address);
}

export const COMMON_STORE_OPTIONS = {
"store-dir": {
type: "string",
demandOption: false,
desc: "Path to the store directory. Defaults to the location of DefaultStore",
},
} as const;

export const COMMON_DEPLOY_OPTIONS = {
...COMMON_STORE_OPTIONS,
"std-output-dir": {
type: "string",
demandOption: true,
Expand Down Expand Up @@ -126,6 +136,7 @@
} as const;
export const COMMON_UPGRADE_OPTIONS = {
...CHAIN_SELECTION_OPTIONS,
...COMMON_STORE_OPTIONS,
"private-key": COMMON_DEPLOY_OPTIONS["private-key"],
"ops-key-path": {
type: "string",
Expand Down Expand Up @@ -161,17 +172,20 @@
return runIfNotCached;
}

export function getSelectedChains(argv: {
chain: InferredOptionType<typeof COMMON_UPGRADE_OPTIONS["chain"]>;
testnet: InferredOptionType<typeof COMMON_UPGRADE_OPTIONS["testnet"]>;
allChains: InferredOptionType<typeof COMMON_UPGRADE_OPTIONS["all-chains"]>;
}) {
export function getSelectedChains(
argv: {
chain: InferredOptionType<typeof COMMON_UPGRADE_OPTIONS["chain"]>;
testnet: InferredOptionType<typeof COMMON_UPGRADE_OPTIONS["testnet"]>;
allChains: InferredOptionType<typeof COMMON_UPGRADE_OPTIONS["all-chains"]>;
},
store: Store
) {
const selectedChains: EvmChain[] = [];
if (argv.allChains && argv.chain)
throw new Error("Cannot use both --all-chains and --chain");
if (!argv.allChains && !argv.chain)
throw new Error("Must use either --all-chains or --chain");
for (const chain of Object.values(DefaultStore.chains)) {
for (const chain of Object.values(store.chains)) {
if (!(chain instanceof EvmChain)) continue;
if (
(argv.allChains && chain.isMainnet() !== argv.testnet) ||
Expand All @@ -198,8 +212,11 @@
* @returns The entropy contract for the given EVM chain.
* @throws {Error} an error if the entropy contract is not found for the given EVM chain.
*/
export function findEntropyContract(chain: EvmChain): EvmEntropyContract {
for (const contract of Object.values(DefaultStore.entropy_contracts)) {
export function findEntropyContract(
chain: EvmChain,
store: Store
): EvmEntropyContract {
for (const contract of Object.values(store.entropy_contracts)) {
if (contract.getChain().getId() === chain.getId()) {
return contract;
}
Expand All @@ -213,8 +230,8 @@
* @returns The EVM chain instance.
* @throws {Error} an error if the chain is not found or is not an EVM chain.
*/
export function findEvmChain(chainName: string): EvmChain {
const chain = DefaultStore.chains[chainName];
export function findEvmChain(chainName: string, store: Store): EvmChain {
const chain = store.chains[chainName];
if (!chain) {
throw new Error(`Chain ${chainName} not found`);
} else if (!(chain instanceof EvmChain)) {
Expand All @@ -229,9 +246,10 @@
* @returns If found, the wormhole contract for the given EVM chain. Else, undefined
*/
export function findWormholeContract(
chain: EvmChain
chain: EvmChain,
store: Store
): EvmWormholeContract | undefined {
for (const contract of Object.values(DefaultStore.wormhole_contracts)) {
for (const contract of Object.values(store.wormhole_contracts)) {
if (
contract instanceof EvmWormholeContract &&
contract.getChain().getId() === chain.getId()
Expand All @@ -256,7 +274,8 @@
export async function deployWormholeContract(
chain: EvmChain,
config: DeployWormholeReceiverContractsConfig,
cacheFile: string
cacheFile: string,
store: Store
): Promise<EvmWormholeContract> {
const receiverSetupAddr = await deployIfNotCached(
cacheFile,
Expand Down Expand Up @@ -311,9 +330,8 @@
}

if (config.saveContract) {
DefaultStore.wormhole_contracts[wormholeContract.getId()] =
wormholeContract;
DefaultStore.saveAllContracts();
store.wormhole_contracts[wormholeContract.getId()] = wormholeContract;
store.saveAllContracts();
}

return wormholeContract;
Expand All @@ -330,10 +348,11 @@
export async function getOrDeployWormholeContract(
chain: EvmChain,
config: DeployWormholeReceiverContractsConfig,
cacheFile: string
cacheFile: string,
store: Store
): Promise<EvmWormholeContract> {
return (
findWormholeContract(chain) ??
(await deployWormholeContract(chain, config, cacheFile))
findWormholeContract(chain, store) ??
(await deployWormholeContract(chain, config, cacheFile, store))
);
}
22 changes: 16 additions & 6 deletions contract_manager/scripts/deploy_evm_contract.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,27 @@
import yargs from "yargs";
import { hideBin } from "yargs/helpers";
import { EvmChain } from "../src/chains";
import { DefaultStore } from "../src/store";
import { DefaultStore, createStore } from "../src/store";

Check warning on line 4 in contract_manager/scripts/deploy_evm_contract.ts

View workflow job for this annotation

GitHub Actions / test

'DefaultStore' is defined but never used
import { readFileSync } from "fs";
import { toPrivateKey } from "../src";

import { COMMON_DEPLOY_OPTIONS } from "./common";
import { COMMON_DEPLOY_OPTIONS, COMMON_STORE_OPTIONS } from "./common";

interface ArgV {
"std-output": string;
"private-key": string;
chain: string;
"deploy-args"?: string[];
"store-dir"?: string;
}

const parser = yargs(hideBin(process.argv))
.scriptName("deploy_evm_contract.ts")
.usage(
"Usage: $0 --std-output <path/to/std-output.json> --private-key <private-key> --chain <chain> [--deploy-args <arg> [... <args>]]"
"Usage: $0 --std-output <path/to/std-output.json> --private-key <private-key> --chain <chain> [--deploy-args <arg> [... <args>]] [--store-dir <store-dir>]"
)
.options({
...COMMON_STORE_OPTIONS,
"std-output": {
type: "string",
demandOption: true,
Expand All @@ -31,12 +40,13 @@
});

async function main() {
const argv = await parser.argv;
const argv = (await parser.argv) as ArgV;
const store = createStore(argv["store-dir"]);

const chain = DefaultStore.chains[argv.chain];
const chain = store.chains[argv.chain];

if (!chain) {
throw new Error(`Chain ${argv.contract} not found`);
throw new Error(`Chain ${argv.chain} not found`);
}

if (chain instanceof EvmChain) {
Expand Down
28 changes: 22 additions & 6 deletions contract_manager/scripts/deploy_evm_pricefeed_contracts.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import yargs from "yargs";
import { hideBin } from "yargs/helpers";
import { EvmChain } from "../src/chains";
import { DefaultStore } from "../src/store";
import { DefaultStore, createStore } from "../src/store";

Check warning on line 4 in contract_manager/scripts/deploy_evm_pricefeed_contracts.ts

View workflow job for this annotation

GitHub Actions / test

'DefaultStore' is defined but never used
import {
DeploymentType,
EvmPriceFeedContract,
Expand All @@ -15,6 +15,7 @@
getWeb3Contract,
getOrDeployWormholeContract,
BaseDeployConfig,
COMMON_STORE_OPTIONS,
} from "./common";

interface DeploymentConfig extends BaseDeployConfig {
Expand All @@ -24,15 +25,29 @@
saveContract: boolean;
}

interface ArgV {
chain: string[];
validTimePeriodSeconds: number;
singleUpdateFeeInWei: number;
deploymentType: string;
"store-dir"?: string;
privateKey: string;
gasMultiplier: number;
gasPriceMultiplier: number;
stdOutputDir: string;
saveContract: boolean;
}

const CACHE_FILE = ".cache-deploy-evm";

const parser = yargs(hideBin(process.argv))
.scriptName("deploy_evm_pricefeed_contracts.ts")
.usage(
"Usage: $0 --std-output-dir <path/to/std-output-dir/> --private-key <private-key> --chain <chain0> --chain <chain1>"
"Usage: $0 --std-output-dir <path/to/std-output-dir/> --private-key <private-key> --chain <chain0> --chain <chain1> [--store-dir <store-dir>]"
)
.options({
...COMMON_DEPLOY_OPTIONS,
...COMMON_STORE_OPTIONS,
"valid-time-period-seconds": {
type: "number",
demandOption: false,
Expand Down Expand Up @@ -91,7 +106,8 @@
}

async function main() {
const argv = await parser.argv;
const argv = (await parser.argv) as ArgV;
const store = createStore(argv["store-dir"]);

const deploymentConfig: DeploymentConfig = {
type: toDeploymentType(argv.deploymentType),
Expand All @@ -111,7 +127,7 @@
const chainNames = argv.chain;

for (const chainName of chainNames) {
const chain = DefaultStore.chains[chainName];
const chain = store.chains[chainName];
if (!chain) {
throw new Error(`Chain ${chainName} not found`);
} else if (!(chain instanceof EvmChain)) {
Expand All @@ -135,8 +151,8 @@
if (deploymentConfig.saveContract) {
console.log("Saving the contract in the store...");
const contract = new EvmPriceFeedContract(chain, priceFeedAddr);
DefaultStore.contracts[contract.getId()] = contract;
DefaultStore.saveAllContracts();
store.contracts[contract.getId()] = contract;
store.saveAllContracts();
}

console.log(
Expand Down
31 changes: 20 additions & 11 deletions contract_manager/scripts/entropy-accept-admin-and-ownership.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,23 @@
import yargs from "yargs";
import { hideBin } from "yargs/helpers";
import { DefaultStore, EvmChain, loadHotWallet } from "../src";
import { DefaultStore, EvmChain, loadHotWallet, createStore } from "../src";
import { COMMON_STORE_OPTIONS } from "./common";

interface ArgV {
testnet: boolean;
"all-chains": boolean;
chain?: string[];
"ops-key-path": string;
"store-dir"?: string;
}

const parser = yargs(hideBin(process.argv))
.usage(
"Creates governance proposal to accept pending admin or ownership transfer for Pyth entropy contracts.\n" +
"Usage: $0 --chain <chain_1> --chain <chain_2> --ops-key-path <ops_key_path>"
"Usage: $0 --chain <chain_1> --chain <chain_2> --ops-key-path <ops_key_path> [--store-dir <store-dir>]"
)
.options({
...COMMON_STORE_OPTIONS,
testnet: {
type: "boolean",
default: false,
Expand All @@ -31,17 +41,18 @@ const parser = yargs(hideBin(process.argv))
});

async function main() {
const argv = await parser.argv;
const argv = (await parser.argv) as ArgV;
const store = createStore(argv["store-dir"]);
const selectedChains: EvmChain[] = [];

if (argv.allChains && argv.chain)
if (argv["all-chains"] && argv.chain)
throw new Error("Cannot use both --all-chains and --chain");
if (!argv.allChains && !argv.chain)
if (!argv["all-chains"] && !argv.chain)
throw new Error("Must use either --all-chains or --chain");
for (const chain of Object.values(DefaultStore.chains)) {
for (const chain of Object.values(store.chains)) {
if (!(chain instanceof EvmChain)) continue;
if (
(argv.allChains && chain.isMainnet() !== argv.testnet) ||
(argv["all-chains"] && chain.isMainnet() !== argv.testnet) ||
argv.chain?.includes(chain.getId())
)
selectedChains.push(chain);
Expand All @@ -58,12 +69,10 @@ async function main() {
}

const vault =
DefaultStore.vaults[
"mainnet-beta_FVQyHcooAtThJ83XFrNnv74BcinbRH3bRmfFamAHBfuj"
];
store.vaults["mainnet-beta_FVQyHcooAtThJ83XFrNnv74BcinbRH3bRmfFamAHBfuj"];

const payloads: Buffer[] = [];
for (const contract of Object.values(DefaultStore.entropy_contracts)) {
for (const contract of Object.values(store.entropy_contracts)) {
if (selectedChains.includes(contract.chain)) {
console.log("Creating payload for chain: ", contract.chain.getId());
const pendingOwner = await contract.getPendingOwner();
Expand Down
26 changes: 17 additions & 9 deletions contract_manager/scripts/generate_upgrade_ton_contract_proposal.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,29 @@
import yargs from "yargs";
import { hideBin } from "yargs/helpers";
import { DefaultStore, loadHotWallet } from "../src";
import { DefaultStore, loadHotWallet, createStore } from "../src";
import { TonChain } from "../src/chains";
import { CHAINS, toChainName } from "@pythnetwork/xc-admin-common";
import fs from "fs";
import path from "path";
import { COMMON_STORE_OPTIONS } from "./common";

interface ArgV {
network: "mainnet" | "testnet";
"contract-address": string;
"ops-key-path": string;
"store-dir"?: string;
}

const parser = yargs(hideBin(process.argv))
.usage(
"Upgrades the Pyth contract on TON and creates a governance proposal for it.\n" +
"Usage: $0 --network <mainnet|testnet> --contract-address <address> --ops-key-path <ops_key_path>\n" +
"Usage: $0 --network <mainnet|testnet> --contract-address <address> --ops-key-path <ops_key_path> [--store-dir <store-dir>]\n" +
"Required environment variables:\n" +
" - ENV_TON_MAINNET_API_KEY: API key for TON mainnet\n" +
" - ENV_TON_TESTNET_API_KEY: API key for TON testnet"
)
.options({
...COMMON_STORE_OPTIONS,
network: {
type: "string",
choices: ["mainnet", "testnet"],
Expand All @@ -34,23 +43,22 @@ const parser = yargs(hideBin(process.argv))
});

async function main() {
const argv = await parser.argv;
const argv = (await parser.argv) as ArgV;
const store = createStore(argv["store-dir"]);
const isMainnet = argv.network === "mainnet";

// Get chain ID and name from CHAINS mapping
const chainId = isMainnet ? CHAINS.ton_mainnet : CHAINS.ton_testnet;
const wormholeChainName = toChainName(chainId);

// Get the TON chain instance from DefaultStore based on network
const chain = DefaultStore.chains[isMainnet ? "ton_mainnet" : "ton_testnet"];
// Get the TON chain instance from store based on network
const chain = store.chains[isMainnet ? "ton_mainnet" : "ton_testnet"];
if (!chain || !(chain instanceof TonChain)) {
throw new Error(`Chain configuration not found for TON ${argv.network}`);
}

const vault =
DefaultStore.vaults[
"mainnet-beta_FVQyHcooAtThJ83XFrNnv74BcinbRH3bRmfFamAHBfuj"
];
store.vaults["mainnet-beta_FVQyHcooAtThJ83XFrNnv74BcinbRH3bRmfFamAHBfuj"];

console.log(
`Upgrading contract on TON ${argv.network} (Chain ID: ${chainId}, Wormhole Chain Name: ${wormholeChainName})`
Expand All @@ -73,7 +81,7 @@ async function main() {

// Create and submit governance proposal
console.log("Using vault for proposal:", vault.getId());
const keypair = await loadHotWallet(argv["ops-key-path"] as string);
const keypair = await loadHotWallet(argv["ops-key-path"]);
console.log("Using wallet:", keypair.publicKey.toBase58());
vault.connect(keypair);
const proposal = await vault.proposeWormholeMessage([payload]);
Expand Down
Loading
Loading