IPrivacy.deposit

deposit(
  PrivacyDepositRequest request
) external payable returns (bool success)

호출자의 공개된 OKRW(msg.value로 첨부)를 셸디드 풀에 예치하고, request의 노트 커밋먼트를 Merkle 트리에 추가합니다. depositIPrivacy에서 유일하게 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;
  }
}
ESC
검색어를 입력하세요