sdk/js: Update relayer testing on mainnet (#3164)
This commit is contained in:
parent
70dd001ba3
commit
575d2fe9a0
|
@ -20,6 +20,8 @@
|
||||||
"docs": "typedoc src/index.ts",
|
"docs": "typedoc src/index.ts",
|
||||||
"test": "DEV=true NETWORK=DEVNET jest --config jestconfig.json --verbose",
|
"test": "DEV=true NETWORK=DEVNET jest --config jestconfig.json --verbose",
|
||||||
"test-ci": "NETWORK=DEVNET NEAR_NO_LOGS=true jest --config jestconfig.json --verbose --setupFiles ./ci-config.js --forceExit",
|
"test-ci": "NETWORK=DEVNET NEAR_NO_LOGS=true jest --config jestconfig.json --verbose --setupFiles ./ci-config.js --forceExit",
|
||||||
|
"test-relayer-mainnet": "ENV=mainnet NETWORK=MAINNET npx jest --config jestconfig.json --verbose ./src/relayer/",
|
||||||
|
"test-relayer-testnet": "ENV=testnet NETWORK=TESTNET npx jest --config jestconfig.json --verbose ./src/relayer/",
|
||||||
"build": "npm run build-all",
|
"build": "npm run build-all",
|
||||||
"format": "echo \"disabled: prettier --write \"src/**/*.ts\"\"",
|
"format": "echo \"disabled: prettier --write \"src/**/*.ts\"\"",
|
||||||
"lint": "tslint -p tsconfig.json",
|
"lint": "tslint -p tsconfig.json",
|
||||||
|
|
|
@ -16,6 +16,8 @@ import { getNetwork, PRIVATE_KEY, isCI } from "./utils/utils";
|
||||||
const network: Network = getNetwork();
|
const network: Network = getNetwork();
|
||||||
const ci: boolean = isCI();
|
const ci: boolean = isCI();
|
||||||
|
|
||||||
|
const testIfDevnet = () => (network == "DEVNET" ? test : test.skip);
|
||||||
|
|
||||||
const sourceChain = network == "DEVNET" ? "ethereum" : "avalanche";
|
const sourceChain = network == "DEVNET" ? "ethereum" : "avalanche";
|
||||||
const targetChain = network == "DEVNET" ? "bsc" : "celo";
|
const targetChain = network == "DEVNET" ? "bsc" : "celo";
|
||||||
|
|
||||||
|
@ -24,11 +26,15 @@ const targetChainId = CHAINS[targetChain];
|
||||||
|
|
||||||
describe("Relay Provider Test", () => {
|
describe("Relay Provider Test", () => {
|
||||||
const addressInfo = getAddressInfo(sourceChain, network);
|
const addressInfo = getAddressInfo(sourceChain, network);
|
||||||
|
if (network == "MAINNET")
|
||||||
|
addressInfo.mockDeliveryProviderAddress =
|
||||||
|
"0x7A0a53847776f7e94Cc35742971aCb2217b0Db81";
|
||||||
const provider = getDefaultProvider(network, sourceChain, ci);
|
const provider = getDefaultProvider(network, sourceChain, ci);
|
||||||
|
|
||||||
// signers
|
// signers
|
||||||
const oracleDeployer = new ethers.Wallet(PRIVATE_KEY, provider);
|
const oracleDeployer = new ethers.Wallet(PRIVATE_KEY, provider);
|
||||||
const deliveryProviderAddress = addressInfo.mockDeliveryProviderAddress;
|
const deliveryProviderAddress = addressInfo.mockDeliveryProviderAddress;
|
||||||
|
|
||||||
if (!deliveryProviderAddress) throw Error("No relay provider address");
|
if (!deliveryProviderAddress) throw Error("No relay provider address");
|
||||||
const deliveryProvider = DeliveryProvider__factory.connect(
|
const deliveryProvider = DeliveryProvider__factory.connect(
|
||||||
deliveryProviderAddress,
|
deliveryProviderAddress,
|
||||||
|
@ -36,7 +42,7 @@ describe("Relay Provider Test", () => {
|
||||||
);
|
);
|
||||||
|
|
||||||
describe("Read Prices Correctly", () => {
|
describe("Read Prices Correctly", () => {
|
||||||
test("readPrices", async () => {
|
testIfDevnet()("readPrices", async () => {
|
||||||
const tokenPrice = ethers.BigNumber.from("100000");
|
const tokenPrice = ethers.BigNumber.from("100000");
|
||||||
const gasPrice = ethers.utils.parseUnits("300", "gwei");
|
const gasPrice = ethers.utils.parseUnits("300", "gwei");
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ import {
|
||||||
Environment,
|
Environment,
|
||||||
} from "../../../token_bridge/__tests__/utils/consts";
|
} from "../../../token_bridge/__tests__/utils/consts";
|
||||||
|
|
||||||
const SAFE_RELAY_DELAY = 10000;
|
const SAFE_RELAY_DELAY = 15000;
|
||||||
|
|
||||||
const characters =
|
const characters =
|
||||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
||||||
|
|
|
@ -49,8 +49,10 @@ import { getSignedVAAWithRetry } from "../../rpc";
|
||||||
const network: Network = getNetwork();
|
const network: Network = getNetwork();
|
||||||
const ci: boolean = isCI();
|
const ci: boolean = isCI();
|
||||||
|
|
||||||
const sourceChain = network == "DEVNET" ? "ethereum" : "avalanche";
|
const sourceChain = network == "DEVNET" ? "ethereum" : "celo";
|
||||||
const targetChain = network == "DEVNET" ? "bsc" : "celo";
|
const targetChain = network == "DEVNET" ? "bsc" : "avalanche";
|
||||||
|
|
||||||
|
const testIfDevnet = () => (network == "DEVNET" ? test : test.skip);
|
||||||
|
|
||||||
type TestChain = {
|
type TestChain = {
|
||||||
chainId: ChainId;
|
chainId: ChainId;
|
||||||
|
@ -71,6 +73,13 @@ const createTestChain = (name: ChainName) => {
|
||||||
addressInfo.wormholeRelayerAddress =
|
addressInfo.wormholeRelayerAddress =
|
||||||
"0x53855d4b64E9A3CF59A84bc768adA716B5536BC5";
|
"0x53855d4b64E9A3CF59A84bc768adA716B5536BC5";
|
||||||
}
|
}
|
||||||
|
if (network == "MAINNET")
|
||||||
|
addressInfo.mockIntegrationAddress =
|
||||||
|
"0xa507Ff8D183D2BEcc9Ff9F82DFeF4b074e1d0E05";
|
||||||
|
if (network == "MAINNET")
|
||||||
|
addressInfo.mockDeliveryProviderAddress =
|
||||||
|
"0x7A0a53847776f7e94Cc35742971aCb2217b0Db81";
|
||||||
|
|
||||||
if (!addressInfo.wormholeRelayerAddress)
|
if (!addressInfo.wormholeRelayerAddress)
|
||||||
throw Error(`No core relayer address for ${name}`);
|
throw Error(`No core relayer address for ${name}`);
|
||||||
if (!addressInfo.mockIntegrationAddress)
|
if (!addressInfo.mockIntegrationAddress)
|
||||||
|
@ -169,7 +178,7 @@ const testSend = async (
|
||||||
0,
|
0,
|
||||||
{ value, gasLimit: REASONABLE_GAS_LIMIT }
|
{ value, gasLimit: REASONABLE_GAS_LIMIT }
|
||||||
);
|
);
|
||||||
console.log("Sent delivery request!");
|
console.log(`Sent delivery request! Transaction hash ${tx.hash}`);
|
||||||
await tx.wait();
|
await tx.wait();
|
||||||
console.log("Message confirmed!");
|
console.log("Message confirmed!");
|
||||||
|
|
||||||
|
@ -205,7 +214,7 @@ const testForward = async (
|
||||||
valueNeededOnTargetChain,
|
valueNeededOnTargetChain,
|
||||||
{ value: value, gasLimit: REASONABLE_GAS_LIMIT }
|
{ value: value, gasLimit: REASONABLE_GAS_LIMIT }
|
||||||
);
|
);
|
||||||
console.log("Sent delivery request!");
|
console.log(`Sent delivery request! Transaction hash ${tx.hash}`);
|
||||||
await tx.wait();
|
await tx.wait();
|
||||||
console.log("Message confirmed!");
|
console.log("Message confirmed!");
|
||||||
|
|
||||||
|
@ -230,6 +239,58 @@ describe("Wormhole Relayer Tests", () => {
|
||||||
expect(message).toBe(arbitraryPayload);
|
expect(message).toBe(arbitraryPayload);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("Executes a Delivery Success With Additional VAAs", async () => {
|
||||||
|
const arbitraryPayload = getArbitraryBytes32();
|
||||||
|
console.log(`Sent message: ${arbitraryPayload}`);
|
||||||
|
|
||||||
|
const wormhole = Implementation__factory.connect(
|
||||||
|
CONTRACTS[network][sourceChain].core || "",
|
||||||
|
source.wallet
|
||||||
|
);
|
||||||
|
const deliverySeq = await wormhole.nextSequence(source.wallet.address);
|
||||||
|
const msgTx = await wormhole.publishMessage(0, arbitraryPayload, 200);
|
||||||
|
await msgTx.wait();
|
||||||
|
|
||||||
|
const value = await relayer.getPrice(
|
||||||
|
sourceChain,
|
||||||
|
targetChain,
|
||||||
|
REASONABLE_GAS_LIMIT * 2,
|
||||||
|
optionalParams
|
||||||
|
);
|
||||||
|
console.log(`Quoted gas delivery fee: ${value}`);
|
||||||
|
|
||||||
|
const tx = await source.mockIntegration.sendMessageWithAdditionalVaas(
|
||||||
|
[],
|
||||||
|
target.chainId,
|
||||||
|
REASONABLE_GAS_LIMIT * 2,
|
||||||
|
0,
|
||||||
|
[
|
||||||
|
relayer.createVaaKey(
|
||||||
|
source.chainId,
|
||||||
|
Buffer.from(tryNativeToUint8Array(source.wallet.address, "ethereum")),
|
||||||
|
deliverySeq
|
||||||
|
),
|
||||||
|
],
|
||||||
|
{ value }
|
||||||
|
);
|
||||||
|
|
||||||
|
console.log(`Sent tx hash: ${tx.hash}`);
|
||||||
|
|
||||||
|
const rx = await tx.wait();
|
||||||
|
|
||||||
|
await waitForRelay();
|
||||||
|
|
||||||
|
console.log("Checking status using SDK");
|
||||||
|
const status = await getStatus(tx.hash);
|
||||||
|
expect(status).toBe("Delivery Success");
|
||||||
|
|
||||||
|
console.log("Checking if message was relayed");
|
||||||
|
const message = (await target.mockIntegration.getDeliveryData())
|
||||||
|
.additionalVaas[0];
|
||||||
|
const parsedMessage = await wormhole.parseVM(message);
|
||||||
|
expect(parsedMessage.payload).toBe(arbitraryPayload);
|
||||||
|
});
|
||||||
|
|
||||||
test("Executes a Delivery Success with manual delivery", async () => {
|
test("Executes a Delivery Success with manual delivery", async () => {
|
||||||
const arbitraryPayload = getArbitraryBytes32();
|
const arbitraryPayload = getArbitraryBytes32();
|
||||||
console.log(`Sent message: ${arbitraryPayload}`);
|
console.log(`Sent message: ${arbitraryPayload}`);
|
||||||
|
@ -356,7 +417,7 @@ describe("Wormhole Relayer Tests", () => {
|
||||||
expect(message2).toBe(arbitraryPayload2);
|
expect(message2).toBe(arbitraryPayload2);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("Executes a Forward Request Failure", async () => {
|
testIfDevnet()("Executes a Forward Request Failure", async () => {
|
||||||
const arbitraryPayload1 = getArbitraryBytes32();
|
const arbitraryPayload1 = getArbitraryBytes32();
|
||||||
const arbitraryPayload2 = getArbitraryBytes32();
|
const arbitraryPayload2 = getArbitraryBytes32();
|
||||||
console.log(
|
console.log(
|
||||||
|
@ -381,7 +442,7 @@ describe("Wormhole Relayer Tests", () => {
|
||||||
expect(message2).not.toBe(arbitraryPayload2);
|
expect(message2).not.toBe(arbitraryPayload2);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("Test getPrice in Typescript SDK", async () => {
|
testIfDevnet()("Test getPrice in Typescript SDK", async () => {
|
||||||
const price = await relayer.getPrice(
|
const price = await relayer.getPrice(
|
||||||
sourceChain,
|
sourceChain,
|
||||||
targetChain,
|
targetChain,
|
||||||
|
@ -541,7 +602,7 @@ describe("Wormhole Relayer Tests", () => {
|
||||||
|
|
||||||
// GOVERNANCE TESTS
|
// GOVERNANCE TESTS
|
||||||
|
|
||||||
test("Governance: Test Registering Chain", async () => {
|
testIfDevnet()("Governance: Test Registering Chain", async () => {
|
||||||
const chain = 24;
|
const chain = 24;
|
||||||
|
|
||||||
const currentAddress =
|
const currentAddress =
|
||||||
|
@ -578,63 +639,68 @@ describe("Wormhole Relayer Tests", () => {
|
||||||
expect(newRegisteredAddress).toBe(expectedNewRegisteredAddress);
|
expect(newRegisteredAddress).toBe(expectedNewRegisteredAddress);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("Governance: Test Setting Default Relay Provider", async () => {
|
testIfDevnet()(
|
||||||
const currentAddress =
|
"Governance: Test Setting Default Relay Provider",
|
||||||
await source.wormholeRelayer.getDefaultDeliveryProvider();
|
async () => {
|
||||||
console.log(
|
const currentAddress =
|
||||||
`For Chain ${source.chainId}, default relay provider: ${currentAddress}`
|
await source.wormholeRelayer.getDefaultDeliveryProvider();
|
||||||
);
|
console.log(
|
||||||
|
`For Chain ${source.chainId}, default relay provider: ${currentAddress}`
|
||||||
|
);
|
||||||
|
|
||||||
const expectedNewDefaultDeliveryProvider =
|
const expectedNewDefaultDeliveryProvider =
|
||||||
"0x1234567890123456789012345678901234567892";
|
"0x1234567890123456789012345678901234567892";
|
||||||
|
|
||||||
const timestamp = (await source.wallet.provider.getBlock("latest"))
|
const timestamp = (await source.wallet.provider.getBlock("latest"))
|
||||||
.timestamp;
|
.timestamp;
|
||||||
const chain = source.chainId;
|
const chain = source.chainId;
|
||||||
const firstMessage =
|
const firstMessage =
|
||||||
governance.publishWormholeRelayerSetDefaultDeliveryProvider(
|
governance.publishWormholeRelayerSetDefaultDeliveryProvider(
|
||||||
timestamp,
|
timestamp,
|
||||||
chain,
|
chain,
|
||||||
|
expectedNewDefaultDeliveryProvider
|
||||||
|
);
|
||||||
|
const firstSignedVaa = guardians.addSignatures(
|
||||||
|
firstMessage,
|
||||||
|
guardianIndices
|
||||||
|
);
|
||||||
|
|
||||||
|
let tx = await source.wormholeRelayer.setDefaultDeliveryProvider(
|
||||||
|
firstSignedVaa
|
||||||
|
);
|
||||||
|
await tx.wait();
|
||||||
|
|
||||||
|
const newDefaultDeliveryProvider =
|
||||||
|
await source.wormholeRelayer.getDefaultDeliveryProvider();
|
||||||
|
|
||||||
|
expect(newDefaultDeliveryProvider).toBe(
|
||||||
expectedNewDefaultDeliveryProvider
|
expectedNewDefaultDeliveryProvider
|
||||||
);
|
);
|
||||||
const firstSignedVaa = guardians.addSignatures(
|
|
||||||
firstMessage,
|
|
||||||
guardianIndices
|
|
||||||
);
|
|
||||||
|
|
||||||
let tx = await source.wormholeRelayer.setDefaultDeliveryProvider(
|
const inverseFirstMessage =
|
||||||
firstSignedVaa
|
governance.publishWormholeRelayerSetDefaultDeliveryProvider(
|
||||||
);
|
timestamp,
|
||||||
await tx.wait();
|
chain,
|
||||||
|
currentAddress
|
||||||
const newDefaultDeliveryProvider =
|
);
|
||||||
await source.wormholeRelayer.getDefaultDeliveryProvider();
|
const inverseFirstSignedVaa = guardians.addSignatures(
|
||||||
|
inverseFirstMessage,
|
||||||
expect(newDefaultDeliveryProvider).toBe(expectedNewDefaultDeliveryProvider);
|
guardianIndices
|
||||||
|
|
||||||
const inverseFirstMessage =
|
|
||||||
governance.publishWormholeRelayerSetDefaultDeliveryProvider(
|
|
||||||
timestamp,
|
|
||||||
chain,
|
|
||||||
currentAddress
|
|
||||||
);
|
);
|
||||||
const inverseFirstSignedVaa = guardians.addSignatures(
|
|
||||||
inverseFirstMessage,
|
|
||||||
guardianIndices
|
|
||||||
);
|
|
||||||
|
|
||||||
tx = await source.wormholeRelayer.setDefaultDeliveryProvider(
|
tx = await source.wormholeRelayer.setDefaultDeliveryProvider(
|
||||||
inverseFirstSignedVaa
|
inverseFirstSignedVaa
|
||||||
);
|
);
|
||||||
await tx.wait();
|
await tx.wait();
|
||||||
|
|
||||||
const originalDefaultDeliveryProvider =
|
const originalDefaultDeliveryProvider =
|
||||||
await source.wormholeRelayer.getDefaultDeliveryProvider();
|
await source.wormholeRelayer.getDefaultDeliveryProvider();
|
||||||
|
|
||||||
expect(originalDefaultDeliveryProvider).toBe(currentAddress);
|
expect(originalDefaultDeliveryProvider).toBe(currentAddress);
|
||||||
});
|
}
|
||||||
|
);
|
||||||
|
|
||||||
test("Governance: Test Upgrading Contract", async () => {
|
testIfDevnet()("Governance: Test Upgrading Contract", async () => {
|
||||||
const IMPLEMENTATION_STORAGE_SLOT =
|
const IMPLEMENTATION_STORAGE_SLOT =
|
||||||
"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
|
"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue