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 { 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
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
|
@ -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";
|
||||||
|
|
|
@ -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,
|
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);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue