sdk/js: add SequenceTracker
testing: add emitter sequence check
This commit is contained in:
parent
090a8e0c74
commit
847dad8d4c
|
@ -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
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue