Bankhaus

Company accounts

A board, not a wallet.

A company does not hand its money to one person. A Bankhaus board is an account with n members and a threshold k: it holds the sealed balance, owns the agents, approves their queue, and does anything only when k members have signed. A signed call is the proposal, the nonce makes it single-use, the deadline lets it expire. Anyone holding the signatures may submit it; the chain sees one sender.

  • k of n, EIP-712 signatures, no proposal storage, no admin
  • The board changes its own members and threshold only by a signed call to itself
  • Sealed transfers from the board carry the same proof as any other; the view key is shared by the members
one proposal, start to finish

board acme.bankhaus · gwen, atlas, orbis · 2 to sign

gwen proposes: approve queued payment #3 of agent #1

signs the call: to, data, nonce 7, deadline 24 h

atlas signs the same call

anyone Board.exec(to, data, deadline, [sig_atlas, sig_gwen])

two members, both on the board, in address order, nonce 7: runs

the chain Executed(7, AgentController, …) from acme.bankhaus

no proposal on chainsingle-use nonceexpires

Try one

Three members, two to sign.

Open a board for acme with gwen, atlas and orbis, threshold two. Propose a sealed payment as gwen. Sign as atlas: at the second signature the call runs, the proof is built with the board's shared view key and the money moves from the board's balance. One signature alone moves nothing.

  • A signed call is the proposal; k signatures execute it
  • The board owns the balance, the agents and their queue
  • The chain sees one sender, the board; never which members signed what
board

Open the board and its proposals appear here: what, who signed, and whether it ran.

What a board can do

01

Hold and pay

A sealed balance of its own. Deposits, sealed transfers, multi-path, hidden recipients: every call the house offers, behind k signatures.

02

Run agents

The board is the agents' owner. It signs mandates, funds vaults, approves or rejects what the queue holds. One compromised member cannot release a payment alone.

03

Govern itself

Members and threshold change only by a signed call to the board itself. There is no admin key and nothing the factory can do after opening it.

On chain

BoardFactory.open(members, threshold, label)          → a Board
Board.exec(to, value, data, deadline, signatures[])   // ≥ threshold members, address order
Board.digest(to, value, data, nonce, deadline)        // what members sign (EIP-712)
Board.setMembers(members, threshold)                  // only via exec

BoardFactory 0xebea52a8…6955be ↗ on Robinhood Chain

From the terminal, an agent, your code

bankhaus board open acme --members gwen,atlas,orbis --threshold 2
bankhaus board propose <board> approve 1 3 > proposal.txt     # a signed call
bankhaus board sign proposal.txt                              # another member
bankhaus board exec proposal.txt                              # anyone, once k signed
board_propose · board_sign · board_exec · board_status        # bankhaus-mcp

Proposals travel as text between members: chat, email, a ticket. Nothing of them touches the chain until the last signature.