COMPAX

THE GROUP WALLET

Money a group holds
without a treasurer

A wallet with no owner. Every member keeps their own key on their own device, and the money moves when enough of them have signed — any two of three, any five of nine, whatever the group set when it made the wallet.

Nothing below is a construct of ours. Each chain already has a way for several people to hold one address, and this uses that way: P2WSH on Bitcoin, Safe on the EVM chains, the account’s own permission system on Tron, Squads V4 on Solana. The addresses on the pages that follow are the deployments this application talks to.

HOW IT WORKS

Four steps, and only
the last one is on a chain

A payment is a conversation before it is a transaction. That is not a metaphor here — it happens in the thread, as messages, and the chain sees it only once the group has agreed.

  1. 1

    The group fixes the rule

    Who signs, and how many of them it takes. It is written into the wallet at the moment it is made, and it is on the chain rather than in this application.

    The rule is not edited afterwards here: a different rule is a different wallet, with its own address to fund and move to. Some chains would allow the change and this application does not make it, so the screen says so before it asks for the second tap.

  2. 2

    Somebody proposes a payment

    It arrives in the conversation as a message, from the person who made it, saying what it pays and to whom. Until it is signed it is a request and nothing else.

    The proposal is carried by the same encrypted group the chat uses, so the server carries it without reading it.

  3. 3

    Each signer signs on their own device

    Read it, tap once, and it is signed with a key that has never left the phone it was made on. Everybody sees the count move.

    No device ever holds a second person’s key, so there is no device whose loss hands anybody the wallet.

  4. 4

    At the threshold it goes to the chain

    The signatures are assembled and broadcast. What enforces the rule from there is the chain, not this application — which is the point of putting the rule there.

    If this application disappeared tomorrow, the wallet would still be a wallet and the rule would still hold.

FIVE CHAINS

What each chain calls
“several people, one address”

Five chains and four pieces of machinery — Ethereum and BNB Smart Chain are the same one. Bitcoin builds and finalises a transaction that carries every signature; the EVM chains keep a contract that counts them; Solana keeps the proposal on chain and approves against it; Tron writes the rule into the account itself. The group does the same thing on all of them, and underneath it is four different pieces of machinery.

Bitcoin

P2WSH multisig · BIP 67 · PSBT

A witness script that reads m of these n keys, and an address that is the hash of it. The keys are sorted lexicographically, so everybody who builds the script from the same set of keys arrives at the same address rather than at n! different ones.

The payment travels as a PSBT: one file that goes round the signers picking up signatures, and is finalised when it has enough.

Script
OP_m <key>… OP_n OP_CHECKMULTISIG
Signers
up to 15, threshold anywhere in between
Chain data
an Electrum server

Ethereum

Safe · canonical deployment

The contract most of the money held by groups on Ethereum already sits in. A proxy is made by the canonical factory and points at the canonical singleton; the owners and the threshold are set in the same call that makes it.

Nothing is forked and nothing is redeployed. The version is read off the contract rather than assumed, because a Safe made by somebody else is a Safe this can open.

Singleton
0x41675C099F32341bf84BFc5382aF534df5C7461a
Factory
0x4e1DCf7AD4e460CfD30791CCC4F9c8a4f820ec67
Batching
MultiSend — several moves, one approval

BNB Smart Chain

Safe · the same addresses

The same contracts at the same addresses. Safe’s deployments are deterministic across EVM chains, so there is nothing chain-specific to learn here and nothing chain-specific in the code either.

It is also why an account on Ethereum is the same account on BNB Smart Chain: one coin type, one key, two chains.

Contracts
identical to Ethereum’s, above
Coin type
60 — shared with Ethereum

Tron

Account permissions · no contract

Tron has the rule built into accounts. A permission carries a list of keys, a weight for each and a threshold, and it is written to the account itself — there is no contract to deploy and no contract to trust.

Weights mean the rule can be something other than counting heads: one key worth two votes, three keys worth one each.

Written by
AccountPermissionUpdate
Rule
weighted keys, one threshold
Note
the update replaces the list rather than amending it

Solana

Squads Protocol V4

The multisig program most of Solana’s treasuries use. The proposal is an account on chain: members approve against it, and it executes when the approvals reach the threshold.

The program id decides where every account of the wallet is derived, so it is pinned to the published deployment and a different one is refused rather than trusted.

Program
SQDS4ep65T869zMMBKyuUq6aD6EgTu8psMjkvj52pCf
Proposal
on chain, approved against

WHY STANDARD ONES

A wallet you can only open here
is a wallet somebody else owns

There is an easier way to build this: one contract of our own on every chain, one format of our own, one application that understands it. It would be less code and it would be worse, because the group’s money would then depend on this application continuing to exist.

What using the standard ones buys

Each of these is a consequence of the choice, not a feature that was added.

  • Audited by more people than us. Safe and Squads hold billions between them and have been looked at accordingly. P2WSH and Tron’s permissions are consensus rules.
  • Readable by other tools. The address is an ordinary Safe, an ordinary Squads multisig, an ordinary P2WSH address, an ordinary Tron permission — block explorers and the protocols’ own interfaces read them without knowing this application exists.
  • Nothing to migrate from. There is no proprietary format to be stuck in, so there is no moment later where leaving costs something.
  • The rule outlives us. The threshold is enforced by the chain. This application is where the group talks about the payment, not what permits it.

AUDITS

Read by people
who are not us

This is the argument for using each chain’s own multisig rather than writing one: the reports below exist, they were paid for by somebody else, and they are about exactly the contracts a wallet made here is made of. Every address and every program id on this page was checked against the projects’ own published deployment records while this section was written.

Tron

Account permissions · consensus, not a contract

none

The same again: the rule is a property of the account, enforced by the nodes rather than by code somebody deployed. There is no contract to audit because there is no contract.

  • Nothing to link, and that is the honest answer

An audit is a reading of a codebase at a commit, not a guarantee about the money in it — and none of these reports is about this application. They are about the contracts underneath it, which is exactly why they are worth more than a report we commissioned about ourselves would be.

BRINGING A PHRASE

Twenty-four words you
have used somewhere else

A recovery phrase is not one convention, it is several, and they disagree about the same thing: which element of the path moves when you ask for “account 2”. Every one of them is correct, and a phrase read under the wrong one shows a zero balance for money that is exactly one line of arithmetic away. So the convention is not guessed at — it is a setting, one per chain, and it offers a list of applications rather than a list of specifications. Money that looks missing is money at a path this app was not looking at.

Bitcoin

Native SegWit default

m/84'/0'/{account}'/0/0

  • Electrum
  • BlueWallet
  • Sparrow
  • Exodus

Address index

m/84'/0'/0'/0/{account}

  • Trust Wallet
  • Muun
  • Phoenix

Ethereum &amp; BNB Smart Chain

Address index default

m/44'/60'/0'/0/{account}

  • MetaMask
  • Rabby
  • Trust Wallet
  • Rainbow
  • Phantom

Hardened account

m/44'/60'/{account}'/0/0

  • Ledger Live
  • Trezor Suite
  • Exodus

Four elements

m/44'/60'/0'/{account}

  • MyEtherWallet (legacy)
  • Ledger (legacy)

Tron

Address index default

m/44'/195'/0'/0/{account}

  • TronLink
  • Trust Wallet

Hardened account

m/44'/195'/{account}'/0/0

  • Ledger Live
  • Trezor Suite

Solana

Four elements default

m/44'/501'/{account}'/0'

  • Phantom
  • Solflare
  • Backpack

Account only

m/44'/501'/{account}'

  • Ledger Live
  • Solflare (hardware)

Legacy

m/501'/{account}'/0/0

  • Sollet (legacy)

Bitcoin’s legacy and nested layouts are deliberately absent. The address builder derives native SegWit and nothing else, so a m/44'/0'/… here would produce a bc1… where every other wallet shows a 1… or a 3… — a string that looks right, belongs to your phrase, and is not the address anybody else reads off that path. A choice that quietly means something other than what it says is worse than no choice.

BRINGING A WALLET

Coming from somewhere else

Two ways in, and they are at different stages

Said plainly, because a page that describes what is planned in the same voice as what is built is a page you cannot use to decide anything.

  • Your recovery phrase — here now. Twenty-four words, and the question about which wallet you used them in. Every address the table above describes is derived on your device from the phrase and stored nowhere; an EVM account, a Tron account and a Solana account are the same address on every network of that chain.
  • A multisig that already exists — not yet. Reading one is done: the library behind this opens a Safe by address and reports its owners, threshold and version; it reads a Squads multisig’s members and threshold, a Tron permission’s signers and weights, and decodes a Bitcoin witness script back to its address, threshold and keys. What is not built is the screen that walks you through it and attaches it to a conversation. Until it is, this page will not pretend otherwise.

Nothing stops you in the meantime: a Safe or a Squads multisig you already have keeps working in the interface you made it in, because it was never anything other than a Safe or a Squads multisig.