IPrivacy.batchTransferWithAuthorization

batchTransferWithAuthorization(
  bytes32 batchId,
  AuthorizedTransferItem[] items
) external returns (bool success)

하나 이상의 실효 발신자를 대신해 다중 증명 배치를 제출합니다. items[i]PrivacyTransferRequestPrivacyActionAuthorization을 함께 담으며, 인가 서명은 공유된 batchId와 아이템별 batchItemIndex 아래에서 해당 아이템의 요청을 서명합니다. 호출자(msg.sender)는 모든 인가의 executor로 기록됩니다. 복원된 서명자와 authorization.effectiveSender 불일치, deadline 만료, nonce 재사용은 배치 전체를 revert시킵니다. 20개 아이템 프로토콜 제한(MaxPrivacyMultiProofBatchItems)은 직접 호출 경로인 batchTransfer와 동일하게 적용됩니다.

파라미터

이름 타입 필수 설명
batchId bytes32 모든 authorization.batchId 필드가 일치해야 하는 공유 배치 식별자입니다. 제출마다 고유해야 하며, 일반적으로 executor가 생성한 임의의 32바이트입니다.
items AuthorizedTransferItem[] 1개 이상 20개 이하의 아이템 배열입니다. 각 아이템은 PrivacyTransferRequest와 그에 대한 서명된 PrivacyActionAuthorization을 짝지어 담습니다. 모든 아이템의 authorization.batchItemIndex는 배열에서의 0부터 시작하는 위치와 같아야 하며, 그렇지 않으면 다이제스트 재계산이 실패하고 배치가 revert됩니다.

반환값

타입: bool

모든 인가가 검증되고 모든 증명이 적용되면 true를 반환합니다.

예제

Executor로서 인가된 배치 제출

Executor가 먼저 batchId를 생성해 모든 실효 발신자에게 전달하고, 그 값을 EIP-712 서명에 포함시켜 동일 배치에 묶습니다. 클라이언트가 아이템 위치를 미리 확인하면 잘못된 인덱스를 트랜잭션 전송 전에 걸러낼 수 있습니다.

import { createWalletClient, http, toHex, randomBytes } from "viem";
import { privateKeyToAccount } from "viem/accounts";

const PRIVACY = "0x100000000000000000000000000000000000000b" as const;
const MAX_BATCH_ITEMS = 20;

type AuthorizedTransferItem = {
  request: any;         // PrivacyTransferRequest tuple
  authorization: any;   // PrivacyActionAuthorization tuple with EIP-712 signature
};

async function submitAuthorizedBatch(items: AuthorizedTransferItem[]) {
  if (items.length === 0 || items.length > MAX_BATCH_ITEMS) {
    throw new Error(`expected 1..${MAX_BATCH_ITEMS} items, got ${items.length}`);
  }
  const batchId = toHex(randomBytes(32));

  // Each item's authorization.batchId and authorization.batchItemIndex must have
  // been included in the EIP-712 message the effective sender already signed.
  items.forEach((item, i) => {
    if (item.authorization.batchId !== batchId) throw new Error(`item ${i} batchId mismatch`);
    if (item.authorization.batchItemIndex !== BigInt(i)) throw new Error(`item ${i} index mismatch`);
  });

  const executor = createWalletClient({
    account: privateKeyToAccount(process.env.EXECUTOR_KEY as `0x${string}`),
    transport: http("https://rpc-testnet.maroo.io"),
  });

  return executor.writeContract({
    address: PRIVACY,
    abi: privacyAbi,
    functionName: "batchTransferWithAuthorization",
    args: [batchId, items],
  });
}
ESC
검색어를 입력하세요