# Bank

## Assets

```
scalar AssetID

struct Asset {
  asset: AssetID
  amount: Decimal
}
```

## Escrow Accounts

```
enum Escrow {
  ContinuousVesting(
    start_time DateTime,
    end_time
  )
  DelayedVesting()
  PeriodicVesting()
  ScriptEscrow(scipt ScriptID, params bytes)
}
```

## Transactions

### Send

```
tx Send(
  from Address,
  to Address,
  assets Asset*
)
```

### Burn

```
tx Burn(
  holder Address,
  assets Asset*
)
```

### Create Escrow

```
tx CreateEscrow(
  escrow Escrow,
  initialFunds Asset*,
  parties EscrowParty*
)

type EscrowParty {
  party: Address,
  role: uint32
} 
```

## Queries

```
query GetBalance(address Address, asset AssetID) Decimal
query GetSupply(asset AssetID) Decimal
query GetBurnedSupply(asset AssetID) Decimal)
```

## State

```
table AssetMetadata {
  asset: AssetID
  authority: bytes
  module: bytes
  name: string
  metadata: data.HashIRI?
  @primary_key(asset)
}

table AssetSupply {
  asset: AssetID
  liquid_supply: Decimal
  burned_supply: Decimal
  @primary_key(asset)
}

table AssetBalance {
  address: Address
  asset: AssetID
  balance: Decimal
  burned: Decimal
  @primary_key(address, asset)
  @index(address)
  @index(asset)
}

table EscrowAccount {
  address: Address
  escrow: Escow
}

table EscrowParty {
  escrow_account: Address
  party: Address
  role: uint32
  @primary_key(escrow_account, party)
  @index(escrow_account)
  @index(party)
}
```
