wormhole/ethereum/ts-scripts/relayer/deliveryProvider/configureDeliveryProvider.ts

111 lines
3.4 KiB
TypeScript

import { ChainId, tryNativeToHexString } from "@certusone/wormhole-sdk";
import type { BigNumberish } from "ethers";
import {
init,
loadChains,
ChainInfo,
loadScriptConfig,
getWormholeRelayerAddress,
getDeliveryProvider,
getDeliveryProviderAddress,
getOperatingChains,
} from "../helpers/env";
import { wait } from "../helpers/utils";
import type { DeliveryProviderStructs } from "../../../ethers-contracts/DeliveryProvider";
/**
* Meant for `config.pricingInfo`
*/
interface PricingInfo {
chainId: ChainId
deliverGasOverhead: BigNumberish
updatePriceGas: BigNumberish
updatePriceNative: BigNumberish
maximumBudget: BigNumberish
};
const processName = "configureDeliveryProvider";
init();
const operatingChains = getOperatingChains();
const chains = loadChains();
const config = loadScriptConfig(processName);
async function run() {
console.log("Start! " + processName);
for (let i = 0; i < operatingChains.length; i++) {
await configureChainsDeliveryProvider(chains[i]);
}
}
async function configureChainsDeliveryProvider(chain: ChainInfo) {
console.log("about to perform DeliveryProvider configuration for chain " + chain.chainId);
const deliveryProvider = getDeliveryProvider(chain);
const coreRelayer = await getWormholeRelayerAddress(chain);
const thisChainsConfigInfo = config.addresses.find(
(x: any) => x.chainId == chain.chainId
);
if (!thisChainsConfigInfo) {
throw new Error(
"Failed to find address config info for chain " + chain.chainId
);
}
if (!thisChainsConfigInfo.rewardAddress) {
throw new Error(
"Failed to find reward address info for chain " + chain.chainId
);
}
const coreConfig: DeliveryProviderStructs.CoreConfigStruct = {
updateWormholeRelayer: true,
updateRewardAddress: true,
updateSupportedKeyTypes: true,
coreRelayer,
rewardAddress: thisChainsConfigInfo.rewardAddress,
supportedKeyTypesBitmap: 1 << 1 // VAA_KEY_TYPE
};
const updates: DeliveryProviderStructs.UpdateStruct[] = [];
// Set the entire relay provider configuration
for (const targetChain of chains) {
const targetChainPriceUpdate = (config.pricingInfo as PricingInfo[]).find(
(x: any) => x.chainId == targetChain.chainId
);
if (!targetChainPriceUpdate) {
throw new Error(
"Failed to find pricingInfo for chain " + targetChain.chainId
);
}
const targetChainProviderAddress = getDeliveryProviderAddress(targetChain);
const remoteDeliveryProvider =
"0x" + tryNativeToHexString(targetChainProviderAddress, "ethereum");
const chainConfigUpdate = {
chainId: targetChain.chainId,
updateAssetConversionBuffer: true,
updateDeliverGasOverhead: true,
updatePrice: true,
updateMaximumBudget: true,
updateTargetChainAddress: true,
updateSupportedChain: true,
isSupported: true,
buffer: 5,
bufferDenominator: 100,
newWormholeFee: 0,
newGasOverhead: targetChainPriceUpdate.deliverGasOverhead,
gasPrice: targetChainPriceUpdate.updatePriceGas,
nativeCurrencyPrice: targetChainPriceUpdate.updatePriceNative,
targetChainAddress: remoteDeliveryProvider,
maximumTotalBudget: targetChainPriceUpdate.maximumBudget,
};
updates.push(chainConfigUpdate);
}
await deliveryProvider.updateConfig(updates, coreConfig).then(wait);
console.log("done with DeliveryProvider configuration on " + chain.chainId);
}
run().then(() => console.log("Done! " + processName));