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
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
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
Open the board and its proposals appear here: what, who signed, and whether it ran.
What a board can do
Hold and pay
A sealed balance of its own. Deposits, sealed transfers, multi-path, hidden recipients: every call the house offers, behind k signatures.
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.
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.