> ## Documentation Index
> Fetch the complete documentation index at: https://www.helius.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Dompet Privat

> Tambahkan dukungan privasi ke dompet Solana yang sudah ada untuk Ring rahasia tanpa izin. Buat dompet privat serta terima dan kirim transaksi privat.

Dompet privat terdiri dari pasangan kunci Solana untuk penandatanganan, kunci nullifier, dan kunci penampil untuk enkripsi—ketiga kunci ini bersama-sama membentuk pasangan kunci terlindungi.
Sistem pengelolaan kunci Anda menyimpan pasangan kunci terlindungi tersebut.
Kode dompet menggunakan Privacy Interface dan SDK untuk membuat transaksi privat.

<img src="https://mintcdn.com/helius/nNv9k5eJvwuxAzBn/images/privacy/stack.svg?fit=max&auto=format&n=nNv9k5eJvwuxAzBn&q=85&s=0e4087582b1d03c3d29d6a21f33149bb" alt="Key management and the Privacy SDK connect through the Privacy Interface. The Privacy SDK calls the Privacy API. The Privacy API submits the transaction to Solana." width="2156" height="270" data-path="images/privacy/stack.svg" />

Integrasi ini memungkinkan pengguna Anda untuk:

1. Membuat dompet privat dengan kustodi mandiri
2. Menerima transfer privat melalui alamat Solana
3. Menyetorkan token ke saldo privat
4. Mengirim secara privat ke alamat Solana
5. Menarik dana ke alamat Solana mana pun
6. Mendekripsi saldo privat dan riwayat transaksi secara lokal

Integrasi ini mencakup:

1. [**Pasangan Kunci Terlindungi**](#integrasikan-pasangan-kunci-terlindungi) – dalam sistem pengelolaan kunci Anda untuk enkripsi
2. [**Privacy Interface dan SDK**](#integrasikan-privacy-interface-dan-sdk) – untuk membuat transaksi privat
3. [**Alur Pengguna**](#integrasikan-alur-pengguna) – untuk diintegrasikan ke dompet Anda

## Konteks untuk AI Anda

<Prompt description="Add a Private Wallet to an existing Solana wallet" actions={["copy", "cursor"]}>
  {`---
    description: Tambahkan Dompet Privat ke dompet Solana yang sudah ada
    allowed-tools: Bash, Read, Write, Edit, Glob, Grep, WebFetch, AskUserQuestion, Task, TaskCreate, TaskGet, TaskList, TaskUpdate, TaskOutput, mcp__deepwiki, mcp__helius-docs
    ---

    ## Tambahkan Dompet Privat ke dompet Solana yang sudah ada

    Gaya bahasa:
    - Sampaikan poinnya. Kemudian berikan penjelasan singkat dan mandiri dalam kalimat lengkap.
    - Tanpa kata-kata pengisi.

    Halaman Saat Ini: https://www.helius.dev/docs/privacy/integration/wallet.md

    Implementasikan dalam urutan ini. Jangan lewatkan atau ubah urutannya:
    1. Derivasi pasangan kunci terlindung
    2. Antarmuka Privasi dalam manajemen kunci
    3. Alur pengguna.

    Konteks:
    - Indeks dokumentasi: https://www.helius.dev/docs/privacy.md
    - Spesifikasi: https://github.com/helius-labs/zolana/blob/main/docs/spec.md
    - MCP: https://www.helius.dev/docs/privacy/ai-tools.md
    - Paket: @heliuslabs/zolana, @solana/kit · zolana-client, zolana-interface, zolana-program, zolana-keypair, zolana-transaction
    - Contoh: https://github.com/helius-labs/zolana-examples/tree/main/typescript-client · https://github.com/helius-labs/zolana-examples/tree/main/rust-client

    API utama: ShieldedKeypairLike, ViewingKeyLike, ShieldedKeypairTrait, ViewingKeyTrait, createZolanaClient. API alur: halaman yang ditautkan dari indeks dokumentasi.

    ### 1. Indeks proyek
    - Jalankan Grep untuk \`ShieldedKeypairLike|ViewingKeyLike|createZolanaClient|@heliuslabs/zolana|zolana-keypair|TSPP/derive\` di seluruh src/
    - Jalankan Glob untuk \`**/*.{ts,tsx,js,rs}\` · baca package.json / Cargo.toml
    - Identifikasi: manajemen kunci Solana yang ada, seed vs perangkat keras/MPC, indeks akun, jalur pengiriman, UI saldo/riwayat
    - Gunakan subagen Task jika ada beberapa paket

    ### 2. Baca referensi
    - Gunakan WebFetch pada halaman saat ini — kedua bahasa antarmuka, kedua tab derivasi
    - Gunakan WebFetch pada indeks dokumentasi — ikuti halaman untuk urutan di atas. Tambahkan on-/off-ramp hanya jika dipilih pada langkah 3
    - Gunakan WebFetch pada spesifikasi ketika perilaku protokol ambigu (registri, pembelanjaan, enkripsi)
    - Gunakan TaskCreate untuk membuat satu tugas per fase di bawah ini

    ### 3. Perjelas tujuan
    - AskUserQuestion: Apakah Anda menggunakan TypeScript atau Rust?
    - AskUserQuestion: Apakah Anda menggunakan dompet berbasis seed, membuat pengujian, atau menggunakan dompet non-seed?
    - Dompet berbasis seed → lakukan derivasi dari frasa seed
    - Pengujian → lakukan derivasi dari pesan tetap
    - Dompet non-seed → lakukan derivasi dari pesan tetap
    - AskUserQuestion: Apakah Anda menginginkan on-/off-ramp?
    - AskUserQuestion: Localnet atau devnet?
    - Ringkas. Tunggu konfirmasi sebelum membuat rencana

    ### 4. Buat rencana
    - Jangan edit file yang tidak terkait. Jangan tambahkan kode mati.
    - Gunakan kode yang ada persis byte demi byte. Jangan menciptakan API, file, atau helper yang tidak ada pada halaman yang telah diambil atau di repositori.
    - Setiap jalur, simbol, dan nomor baris yang disebutkan harus berasal dari langkah 1 atau 2. Jika belum dibaca, jangan tuliskan.
    - Buat pohon ASCII dari file yang akan ditambahkan atau diubah. Satu baris per file: jalur, lalu fungsi file tersebut.
    - Ikuti urutannya. Jika tidak jelas, gunakan AskUserQuestion. Sajikan rencana. Tunggu persetujuan.

    ### 5. Implementasikan
    - TS: Jalankan Bash \`pnpm add @heliuslabs/zolana @solana/kit\` jika belum ada
    - Rust: tambahkan crate dari halaman SDK yang ditautkan dari indeks dokumentasi
    - Ikuti rencana yang telah disetujui. Gunakan Write/Edit. Jangan ganti pasangan kunci Solana
    - Gunakan TaskUpdate pada setiap langkah

    ### 6. Verifikasi
    - Setiap metode antarmuka untuk bahasa yang dipilih telah diimplementasikan
    - Tidak ada rahasia dalam log atau payload jaringan
    - TS: Jalankan Bash \`tsc --noEmit\` + pengujian yang ada
    - Rust: Jalankan Bash \`cargo check\` + \`cargo test\` jika ada pengujian
    - Tandai selesai menggunakan TaskUpdate

    ### Alat
    - mcp__helius-docs untuk halaman dokumentasi
    - mcp__deepwiki__ask_question("helius-labs/zolana", "<q>")
    - WebFetch \`https://www.helius.dev/docs/<path>.md\`
    - Subagen Task untuk Grep/Read/WebFetch secara paralel
    - TaskList untuk pekerjaan yang tersisa

    Invarian:
    - Dompet menyimpan pasangan kunci terlindung. Jangan pernah kirim materi kunci ke API Privasi.
    - Implementasikan setiap metode pada antarmuka bahasa yang dipilih. Jangan salin metode khusus Rust (\`sign_hash\`, \`nullifier_key\`) ke TypeScript.
    - Operasi kunci penampil bersifat lokal dan sinkron. Kustodian yang hanya dapat menandatangani tidak valid.
    - Gunakan hanya API dari halaman saat ini, indeks dokumentasi, dan halaman alur dalam urutan tersebut. Jika API tidak ada di sana, berhenti dan gunakan AskUserQuestion.
    - Jangan catat mnemonik, nullifier, kunci penampil, atau tanda tangan \`TSPP/derive/v1\` ke log.
    - Bahasanya adalah TypeScript atau Rust, bukan keduanya.
    - Asetnya adalah SOL, SPL, dan Token-2022.
    - Setiap kunci publik Solana milik pengguna dapat menambahkan Dompet Privat. Satu alamat Solana dipetakan ke satu Alamat Terlindung.
    - Ketika penerima transfer privat tidak memiliki Dompet Privat, API Privasi dapat mengalihkan transfer menjadi penarikan dari privat ke publik.
    Kami menyarankan untuk meminta tanda tangan pengguna yang terpisah di UI guna memastikan pengguna tidak menarik dana ke saldo publik secara tidak sengaja.`}
</Prompt>

<Accordion title="View prompt">
  ```text theme={"system"}
  description: Add a Private Wallet to an existing Solana wallet
  allowed-tools: Bash, Read, Write, Edit, Glob, Grep, WebFetch, AskUserQuestion, Task, TaskCreate, TaskGet, TaskList, TaskUpdate, TaskOutput, mcp__deepwiki, mcp__helius-docs
  ---

  ## Add a Private Wallet to an existing Solana wallet

  Voice:
  - Point. Then a short, self-contained explanation in a real sentence.
  - No fill words.

  Current Page: https://www.helius.dev/docs/privacy/integration/wallet.md

  Implement in this sequence. Do not skip or rearrange:
  1. Shielded keypair derivation
  2. Privacy Interface in key management
  3. User flows.

  Context:
  - Docs index: https://www.helius.dev/docs/privacy.md
  - Spec: https://github.com/helius-labs/zolana/blob/main/docs/spec.md
  - MCP: https://www.helius.dev/docs/privacy/ai-tools.md
  - Packages: @heliuslabs/zolana, @solana/kit · zolana-client, zolana-interface, zolana-program, zolana-keypair, zolana-transaction
  - Examples: https://github.com/helius-labs/zolana-examples/tree/main/typescript-client · https://github.com/helius-labs/zolana-examples/tree/main/rust-client

  Key APIs: ShieldedKeypairLike, ViewingKeyLike, ShieldedKeypairTrait, ViewingKeyTrait, createZolanaClient. Flow APIs: the pages linked from the docs index.

  ### 1. Index project
  - Grep \`ShieldedKeypairLike|ViewingKeyLike|createZolanaClient|@heliuslabs/zolana|zolana-keypair|TSPP/derive\` across src/
  - Glob \`**/*.{ts,tsx,js,rs}\` · read package.json / Cargo.toml
  - Identify: existing Solana key management, seed vs hardware/MPC, account index, send path, balance/history UI
  - Task subagent if multiple packages

  ### 2. Read references
  - WebFetch the current page — both interface languages, both derivation tabs
  - WebFetch the docs index — follow the pages for the sequence above. Add on-/off-ramp only if selected in step 3
  - WebFetch the spec when protocol behavior is ambiguous (registry, spends, encryption)
  - TaskCreate one todo per phase below

  ### 3. Clarify intention
  - AskUserQuestion: Are you using TypeScript or Rust?
  - AskUserQuestion: Are you a seed-based wallet, creating tests, or a non-seed-based wallet?
    - Seed-based wallet → derive from the seed phrase
    - Tests → derive from a fixed message
    - Non-seed-based wallet → derive from a fixed message
  - AskUserQuestion: Do you want on-/off-ramp?
  - AskUserQuestion: Localnet or devnet?
  - Summarize. Wait for confirmation before planning

  ### 4. Create plan
  - Do not edit unrelated files. Do not add dead code.
  - Take existing code byte for byte. Do not invent APIs, files, or helpers that are not on the fetched pages or in the repo.
  - Every claimed path, symbol, and line number comes from step 1 or 2. If it was not read, do not write it.
  - ASCII tree of files to add or change. One line per file: path, then what that file does.
  - Follow the sequence. If unclear, AskUserQuestion. Present the plan. Wait for approval.

  ### 5. Implement
  - TS: Bash \`pnpm add @heliuslabs/zolana @solana/kit\` if missing
  - Rust: add the crates from the SDK page linked from the docs index
  - Follow the approved plan. Write/Edit. Do not replace the Solana keypair
  - TaskUpdate each step

  ### 6. Verify
  - Every interface method for the chosen language is implemented
  - No secrets in logs or network payloads
  - TS: Bash \`tsc --noEmit\` + existing tests
  - Rust: Bash \`cargo check\` + \`cargo test\` if tests exist
  - TaskUpdate complete

  ### Tools
  - mcp__helius-docs for docs pages
  - mcp__deepwiki__ask_question("helius-labs/zolana", "<q>")
  - WebFetch \`https://www.helius.dev/docs/<path>.md\`
  - Task subagent for parallel Grep/Read/WebFetch
  - TaskList for remaining work

  Invariants:
  - Wallet holds the shielded keypair. Never send key material to the Privacy API.
  - Implement every method on the chosen language's interface. Do not copy Rust-only methods (\`sign_hash\`, \`nullifier_key\`) onto TypeScript.
  - Viewing-key operations are local and synchronous. A sign-only custodian is invalid.
  - Use only APIs from the current page, the docs index, and the flow pages in the sequence. If an API is not there, stop and AskUserQuestion.
  - Do not log mnemonic, nullifier, viewing key, or the \`TSPP/derive/v1\` signature.
  - Language is TypeScript or Rust, not both.
  - Assets are SOL, SPL, and Token-2022.
  - Every Solana public key of the user can add a Private Wallet. One Solana address maps to one Shielded Address.
  - When the recipient of a private transfer does not have a Private Wallet, the Privacy API can resolve the transfer to a private-to-public withdrawal.
  We recommend requesting a separate user signature in the UI to ensure the user does not withdraw to a public balance by accident.
  ```
</Accordion>

<Steps>
  <Step>
    ## Integrasikan Pasangan Kunci Terlindungi

    Integrasi dompet privat menambahkan pasangan kunci terlindungi ke sistem pengelolaan kunci Anda.
    Pasangan kunci terlindungi menandatangani, mengenkripsi, dan mendekripsi transaksi.

    Pasangan kunci terlindungi merupakan kumpulan kunci penandatanganan, nullifier, dan penampil.

    * **Kunci penandatanganan:** Pasangan kunci Ed25519 Solana milik dompet untuk menandatangani transaksi.
    * **Kunci penampil:** Pasangan kunci P-256 yang digunakan untuk mengenkripsi dan mendekripsi transaksi.
    * **Kunci nullifier:** <Tooltip tip="A nullifier ensures a private balance cannot be spent twice. A private balance is the sum of all UTXOs (unspent transaction outputs) owned by an address. Each transaction spends (nullifies) input UTXOs and creates new outputs.">Kunci yang digunakan untuk memperoleh nullifier.</Tooltip>

    Dompet dapat membuat pasangan kunci terlindungi dengan dua cara:

    1. Untuk dompet berbasis seed, pilih **Turunkan dari frasa seed**.
    2. Untuk dompet yang tidak berbasis seed, pilih **Turunkan dari tanda tangan EdDSA**.

    <Tabs>
      <Tab title="Derive from seed phrase" id="derive-from-seed-phrase">
        Dompet berbasis seed menurunkan pasangan kunci terlindungi dari satu mnemonik BIP-39 dan indeks akun (`0`, `1`, …).

        Setiap indeks akun memetakan satu pasangan kunci Solana ke satu pasangan kunci terlindungi.
        Anda dapat memulihkan pasangan kunci terlindungi dengan cara yang sama seperti memulihkan pasangan kunci Solana.

        Contoh:

        * Akun 0: pasangan kunci Solana 0 dan pasangan kunci terlindungi 0
        * Akun 1: pasangan kunci Solana 1 dan pasangan kunci terlindungi 1

        | Kunci           | Jalur Derivasi                     | Skema                     |
        | --------------- | ---------------------------------- | ------------------------- |
        | Penandatanganan | `m/44'/501'/account'/0'`           | SLIP-0010 Ed25519         |
        | Nullifier       | `m/44'/1392955331'/account'/1'/0'` | SLIP-0010 Ed25519\[1..32] |
        | Penampil        | `m/44'/1392955331'/account'/2'/0'` | SLIP-0010 NIST P-256      |

        Kunci penandatanganan terlindungi adalah kunci Ed25519 Solana milik akun tersebut.
        Kunci nullifier dan penampil adalah kunci tambahan yang diturunkan dari seed yang sama.

        <Info>
          Contoh Implementasi: [Contoh TypeScript](https://github.com/helius-labs/zolana/blob/cad0664e374f6a0e5c532169c5895203e366eb56/sdk-libs/ts/test/seed-based-keypair.test.ts#L60) · [Contoh Rust](https://github.com/helius-labs/zolana/blob/cad0664e374f6a0e5c532169c5895203e366eb56/sdk-libs/keypair/tests/seed_based_keypair.rs#L111)
        </Info>
      </Tab>

      <Tab title="Derive from EdDSA signature" id="derive-from-signature">
        Turunkan pasangan kunci terlindungi dari tanda tangan EdDSA atas pesan tetap.
        Tanda tangan EdDSA bersifat deterministik, sehingga tanda tangan dari pasangan kunci Solana yang sama untuk pesan yang sama selalu menghasilkan pasangan kunci terlindungi yang sama.
        Kami menggunakan tanda tangan tersebut sebagai seed untuk menurunkan pasangan kunci terlindungi.

        Payload pesan tetapnya adalah `"TSPP/derive/v1"`, yang dikodekan sebagai pesan off-chain Solana v0.

        Kunci penandatanganan terlindungi adalah kunci EdDSA Solana milik dompet.
        Kunci nullifier dan penampil adalah kunci tambahan yang diturunkan dari tanda tangan.

        <Warning>
          Tanda tangan tersebut merupakan seed derivasi.
          Siapa pun yang memilikinya dapat menurunkan kunci nullifier dan penampil serta mendekripsi transaksi pengguna.
          Tolak setiap permintaan penandatanganan untuk pesan `"TSPP/derive/v1"` dari pihak ketiga.
        </Warning>

        Pseudocode untuk menurunkan pasangan kunci terlindungi dari tanda tangan Solana:

        ```jsx theme={"system"}
        function deriveShieldedKeypair(solanaKeypair):
              solanaPubkey = solanaKeypair.publicKeyBytes() // 32 bytes
        	
              payload = UTF8("TSPP/derive/v1")

              // Solana off-chain message v0 envelope
              derivationMessage =
                  bytes("\xffsolana offchain")            // 16 bytes
                  || u8(0)                                // version
                  || SHA256(payload)                      // application domain
                  || u8(0)                                // restricted ASCII format
                  || u8(1)                                // one signer
                  || solanaPubkey
                  || u16LE(length(payload))
                  || payload

              // Ed25519 signatures are deterministic, so the same wallet produces
              // the same 64-byte seed every time.
              derivationSeed = ED25519_SIGN(
                  solanaKeypair.secretKey,
                  derivationMessage
              )

              // HKDF-Extract with no salt
              prk = HKDF_SHA256_EXTRACT(
                  salt = empty,
                  ikm  = derivationSeed
              )

              nullifierSecret = HKDF_SHA256_EXPAND(
                  prk,
                  info   = UTF8("TSPP/nf_key/ed25519/v1"),
                  length = 31
              )

              viewingKeyMaterial = HKDF_SHA256_EXPAND(
                  prk,
                  info   = UTF8("TSPP/view_key/ed25519/v1"),
                  length = 48
              )

              // RFC hash-to-field reduction into a non-zero P-256 scalar
              viewingSecret = P256_SCALAR_FROM_OKM(viewingKeyMaterial)

              return ShieldedKeypair {
                  signingKey:    solanaKeypair,
                  nullifierKey:  NullifierKey(nullifierSecret),
                  viewingKey:    P256Keypair(viewingSecret)
        }
        ```

        <Info>
          Contoh Implementasi: [TypeScript](https://github.com/helius-labs/zolana/blob/cad0664e374f6a0e5c532169c5895203e366eb56/sdk-libs/ts/src/keypair/shielded.ts#L201) · [Rust](https://github.com/helius-labs/zolana/blob/cad0664e374f6a0e5c532169c5895203e366eb56/sdk-libs/keypair/src/shielded.rs#L126)
        </Info>
      </Tab>
    </Tabs>
  </Step>

  <Step>
    ## Integrasikan Privacy Interface dan SDK

    Privacy Interface memungkinkan kode Anda menggunakan Privacy SDK untuk membuat transaksi privat tanpa mengakses materi kunci secara langsung.
    Sistem pengelolaan kunci Anda mengimplementasikan Privacy Interface dalam dua bagian.

    1. Antarmuka Penandatanganan untuk Pembuatan Transaksi dengan Privacy SDK. Lihat Sumber: [TypeScript](https://github.com/helius-labs/zolana/blob/236e6cd6cee4d07e567b316210e018f31dfa4d90/sdk-libs/ts/src/keypair/shielded.ts#L132)/ [Rust](https://github.com/helius-labs/zolana/blob/236e6cd6cee4d07e567b316210e018f31dfa4d90/sdk-libs/keypair/src/traits/shielded_keypair.rs)
    2. Antarmuka Enkripsi & Dekripsi. Lihat Sumber: [TypeScript](https://github.com/helius-labs/zolana/blob/236e6cd6cee4d07e567b316210e018f31dfa4d90/sdk-libs/ts/src/keypair/shielded.ts#L154)/ [Rust](https://github.com/helius-labs/zolana/blob/236e6cd6cee4d07e567b316210e018f31dfa4d90/sdk-libs/keypair/src/traits/view_key.rs)

    <Info>
      Privacy Interface bersifat stateless sehingga tidak menyimpan saldo atau riwayat transaksi.
      Untuk meningkatkan performa, sebaiknya simpan saldo pengguna dan riwayat transaksi dalam cache lokal.
    </Info>

    ### Tentang Pembuatan Bukti

    Pembuatan bukti zero-knowledge memerlukan input plaintext dari seluruh data transaksi pengguna dan kunci nullifier.

    Saat ini, pembuatan bukti di server tersedia melalui URL RPC Helius standar.

    Pembuatan bukti secara lokal akan segera tersedia.
    Pembuatan bukti server terenkripsi secara menyeluruh di AWS Nitro direncanakan sebelum peluncuran mainnet.
  </Step>

  <Step>
    ## Integrasikan Alur Pengguna

    ### Buat Dompet Privat

    Dompet privat dibuat dalam dua langkah:

    1. Turunkan pasangan kunci terlindungi
    2. Daftarkan alamat Solana dalam registri on-chain.

    Pembuatan dompet privat tidak mengharuskan penyetoran ke saldo privat.

    Registri menghubungkan kunci publik penandatanganan dengan kunci publik nullifier dan penampil. Bersama-sama, kunci publik ini membentuk alamat terlindungi.

    ```mermaid theme={"system"}
    %%{init: {
      'theme': 'base',
      'themeVariables': {
        'lineColor':           '#FF6B35',
        'primaryTextColor':    '#737373',
        'primaryBorderColor':  '#9CA3AF',
        'actorBkg':            '#FFFFFF',
        'actorBorder':         '#9CA3AF',
        'actorTextColor':      '#737373',
        'signalColor':         '#FF6B35',
        'signalTextColor':     '#737373',
        'labelBoxBkgColor':    '#FF6B351F',
        'labelBoxBorderColor': '#FF6B35',
        'noteBkgColor':        '#F5F5F5',
        'noteTextColor':       '#737373',
        'noteBorderColor':     '#9CA3AF'
      }
    }}%%
    sequenceDiagram
        participant User
        participant Privacy SDK
        participant Solana

        User->>Privacy SDK: Create Private Wallet
        Privacy SDK->>Solana: Register Solana address

    ```

    <Info>
      Setiap catatan registri merupakan PDA yang dimiliki oleh <Tooltip tip="regyS5rkAcw2YzDJCmTwCTHs2s246FXxbmuRZ42u2PD">[program registri](https://orbmarkets.io/address/regyS5rkAcw2YzDJCmTwCTHs2s246FXxbmuRZ42u2PD)</Tooltip>, yang dapat diperiksa siapa pun untuk mengetahui apakah suatu alamat Solana dapat menerima transfer privat.
    </Info>

    <Tabs>
      <Tab title="TypeScript Client">
        ```typescript theme={"system"}
        import { buildRegistrationTransaction } from "@heliuslabs/zolana";
        import { isWalletRegistered } from "@heliuslabs/zolana/wallet";

        const registration = await buildRegistrationTransaction({
          client,
          owner: signer.address,
          address,
        });
        if (registration !== undefined) {
          await sendTransaction(registration);
        }

        const registered = await isWalletRegistered({
          rpc: client,
          owner: signer.address,
        });
        ```

        * `owner` adalah alamat Solana pengguna, yang digunakan untuk menurunkan PDA registri.
        * `address` adalah Alamat Terlindungi pengguna.
        * `buildRegistrationTransaction` mengembalikan transaksi pendaftaran atau pembaruan kunci yang telah dikompilasi. Fungsi ini mengembalikan `undefined` jika dompet sudah terdaftar.
        * `sendTransaction` menandatangani dan mengirim transaksi.
        * `isWalletRegistered` membaca PDA registri untuk memeriksa pendaftaran.
      </Tab>

      <Tab title="Rust Client">
        ```rust theme={"system"}
        use solana_signer::Signer;
        use zolana_client::{sign_transaction, Rpc};
        use zolana_wallet::{
            build_registration_transaction_sync,
            is_wallet_registered_sync,
        };

        if let Some(registration) = build_registration_transaction_sync(
            &client,
            owner.pubkey(),
            &owner.shielded_address()?,
            None,
            None,
        )? {
            let registration = sign_transaction(registration, &[&owner])?;
            client.process_transaction(registration)?;
        }

        assert!(is_wallet_registered_sync(&client, owner.pubkey())?);
        ```

        * `owner` adalah `ShieldedKeypair` milik pengguna. Kunci publik Solana-nya mengidentifikasi catatan registri, dan tanda tangannya mengotorisasi pendaftaran.
        * `owner.shielded_address()` mengembalikan Alamat Terlindungi pengguna.
        * `build_registration_transaction_sync` mengembalikan pesan pendaftaran atau pembaruan kunci yang belum ditandatangani. Fungsi ini mengembalikan `None` jika dompet sudah terdaftar.
        * `None` pertama tidak menyertakan bukti pengikatan kunci untuk dompet Ed25519. `None` terakhir menggunakan pemilik sebagai pembayar. Pemilik tetap menandatangani.
        * `sign_transaction` menandatangani pesan. `process_transaction` mengirim dan mengonfirmasi transaksi.
        * `is_wallet_registered_sync` membaca PDA registri untuk memeriksa pendaftaran.
      </Tab>
    </Tabs>

    <Info>
      Contoh pendaftaran lengkap: [TypeScript](https://github.com/helius-labs/zolana-examples/blob/7775438e0a290a4c28dccf919719bd640c3ec5e3/typescript-client/examples/register_private_wallet.ts) · [Rust](https://github.com/helius-labs/zolana-examples/blob/7775438e0a290a4c28dccf919719bd640c3ec5e3/rust-client/examples/register_private_wallet.rs)
    </Info>

    ### Sinkronkan Saldo Privat & Riwayat Transaksi

    Sinkronisasi saldo mengambil status terenkripsi dari RPC dan mendekripsinya di dompet.

    RPC tidak melakukan dekripsi. Hanya pemilik yang dapat mendekripsi saldo privat menggunakan kunci penampil.

    <Info>
      Dompet harus mendekripsi dan memperbarui saldo sebelum transaksi privat serta setiap kali menjalankan backfill: saat dompet dibuka kuncinya, dompet privat dibuka, aplikasi dilanjutkan, jaringan tersambung kembali, terjadi celah stream, atau dompet dipulihkan.
    </Info>

    <CardGroup cols={2}>
      <Card title="Read a Private Balance" icon="wallet" href="/docs/id/privacy/guides/read-balance" horizontal />

      <Card title="Read Private Transaction History" icon="clock-rotate-left" href="/docs/id/privacy/guides/read-history" horizontal />
    </CardGroup>

    ### Setorkan ke Saldo Privat

    Pengguna dapat menyetorkan dana ke saldo privat dengan dua cara:

    1. Melakukan on-ramp dari saldo fiat ke saldo kripto privat
    2. Menyetorkan dari akun SPL publik ke saldo privat

    On-ramp dan setoran memiliki jaminan privasi yang berbeda.
    Untuk privasi yang lebih baik, sebaiknya gunakan on-ramp daripada setoran.

    | Bidang        | On-ramp dari Fiat | Setoran dari SPL |
    | ------------- | ----------------- | ---------------- |
    | Aset          | Privat            | Publik           |
    | Jumlah        | Privat            | Publik           |
    | Sumber        | Tidak on-chain    | Publik           |
    | Alamat tujuan | Publik            | Publik           |

    <CardGroup cols={2}>
      <Card title="On-/Off-Ramp" icon="circle-dollar-to-slot" href="/docs/id/privacy/integration/on-off-ramp">
        Lakukan on-/off-ramp fiat secara langsung ke dan dari saldo privat.
      </Card>

      <Card title="Deposit" icon="arrow-down-to-bracket" href="/docs/id/privacy/guides/deposit">
        Setorkan dari saldo kripto publik.
      </Card>
    </CardGroup>

    ### Transfer Privat

    Pengguna dapat mengirim transfer privat ke alamat dompet Solana mana pun.

    Untuk setiap transfer privat, Privacy SDK mencari alamat dompet dalam registri on-chain guna memeriksa apakah penerima memiliki dompet privat.

    Privacy SDK dapat mengubah transfer privat menjadi penarikan dari privat ke publik ketika penerima tidak memiliki Dompet Privat.

    <Info>
      Sebaiknya beri label transaksi sebagai penarikan di UI agar pengguna tidak secara tidak sengaja menarik dana ke saldo publik.
    </Info>

    | Bidang               | Visibilitas | Alasan                                                             |
    | -------------------- | ----------- | ------------------------------------------------------------------ |
    | Aset                 | Privat      | Aset dienkripsi secara on-chain                                    |
    | Jumlah               | Privat      | Jumlah yang ditransfer dienkripsi secara on-chain                  |
    | Dompet privat sumber | Publik      | Dalam Ring rahasia, dompet privat sumber terlihat secara on-chain. |
    | Penerima             | Publik      | Dalam Ring rahasia, penerima terlihat secara on-chain.             |

    <Card title="Private Transfer" icon="arrow-right-arrow-left" href="/docs/id/privacy/guides/transfer">
      Transfer secara privat ke saldo privat.
    </Card>

    ### Tarik ke Saldo Publik

    Penarikan dapat digunakan dengan dua cara:

    1. Sebagai opsi cadangan untuk transfer privat kepada penerima yang tidak memiliki dompet privat, atau
    2. Penarikan langsung ke akun token SPL publik.

    Untuk penarikan, sebaiknya berikan label yang jelas bahwa pengguna meninggalkan saldo privat, serupa dengan ekspor frasa seed atau kunci privat.

    | Bidang               | Visibilitas | Alasan                                                             |
    | -------------------- | ----------- | ------------------------------------------------------------------ |
    | Aset                 | Publik      | Aset terlihat secara on-chain                                      |
    | Jumlah               | Publik      | Jumlah yang ditarik terlihat secara on-chain                       |
    | Dompet privat sumber | Publik      | Dalam Ring rahasia, dompet privat sumber terlihat secara on-chain. |
    | Dompet publik tujuan | Publik      | Alamat dompet tujuan terlihat secara on-chain                      |
    | Saldo publik tujuan  | Publik      | Saldo publik yang dihasilkan terlihat secara on-chain              |
    | Sisa saldo privat    | Privat      | Sisa saldo dienkripsi secara on-chain                              |

    <Card title="Withdraw" icon="arrow-up-to-bracket" href="/docs/id/privacy/guides/withdraw">
      Tarik ke saldo kripto publik.
    </Card>
  </Step>
</Steps>

## Tidak menemukan yang Anda cari?

<Callout type="info">
  Hubungi kami! [Telegram](https://t.me/tilo_light) | [Email](mailto:sales@helius.xyz) | [Kontak](https://www.helius.dev/contact)
</Callout>
