IPrivacy.deposit
deposit(
PrivacyDepositRequest request
) external payable returns (bool success) 호출자의 공개된 OKRW(msg.value로 첨부)를 셸디드 풀에 예치하고, request의 노트 커밋먼트를 Merkle 트리에 추가합니다. deposit은 IPrivacy에서 유일하게 payable인 메서드입니다. 셸디드 금액은 64비트 필드로 제한되므로, 한 번의 deposit은 최대 18446744073709551615 base 단위(약 18.446744073709551615 OKRW)입니다. 더 큰 잔액은 여러 노트로 보관합니다. 실패는 IPrivacy의 타입 지정 커스텀 오류 또는 IPrecompile의 상속 오류로 revert됩니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
request | PrivacyDepositRequest | ✓ | deposit 페이로드입니다. noteCommitment(셸디드 출력), encryptedNote(수신자가 복호화할 암호문), proof(deposit 유효성 증명)를 포함합니다. |
반환값
타입:
bool 성공 시 true를 반환합니다. 실패는 false 반환이 아니라 타입 지정 커스텀 오류로 revert됩니다.
에러
| 코드 | 이름 | 설명 |
|---|---|---|
InvalidAmount | InvalidAmount | IPrecompile에서 상속됩니다. msg.value가 셸디드 금액 검증에 실패했을 때(0, 부호 없는 형태로 음수, 또는 64비트 셸디드 상한 초과) revert됩니다. InvalidAmount(string amount) 형태로 인코딩되며 페이로드는 금액을 10진수 문자열로 표현한 값입니다. |
InvalidAddress | InvalidAddress | IPrecompile에서 상속됩니다. 호출자 주소를 유효한 계정 주소로 변환할 수 없을 때(보통 0 주소) revert됩니다. InvalidAddress(string bad)로 인코딩됩니다. |
PrivacyCommitmentAlreadyExists | PrivacyCommitmentAlreadyExists | noteCommitment가 이미 셸디드 풀 Merkle 트리에 존재할 때 revert됩니다. |
PrivacyMerkleCapacityExceeded | PrivacyMerkleCapacityExceeded | deposit의 커밋먼트를 추가하면 Merkle 트리 용량을 초과할 때 revert됩니다. |
InvalidNumberOfArgs | InvalidNumberOfArgs | IPrecompile에서 상속됩니다. ABI 인코딩된 호출이 정확히 하나의 인자를 담고 있지 않을 때 revert됩니다. |
예제
15 OKRW를 셸디드 풀에 예치
더 큰 잔액(예: 10,000,000 OKRW)은 여러 노트로 보관합니다. 금액을 여러 deposit으로 분할하고 각 deposit이 64비트 상한 아래가 되도록 합니다.
import { createWalletClient, http, parseEther } from "viem";
import { privateKeyToAccount } from "viem/accounts";
import { privacyAbi } from "@maroo-chain/contracts/abi/IPrivacy";
const PRIVACY = "0x100000000000000000000000000000000000000b" as const;
const wallet = createWalletClient({
account: privateKeyToAccount(process.env.USER_KEY as `0x${string}`),
transport: http("https://rpc-testnet.maroo.io"),
});
// Stays under the 64-bit shielded cap (~18.446... OKRW per deposit).
await wallet.writeContract({
address: PRIVACY,
abi: privacyAbi,
functionName: "deposit",
args: [request],
value: parseEther("15"),
}); 64비트 셸디드 금액 상한 처리
64비트 셸디드 상한은 하부 ValidateShieldedAmount 검사가 강제하며, 공유 오류 리팩터링 이후 InvalidAmount(string)으로 노출됩니다. 이전에 InvalidAmount(uint256)으로 선언한 ABI 조각을 갱신합니다.
import { decodeErrorResult, parseEther } from "viem";
import { privacyAbi } from "@maroo-chain/contracts/abi/IPrivacy";
try {
await wallet.writeContract({
address: PRIVACY,
abi: privacyAbi,
functionName: "deposit",
args: [request],
value: parseEther("20"), // above the 64-bit shielded cap — will revert
});
} catch (err: any) {
if (!err?.data) throw err;
const decoded = decodeErrorResult({ abi: privacyAbi, data: err.data });
if (decoded.errorName === "InvalidAmount") {
const [amount] = decoded.args as [string];
console.warn(`deposit amount ${amount} exceeds 64-bit shielded cap — split across multiple notes`);
} else {
throw err;
}
}