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.expiresAtUnix를 authorization.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],
});