Skip to content

Accounts and actions ​

Everything is an account ​

On PulseVM there are no separate "wallet" and "contract" address types — there is one primitive: the account. An account is a human-readable name (≤12 chars, a-z/1-5, e.g. acme.treasury), it holds permissions and balances, and it may also hold a contract. The same acme account can hold funds, be governed by multisig, and run code.

A contract lives on an account ​

You deploy a contract by setting its WASM and ABI onto an account (setcode / setabi, via the pulse.bios/pulse.system actions or pulse-cli). The account is the contract's identity — when the contract acts, it acts as that named account.

Actions ​

A contract exposes actions — named entry points with typed parameters. A transaction is a list of actions, executed atomically (all succeed or all roll back). For example, a token contract exposes transfer(from, to, quantity, memo); calling it is sending that action to the token account.

pulse-ts push-action pulse.token transfer \
  '{"from":"alice","to":"bob","quantity":"10.0000 SYS","memo":"hi"}' --actor alice

Each action carries one or more authorizations (actor@permission) that the chain enforces. Actions can also trigger further actions — see inline actions.

Why this matters ​

Named accounts + account-resident contracts are why authorization, recovery, and multisig are native rather than bolted on: they're properties of the account, not of a key or a wrapper contract. See Native by Design.