Upgrade using ABI

Step 1: Create a Solana Account

First, create a Solana account that will be used to control the Ethereum account.

Step 2: Create the Corresponding Ethereum Account

You need to use a Solana account to send messages to the Ethereum contract through the Solana program.

import { ethers } from "hardhat";
import { PublicKey } from "@solana/web3.js";
import { coder } from "your-coder-library"; // Example placeholder

const solanaAddress = new PublicKey("your-solana-account").toBytes();
const sourceAddress = coder.encode(["bytes32"], [Buffer.from(solanaAddress)]);
const payload = coder.encode(["bytes32", "bytes"], [sourceAddress, Buffer.from([0])]);

// Send message using the Solana program
const programID = new PublicKey("solana-program-address");
const program = new anchor.Program(idl, programID);
const message = hexStringToUint8Array(payload);

const ix3 = program.methods.sendMessage(Buffer.from(message)).accounts({
  config: realConfig,
  wormholeProgram: CORE_BRIDGE_PID,
  ...wormholeAccounts2,
}).instruction();

const tx3 = new Transaction().add(await ix3);

try {
  const commitment: Commitment = 'confirmed';
  await sendAndConfirmTransaction(provider.connection, tx3, [yourSolanaAccount], { commitment });
} catch (error) {
  console.error(error);
}

You can generate the payload as follows:

// Activate the contract address. This step requires interaction with Solana to assemble the data.
// The contract address is specified as a PublicKey and then converted to a byte array.
const contractAddress = new PublicKey("6v9YRMJbiXSjwco3evS2XdNuqPbwzKf3ykmn5iQJ4UyF").toBytes();

// The contract address is then encoded as a `bytes32` type for further processing.
// It is important to ensure the correct type when encoding the data.
const sourceAddress = coder.encode(["bytes32"], [Buffer.from(contractAddress)]);

// A payload is assembled by encoding two fields:
const payload = coder.encode(["bytes32", "bytes"], [sourceAddress, Buffer.from([0])]);

// The final payload is logged to the console for debugging purposes or further use.
console.log(payload);

Step 3: Query the Generated Proxy Account

const uniProxyFactory = await ethers.getContractFactory("UniProxy");
const UniProxy = await uniProxyFactory.attach("uniProxy-contract-address");
const sourceChain = 1; // Solana
const userAddress = ethers.zeroPadValue(new PublicKey("your-solana-account").toBytes(), 32);
const proxyAddress = await UniProxy.proxys(sourceChain, userAddress);
console.log(proxyAddress);

The Proxy address will be shown if you upgrade succseefullyo upgrade your account into a universal account, you should send

Last updated