Skip to content

account_create_ephemeral

View as Markdown

The account_create_ephemeral syscall creates a temporary account that exists only for the duration of the current transaction. Ephemeral accounts do not require state proofs and are automatically cleaned up at transaction end.

Code: 0x05 (TN_SYSCALL_CODE_ACCOUNT_CREATE_EPHEMERAL)

ulong tsys_account_create_ephemeral( ulong account_idx,
uchar const seed[TN_SEED_SIZE] );

account_idx · ulong · required

Index of the account slot to create. Must be writable in the transaction and currently non-existent.

seed · uchar const[TN_SEED_SIZE] · required

Fixed 32-byte seed used for address derivation.

Returns a syscall result code:

Success · ulong

  • TN_VM_SYSCALL_SUCCESS (0) - Ephemeral account created successfully

Error Codes · ulong

  • TN_VM_ERR_SYSCALL_INVALID_ACCOUNT_INDEX (-8) - Account index out of bounds
  • TN_VM_ERR_SYSCALL_ACCOUNT_NOT_WRITABLE (-10) - Account not writable in transaction
  • TN_VM_ERR_SYSCALL_ACCOUNT_ALREADY_EXISTS (-15) - Account already exists
  • TN_VM_ERR_SYSCALL_INVALID_ADDRESS (-22) - Invalid virtual address for seed
  • TN_VM_ERR_SYSCALL_BAD_ACCOUNT_ADDRESS (-16) - Computed address doesn’t match expected
  • TN_VM_ERR_SYSCALL_STATE_BYTES_ADDED_OVERFLOW (-47) - State bytes counter overflow during activation
  • Base cost: TN_VM_SYSCALL_BASE_COST (512 units)
  • Seed cost: Additional units equal to TN_SEED_SIZE bytes
  • Metadata cost: Additional units equal to sizeof(tsdk_account_meta_t)
  • Total formula: base_cost + TN_SEED_SIZE + sizeof(tsdk_account_meta_t)
  • Note: No proof cost since ephemeral accounts don’t require state proofs
  • Page usage: No direct page allocation (account data starts at size 0)
  • Metadata pages: Allocates pages for account metadata structure
  • Cleanup: All allocated pages are automatically freed at transaction end
  • GASC (Global Activated State Counter): Incremented by TSDK_ACCOUNT_META_FOOTPRINT bytes
  • Purpose: Tracks activated state for the ephemeral account creation in the global state counter
  • Overflow protection: Returns TN_VM_ERR_SYSCALL_STATE_BYTES_ADDED_OVERFLOW if counter would overflow
  • Account creation: Creates a new account with EPHEMERAL flag set
  • Ownership: Sets the current program as the account owner
  • Automatic cleanup: Account will be deleted at transaction end

The ephemeral account address is computed as:

SHA256(current_program_pubkey || is_ephemeral(1) || seed)
  • No state proof required (faster creation)
  • Account exists only during transaction execution
  • Cannot be used in balance transfers (ephemeral accounts rejected)
  • Automatically deleted when transaction completes
  • Perfect for temporary storage and intermediate computations
  • The computed address must match the transaction’s expected address
  • Seed must be exactly TN_SEED_SIZE (32 bytes)
FeaturePermanent AccountEphemeral Account
State proofRequiredNot required
LifetimePersists after transactionTransaction only
Balance transfersAllowedForbidden
Creation costHigher (includes proof)Lower (no proof)
Address derivationis_ephemeral = 0is_ephemeral = 1
#include <thru-sdk/c/tn_sdk_syscall.h>
#include <string.h>
// Create ephemeral account for temporary storage
ulong account_idx = 3;
uchar seed[TN_SEED_SIZE] = { 0 };
memcpy( seed, "temp_storage", 12 );
ulong result = tsys_account_create_ephemeral( account_idx, seed );
if (result == TN_VM_SYSCALL_SUCCESS) {
// Ephemeral account created successfully
// Account will be automatically deleted at transaction end
// Can be used for temporary data storage
// Cannot participate in balance transfers
}