Meridian
Brokers & accounts

The token is the key.

A Broker is an ERC-721. Its account is an ERC-6551 contract that treats the token's current owner as its only authority. Understanding that one relationship explains everything else in the protocol.

The pair

Two things exist for every Broker: the token, which is what you hold and trade, and the account, which is what actually holds the portfolio. They are permanently bound. A Broker cannot be pointed at a different account, and an account cannot be reassigned to a different Broker.

The Broker

An ERC-721 token. Carries the license tier, the distribution weight and any unclaimed accrual. This is the thing that moves.

The account

An ERC-6551 contract at a deterministic address. Holds hStocks, ETH and other compatible tokens. This is the thing that stays.

A deterministic address

The account address is derived from five inputs: the registry, the account implementation, a salt, the chain id, the token contract and the token id. Nothing about it is stored or assigned, so it can be computed by anyone at any time, including before the account has any code.

Two consequences follow. An account can receive assets before it is deployed, because an address does not need code to hold a balance. And deployment is idempotent: calling createAccount against an already-deployed account returns the existing address instead of reverting.

Deployment only matters when the account needs to act — signing a stock desk purchase, for instance. Receiving assets never requires it.

Where authority comes from

The account has no private key and no admin role. When a call arrives it asks the token contract who currently owns the Broker, and it accepts the call only from that address:

function owner() view returns (address) {
    return IERC721(tokenContract).ownerOf(tokenId);
}

Because that lookup happens at call time rather than being cached at deployment, control follows the token automatically. A sale needs no migration step and the account never learns that a sale happened, which is why control transfers in the same block as the token.

What the account can do

The owner drives the account through a single entry point. execute takes a target, a value, a calldata payload and an operation type, and returns whatever the call returned:

function execute(address to, uint256 value, bytes calldata data, uint8 op)
    payable returns (bytes memory)

That is enough to buy an hStock, approve a token, or forward ETH — the account is a general purpose executor whose permission check happens to be an ownerOf call.

Limits worth knowing