wormhole/sdk/js/src/solana/wormhole/accounts/guardianSet.ts

74 lines
1.8 KiB
TypeScript

import {
Connection,
PublicKey,
Commitment,
PublicKeyInitData,
} from "@solana/web3.js";
import {
ETHEREUM_KEY_LENGTH,
deriveAddress,
getAccountData,
} from "../../utils";
export function deriveGuardianSetKey(
wormholeProgramId: PublicKeyInitData,
index: number
): PublicKey {
return deriveAddress(
[
Buffer.from("GuardianSet"),
(() => {
const buf = Buffer.alloc(4);
buf.writeUInt32BE(index);
return buf;
})(),
],
wormholeProgramId
);
}
export async function getGuardianSet(
connection: Connection,
wormholeProgramId: PublicKeyInitData,
index: number,
commitment?: Commitment
): Promise<GuardianSetData> {
return connection
.getAccountInfo(deriveGuardianSetKey(wormholeProgramId, index), commitment)
.then((info) => GuardianSetData.deserialize(getAccountData(info)));
}
export class GuardianSetData {
index: number;
keys: Buffer[];
creationTime: number;
expirationTime: number;
constructor(
index: number,
keys: Buffer[],
creationTime: number,
expirationTime: number
) {
this.index = index;
this.keys = keys;
this.creationTime = creationTime;
this.expirationTime = expirationTime;
}
static deserialize(data: Buffer): GuardianSetData {
const index = data.readUInt32LE(0);
const keysLen = data.readUInt32LE(4);
const keysEnd = 8 + keysLen * ETHEREUM_KEY_LENGTH;
const creationTime = data.readUInt32LE(keysEnd);
const expirationTime = data.readUInt32LE(4 + keysEnd);
const keys = [];
for (let i = 0; i < keysLen; ++i) {
const start = 8 + i * ETHEREUM_KEY_LENGTH;
keys.push(data.subarray(start, start + ETHEREUM_KEY_LENGTH));
}
return new GuardianSetData(index, keys, creationTime, expirationTime);
}
}