sdk/js: add circleIntegration parsing

This commit is contained in:
Paul Noel 2023-08-08 14:01:40 -05:00 committed by Evan Gray
parent 21fc11f5bc
commit 826c9939d1
2 changed files with 89 additions and 0 deletions

View File

@ -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);
});
});

View File

@ -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,
};
}