feat: use sdk in js client

This commit is contained in:
Evan Gray 2022-02-14 02:47:38 +00:00 committed by Evan Gray
parent fd62d71f61
commit fce0708e11
15 changed files with 3501 additions and 57222 deletions

View File

@ -14,29 +14,19 @@ RUN --mount=type=cache,target=/root/.cache \
ENV SOLANA_BIN_PATH="/root/.local/share/solana/install/active_release/bin"
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
COPY clients/token_bridge/package.json clients/token_bridge/package-lock.json ./
RUN --mount=type=cache,uid=1000,gid=1000,target=/home/node/.npm \
npm ci
COPY clients/token_bridge ./
RUN set -xe && \
npm run build-contracts && \
npm run build
RUN npm run build
WORKDIR /usr/src/clients/nft_bridge
COPY clients/nft_bridge/package.json clients/nft_bridge/package-lock.json ./
RUN --mount=type=cache,uid=1000,gid=1000,target=/home/node/.npm \
npm ci
COPY clients/nft_bridge ./
RUN set -xe && \
npm run build-contracts && \
npm run build
RUN npm run build
ADD solana /usr/src/solana
ADD proto /usr/src/proto

View File

@ -13,6 +13,9 @@ allow_k8s_contexts("ci")
# Disable telemetry by default
analytics_settings(False)
# Moar updates (default is 3)
update_settings(max_parallel_updates=10)
# Runtime configuration
config.define_bool("ci", False, "We are running in CI")
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 .",
env = {"DOCKER_BUILDKIT": "1"},
labels = ["protobuf"],
allow_parallel=True,
trigger_mode = trigger_mode,
)
@ -90,6 +94,7 @@ local_resource(
cmd = "tilt docker build -- --target node-export -f Dockerfile.proto -o type=local,dest=. .",
env = {"DOCKER_BUILDKIT": "1"},
labels = ["protobuf"],
allow_parallel=True,
trigger_mode = trigger_mode,
)
@ -99,6 +104,7 @@ local_resource(
cmd = "tilt docker build -- --target teal-export -f Dockerfile.teal -o type=local,dest=. .",
env = {"DOCKER_BUILDKIT": "1"},
labels = ["algorand"],
allow_parallel=True,
trigger_mode = trigger_mode,
)
@ -111,6 +117,7 @@ local_resource(
cmd = "tilt docker build -- -f Dockerfile.wasm -o type=local,dest=.. .",
env = {"DOCKER_BUILDKIT": "1"},
labels = ["solana"],
allow_parallel=True,
trigger_mode = trigger_mode,
)
@ -162,7 +169,7 @@ k8s_yaml_with_ns(build_node_yaml())
k8s_resource(
"guardian",
resource_deps = ["proto-gen", "solana-devnet"],
resource_deps = ["proto-gen", "eth-devnet", "eth-devnet2", "terra-terrad", "solana-devnet"],
port_forwards = [
port_forward(6060, name = "Debug/Status Server [:6060]", host = webHost),
port_forward(7070, name = "Public gRPC [:7070]", host = webHost),
@ -192,7 +199,7 @@ k8s_resource(
docker_build(
ref = "bridge-client",
context = ".",
only = ["./proto", "./solana", "./ethereum", "./clients"],
only = ["./proto", "./solana", "./clients"],
dockerfile = "Dockerfile.client",
# Ignore target folders from local (non-container) development.
ignore = ["./solana/*/target"],
@ -212,7 +219,6 @@ k8s_yaml_with_ns("devnet/solana-devnet.yaml")
k8s_resource(
"solana-devnet",
resource_deps = ["wasm-gen"],
port_forwards = [
port_forward(8899, name = "Solana RPC [:8899]", host = webHost),
port_forward(8900, name = "Solana WS [:8900]", host = webHost),
@ -345,7 +351,7 @@ if ci_tests:
k8s_resource(
"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"],
trigger_mode = trigger_mode,
)

5
clients/.gitignore vendored
View File

@ -1,2 +1,5 @@
contracts
ethers-contracts
ethers-contracts
# tsc output
*/main.js

View File

@ -2,16 +2,16 @@ import yargs from "yargs";
const {hideBin} = require('yargs/helpers')
import * as bridge from "bridge";
import * as elliptic from "elliptic";
import * as ethers from "ethers";
import * as nft_bridge from "nft-bridge";
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 {solidityKeccak256} from "ethers/lib/utils";
import {setDefaultWasm, importCoreWasm, importNftWasm, ixFromRust, BridgeImplementation__factory} from '@certusone/wormhole-sdk'
setDefaultWasm("node")
const signAndEncodeVM = function (
timestamp,
nonce,
@ -136,6 +136,9 @@ yargs(hideBin(process.argv))
default: "NFTWqJR8YnRVqPDvTJrYuLrQDitTG5AScqbeghi4zSA"
})
}, async (argv: any) => {
const bridge = await importCoreWasm()
const nft_bridge = await importNftWasm()
let connection = setupConnection(argv);
let bridge_id = new PublicKey(argv.bridge);
let nft_bridge_id = new PublicKey(argv.nft_bridge);
@ -204,6 +207,8 @@ yargs(hideBin(process.argv))
default: "0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d"
})
}, async (argv: any) => {
const bridge = await importCoreWasm()
let provider = new ethers.providers.JsonRpcProvider(argv.rpc)
let signer = new ethers.Wallet(argv.key, provider)
let t = new BridgeImplementation__factory(signer);
@ -228,6 +233,8 @@ yargs(hideBin(process.argv))
.argv;
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 guardian_addr = new PublicKey(bridge.guardian_set_address(bridge_id.toString(), bridge_state.guardian_set_index));
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> {
const bridge = await importCoreWasm()
let bridge_state = new PublicKey(bridge.state_address(bridge_id.toString()));
let acc = await connection.getAccountInfo(bridge_state);
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 {
// The current guardian set index, used to decide which signature sets to accept.
guardian_set_index: number,

File diff suppressed because it is too large Load Diff

View File

@ -2,8 +2,8 @@
"name": "wormhole-client-solana",
"version": "1.0.0",
"dependencies": {
"@certusone/wormhole-sdk": "^0.2.0",
"@solana/web3.js": "^1.22.0",
"@typechain/ethers-v5": "^7.0.1",
"bn.js": "^5.2.0",
"bs58": "^4.0.1",
"buffer-layout": "^1.2.2",
@ -16,19 +16,14 @@
"scripts": {
"start": "tsc && node main.js",
"build": "tsc",
"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"
"test": "echo \"Error: no test specified\" && exit 1"
},
"devDependencies": {
"@openzeppelin/contracts": "^4.2.0",
"@truffle/hdwallet-provider": "^1.4.1",
"@types/bn.js": "^5.1.0",
"@types/bs58": "^4.0.1",
"@types/yargs": "^17.0.2",
"bridge": "file:./pkg/core",
"copy-dir": "^1.3.0",
"nft-bridge": "file:./pkg/nft",
"truffle": "^5.4.1",
"typescript": "^4.3.5"
}
}

View File

@ -1,2 +0,0 @@
const copydir = require("copy-dir");
copydir.sync("../../ethereum/build/contracts", "./contracts");

View File

@ -1,10 +1,11 @@
import yargs from "yargs";
const {hideBin} = require('yargs/helpers')
import * as bridge from "bridge";
import * as web3 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))
.command('post_message [nonce] [message] [consistency]', 'post a message', (yargs) => {
@ -25,6 +26,8 @@ yargs(hideBin(process.argv))
required: true
})
}, async (argv: any) => {
const bridge = await importCoreWasm()
let connection = setupConnection(argv);
let bridge_id = new PublicKey(argv.bridge);
@ -50,7 +53,7 @@ yargs(hideBin(process.argv))
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
let transaction = new web3.Transaction().add(transferIx, ix);
@ -95,6 +98,8 @@ yargs(hideBin(process.argv))
required: true
})
}, async (argv: any) => {
const bridge = await importCoreWasm()
let connection = setupConnection(argv);
let bridge_id = new PublicKey(argv.bridge);
@ -159,6 +164,8 @@ yargs(hideBin(process.argv))
.argv;
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 guardian_addr = new PublicKey(bridge.guardian_set_address(bridge_id.toString(), bridge_state.guardian_set_index));
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> {
const bridge = await importCoreWasm()
let bridge_state = new PublicKey(bridge.state_address(bridge_id.toString()));
let acc = await connection.getAccountInfo(bridge_state);
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 {
// The current guardian set index, used to decide which signature sets to accept.
guardian_set_index: number,

File diff suppressed because it is too large Load Diff

View File

@ -2,10 +2,12 @@
"name": "wormhole-client-solana",
"version": "1.0.0",
"dependencies": {
"@certusone/wormhole-sdk": "^0.2.0",
"@solana/web3.js": "^1.22.0",
"bn.js": "^5.2.0",
"bs58": "^4.0.1",
"buffer-layout": "^1.2.2",
"ethers": "^5.4.1",
"npm": "^7.20.0",
"yargs": "^17.0.1"
},
@ -14,10 +16,9 @@
"test": "echo \"Error: no test specified\" && exit 1"
},
"devDependencies": {
"@types/bs58": "^4.0.1",
"@types/bn.js": "^5.1.0",
"@types/bs58": "^4.0.1",
"@types/yargs": "^17.0.2",
"bridge": "file:./pkg",
"typescript": "^4.3.5"
}
}

View File

@ -2,19 +2,19 @@ import yargs from "yargs";
const {hideBin} = require('yargs/helpers')
import * as bridge from "bridge";
import * as elliptic from "elliptic";
import * as ethers from "ethers";
import * as token_bridge from "token-bridge";
import * as web3s from '@solana/web3.js';
import {fromUint8Array} from "js-base64";
import {BridgeImplementation__factory} from "./src/ethers-contracts";
import {LCDClient, MnemonicKey} from '@terra-money/terra.js';
import {MsgExecuteContract} from "@terra-money/terra.js";
import {PublicKey, TransactionInstruction, AccountMeta, Keypair, Connection} from "@solana/web3.js";
import {solidityKeccak256} from "ethers/lib/utils";
import {setDefaultWasm, importCoreWasm, importTokenWasm, ixFromRust, BridgeImplementation__factory} from '@certusone/wormhole-sdk'
setDefaultWasm("node")
const signAndEncodeVM = function (
timestamp,
nonce,
@ -256,6 +256,9 @@ yargs(hideBin(process.argv))
default: "B6RHG3mfcckmrYN1UhmJzyS1XX3fZKbkeUcpJe9Sy3FE"
})
}, async (argv: any) => {
const bridge = await importCoreWasm()
const token_bridge = await importTokenWasm()
let connection = setupConnection(argv);
let bridge_id = new PublicKey(argv.bridge);
let token_bridge_id = new PublicKey(argv.token_bridge);
@ -324,6 +327,8 @@ yargs(hideBin(process.argv))
default: "0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d"
})
}, async (argv: any) => {
const bridge = await importCoreWasm()
let provider = new ethers.providers.JsonRpcProvider(argv.rpc)
let signer = new ethers.Wallet(argv.key, provider)
let t = new BridgeImplementation__factory(signer);
@ -349,6 +354,8 @@ yargs(hideBin(process.argv))
.argv;
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 guardian_addr = new PublicKey(bridge.guardian_set_address(bridge_id.toString(), bridge_state.guardian_set_index));
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> {
const bridge = await importCoreWasm()
let bridge_state = new PublicKey(bridge.state_address(bridge_id.toString()));
let acc = await connection.getAccountInfo(bridge_state);
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 {
// The current guardian set index, used to decide which signature sets to accept.
guardian_set_index: number,

File diff suppressed because it is too large Load Diff

View File

@ -2,9 +2,9 @@
"name": "wormhole-client-solana",
"version": "1.0.0",
"dependencies": {
"@certusone/wormhole-sdk": "^0.2.0",
"@solana/web3.js": "^1.22.0",
"@terra-money/terra.js": "^1.8.9",
"@typechain/ethers-v5": "^7.0.1",
"bn.js": "^5.2.0",
"bs58": "^4.0.1",
"buffer-layout": "^1.2.2",
@ -17,19 +17,14 @@
"scripts": {
"start": "tsc && node main.js",
"build": "tsc",
"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"
"test": "echo \"Error: no test specified\" && exit 1"
},
"devDependencies": {
"@openzeppelin/contracts": "^4.2.0",
"@truffle/hdwallet-provider": "^1.4.1",
"@types/bn.js": "^5.1.0",
"@types/bs58": "^4.0.1",
"@types/yargs": "^17.0.2",
"bridge": "file:./pkg/core",
"copy-dir": "^1.3.0",
"token-bridge": "file:./pkg/token",
"truffle": "^5.4.1",
"typescript": "^4.3.5"
}
}

View File

@ -1,2 +0,0 @@
const copydir = require("copy-dir");
copydir.sync("../../ethereum/build/contracts", "./contracts");

View File

@ -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/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/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/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/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/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