diff --git a/sdk/js/src/vaa/__tests__/circleUnit.ts b/sdk/js/src/vaa/__tests__/circleUnit.ts new file mode 100644 index 000000000..b133f0b6f --- /dev/null +++ b/sdk/js/src/vaa/__tests__/circleUnit.ts @@ -0,0 +1,41 @@ +import { describe, expect, test } from "@jest/globals"; +import { + CircleIntegrationDeposit, + CircleIntegrationPayload, + parseCircleIntegrationDepositWithPayload, +} from "../circleIntegration"; + +describe("VAA Parsing Unit Tests", () => { + test("CircleIntegration DepositWithPayload", () => { + const testPayload = Buffer.from( + "01000000000000000000000000b97ef9ef8734c71904d8002f8b6bc66dd9c48a6e0000000000000000000000000000000000000000000000000000000018701a8000000001000000000000000000000f880000000000000000000000004cb69fae7e7af841e44e1a1c30af640739378bb20000000000000000000000004cb69fae7e7af841e44e1a1c30af640739378bb20061010000000000000000000000000000000000000000000000000000000001c9c3800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380d25e69c3df71de6891bfd511af87e9b3e9036", + "hex" + ); + const testResult: CircleIntegrationDeposit = { + payloadType: CircleIntegrationPayload.DepositWithPayload, + tokenAddress: Buffer.from( + "000000000000000000000000b97ef9ef8734c71904d8002f8b6bc66dd9c48a6e", + "hex" + ), + amount: BigInt("410000000"), + sourceDomain: 1, + targetDomain: 0, + nonce: BigInt("3976"), + fromAddress: Buffer.from( + "0000000000000000000000004cb69fae7e7af841e44e1a1c30af640739378bb2", + "hex" + ), + mintRecipient: Buffer.from( + "0000000000000000000000004cb69fae7e7af841e44e1a1c30af640739378bb2", + "hex" + ), + payloadLen: 97, + depositPayload: Buffer.from( + "010000000000000000000000000000000000000000000000000000000001c9c3800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380d25e69c3df71de6891bfd511af87e9b3e9036", + "hex" + ), + }; + const parsedPayload = parseCircleIntegrationDepositWithPayload(testPayload); + expect(parsedPayload).toEqual(testResult); + }); +}); diff --git a/sdk/js/src/vaa/circleIntegration.ts b/sdk/js/src/vaa/circleIntegration.ts new file mode 100644 index 000000000..31b7be36b --- /dev/null +++ b/sdk/js/src/vaa/circleIntegration.ts @@ -0,0 +1,48 @@ +import { BN } from "@project-serum/anchor"; + +export enum CircleIntegrationPayload { + DepositWithPayload = 1, +} + +export interface CircleIntegrationDeposit { + payloadType: CircleIntegrationPayload.DepositWithPayload; + tokenAddress: Buffer; + amount: bigint; + sourceDomain: number; + targetDomain: number; + nonce: bigint; + fromAddress: Buffer; + mintRecipient: Buffer; + payloadLen: number; + depositPayload: Buffer; +} + +export function parseCircleIntegrationDepositWithPayload( + payload: Buffer +): CircleIntegrationDeposit { + const payloadType = payload.readUInt8(0); + if (payloadType != CircleIntegrationPayload.DepositWithPayload) { + throw new Error("not circle integration payload VAA"); + } + const tokenAddress = payload.subarray(1, 33); + const amount = BigInt(new BN(payload.subarray(33, 65)).toString()); + const sourceDomain = payload.readUInt32BE(65); + const targetDomain = payload.readUInt32BE(69); + const nonce = payload.readBigUInt64BE(73); + const fromAddress = payload.subarray(81, 113); + const mintRecipient = payload.subarray(113, 145); + const payloadLen = payload.readUInt16BE(145); + const depositPayload = payload.subarray(147); + return { + payloadType, + tokenAddress, + amount, + sourceDomain, + targetDomain, + nonce, + fromAddress, + mintRecipient, + payloadLen, + depositPayload, + }; +}