# Accounts

Every account can be accessed through two types:

* As a **Public Account** with the type `PublicAccount`, which represents the publicly available portion of an account.

  ```
  struct PublicAccount {

      let address: Address

      // Storage operations

      fun getCapability<T>(_ path: Path): Capability<T>?
      fun getLinkTarget(_ path: Path): Path?
  }
  ```

  Any code can get the `PublicAccount` for an account address using the built-in `getAccount` function:

  ```
  fun getAccount(_ address: Address): PublicAccount
  ```
* As an **Authorized Account** with type `AuthAccount`, which represents the authorized portion of an account.

  Access to an `AuthAccount` means having full access to its storage, public keys, and code.

  Only signed transactions can get the `AuthAccount` for an account. For each script signer of the transaction, the corresponding `AuthAccount` is passed to the `prepare` phase of the transaction.

  ```
  struct AuthAccount {

      let address: Address

      // Contract code

      fun setCode(_ code: [UInt8], ... contractInitializerArguments)

      // Key management

      fun addPublicKey(_ publicKey: [UInt8])
      fun removePublicKey(_ index: Int)

      // Storage operations

      fun save<T>(_ value: T, to: Path)
      fun load<T>(from: Path): T?
      fun copy<T: AnyStruct>(from: Path): T?

      fun borrow<T: &Any>(from: Path): T?

      fun link<T: &Any>(_ newCapabilityPath: Path, target: Path): Capability<T>?
      fun getLinkTarget(_ path: Path): Path?
      fun unlink(_ path: Path)

      fun getCapability<T: &Any>(_ path Path): Capability<T>?
  }
  ```
