Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Instruction Reference

Pre-Alpha Disclaimer: This is an early pre-alpha release for exploring the SDK and starting development only. There is no real encryption — all data is completely public and stored as plaintext on-chain. Do not submit any sensitive or real data. Encryption keys and the trust model are not final; do not rely on any encryption guarantees or key material until mainnet. All interfaces, APIs, and data formats are subject to change without notice. The Solana program and all on-chain data will be wiped periodically and everything will be deleted when we transition to Encrypt Alpha 1. This software is provided “as is” without warranty of any kind; use is entirely at your own risk and dWallet Labs assumes no liability for any damages arising from its use.

All 22 instructions in the Encrypt Solana program. The first byte of instruction data is the discriminator.

Instruction Groups

GroupDisc RangeInstructions
Setup0initialize
Executor1–6create_input_ciphertext, create_plaintext_ciphertext, commit_ciphertext, execute_graph, register_graph, execute_registered_graph
Ownership7–9transfer_ciphertext, copy_ciphertext, make_public
Gateway10–12request_decryption, respond_decryption, close_decryption_request
Fees13–18create_deposit, top_up, withdraw, update_config_fees, reimburse, request_withdraw
Authority19–21add_authority, remove_authority, register_network_encryption_key
Event228emit_event

Setup

initialize (disc 0)

One-time program initialization. Creates the EncryptConfig and initial Authority PDAs.

Accounts:

#AccountWSDescription
0configyesnoEncryptConfig PDA (must be empty)
1authority_pdayesnoAuthority PDA (must be empty)
2initializernoyesInitial authority signer
3payeryesyesRent payer
4system_programnonoSystem program

Data (2 bytes): config_bump(1) | authority_bump(1)


Executor

create_input_ciphertext (disc 1)

Authority-driven: creates a verified ciphertext from off-chain encrypted data + ZK proof. Status = VERIFIED immediately.

Accounts:

#AccountWSDescription
0authority_pdanonoAuthority PDA
1signernoyesAuthority signer
2confignonoEncryptConfig
3deposityesnoEncryptDeposit (fee source)
4ciphertextyesnoNew Ciphertext account (must be empty)
5creatornonoWho gets authorized
6network_encryption_keynonoNetworkEncryptionKey PDA
7payeryesyesRent payer
8system_programnonoSystem program
9event_authoritynonoEvent authority PDA
10programnonoEncrypt program

Data (33 bytes): fhe_type(1) | ciphertext_digest(32)


create_plaintext_ciphertext (disc 2)

User-signed: creates a ciphertext from a plaintext value. The executor encrypts off-chain and commits later. Status = PENDING.

Supports both signer and CPI (program) callers. CPI path inserts cpi_authority at position 4.

Accounts (signer path):

#AccountWSDescription
0confignonoEncryptConfig
1deposityesnoEncryptDeposit
2ciphertextyesnoNew Ciphertext account (must be empty)
3creatornoyesSigner (gets authorized)
4network_encryption_keynonoNetworkEncryptionKey PDA
5payeryesyesRent payer
6system_programnonoSystem program
7event_authoritynonoEvent authority PDA
8programnonoEncrypt program

Accounts (CPI path): Same as above but cpi_authority is inserted at position 4, shifting positions 4–8 to 5–9.

Data (1+ bytes): fhe_type(1) | [plaintext_bytes(N)]


commit_ciphertext (disc 3)

Authority writes the ciphertext digest after off-chain FHE evaluation. Sets status from PENDING to VERIFIED.

Accounts:

#AccountWSDescription
0authority_pdanonoAuthority PDA
1signernoyesAuthority signer
2ciphertextyesnoCiphertext account
3event_authoritynonoEvent authority PDA
4programnonoEncrypt program

Data (32 bytes): ciphertext_digest(32)


execute_graph (disc 4)

Execute a computation graph. Creates/updates output ciphertext accounts. Emits GraphExecuted event.

Supports both signer and CPI callers. CPI path inserts cpi_authority at position 3.

Accounts (signer path):

#AccountWSDescription
0confignonoEncryptConfig
1deposityesnoEncryptDeposit
2callernoyesSigner
3network_encryption_keynonoNetworkEncryptionKey PDA
4payeryesyesRent payer
5event_authoritynonoEvent authority PDA
6programnonoEncrypt program
7..7+Ninput ciphertextsnonoInput ciphertext accounts
7+N..7+N+Moutput ciphertextsyesnoOutput ciphertext accounts

Accounts (CPI path): cpi_authority at position 3, remaining shifted by 1. Fixed accounts = 8 instead of 7.

Data: graph_data_len(2) | graph_data(N) | num_inputs(2)


register_graph (disc 5)

Register a reusable computation graph on-chain. Creates a RegisteredGraph PDA.

Accounts:

#AccountWSDescription
0graph_pdayesnoRegisteredGraph PDA (must be empty)
1registrarnoyesSigner
2payeryesyesRent payer
3system_programnonoSystem program

Data (35+ bytes): bump(1) | graph_hash(32) | graph_data_len(2) | graph_data(N)


execute_registered_graph (disc 6)

Execute a previously registered graph. Uses the on-chain graph data (no need to re-send).

Supports both signer and CPI callers.

Accounts (signer path):

#AccountWSDescription
0confignonoEncryptConfig
1deposityesnoEncryptDeposit
2graph_pdanonoRegisteredGraph PDA
3callernoyesSigner
4network_encryption_keynonoNetworkEncryptionKey PDA
5payeryesyesRent payer
6event_authoritynonoEvent authority PDA
7programnonoEncrypt program
8+remainingvariesnoInput + output ciphertexts

Accounts (CPI path): cpi_authority at position 4, fixed = 9.

Data (2 bytes): num_inputs(2)


Ownership

transfer_ciphertext (disc 7)

Transfer authorization to a new party by updating the authorized field.

Accounts (signer path):

#AccountWSDescription
0ciphertextyesnoCiphertext account
1current_authorizednoyesCurrent authorized signer
2new_authorizednonoNew authorized party

Accounts (CPI path): cpi_authority at position 2, new_authorized at position 3.

Data: none


copy_ciphertext (disc 8)

Create a copy of a ciphertext with a different authorized party.

Accounts (signer path):

#AccountWSDescription
0source_ciphertextnonoSource Ciphertext
1new_ciphertextyesnoNew Ciphertext account (must be empty)
2current_authorizednoyesCurrent authorized signer
3new_authorizednonoNew authorized party
4payeryesyesRent payer
5system_programnonoSystem program

Accounts (CPI path): cpi_authority at position 3, remaining shifted.

Data (1 byte): transient(1) (0 = permanent/rent-exempt, 1 = transient/0 lamports)


make_public (disc 9)

Set authorized to zero (public). Irreversible and idempotent.

Accounts (signer path):

#AccountWSDescription
0ciphertextyesnoCiphertext account
1callernoyesCurrent authorized signer

Accounts (CPI path): cpi_authority at position 2.

Data (32 bytes): ciphertext_id(32)


Gateway

request_decryption (disc 10)

Request decryption of a ciphertext. Creates a DecryptionRequest account and stores a digest snapshot.

Supports both signer and CPI callers.

Accounts (signer path):

#AccountWSDescription
0confignonoEncryptConfig
1deposityesnoEncryptDeposit
2request_acctyesnoDecryptionRequest account (must be empty)
3callernoyesSigner
4ciphertextnonoCiphertext to decrypt
5payeryesyesRent payer
6system_programnonoSystem program
7event_authoritynonoEvent authority PDA
8programnonoEncrypt program

Accounts (CPI path): cpi_authority at position 4, remaining shifted. Fixed = 10.

Data: none


respond_decryption (disc 11)

Authority writes the decrypted plaintext bytes into the DecryptionRequest account.

Accounts:

#AccountWSDescription
0authority_pdanonoAuthority PDA
1request_acctyesnoDecryptionRequest account
2signernoyesAuthority signer
3event_authoritynonoEvent authority PDA
4programnonoEncrypt program

Data (variable): plaintext bytes chunk to write


close_decryption_request (disc 12)

Close a decryption request and reclaim rent. Only the original requester can close.

Accounts (signer path):

#AccountWSDescription
0requestyesnoDecryptionRequest account
1callernoyesRequester signer
2destinationyesnoRent destination

Accounts (CPI path): cpi_authority at position 2, destination at position 3.

Data: none


Fees

create_deposit (disc 13)

Create an EncryptDeposit PDA for a user. Transfers initial ENC tokens and SOL gas.

Accounts:

#AccountWSDescription
0deposityesnoEncryptDeposit PDA (must be empty)
1confignonoEncryptConfig
2usernoyesDeposit owner
3payeryesyesRent payer
4user_atayesnoUser’s ENC token account
5vaultyesnoProgram’s ENC vault token account
6token_programnonoSPL Token program
7system_programnonoSystem program

Data (17 bytes): bump(1) | initial_enc_amount(8) | initial_gas_amount(8)


top_up (disc 14)

Add ENC tokens and/or SOL gas to an existing deposit.

Accounts:

#AccountWSDescription
0deposityesnoEncryptDeposit PDA
1confignonoEncryptConfig
2usernoyesDeposit owner
3user_atayesnoUser’s ENC token account
4vaultyesnoENC vault
5token_programnonoSPL Token program
6system_programnonoSystem program

Data (16 bytes): enc_amount(8) | gas_amount(8)


withdraw (disc 15)

Execute a pending withdrawal. Available when current_epoch >= withdrawal_epoch.

Accounts:

#AccountWSDescription
0deposityesnoEncryptDeposit PDA
1confignonoEncryptConfig
2usernoyesDeposit owner
3user_atayesnoUser’s ENC token account
4vaultyesnoENC vault
5vault_authoritynonoVault authority PDA
6token_programnonoSPL Token program

Data: none


update_config_fees (disc 16)

Authority updates the fee schedule in EncryptConfig.

Accounts:

#AccountWSDescription
0configyesnoEncryptConfig PDA
1authority_pdanonoAuthority PDA
2signernoyesAuthority signer

Data (58 bytes): enc_per_input(8) | enc_per_output(8) | max_enc_per_op(8) | max_ops_per_graph(2) | gas_base(8) | gas_per_input(8) | gas_per_output(8) | gas_per_byte(8)


reimburse (disc 17)

Authority credits back the per-op max-charge overcharge after computing actual costs.

Accounts:

#AccountWSDescription
0authority_pdanonoAuthority PDA
1signernoyesAuthority signer
2deposityesnoEncryptDeposit PDA

Data (16 bytes): enc_amount(8) | gas_amount(8)


request_withdraw (disc 18)

Set pending withdrawal amounts. Actual withdrawal available next epoch.

Accounts:

#AccountWSDescription
0deposityesnoEncryptDeposit PDA
1confignonoEncryptConfig
2usernoyesDeposit owner

Data (16 bytes): enc_amount(8) | gas_amount(8)


Authority

add_authority (disc 19)

Add a new authority. Must be signed by an existing authority.

Accounts:

#AccountWSDescription
0new_authyesnoNew Authority PDA (must be empty)
1existing_authnonoExisting Authority PDA
2signernoyesExisting authority signer
3payeryesyesRent payer
4system_programnonoSystem program

Data (33 bytes): bump(1) | new_pubkey(32)


remove_authority (disc 20)

Deactivate an authority.

Accounts:

#AccountWSDescription
0target_authyesnoAuthority PDA to deactivate
1signer_authnonoSigner’s Authority PDA
2signernoyesAuthority signer

Data: none


register_network_encryption_key (disc 21)

Register a new FHE network encryption public key.

Accounts:

#AccountWSDescription
0network_encryption_key_pdayesnoNetworkEncryptionKey PDA (must be empty)
1authority_pdanonoAuthority PDA
2signernoyesAuthority signer
3payeryesyesRent payer
4system_programnonoSystem program

Data (33 bytes): bump(1) | network_public_key(32)


Event

emit_event (disc 228)

Self-CPI event handler. Called internally by the Encrypt program to emit Anchor-compatible events. Not called by external programs.

Accounts:

#AccountWSDescription
0event_authoritynonoEvent authority PDA (must match)
1programnonoEncrypt program

Data: Event payload (prefixed with EVENT_IX_TAG_LE)