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 {
deriveEmitterSequenceKey,
getSequenceTracker,
SequenceTracker,
} from "./sequence";
export interface EmitterAccounts {
emitter: PublicKey;
@ -12,16 +22,6 @@ export function deriveWormholeEmitterKey(
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(
emitterProgramId: PublicKeyInitData,
wormholeProgramId: PublicKeyInitData
@ -32,3 +32,17 @@ export function getEmitterKeys(
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 "./guardianSet";
export * from "./postedVaa";
export * from "./sequence";
export * from "./signatureSet";
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,
getPostedMessage,
getPostedVaa,
getProgramSequenceTracker,
} from "../../../sdk/js/src/solana/wormhole";
import {
parseGovernanceVaa,
@ -1082,6 +1083,13 @@ describe("Token Bridge", () => {
expect(assetMeta.decimals).to.equal(9);
expect(assetMeta.symbol).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 () => {
@ -1183,6 +1191,13 @@ describe("Token Bridge", () => {
Buffer.compare(tokenTransfer.tokenAddress, mint.toBuffer())
).to.equal(0);
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 () => {
@ -1409,6 +1424,13 @@ describe("Token Bridge", () => {
expect(
Buffer.compare(tokenTransfer.tokenTransferPayload, transferPayload)
).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)
).to.equal(0);
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 () => {
@ -1846,6 +1875,13 @@ describe("Token Bridge", () => {
expect(
Buffer.compare(tokenTransfer.tokenTransferPayload, transferPayload)
).to.equal(0);
const sequenceTracker = await getProgramSequenceTracker(
connection,
TOKEN_BRIDGE_ADDRESS,
CORE_BRIDGE_ADDRESS
);
expect(sequenceTracker.value()).to.equal(messageData.sequence + 1n);
});
});
});