-
Notifications
You must be signed in to change notification settings - Fork 742
/
Copy pathwormhole.ts
56 lines (48 loc) · 1.43 KB
/
wormhole.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import { keccak256 } from "../utils";
export { isBytes } from "ethers/lib/utils";
export interface GuardianSignature {
index: number;
signature: Buffer;
}
export interface ParsedVaa {
version: number;
guardianSetIndex: number;
guardianSignatures: GuardianSignature[];
timestamp: number;
nonce: number;
emitterChain: number;
emitterAddress: Buffer;
sequence: bigint;
consistencyLevel: number;
payload: Buffer;
hash: Buffer;
}
export type SignedVaa = Uint8Array | Buffer;
export function parseVaa(vaa: SignedVaa): ParsedVaa {
const signedVaa = Buffer.isBuffer(vaa) ? vaa : Buffer.from(vaa as Uint8Array);
const sigStart = 6;
const numSigners = signedVaa[5];
const sigLength = 66;
const guardianSignatures: GuardianSignature[] = [];
for (let i = 0; i < numSigners; ++i) {
const start = sigStart + i * sigLength;
guardianSignatures.push({
index: signedVaa[start],
signature: signedVaa.subarray(start + 1, start + 66),
});
}
const body = signedVaa.subarray(sigStart + sigLength * numSigners);
return {
version: signedVaa[0],
guardianSetIndex: signedVaa.readUInt32BE(1),
guardianSignatures,
timestamp: body.readUInt32BE(0),
nonce: body.readUInt32BE(4),
emitterChain: body.readUInt16BE(8),
emitterAddress: body.subarray(10, 42),
sequence: body.readBigUInt64BE(42),
consistencyLevel: body[50],
payload: body.subarray(51),
hash: keccak256(body),
};
}