IPrivacy.transferWithAuthorization

transferWithAuthorization(
  PrivacyTransferRequest request,
  PrivacyActionAuthorization authorization
) external returns (bool success)

서명된 권한 페이로드(EOA, EIP-7702, ERC-1271)로 검증하여 authorization.effectiveSender를 대신해 은닉 전송을 실행합니다. 내부 PrivacyTransferRequest는 필수 필드 expiresAtUnix를 포함하며, 권한 자체의 만료는 별도의 authorization.deadline이 통제합니다. 두 만료 검사 모두 실패 시 일반 문자열 revert로 거절됩니다(IPrivacy는 커스텀 오류 타입을 선언하지 않습니다).

파라미터

이름 타입 필수 설명
request PrivacyTransferRequest 은닉 전송 요청입니다. expiresAtUnix는 필수이며 현재 블록 시간보다 커야 합니다.
authorization PrivacyActionAuthorization effectiveSender, executor, nonce, deadline, authorizationKind, signature를 담은 서명된 권한 페이로드입니다. 성공 시 nonce가 소진되어 재사용할 수 없습니다.

반환값

타입: bool

성공 시 true를 반환합니다. 실패는 일반 문자열 revert로 처리됩니다.

에러

코드 이름 설명
expiresAtUnix is required expiresAtUnix is required 문자열 revert입니다. request.expiresAtUnix가 0이었습니다.
transfer payload has expired transfer payload has expired 문자열 revert입니다. 현재 블록 시간이 request.expiresAtUnix 이상이었습니다.
privacy authorization expired privacy authorization expired 문자열 revert입니다. 현재 블록 시간이 authorization.deadline 이상이었습니다.
privacy authorization nonce already used privacy authorization nonce already used 문자열 revert입니다. 권한 페이로드의 nonce가 이전 호출에서 이미 소진되었습니다.

예제

executor가 대리 제출하는 만료 지정 전송

전송 페이로드가 서명자의 승인 유효 기간보다 먼저 무효화되어야 하는 경우, request.expiresAtUnixauthorization.deadline보다 짧게 설정합니다.

const nowSec = Math.floor(Date.now() / 1000);

const request = {
  // ... other privacy fields ...
  expiresAtUnix: BigInt(nowSec + 300),   // request payload expires in 5 min
};

const authorization = {
  // TODO: replace with the real effective sender before production.
  effectiveSender:    "0x8f3aC2b1D9e74C05a6B18Fe27dC4913E5A0f7b62",
  // TODO: replace with the real executor (submitter) address before production.
  executor:           "0x2c7F09b81A6D3fF1e5A0D4c6Bc2A8f7E19dC3a4B",
  nonce:              currentNonce,
  deadline:           BigInt(nowSec + 600), // authorization valid for 10 min
  authorizationKind:  0,                    // EOA / EIP-7702 / ERC-1271 per policy
  signature:          "0x...",
};

await executorWallet.writeContract({
  address: "0x100000000000000000000000000000000000000b",
  abi: privacyAbi,
  functionName: "transferWithAuthorization",
  args: [request, authorization],
});
ESC
검색어를 입력하세요