浏览代码

sdk/js: add circleIntegration parsing

Paul Noel 2 年之前
父节点
当前提交
826c9939d1
共有 2 个文件被更改,包括 89 次插入0 次删除
  1. 41 0
      sdk/js/src/vaa/__tests__/circleUnit.ts
  2. 48 0
      sdk/js/src/vaa/circleIntegration.ts

+ 41 - 0
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);
+  });
+});

+ 48 - 0
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,
+  };
+}