sdk/js: add SequenceTracker

testing: add emitter sequence check
This commit is contained in:
A5 Pickle 2022-10-27 17:32:13 +00:00 committed by Evan Gray
parent 090a8e0c74
commit 847dad8d4c
4 changed files with 112 additions and 11 deletions

View File

@ -1,5 +1,15 @@
import { PublicKey, PublicKeyInitData } from "@solana/web3.js"; import {
Commitment,
Connection,
PublicKey,
PublicKeyInitData,
} from "@solana/web3.js";
import { deriveAddress } from "../../utils"; import { deriveAddress } from "../../utils";
import {
deriveEmitterSequenceKey,
getSequenceTracker,
SequenceTracker,
} from "./sequence";
export interface EmitterAccounts { export interface EmitterAccounts {
emitter: PublicKey; emitter: PublicKey;
@ -12,16 +22,6 @@ export function deriveWormholeEmitterKey(
return deriveAddress([Buffer.from("emitter")], emitterProgramId); return deriveAddress([Buffer.from("emitter")], emitterProgramId);
} }
export function deriveEmitterSequenceKey(
emitter: PublicKeyInitData,
wormholeProgramId: PublicKeyInitData
): PublicKey {
return deriveAddress(
[Buffer.from("Sequence"), new PublicKey(emitter).toBytes()],
wormholeProgramId
);
}
export function getEmitterKeys( export function getEmitterKeys(
emitterProgramId: PublicKeyInitData, emitterProgramId: PublicKeyInitData,
wormholeProgramId: PublicKeyInitData wormholeProgramId: PublicKeyInitData
@ -32,3 +32,17 @@ export function getEmitterKeys(
sequence: deriveEmitterSequenceKey(emitter, wormholeProgramId), sequence: deriveEmitterSequenceKey(emitter, wormholeProgramId),
}; };
} }
export async function getProgramSequenceTracker(
connection: Connection,
emitterProgramId: PublicKeyInitData,
wormholeProgramId: PublicKeyInitData,
commitment?: Commitment
): Promise<SequenceTracker> {
return getSequenceTracker(
connection,
deriveWormholeEmitterKey(emitterProgramId),
wormholeProgramId,
commitment
);
}

View File

@ -4,5 +4,6 @@ export * from "./emitter";
export * from "./feeCollector"; export * from "./feeCollector";
export * from "./guardianSet"; export * from "./guardianSet";
export * from "./postedVaa"; export * from "./postedVaa";
export * from "./sequence";
export * from "./signatureSet"; export * from "./signatureSet";
export * from "./upgrade"; export * from "./upgrade";

View File

@ -0,0 +1,50 @@
import {
Connection,
PublicKey,
Commitment,
PublicKeyInitData,
} from "@solana/web3.js";
import { deriveAddress, getAccountData } from "../../utils";
export function deriveEmitterSequenceKey(
emitter: PublicKeyInitData,
wormholeProgramId: PublicKeyInitData
): PublicKey {
return deriveAddress(
[Buffer.from("Sequence"), new PublicKey(emitter).toBytes()],
wormholeProgramId
);
}
export async function getSequenceTracker(
connection: Connection,
emitter: PublicKeyInitData,
wormholeProgramId: PublicKeyInitData,
commitment?: Commitment
): Promise<SequenceTracker> {
return connection
.getAccountInfo(
deriveEmitterSequenceKey(emitter, wormholeProgramId),
commitment
)
.then((info) => SequenceTracker.deserialize(getAccountData(info)));
}
export class SequenceTracker {
sequence: bigint;
constructor(sequence: bigint) {
this.sequence = sequence;
}
static deserialize(data: Buffer): SequenceTracker {
if (data.length != 8) {
throw new Error("data.length != 8");
}
return new SequenceTracker(data.readBigUInt64LE(0));
}
value(): bigint {
return this.sequence;
}
}

View File

@ -58,6 +58,7 @@ import {
deriveWormholeEmitterKey, deriveWormholeEmitterKey,
getPostedMessage, getPostedMessage,
getPostedVaa, getPostedVaa,
getProgramSequenceTracker,
} from "../../../sdk/js/src/solana/wormhole"; } from "../../../sdk/js/src/solana/wormhole";
import { import {
parseGovernanceVaa, parseGovernanceVaa,
@ -1082,6 +1083,13 @@ describe("Token Bridge", () => {
expect(assetMeta.decimals).to.equal(9); expect(assetMeta.decimals).to.equal(9);
expect(assetMeta.symbol).to.equal(""); expect(assetMeta.symbol).to.equal("");
expect(assetMeta.name).to.equal(""); expect(assetMeta.name).to.equal("");
const sequenceTracker = await getProgramSequenceTracker(
connection,
TOKEN_BRIDGE_ADDRESS,
CORE_BRIDGE_ADDRESS
);
expect(sequenceTracker.value()).to.equal(messageData.sequence + 1n);
}); });
// it("Attest Mint With Metadata", async () => { // it("Attest Mint With Metadata", async () => {
@ -1183,6 +1191,13 @@ describe("Token Bridge", () => {
Buffer.compare(tokenTransfer.tokenAddress, mint.toBuffer()) Buffer.compare(tokenTransfer.tokenAddress, mint.toBuffer())
).to.equal(0); ).to.equal(0);
expect(tokenTransfer.tokenChain).to.equal(1); expect(tokenTransfer.tokenChain).to.equal(1);
const sequenceTracker = await getProgramSequenceTracker(
connection,
TOKEN_BRIDGE_ADDRESS,
CORE_BRIDGE_ADDRESS
);
expect(sequenceTracker.value()).to.equal(messageData.sequence + 1n);
}); });
it("Receive Token", async () => { it("Receive Token", async () => {
@ -1409,6 +1424,13 @@ describe("Token Bridge", () => {
expect( expect(
Buffer.compare(tokenTransfer.tokenTransferPayload, transferPayload) Buffer.compare(tokenTransfer.tokenTransferPayload, transferPayload)
).to.equal(0); ).to.equal(0);
const sequenceTracker = await getProgramSequenceTracker(
connection,
TOKEN_BRIDGE_ADDRESS,
CORE_BRIDGE_ADDRESS
);
expect(sequenceTracker.value()).to.equal(messageData.sequence + 1n);
}); });
}); });
@ -1744,6 +1766,13 @@ describe("Token Bridge", () => {
Buffer.compare(tokenTransfer.tokenAddress, tokenAddress) Buffer.compare(tokenTransfer.tokenAddress, tokenAddress)
).to.equal(0); ).to.equal(0);
expect(tokenTransfer.tokenChain).to.equal(tokenChain); expect(tokenTransfer.tokenChain).to.equal(tokenChain);
const sequenceTracker = await getProgramSequenceTracker(
connection,
TOKEN_BRIDGE_ADDRESS,
CORE_BRIDGE_ADDRESS
);
expect(sequenceTracker.value()).to.equal(messageData.sequence + 1n);
}); });
it("Send Token With Payload", async () => { it("Send Token With Payload", async () => {
@ -1846,6 +1875,13 @@ describe("Token Bridge", () => {
expect( expect(
Buffer.compare(tokenTransfer.tokenTransferPayload, transferPayload) Buffer.compare(tokenTransfer.tokenTransferPayload, transferPayload)
).to.equal(0); ).to.equal(0);
const sequenceTracker = await getProgramSequenceTracker(
connection,
TOKEN_BRIDGE_ADDRESS,
CORE_BRIDGE_ADDRESS
);
expect(sequenceTracker.value()).to.equal(messageData.sequence + 1n);
}); });
}); });
}); });