feat: use sdk in js client
This commit is contained in:
parent
fd62d71f61
commit
fce0708e11
|
@ -14,29 +14,19 @@ RUN --mount=type=cache,target=/root/.cache \
|
||||||
ENV SOLANA_BIN_PATH="/root/.local/share/solana/install/active_release/bin"
|
ENV SOLANA_BIN_PATH="/root/.local/share/solana/install/active_release/bin"
|
||||||
ENV PATH="$SOLANA_BIN_PATH:$PATH"
|
ENV PATH="$SOLANA_BIN_PATH:$PATH"
|
||||||
|
|
||||||
WORKDIR /usr/src/ethereum
|
|
||||||
COPY ethereum/package.json ethereum/package-lock.json ./
|
|
||||||
RUN --mount=type=cache,uid=1000,gid=1000,target=/home/node/.npm \
|
|
||||||
npm ci
|
|
||||||
COPY ethereum ./
|
|
||||||
|
|
||||||
WORKDIR /usr/src/clients/token_bridge
|
WORKDIR /usr/src/clients/token_bridge
|
||||||
COPY clients/token_bridge/package.json clients/token_bridge/package-lock.json ./
|
COPY clients/token_bridge/package.json clients/token_bridge/package-lock.json ./
|
||||||
RUN --mount=type=cache,uid=1000,gid=1000,target=/home/node/.npm \
|
RUN --mount=type=cache,uid=1000,gid=1000,target=/home/node/.npm \
|
||||||
npm ci
|
npm ci
|
||||||
COPY clients/token_bridge ./
|
COPY clients/token_bridge ./
|
||||||
RUN set -xe && \
|
RUN npm run build
|
||||||
npm run build-contracts && \
|
|
||||||
npm run build
|
|
||||||
|
|
||||||
WORKDIR /usr/src/clients/nft_bridge
|
WORKDIR /usr/src/clients/nft_bridge
|
||||||
COPY clients/nft_bridge/package.json clients/nft_bridge/package-lock.json ./
|
COPY clients/nft_bridge/package.json clients/nft_bridge/package-lock.json ./
|
||||||
RUN --mount=type=cache,uid=1000,gid=1000,target=/home/node/.npm \
|
RUN --mount=type=cache,uid=1000,gid=1000,target=/home/node/.npm \
|
||||||
npm ci
|
npm ci
|
||||||
COPY clients/nft_bridge ./
|
COPY clients/nft_bridge ./
|
||||||
RUN set -xe && \
|
RUN npm run build
|
||||||
npm run build-contracts && \
|
|
||||||
npm run build
|
|
||||||
|
|
||||||
ADD solana /usr/src/solana
|
ADD solana /usr/src/solana
|
||||||
ADD proto /usr/src/proto
|
ADD proto /usr/src/proto
|
||||||
|
|
14
Tiltfile
14
Tiltfile
|
@ -13,6 +13,9 @@ allow_k8s_contexts("ci")
|
||||||
# Disable telemetry by default
|
# Disable telemetry by default
|
||||||
analytics_settings(False)
|
analytics_settings(False)
|
||||||
|
|
||||||
|
# Moar updates (default is 3)
|
||||||
|
update_settings(max_parallel_updates=10)
|
||||||
|
|
||||||
# Runtime configuration
|
# Runtime configuration
|
||||||
config.define_bool("ci", False, "We are running in CI")
|
config.define_bool("ci", False, "We are running in CI")
|
||||||
config.define_bool("manual", False, "Set TRIGGER_MODE_MANUAL by default")
|
config.define_bool("manual", False, "Set TRIGGER_MODE_MANUAL by default")
|
||||||
|
@ -80,6 +83,7 @@ local_resource(
|
||||||
cmd = "tilt docker build -- --target go-export -f Dockerfile.proto -o type=local,dest=node .",
|
cmd = "tilt docker build -- --target go-export -f Dockerfile.proto -o type=local,dest=node .",
|
||||||
env = {"DOCKER_BUILDKIT": "1"},
|
env = {"DOCKER_BUILDKIT": "1"},
|
||||||
labels = ["protobuf"],
|
labels = ["protobuf"],
|
||||||
|
allow_parallel=True,
|
||||||
trigger_mode = trigger_mode,
|
trigger_mode = trigger_mode,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -90,6 +94,7 @@ local_resource(
|
||||||
cmd = "tilt docker build -- --target node-export -f Dockerfile.proto -o type=local,dest=. .",
|
cmd = "tilt docker build -- --target node-export -f Dockerfile.proto -o type=local,dest=. .",
|
||||||
env = {"DOCKER_BUILDKIT": "1"},
|
env = {"DOCKER_BUILDKIT": "1"},
|
||||||
labels = ["protobuf"],
|
labels = ["protobuf"],
|
||||||
|
allow_parallel=True,
|
||||||
trigger_mode = trigger_mode,
|
trigger_mode = trigger_mode,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -99,6 +104,7 @@ local_resource(
|
||||||
cmd = "tilt docker build -- --target teal-export -f Dockerfile.teal -o type=local,dest=. .",
|
cmd = "tilt docker build -- --target teal-export -f Dockerfile.teal -o type=local,dest=. .",
|
||||||
env = {"DOCKER_BUILDKIT": "1"},
|
env = {"DOCKER_BUILDKIT": "1"},
|
||||||
labels = ["algorand"],
|
labels = ["algorand"],
|
||||||
|
allow_parallel=True,
|
||||||
trigger_mode = trigger_mode,
|
trigger_mode = trigger_mode,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -111,6 +117,7 @@ local_resource(
|
||||||
cmd = "tilt docker build -- -f Dockerfile.wasm -o type=local,dest=.. .",
|
cmd = "tilt docker build -- -f Dockerfile.wasm -o type=local,dest=.. .",
|
||||||
env = {"DOCKER_BUILDKIT": "1"},
|
env = {"DOCKER_BUILDKIT": "1"},
|
||||||
labels = ["solana"],
|
labels = ["solana"],
|
||||||
|
allow_parallel=True,
|
||||||
trigger_mode = trigger_mode,
|
trigger_mode = trigger_mode,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -162,7 +169,7 @@ k8s_yaml_with_ns(build_node_yaml())
|
||||||
|
|
||||||
k8s_resource(
|
k8s_resource(
|
||||||
"guardian",
|
"guardian",
|
||||||
resource_deps = ["proto-gen", "solana-devnet"],
|
resource_deps = ["proto-gen", "eth-devnet", "eth-devnet2", "terra-terrad", "solana-devnet"],
|
||||||
port_forwards = [
|
port_forwards = [
|
||||||
port_forward(6060, name = "Debug/Status Server [:6060]", host = webHost),
|
port_forward(6060, name = "Debug/Status Server [:6060]", host = webHost),
|
||||||
port_forward(7070, name = "Public gRPC [:7070]", host = webHost),
|
port_forward(7070, name = "Public gRPC [:7070]", host = webHost),
|
||||||
|
@ -192,7 +199,7 @@ k8s_resource(
|
||||||
docker_build(
|
docker_build(
|
||||||
ref = "bridge-client",
|
ref = "bridge-client",
|
||||||
context = ".",
|
context = ".",
|
||||||
only = ["./proto", "./solana", "./ethereum", "./clients"],
|
only = ["./proto", "./solana", "./clients"],
|
||||||
dockerfile = "Dockerfile.client",
|
dockerfile = "Dockerfile.client",
|
||||||
# Ignore target folders from local (non-container) development.
|
# Ignore target folders from local (non-container) development.
|
||||||
ignore = ["./solana/*/target"],
|
ignore = ["./solana/*/target"],
|
||||||
|
@ -212,7 +219,6 @@ k8s_yaml_with_ns("devnet/solana-devnet.yaml")
|
||||||
|
|
||||||
k8s_resource(
|
k8s_resource(
|
||||||
"solana-devnet",
|
"solana-devnet",
|
||||||
resource_deps = ["wasm-gen"],
|
|
||||||
port_forwards = [
|
port_forwards = [
|
||||||
port_forward(8899, name = "Solana RPC [:8899]", host = webHost),
|
port_forward(8899, name = "Solana RPC [:8899]", host = webHost),
|
||||||
port_forward(8900, name = "Solana WS [:8900]", host = webHost),
|
port_forward(8900, name = "Solana WS [:8900]", host = webHost),
|
||||||
|
@ -345,7 +351,7 @@ if ci_tests:
|
||||||
|
|
||||||
k8s_resource(
|
k8s_resource(
|
||||||
"ci-tests",
|
"ci-tests",
|
||||||
resource_deps = ["eth-devnet", "eth-devnet2", "terra-terrad", "terra-fcd", "solana-devnet", "spy", "guardian"],
|
resource_deps = ["proto-gen-web", "wasm-gen", "eth-devnet", "eth-devnet2", "terra-terrad", "terra-fcd", "solana-devnet", "spy", "guardian"],
|
||||||
labels = ["ci"],
|
labels = ["ci"],
|
||||||
trigger_mode = trigger_mode,
|
trigger_mode = trigger_mode,
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,2 +1,5 @@
|
||||||
contracts
|
contracts
|
||||||
ethers-contracts
|
ethers-contracts
|
||||||
|
|
||||||
|
# tsc output
|
||||||
|
*/main.js
|
||||||
|
|
|
@ -2,16 +2,16 @@ import yargs from "yargs";
|
||||||
|
|
||||||
const {hideBin} = require('yargs/helpers')
|
const {hideBin} = require('yargs/helpers')
|
||||||
|
|
||||||
import * as bridge from "bridge";
|
|
||||||
import * as elliptic from "elliptic";
|
import * as elliptic from "elliptic";
|
||||||
import * as ethers from "ethers";
|
import * as ethers from "ethers";
|
||||||
import * as nft_bridge from "nft-bridge";
|
|
||||||
import * as web3s from '@solana/web3.js';
|
import * as web3s from '@solana/web3.js';
|
||||||
|
|
||||||
import {BridgeImplementation__factory} from "./src/ethers-contracts";
|
|
||||||
import {PublicKey, TransactionInstruction, AccountMeta, Keypair, Connection} from "@solana/web3.js";
|
import {PublicKey, TransactionInstruction, AccountMeta, Keypair, Connection} from "@solana/web3.js";
|
||||||
import {solidityKeccak256} from "ethers/lib/utils";
|
import {solidityKeccak256} from "ethers/lib/utils";
|
||||||
|
|
||||||
|
import {setDefaultWasm, importCoreWasm, importNftWasm, ixFromRust, BridgeImplementation__factory} from '@certusone/wormhole-sdk'
|
||||||
|
setDefaultWasm("node")
|
||||||
|
|
||||||
const signAndEncodeVM = function (
|
const signAndEncodeVM = function (
|
||||||
timestamp,
|
timestamp,
|
||||||
nonce,
|
nonce,
|
||||||
|
@ -136,6 +136,9 @@ yargs(hideBin(process.argv))
|
||||||
default: "NFTWqJR8YnRVqPDvTJrYuLrQDitTG5AScqbeghi4zSA"
|
default: "NFTWqJR8YnRVqPDvTJrYuLrQDitTG5AScqbeghi4zSA"
|
||||||
})
|
})
|
||||||
}, async (argv: any) => {
|
}, async (argv: any) => {
|
||||||
|
const bridge = await importCoreWasm()
|
||||||
|
const nft_bridge = await importNftWasm()
|
||||||
|
|
||||||
let connection = setupConnection(argv);
|
let connection = setupConnection(argv);
|
||||||
let bridge_id = new PublicKey(argv.bridge);
|
let bridge_id = new PublicKey(argv.bridge);
|
||||||
let nft_bridge_id = new PublicKey(argv.nft_bridge);
|
let nft_bridge_id = new PublicKey(argv.nft_bridge);
|
||||||
|
@ -204,6 +207,8 @@ yargs(hideBin(process.argv))
|
||||||
default: "0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d"
|
default: "0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d"
|
||||||
})
|
})
|
||||||
}, async (argv: any) => {
|
}, async (argv: any) => {
|
||||||
|
const bridge = await importCoreWasm()
|
||||||
|
|
||||||
let provider = new ethers.providers.JsonRpcProvider(argv.rpc)
|
let provider = new ethers.providers.JsonRpcProvider(argv.rpc)
|
||||||
let signer = new ethers.Wallet(argv.key, provider)
|
let signer = new ethers.Wallet(argv.key, provider)
|
||||||
let t = new BridgeImplementation__factory(signer);
|
let t = new BridgeImplementation__factory(signer);
|
||||||
|
@ -228,6 +233,8 @@ yargs(hideBin(process.argv))
|
||||||
.argv;
|
.argv;
|
||||||
|
|
||||||
async function post_vaa(connection: Connection, bridge_id: PublicKey, payer: Keypair, vaa: Buffer) {
|
async function post_vaa(connection: Connection, bridge_id: PublicKey, payer: Keypair, vaa: Buffer) {
|
||||||
|
const bridge = await importCoreWasm()
|
||||||
|
|
||||||
let bridge_state = await get_bridge_state(connection, bridge_id);
|
let bridge_state = await get_bridge_state(connection, bridge_id);
|
||||||
let guardian_addr = new PublicKey(bridge.guardian_set_address(bridge_id.toString(), bridge_state.guardian_set_index));
|
let guardian_addr = new PublicKey(bridge.guardian_set_address(bridge_id.toString(), bridge_state.guardian_set_index));
|
||||||
let acc = await connection.getAccountInfo(guardian_addr);
|
let acc = await connection.getAccountInfo(guardian_addr);
|
||||||
|
@ -272,6 +279,8 @@ async function post_vaa(connection: Connection, bridge_id: PublicKey, payer: Key
|
||||||
}
|
}
|
||||||
|
|
||||||
async function get_bridge_state(connection: Connection, bridge_id: PublicKey): Promise<BridgeState> {
|
async function get_bridge_state(connection: Connection, bridge_id: PublicKey): Promise<BridgeState> {
|
||||||
|
const bridge = await importCoreWasm()
|
||||||
|
|
||||||
let bridge_state = new PublicKey(bridge.state_address(bridge_id.toString()));
|
let bridge_state = new PublicKey(bridge.state_address(bridge_id.toString()));
|
||||||
let acc = await connection.getAccountInfo(bridge_state);
|
let acc = await connection.getAccountInfo(bridge_state);
|
||||||
if (acc?.data === undefined) {
|
if (acc?.data === undefined) {
|
||||||
|
@ -287,23 +296,6 @@ function setupConnection(argv: yargs.Arguments): web3s.Connection {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function ixFromRust(data: any): TransactionInstruction {
|
|
||||||
let keys: Array<AccountMeta> = data.accounts.map(accountMetaFromRust)
|
|
||||||
return new TransactionInstruction({
|
|
||||||
programId: new PublicKey(data.program_id),
|
|
||||||
data: Buffer.from(data.data),
|
|
||||||
keys: keys,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function accountMetaFromRust(meta: any): AccountMeta {
|
|
||||||
return {
|
|
||||||
pubkey: new PublicKey(meta.pubkey),
|
|
||||||
isSigner: meta.is_signer,
|
|
||||||
isWritable: meta.is_writable,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
interface BridgeState {
|
interface BridgeState {
|
||||||
// The current guardian set index, used to decide which signature sets to accept.
|
// The current guardian set index, used to decide which signature sets to accept.
|
||||||
guardian_set_index: number,
|
guardian_set_index: number,
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -2,8 +2,8 @@
|
||||||
"name": "wormhole-client-solana",
|
"name": "wormhole-client-solana",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@certusone/wormhole-sdk": "^0.2.0",
|
||||||
"@solana/web3.js": "^1.22.0",
|
"@solana/web3.js": "^1.22.0",
|
||||||
"@typechain/ethers-v5": "^7.0.1",
|
|
||||||
"bn.js": "^5.2.0",
|
"bn.js": "^5.2.0",
|
||||||
"bs58": "^4.0.1",
|
"bs58": "^4.0.1",
|
||||||
"buffer-layout": "^1.2.2",
|
"buffer-layout": "^1.2.2",
|
||||||
|
@ -16,19 +16,14 @@
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "tsc && node main.js",
|
"start": "tsc && node main.js",
|
||||||
"build": "tsc",
|
"build": "tsc",
|
||||||
"test": "echo \"Error: no test specified\" && exit 1",
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
"build-contracts": "npm run build --prefix ../../ethereum && node scripts/copyContracts.js && typechain --target=ethers-v5 --out-dir=src/ethers-contracts contracts/*.json"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@openzeppelin/contracts": "^4.2.0",
|
|
||||||
"@truffle/hdwallet-provider": "^1.4.1",
|
"@truffle/hdwallet-provider": "^1.4.1",
|
||||||
"@types/bn.js": "^5.1.0",
|
"@types/bn.js": "^5.1.0",
|
||||||
"@types/bs58": "^4.0.1",
|
"@types/bs58": "^4.0.1",
|
||||||
"@types/yargs": "^17.0.2",
|
"@types/yargs": "^17.0.2",
|
||||||
"bridge": "file:./pkg/core",
|
|
||||||
"copy-dir": "^1.3.0",
|
"copy-dir": "^1.3.0",
|
||||||
"nft-bridge": "file:./pkg/nft",
|
|
||||||
"truffle": "^5.4.1",
|
|
||||||
"typescript": "^4.3.5"
|
"typescript": "^4.3.5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
const copydir = require("copy-dir");
|
|
||||||
copydir.sync("../../ethereum/build/contracts", "./contracts");
|
|
|
@ -1,10 +1,11 @@
|
||||||
import yargs from "yargs";
|
import yargs from "yargs";
|
||||||
|
|
||||||
const {hideBin} = require('yargs/helpers')
|
const {hideBin} = require('yargs/helpers')
|
||||||
import * as bridge from "bridge";
|
|
||||||
import * as web3 from '@solana/web3.js';
|
import * as web3 from '@solana/web3.js';
|
||||||
import {PublicKey, Transaction, TransactionInstruction, AccountMeta, Keypair, Connection} from "@solana/web3.js";
|
import {PublicKey, Transaction, TransactionInstruction, AccountMeta, Keypair, Connection} from "@solana/web3.js";
|
||||||
import {post_message_ix} from "bridge";
|
|
||||||
|
import {setDefaultWasm, importCoreWasm, ixFromRust} from '@certusone/wormhole-sdk'
|
||||||
|
setDefaultWasm("node")
|
||||||
|
|
||||||
yargs(hideBin(process.argv))
|
yargs(hideBin(process.argv))
|
||||||
.command('post_message [nonce] [message] [consistency]', 'post a message', (yargs) => {
|
.command('post_message [nonce] [message] [consistency]', 'post a message', (yargs) => {
|
||||||
|
@ -25,6 +26,8 @@ yargs(hideBin(process.argv))
|
||||||
required: true
|
required: true
|
||||||
})
|
})
|
||||||
}, async (argv: any) => {
|
}, async (argv: any) => {
|
||||||
|
const bridge = await importCoreWasm()
|
||||||
|
|
||||||
let connection = setupConnection(argv);
|
let connection = setupConnection(argv);
|
||||||
let bridge_id = new PublicKey(argv.bridge);
|
let bridge_id = new PublicKey(argv.bridge);
|
||||||
|
|
||||||
|
@ -50,7 +53,7 @@ yargs(hideBin(process.argv))
|
||||||
throw new Error("invalid consistency level")
|
throw new Error("invalid consistency level")
|
||||||
}
|
}
|
||||||
|
|
||||||
let ix = ixFromRust(post_message_ix(bridge_id.toString(), from.publicKey.toString(), emitter.publicKey.toString(), message.publicKey.toString(), argv.nonce, Buffer.from(argv.message, "hex"), argv.consistency));
|
let ix = ixFromRust(bridge.post_message_ix(bridge_id.toString(), from.publicKey.toString(), emitter.publicKey.toString(), message.publicKey.toString(), argv.nonce, Buffer.from(argv.message, "hex"), argv.consistency));
|
||||||
// Add transfer instruction to transaction
|
// Add transfer instruction to transaction
|
||||||
let transaction = new web3.Transaction().add(transferIx, ix);
|
let transaction = new web3.Transaction().add(transferIx, ix);
|
||||||
|
|
||||||
|
@ -95,6 +98,8 @@ yargs(hideBin(process.argv))
|
||||||
required: true
|
required: true
|
||||||
})
|
})
|
||||||
}, async (argv: any) => {
|
}, async (argv: any) => {
|
||||||
|
const bridge = await importCoreWasm()
|
||||||
|
|
||||||
let connection = setupConnection(argv);
|
let connection = setupConnection(argv);
|
||||||
let bridge_id = new PublicKey(argv.bridge);
|
let bridge_id = new PublicKey(argv.bridge);
|
||||||
|
|
||||||
|
@ -159,6 +164,8 @@ yargs(hideBin(process.argv))
|
||||||
.argv;
|
.argv;
|
||||||
|
|
||||||
async function post_vaa(connection: Connection, bridge_id: PublicKey, payer: Keypair, vaa: Buffer) {
|
async function post_vaa(connection: Connection, bridge_id: PublicKey, payer: Keypair, vaa: Buffer) {
|
||||||
|
const bridge = await importCoreWasm()
|
||||||
|
|
||||||
let bridge_state = await get_bridge_state(connection, bridge_id);
|
let bridge_state = await get_bridge_state(connection, bridge_id);
|
||||||
let guardian_addr = new PublicKey(bridge.guardian_set_address(bridge_id.toString(), bridge_state.guardian_set_index));
|
let guardian_addr = new PublicKey(bridge.guardian_set_address(bridge_id.toString(), bridge_state.guardian_set_index));
|
||||||
let acc = await connection.getAccountInfo(guardian_addr);
|
let acc = await connection.getAccountInfo(guardian_addr);
|
||||||
|
@ -203,6 +210,8 @@ async function post_vaa(connection: Connection, bridge_id: PublicKey, payer: Key
|
||||||
}
|
}
|
||||||
|
|
||||||
async function get_bridge_state(connection: Connection, bridge_id: PublicKey): Promise<BridgeState> {
|
async function get_bridge_state(connection: Connection, bridge_id: PublicKey): Promise<BridgeState> {
|
||||||
|
const bridge = await importCoreWasm()
|
||||||
|
|
||||||
let bridge_state = new PublicKey(bridge.state_address(bridge_id.toString()));
|
let bridge_state = new PublicKey(bridge.state_address(bridge_id.toString()));
|
||||||
let acc = await connection.getAccountInfo(bridge_state);
|
let acc = await connection.getAccountInfo(bridge_state);
|
||||||
if (acc?.data === undefined) {
|
if (acc?.data === undefined) {
|
||||||
|
@ -218,23 +227,6 @@ function setupConnection(argv: yargs.Arguments): web3.Connection {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function ixFromRust(data: any): TransactionInstruction {
|
|
||||||
let keys: Array<AccountMeta> = data.accounts.map(accountMetaFromRust)
|
|
||||||
return new TransactionInstruction({
|
|
||||||
programId: new PublicKey(data.program_id),
|
|
||||||
data: Buffer.from(data.data),
|
|
||||||
keys: keys,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function accountMetaFromRust(meta: any): AccountMeta {
|
|
||||||
return {
|
|
||||||
pubkey: new PublicKey(meta.pubkey),
|
|
||||||
isSigner: meta.is_signer,
|
|
||||||
isWritable: meta.is_writable,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
interface BridgeState {
|
interface BridgeState {
|
||||||
// The current guardian set index, used to decide which signature sets to accept.
|
// The current guardian set index, used to decide which signature sets to accept.
|
||||||
guardian_set_index: number,
|
guardian_set_index: number,
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -2,10 +2,12 @@
|
||||||
"name": "wormhole-client-solana",
|
"name": "wormhole-client-solana",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@certusone/wormhole-sdk": "^0.2.0",
|
||||||
"@solana/web3.js": "^1.22.0",
|
"@solana/web3.js": "^1.22.0",
|
||||||
"bn.js": "^5.2.0",
|
"bn.js": "^5.2.0",
|
||||||
"bs58": "^4.0.1",
|
"bs58": "^4.0.1",
|
||||||
"buffer-layout": "^1.2.2",
|
"buffer-layout": "^1.2.2",
|
||||||
|
"ethers": "^5.4.1",
|
||||||
"npm": "^7.20.0",
|
"npm": "^7.20.0",
|
||||||
"yargs": "^17.0.1"
|
"yargs": "^17.0.1"
|
||||||
},
|
},
|
||||||
|
@ -14,10 +16,9 @@
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/bs58": "^4.0.1",
|
|
||||||
"@types/bn.js": "^5.1.0",
|
"@types/bn.js": "^5.1.0",
|
||||||
|
"@types/bs58": "^4.0.1",
|
||||||
"@types/yargs": "^17.0.2",
|
"@types/yargs": "^17.0.2",
|
||||||
"bridge": "file:./pkg",
|
|
||||||
"typescript": "^4.3.5"
|
"typescript": "^4.3.5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,19 +2,19 @@ import yargs from "yargs";
|
||||||
|
|
||||||
const {hideBin} = require('yargs/helpers')
|
const {hideBin} = require('yargs/helpers')
|
||||||
|
|
||||||
import * as bridge from "bridge";
|
|
||||||
import * as elliptic from "elliptic";
|
import * as elliptic from "elliptic";
|
||||||
import * as ethers from "ethers";
|
import * as ethers from "ethers";
|
||||||
import * as token_bridge from "token-bridge";
|
|
||||||
import * as web3s from '@solana/web3.js';
|
import * as web3s from '@solana/web3.js';
|
||||||
|
|
||||||
import {fromUint8Array} from "js-base64";
|
import {fromUint8Array} from "js-base64";
|
||||||
import {BridgeImplementation__factory} from "./src/ethers-contracts";
|
|
||||||
import {LCDClient, MnemonicKey} from '@terra-money/terra.js';
|
import {LCDClient, MnemonicKey} from '@terra-money/terra.js';
|
||||||
import {MsgExecuteContract} from "@terra-money/terra.js";
|
import {MsgExecuteContract} from "@terra-money/terra.js";
|
||||||
import {PublicKey, TransactionInstruction, AccountMeta, Keypair, Connection} from "@solana/web3.js";
|
import {PublicKey, TransactionInstruction, AccountMeta, Keypair, Connection} from "@solana/web3.js";
|
||||||
import {solidityKeccak256} from "ethers/lib/utils";
|
import {solidityKeccak256} from "ethers/lib/utils";
|
||||||
|
|
||||||
|
import {setDefaultWasm, importCoreWasm, importTokenWasm, ixFromRust, BridgeImplementation__factory} from '@certusone/wormhole-sdk'
|
||||||
|
setDefaultWasm("node")
|
||||||
|
|
||||||
const signAndEncodeVM = function (
|
const signAndEncodeVM = function (
|
||||||
timestamp,
|
timestamp,
|
||||||
nonce,
|
nonce,
|
||||||
|
@ -256,6 +256,9 @@ yargs(hideBin(process.argv))
|
||||||
default: "B6RHG3mfcckmrYN1UhmJzyS1XX3fZKbkeUcpJe9Sy3FE"
|
default: "B6RHG3mfcckmrYN1UhmJzyS1XX3fZKbkeUcpJe9Sy3FE"
|
||||||
})
|
})
|
||||||
}, async (argv: any) => {
|
}, async (argv: any) => {
|
||||||
|
const bridge = await importCoreWasm()
|
||||||
|
const token_bridge = await importTokenWasm()
|
||||||
|
|
||||||
let connection = setupConnection(argv);
|
let connection = setupConnection(argv);
|
||||||
let bridge_id = new PublicKey(argv.bridge);
|
let bridge_id = new PublicKey(argv.bridge);
|
||||||
let token_bridge_id = new PublicKey(argv.token_bridge);
|
let token_bridge_id = new PublicKey(argv.token_bridge);
|
||||||
|
@ -324,6 +327,8 @@ yargs(hideBin(process.argv))
|
||||||
default: "0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d"
|
default: "0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d"
|
||||||
})
|
})
|
||||||
}, async (argv: any) => {
|
}, async (argv: any) => {
|
||||||
|
const bridge = await importCoreWasm()
|
||||||
|
|
||||||
let provider = new ethers.providers.JsonRpcProvider(argv.rpc)
|
let provider = new ethers.providers.JsonRpcProvider(argv.rpc)
|
||||||
let signer = new ethers.Wallet(argv.key, provider)
|
let signer = new ethers.Wallet(argv.key, provider)
|
||||||
let t = new BridgeImplementation__factory(signer);
|
let t = new BridgeImplementation__factory(signer);
|
||||||
|
@ -349,6 +354,8 @@ yargs(hideBin(process.argv))
|
||||||
.argv;
|
.argv;
|
||||||
|
|
||||||
async function post_vaa(connection: Connection, bridge_id: PublicKey, payer: Keypair, vaa: Buffer) {
|
async function post_vaa(connection: Connection, bridge_id: PublicKey, payer: Keypair, vaa: Buffer) {
|
||||||
|
const bridge = await importCoreWasm()
|
||||||
|
|
||||||
let bridge_state = await get_bridge_state(connection, bridge_id);
|
let bridge_state = await get_bridge_state(connection, bridge_id);
|
||||||
let guardian_addr = new PublicKey(bridge.guardian_set_address(bridge_id.toString(), bridge_state.guardian_set_index));
|
let guardian_addr = new PublicKey(bridge.guardian_set_address(bridge_id.toString(), bridge_state.guardian_set_index));
|
||||||
let acc = await connection.getAccountInfo(guardian_addr);
|
let acc = await connection.getAccountInfo(guardian_addr);
|
||||||
|
@ -393,6 +400,8 @@ async function post_vaa(connection: Connection, bridge_id: PublicKey, payer: Key
|
||||||
}
|
}
|
||||||
|
|
||||||
async function get_bridge_state(connection: Connection, bridge_id: PublicKey): Promise<BridgeState> {
|
async function get_bridge_state(connection: Connection, bridge_id: PublicKey): Promise<BridgeState> {
|
||||||
|
const bridge = await importCoreWasm()
|
||||||
|
|
||||||
let bridge_state = new PublicKey(bridge.state_address(bridge_id.toString()));
|
let bridge_state = new PublicKey(bridge.state_address(bridge_id.toString()));
|
||||||
let acc = await connection.getAccountInfo(bridge_state);
|
let acc = await connection.getAccountInfo(bridge_state);
|
||||||
if (acc?.data === undefined) {
|
if (acc?.data === undefined) {
|
||||||
|
@ -408,23 +417,6 @@ function setupConnection(argv: yargs.Arguments): web3s.Connection {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function ixFromRust(data: any): TransactionInstruction {
|
|
||||||
let keys: Array<AccountMeta> = data.accounts.map(accountMetaFromRust)
|
|
||||||
return new TransactionInstruction({
|
|
||||||
programId: new PublicKey(data.program_id),
|
|
||||||
data: Buffer.from(data.data),
|
|
||||||
keys: keys,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function accountMetaFromRust(meta: any): AccountMeta {
|
|
||||||
return {
|
|
||||||
pubkey: new PublicKey(meta.pubkey),
|
|
||||||
isSigner: meta.is_signer,
|
|
||||||
isWritable: meta.is_writable,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
interface BridgeState {
|
interface BridgeState {
|
||||||
// The current guardian set index, used to decide which signature sets to accept.
|
// The current guardian set index, used to decide which signature sets to accept.
|
||||||
guardian_set_index: number,
|
guardian_set_index: number,
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -2,9 +2,9 @@
|
||||||
"name": "wormhole-client-solana",
|
"name": "wormhole-client-solana",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@certusone/wormhole-sdk": "^0.2.0",
|
||||||
"@solana/web3.js": "^1.22.0",
|
"@solana/web3.js": "^1.22.0",
|
||||||
"@terra-money/terra.js": "^1.8.9",
|
"@terra-money/terra.js": "^1.8.9",
|
||||||
"@typechain/ethers-v5": "^7.0.1",
|
|
||||||
"bn.js": "^5.2.0",
|
"bn.js": "^5.2.0",
|
||||||
"bs58": "^4.0.1",
|
"bs58": "^4.0.1",
|
||||||
"buffer-layout": "^1.2.2",
|
"buffer-layout": "^1.2.2",
|
||||||
|
@ -17,19 +17,14 @@
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "tsc && node main.js",
|
"start": "tsc && node main.js",
|
||||||
"build": "tsc",
|
"build": "tsc",
|
||||||
"test": "echo \"Error: no test specified\" && exit 1",
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
"build-contracts": "npm run build --prefix ../../ethereum && node scripts/copyContracts.js && typechain --target=ethers-v5 --out-dir=src/ethers-contracts contracts/*.json"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@openzeppelin/contracts": "^4.2.0",
|
|
||||||
"@truffle/hdwallet-provider": "^1.4.1",
|
"@truffle/hdwallet-provider": "^1.4.1",
|
||||||
"@types/bn.js": "^5.1.0",
|
"@types/bn.js": "^5.1.0",
|
||||||
"@types/bs58": "^4.0.1",
|
"@types/bs58": "^4.0.1",
|
||||||
"@types/yargs": "^17.0.2",
|
"@types/yargs": "^17.0.2",
|
||||||
"bridge": "file:./pkg/core",
|
|
||||||
"copy-dir": "^1.3.0",
|
"copy-dir": "^1.3.0",
|
||||||
"token-bridge": "file:./pkg/token",
|
|
||||||
"truffle": "^5.4.1",
|
|
||||||
"typescript": "^4.3.5"
|
"typescript": "^4.3.5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
const copydir = require("copy-dir");
|
|
||||||
copydir.sync("../../ethereum/build/contracts", "./contracts");
|
|
|
@ -82,18 +82,11 @@ COPY --from=build /usr/src/bridge/bridge/program/bundler sdk/js/src/solana/core
|
||||||
COPY --from=build /usr/src/bridge/modules/token_bridge/program/bundler sdk/js/src/solana/token
|
COPY --from=build /usr/src/bridge/modules/token_bridge/program/bundler sdk/js/src/solana/token
|
||||||
COPY --from=build /usr/src/bridge/migration/bundler sdk/js/src/solana/migration
|
COPY --from=build /usr/src/bridge/migration/bundler sdk/js/src/solana/migration
|
||||||
COPY --from=build /usr/src/bridge/modules/nft_bridge/program/bundler sdk/js/src/solana/nft
|
COPY --from=build /usr/src/bridge/modules/nft_bridge/program/bundler sdk/js/src/solana/nft
|
||||||
|
|
||||||
COPY --from=build /usr/src/bridge/pyth2wormhole/program/bundler third_party/pyth/p2w-sdk/src/solana/p2w-core
|
COPY --from=build /usr/src/bridge/pyth2wormhole/program/bundler third_party/pyth/p2w-sdk/src/solana/p2w-core
|
||||||
COPY --from=build /usr/src/bridge/bridge/program/bundler explorer/wasm/core
|
|
||||||
COPY --from=build /usr/src/bridge/modules/token_bridge/program/bundler explorer/wasm/token
|
|
||||||
COPY --from=build /usr/src/bridge/modules/nft_bridge/program/bundler explorer/wasm/nft
|
|
||||||
COPY --from=build /usr/src/bridge/bridge/program/bundler third_party/pyth/p2w-sdk/src/solana/wormhole-core
|
COPY --from=build /usr/src/bridge/bridge/program/bundler third_party/pyth/p2w-sdk/src/solana/wormhole-core
|
||||||
|
|
||||||
COPY --from=build /usr/src/bridge/bridge/program/nodejs sdk/js/src/solana/core-node
|
COPY --from=build /usr/src/bridge/bridge/program/nodejs sdk/js/src/solana/core-node
|
||||||
COPY --from=build /usr/src/bridge/modules/token_bridge/program/nodejs sdk/js/src/solana/token-node
|
COPY --from=build /usr/src/bridge/modules/token_bridge/program/nodejs sdk/js/src/solana/token-node
|
||||||
COPY --from=build /usr/src/bridge/migration/nodejs sdk/js/src/solana/migration-node
|
COPY --from=build /usr/src/bridge/migration/nodejs sdk/js/src/solana/migration-node
|
||||||
COPY --from=build /usr/src/bridge/modules/nft_bridge/program/nodejs sdk/js/src/solana/nft-node
|
COPY --from=build /usr/src/bridge/modules/nft_bridge/program/nodejs sdk/js/src/solana/nft-node
|
||||||
COPY --from=build /usr/src/bridge/bridge/program/nodejs clients/solana/pkg
|
|
||||||
COPY --from=build /usr/src/bridge/bridge/program/nodejs clients/token_bridge/pkg/core
|
|
||||||
COPY --from=build /usr/src/bridge/bridge/program/nodejs clients/nft_bridge/pkg/core
|
|
||||||
COPY --from=build /usr/src/bridge/modules/token_bridge/program/nodejs clients/token_bridge/pkg/token
|
|
||||||
COPY --from=build /usr/src/bridge/modules/nft_bridge/program/nodejs clients/nft_bridge/pkg/nft
|
|
||||||
|
|
Loading…
Reference in New Issue