[xc-admin] crank relayer needs to create price and product accounts (#589)

* Add code

* Revert
This commit is contained in:
guibescos 2023-02-14 05:14:08 -06:00 committed by GitHub
parent d95c9247a2
commit 6d806f78f6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 74 additions and 0 deletions

View File

@ -6,8 +6,10 @@ import {
} from "@certusone/wormhole-sdk/lib/cjs/solana/wormhole";
import { AnchorProvider, BN, Program } from "@coral-xyz/anchor";
import NodeWallet from "@coral-xyz/anchor/dist/cjs/nodewallet";
import { parseProductData } from "@pythnetwork/client";
import {
getPythClusterApiUrl,
getPythProgramKeyForCluster,
PythCluster,
} from "@pythnetwork/client/lib/cluster";
import {
@ -16,11 +18,15 @@ import {
Connection,
Keypair,
PublicKey,
SystemProgram,
TransactionInstruction,
} from "@solana/web3.js";
import * as fs from "fs";
import {
decodeGovernancePayload,
ExecutePostedVaa,
MultisigParser,
PythMultisigInstruction,
WORMHOLE_ADDRESS,
WORMHOLE_API_ENDPOINT,
} from "xc_admin_common";
@ -37,6 +43,8 @@ const REMOTE_EXECUTOR_ADDRESS = new PublicKey(
"exe6S3AxPVNmy46L4Nj6HrnnAVQUhwyYzMSNcnRn3qq"
);
const PRODUCT_ACCOUNT_SIZE = 512;
const PRICE_ACCOUNT_SIZE = 3312;
const CLAIM_RECORD_SEED = "CLAIM_RECORD";
const EXECUTOR_KEY_SEED = "EXECUTOR_KEY";
const CLUSTER: PythCluster = envOrErr("CLUSTER") as PythCluster;
@ -97,6 +105,9 @@ async function run() {
governancePayload instanceof ExecutePostedVaa &&
governancePayload.targetChainId == "pythnet"
) {
const multisigParser = MultisigParser.fromCluster(CLUSTER);
const preInstructions: TransactionInstruction[] = [];
console.log(`Found VAA ${lastSequenceNumber}, relaying ...`);
await postVaaSolana(
provider.connection,
@ -110,6 +121,7 @@ async function run() {
let extraAccountMetas: AccountMeta[] = [
{ pubkey: executorKey, isSigner: false, isWritable: true },
];
for (const ix of governancePayload.instructions) {
extraAccountMetas.push({
pubkey: ix.programId,
@ -121,6 +133,67 @@ async function run() {
return !acc.pubkey.equals(executorKey);
})
);
const parsedInstruction = multisigParser.parseInstruction(ix);
if (
parsedInstruction instanceof PythMultisigInstruction &&
parsedInstruction.name == "addProduct"
) {
const productSeed = "product:" + parsedInstruction.args.symbol;
const productAddress = await PublicKey.createWithSeed(
provider.wallet.publicKey,
productSeed,
getPythProgramKeyForCluster(CLUSTER as PythCluster)
);
preInstructions.push(
SystemProgram.createAccountWithSeed({
fromPubkey: provider.wallet.publicKey,
basePubkey: provider.wallet.publicKey,
newAccountPubkey: productAddress,
seed: productSeed,
space: PRODUCT_ACCOUNT_SIZE,
lamports:
await provider.connection.getMinimumBalanceForRentExemption(
PRODUCT_ACCOUNT_SIZE
),
programId: getPythProgramKeyForCluster(CLUSTER as PythCluster),
})
);
} else if (
parsedInstruction instanceof PythMultisigInstruction &&
parsedInstruction.name == "addPrice"
) {
const productAccount = await provider.connection.getAccountInfo(
parsedInstruction.accounts.named.productAccount.pubkey
);
if (productAccount) {
const priceSeed =
"price:" + parseProductData(productAccount.data).product.symbol;
const priceAddress = await PublicKey.createWithSeed(
provider.wallet.publicKey,
priceSeed,
getPythProgramKeyForCluster(CLUSTER as PythCluster)
);
preInstructions.push(
SystemProgram.createAccountWithSeed({
fromPubkey: provider.wallet.publicKey,
basePubkey: provider.wallet.publicKey,
newAccountPubkey: priceAddress,
seed: priceSeed,
space: PRICE_ACCOUNT_SIZE,
lamports:
await provider.connection.getMinimumBalanceForRentExemption(
PRICE_ACCOUNT_SIZE
),
programId: getPythProgramKeyForCluster(
CLUSTER as PythCluster
),
})
);
} else {
throw Error("Product account not found");
}
}
}
await remoteExecutor.methods
@ -130,6 +203,7 @@ async function run() {
postedVaa: derivePostedVaaKey(WORMHOLE_ADDRESS[CLUSTER]!, vaa.hash),
})
.remainingAccounts(extraAccountMetas)
.preInstructions(preInstructions)
.rpc();
}
} else if (response.code == 5) {