IPrivacy.withdrawWithAuthorization
withdrawWithAuthorization(
PrivacyWithdrawRequest request,
PrivacyActionAuthorization authorization
) external returns (bool) effectiveSender가 서명한 EIP-712 인증을 사용하여 실드 풀의 자금을 투명한 EVM 수신자에게 대리 인출합니다. executor(일반적으로 릴레이어)가 트랜잭션을 제출하며, 프리컴파일이 서명을 검증하고 nonce와 deadline으로 재사용을 차단한 뒤 직접 withdraw 메서드와 동일한 널리파이어 소비 상태 전이를 수행합니다. amount 필드는 체인이 파싱하는 코인 문자열입니다(예: 1천만 OKRW는 "10000000000000000000000000aokrw").
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
request | PrivacyWithdrawRequest | ✓ | 실드 인출 페이로드입니다. proof, root, nullifier, amount(코인 문자열, 예: "10000000000000000000000000aokrw"), recipient(투명 EVM 주소), chainId, expiresAtUnix로 구성됩니다. |
authorization | PrivacyActionAuthorization | ✓ | effectiveSender의 EIP-712 서명 인증입니다. executor는 반드시 msg.sender와 일치해야 하며, 표준 도메인은 privacy-authorization-eip712-domain을 참고합니다. |
반환값
타입:
bool 성공 시 true를 반환합니다. 실패는 revert됩니다.
예제
1천만 OKRW 릴레이 인출
import { createWalletClient, http } from "viem";
import { privateKeyToAccount } from "viem/accounts";
const PRIVACY = "0x100000000000000000000000000000000000000b" as const;
const relayer = createWalletClient({
account: privateKeyToAccount(process.env.RELAYER_KEY as `0x${string}`),
transport: http("https://rpc-testnet.maroo.io"),
});
const withdrawRequest = {
proof: proofBytes,
root: merkleRoot,
nullifier: nullifierBytes,
amount: "10000000000000000000000000aokrw", // 10,000,000 OKRW
recipient: "0x1111111111111111111111111111111111111111", // TODO: replace before production
chainId: "maroo-testnet",
expiresAtUnix: BigInt(Math.floor(Date.now() / 1000) + 300),
};
await relayer.writeContract({
address: PRIVACY,
abi: privacyAbi,
functionName: "withdrawWithAuthorization",
args: [
withdrawRequest,
{
effectiveSender,
executor: relayer.account.address,
nonce,
deadline: BigInt(Math.floor(Date.now() / 1000) + 300),
authorizationKind: 3, // withdraw
signature: eip712Signature,
},
],
});