Skip to content

Commit a3a63d2

Browse files
authored
solana: Update ntt_transceiver program to use Wormhole shims (#663)
This PR is based on this transceiver prototype commit: 66940fe. This PR adds: * Update `ntt_transceiver` program as described in [this comment](#663 (comment)) * Update `SolanaNtt` and `SolanaNttWormholeTransceiver` classes as described in [this comment](#663 (comment)) * Add program binaries and IDLs for interacting with the shim programs * Add `TestWormholePostMessageShim` utility helper class to help re-build the message from event/instruction data * Fix Cargo, Anchor, and Tilt test errors * Update IDL
1 parent fc8e5a4 commit a3a63d2

37 files changed

+2905
-184
lines changed

Tiltfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ load('ext://namespace', 'namespace_create', 'namespace_inject')
22
load('ext://git_resource', 'git_checkout')
33

44
git_checkout('https://github.com/wormhole-foundation/wormhole.git#main', '.wormhole/', unsafe_mode=True)
5-
local(['sed','-i.bak','s/{chainId: vaa.ChainIDEthereum, addr: "000000000000000000000000855FA758c77D68a04990E992aA4dcdeF899F654A"},/{chainId: vaa.ChainIDEthereum, addr: "000000000000000000000000855FA758c77D68a04990E992aA4dcdeF899F654A"},{chainId: vaa.ChainIDSolana, addr: "8bf0b547c96edc5c1d512ca25c5c1d1812a180438a0046e511d1fb61561d5cdf"},{chainId: vaa.ChainIDSolana, addr: "0a490691c21334ca173d9ce386e2a86774ce173f351db10d5d0cccc5c4875376"},{chainId: vaa.ChainIDEthereum, addr: "0000000000000000000000006f84742680311cef5ba42bc10a71a4708b4561d1"},{chainId: vaa.ChainIDEthereum, addr: "0000000000000000000000009ba423008e530c4d464da15f0c9652942216f019"},{chainId: vaa.ChainIDBSC, addr: "0000000000000000000000006f84742680311cef5ba42bc10a71a4708b4561d1"},{chainId: vaa.ChainIDBSC, addr: "000000000000000000000000baac7efcddde498b0b791eda92d43b20f5cd8ff6"},/g', '.wormhole/node/pkg/accountant/ntt_config.go'])
5+
local(['sed','-i.bak','s/{chainId: vaa.ChainIDEthereum, addr: "000000000000000000000000855FA758c77D68a04990E992aA4dcdeF899F654A"},/{chainId: vaa.ChainIDEthereum, addr: "000000000000000000000000855FA758c77D68a04990E992aA4dcdeF899F654A"},{chainId: vaa.ChainIDSolana, addr: "253e5fcb56de6013759d1bbed9c2b0940b7a556b9333957d37be63d9ba096dd3"},{chainId: vaa.ChainIDSolana, addr: "739c49640a801d835bae7c77b64f1c6403c1665e443b87bb4147c75187750830"},{chainId: vaa.ChainIDEthereum, addr: "0000000000000000000000006f84742680311cef5ba42bc10a71a4708b4561d1"},{chainId: vaa.ChainIDEthereum, addr: "0000000000000000000000009ba423008e530c4d464da15f0c9652942216f019"},{chainId: vaa.ChainIDBSC, addr: "0000000000000000000000006f84742680311cef5ba42bc10a71a4708b4561d1"},{chainId: vaa.ChainIDBSC, addr: "000000000000000000000000baac7efcddde498b0b791eda92d43b20f5cd8ff6"},/g', '.wormhole/node/pkg/accountant/ntt_config.go'])
66

77
load(".wormhole/Tiltfile", "namespace", "k8s_yaml_with_ns")
88

sdk/__tests__/utils.ts

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -119,11 +119,18 @@ export async function link(chainInfos: Ctx[], accountantPrivateKey: string) {
119119
const hub = chainInfos[0]!;
120120
const hubChain = hub.context.chain;
121121

122+
// handle Solana emitter account case separately
123+
const whTransceiver =
124+
chainToPlatform(hubChain) === "Solana"
125+
? NTT.transceiverPdas(hub.contracts!.transceiver["wormhole"]!)
126+
.emitterAccount()
127+
.toString()
128+
: hub.contracts!.transceiver["wormhole"]!;
122129
const msgId: WormholeMessageId = {
123130
chain: hubChain,
124131
emitter: Wormhole.chainAddress(
125132
hubChain,
126-
hub.contracts!.transceiver["wormhole"]!
133+
whTransceiver
127134
).address.toUniversalAddress(),
128135
sequence: 0n,
129136
};
@@ -495,7 +502,8 @@ async function deploySolana(ctx: Ctx): Promise<Ctx> {
495502
console.log(`Using public key: ${address}`);
496503

497504
const signature = await connection.requestAirdrop(address, 1000000000000);
498-
await connection.confirmTransaction(signature);
505+
const latestBlockhash = await connection.getLatestBlockhash();
506+
await connection.confirmTransaction({ ...latestBlockhash, signature });
499507
console.log(`Airdropped 1000 SOL`);
500508

501509
const mint = await spl.createMint(connection, keypair, address, null, 9);
@@ -519,14 +527,16 @@ async function deploySolana(ctx: Ctx): Promise<Ctx> {
519527
ctx.mode === "locking"
520528
? "NTTManager222222222222222222222222222222222"
521529
: "NTTManager111111111111111111111111111111111";
530+
const transceiverProgramId =
531+
ctx.mode === "locking"
532+
? "NTTTransceiver22222222222222222222222222222"
533+
: "NTTTransceiver11111111111111111111111111111";
522534

523535
ctx.contracts = {
524536
token: mint.toBase58(),
525537
manager: managerProgramId,
526538
transceiver: {
527-
wormhole: NTT.transceiverPdas(managerProgramId)
528-
.emitterAccount()
529-
.toString(),
539+
wormhole: transceiverProgramId,
530540
},
531541
};
532542

@@ -577,13 +587,16 @@ async function deploySolana(ctx: Ctx): Promise<Ctx> {
577587
console.log("Registered transceiver with self");
578588
}
579589

590+
const whTransceiver = await manager.getWormholeTransceiver();
591+
if (!whTransceiver) {
592+
throw new Error("Wormhole transceiver not found");
593+
}
594+
580595
return {
581596
...ctx,
582597
contracts: {
583598
transceiver: {
584-
wormhole: NTT.transceiverPdas(manager.program.programId)
585-
.emitterAccount()
586-
.toString(),
599+
wormhole: whTransceiver.programId.toString(),
587600
},
588601
manager: manager.program.programId.toString(),
589602
token: mint.toString(),
@@ -600,7 +613,11 @@ async function setupPeer(targetCtx: Ctx, peerCtx: Ctx) {
600613
} = peerCtx.contracts!;
601614

602615
const peerManager = Wormhole.chainAddress(peer.chain, manager);
603-
const peerTransceiver = Wormhole.chainAddress(peer.chain, transceiver!);
616+
const whTransceiver =
617+
chainToPlatform(peer.chain) === "Solana"
618+
? NTT.transceiverPdas(transceiver!).emitterAccount().toString()
619+
: transceiver!;
620+
const peerTransceiver = Wormhole.chainAddress(peer.chain, whTransceiver);
604621

605622
const tokenDecimals = target.config.nativeTokenDecimals;
606623
const inboundLimit = amount.units(amount.parse("1000", tokenDecimals));

solana/Anchor.toml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@ upgradeable = true
3232
address = "worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth"
3333
program = "programs/example-native-token-transfers/tests/fixtures/mainnet_core_bridge.so"
3434

35+
[[test.genesis]]
36+
address = "EtZMZM22ViKMo4r5y4Anovs3wKQ2owUmDpjygnMMcdEX"
37+
program = "programs/example-native-token-transfers/tests/fixtures/mainnet_wormhole_post_message_shim.so"
38+
39+
[[test.genesis]]
40+
address = "EFaNWErqAtVWufdNb7yofSHHfWFos843DFpu4JBw24at"
41+
program = "programs/example-native-token-transfers/tests/fixtures/mainnet_wormhole_verify_vaa_shim.so"
42+
3543
[test.validator]
3644
bind_address = "0.0.0.0"
3745
url = "https://api.mainnet-beta.solana.com"

solana/Cargo.lock

Lines changed: 66 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

solana/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ solana-address-lookup-table-program = "=1.18.26"
5454
spl-token = "4.0.0"
5555
spl-token-2022 = "3.0.2"
5656

57-
wormhole-anchor-sdk = { version = "0.29.0-alpha.1", default-features = false }
57+
wormhole-anchor-sdk = { git = "https://github.com/wormholelabs-xyz/wormhole-scaffolding", branch = "solana/anchor-0.29.0", default-features = false }
5858
wormhole-sdk = { git = "https://github.com/wormhole-foundation/wormhole", rev = "eee4641" }
5959
serde_wormhole = { git = "https://github.com/wormhole-foundation/wormhole", rev = "eee4641" }
6060

solana/Dockerfile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,16 @@ RUN --mount=type=cache,target=/opt/solana/deps/target,id=build_anchor_ntt_target
2222

2323
RUN cp ./target/sbf-solana-solana/release/example_native_token_transfers.so /opt/solana/deps/example_native_token_transfers.so
2424
RUN cp ./target/sbf-solana-solana/release/wormhole_governance.so /opt/solana/deps/wormhole_governance.so
25+
RUN cp ./target/sbf-solana-solana/release/ntt_transceiver.so /opt/solana/deps/ntt_transceiver.so
2526

2627
RUN --mount=type=cache,target=/opt/solana/deps/target,id=build_anchor_ntt_target \
2728
--mount=type=cache,target=/usr/local/cargo/registry,id=cargo_registry \
2829
--mount=type=cache,target=.anchor,id=anchor_cache \
2930
anchor build --arch sbf -- --no-default-features --features tilt-devnet2
3031

3132
RUN cp ./target/sbf-solana-solana/release/example_native_token_transfers.so /opt/solana/deps/example_native_token_transfers_2.so
33+
RUN cp ./target/sbf-solana-solana/release/ntt_transceiver.so /opt/solana/deps/ntt_transceiver_2.so
34+
3235

3336
COPY solana/tilt /opt/solana/deps
3437

solana/programs/example-native-token-transfers/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,13 @@ no-log-ix-name = []
1616
cpi = ["no-entrypoint"]
1717
idl-build = [
1818
"anchor-lang/idl-build",
19-
"anchor-spl/idl-build"
19+
"anchor-spl/idl-build",
2020
]
2121
# cargo-test-sbf will pass this along
2222
test-sbf = []
2323
# networks
2424
mainnet = [ "wormhole-anchor-sdk/mainnet" ]
25+
bridge-address-from-env = [ "wormhole-anchor-sdk/bridge-address-from-env" ]
2526
solana-devnet = [ "wormhole-anchor-sdk/solana-devnet" ]
2627
tilt-devnet = [ "wormhole-anchor-sdk/tilt-devnet" ]
2728
tilt-devnet2 = [ "tilt-devnet" ]

solana/programs/example-native-token-transfers/tests/admin.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ async fn test_reregister_all_transceivers() {
7373
// Transceivers are expected to be executable which requires them to be added on setup
7474
// Thus, we pass all available executable program IDs as dummy_transceivers
7575
let dummy_transceivers = vec![
76-
wormhole_anchor_sdk::wormhole::program::ID,
76+
wormhole_anchor_sdk::wormhole::program::Wormhole::id(),
7777
wormhole_governance::ID,
7878
];
7979
let num_dummy_transceivers: u8 = dummy_transceivers.len().try_into().unwrap();

solana/programs/example-native-token-transfers/tests/common/setup.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ pub async fn setup_programs(program_owner: Pubkey) -> Result<ProgramTest, Error>
128128
add_program_upgradeable(
129129
&mut program_test,
130130
"mainnet_core_bridge",
131-
wormhole_anchor_sdk::wormhole::program::ID,
131+
wormhole_anchor_sdk::wormhole::program::Wormhole::id(),
132132
None,
133133
);
134134

0 commit comments

Comments
 (0)