---
title: account_set_flags
description: Modifies account flags such as PROGRAM
source_url:
  html: https://thru.org/docs/spec/vm/syscalls/account_set_flags/
  md: https://thru.org/docs/spec/vm/syscalls/account_set_flags.md
---

# account_set_flags

## Overview

The `account_set_flags` syscall modifies specific flags on an account, such as marking it as a program account. Only certain flags can be modified.

## Syscall Code

**Code:** `0x0E` (`TN_SYSCALL_CODE_ACCOUNT_SET_FLAGS`)

## C SDK Function

```c
ulong tsys_account_set_flags(ushort account_idx, uchar flags);
```

## Arguments

**`account_idx` · *ushort* · **required****

Index of the account to modify. Must be writable by the current program.

**`flags` · *uchar* · **required****

New flags value. Only modifiable flags will be changed.

## Return Value

Returns a syscall result code:

**`Success` · *ulong***

- `TN_VM_SYSCALL_SUCCESS` (0) - Flags updated successfully

**`Error Codes` · *ulong***

- `TN_VM_ERR_SYSCALL_INVALID_ACCOUNT_INDEX` (-8) - Account index out of bounds
- `TN_VM_ERR_SYSCALL_ACCOUNT_DOES_NOT_EXIST` (-9) - Account does not exist
- `TN_VM_ERR_SYSCALL_ACCOUNT_NOT_WRITABLE` (-10) - Account not writable by current program
- `TN_VM_ERR_SYSCALL_INVALID_FLAGS` (-41) - Attempted to modify non-modifiable flags
- `TN_VM_ERR_SYSCALL_ACCOUNT_IS_NOT_PROGRAM` (-17) - Account data is not valid program bytecode (when setting PROGRAM flag)
- `TN_VM_ERR_SYSCALL_PROGRAM_IN_CALL_STACK` (-49) - Cannot unset PROGRAM flag while program is in the call stack

## Resource Consumption

### Compute Units

- **Base cost**: `TN_VM_SYSCALL_BASE_COST` (512 units)
- **Additional cost**: None
- **Total cost**: Fixed at 512 units regardless of flag changes

### Memory Pages

- **Page usage**: No direct page allocation
- **Metadata impact**: May trigger metadata page allocation if not already writable
- **Program validation**: Temporary memory usage when validating program bytecode

## Side Effects

- **Account flags**: Updates the account’s flag bits
- **Account metadata**: Makes account metadata writable if not already
- **Program validation**: Validates bytecode when setting PROGRAM flag
- **Write permissions**: May remove account writability when marking as program

## Modifiable Flags

Only certain flags can be modified:

**`TSDK_ACCOUNT_FLAG_PROGRAM` · *flag***

Marks the account as containing executable program bytecode. When setting this flag, the account data is validated as valid program bytecode.

## Flag Setting Behavior

### PROGRAM Flag

**Setting the flag:**

- Account data is validated as valid program bytecode
- Account is automatically made non-writable (security measure)
- Validation failure causes the syscall to fail

**Clearing the flag:**

- Cannot be cleared while the program is in the call stack (current program or any caller)
- Returns `TN_VM_ERR_SYSCALL_PROGRAM_IN_CALL_STACK` if program is executing
- Once cleared, account becomes a regular data account

## Usage Notes

- Only the account owner (program) can modify flags
- Attempts to modify non-modifiable flags result in an error
- If no flags actually change, the syscall succeeds immediately
- Program validation is performed when setting the PROGRAM flag
- Account must exist and be writable by the current program

## Security Considerations

- Setting the PROGRAM flag automatically removes account writability
- This prevents modification of executable code after deployment
- The PROGRAM flag cannot be cleared while the program is in the call stack
- This prevents a program from invalidating itself or its callers during execution

## Example

```c
#include <thru-sdk/c/tn_sdk_syscall.h>

// Mark account as a program (requires valid bytecode)
ushort account_idx = 3;
uchar current_flags = get_account_flags(account_idx);
uchar new_flags = current_flags | TSDK_ACCOUNT_FLAG_PROGRAM;

ulong result = tsys_account_set_flags(account_idx, new_flags);

if (result == TN_VM_SYSCALL_SUCCESS) {
    // Account is now marked as a program
    // Account has been made non-writable
    // Bytecode has been validated
}

// Remove program flag (make it a data account again)
new_flags = current_flags & ~TSDK_ACCOUNT_FLAG_PROGRAM;
result = tsys_account_set_flags(account_idx, new_flags);

// Attempt to modify non-modifiable flag (will fail)
uchar invalid_flags = current_flags | TSDK_ACCOUNT_FLAG_DELETED;  // Not modifiable
result = tsys_account_set_flags(account_idx, invalid_flags);
// Returns TN_VM_ERR_SYSCALL_INVALID_FLAGS
```
