Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Auditing a project

You have found a project that says it pays contributors with Dedalo. This chapter is how to check that from the outside, without asking the maintainer for anything.

Everything below runs on a clone. None of it needs a key, a token, an API, or the maintainer’s cooperation — which is the property that makes the claim worth anything.

1. Clone and verify the chain

git clone --filter=blob:none https://github.com/some/project
cd project
dedalo verify
head dedc6ddbbef5415e6dcbf805b60affd83c49
ok 4 entries hash to their recorded ids
ok 2 settled plans present and self-consistent

Each ledger entry names its parent and hashes over it, so an entry edited after the fact breaks every id after it and HEAD stops matching. A pass means the record you are reading is the record that was written.

A failure means one of three things: an entry was edited, an object is missing from the clone, or .dedalo/ was partly committed. All three are worth asking about.

2. Recompute a round

dedalo plan --amount 1000 --since af3141b5 --json | jq -r .id

Compare the id against the one in the ledger entry. If they match, the published round is exactly what this history and this config produce. If they do not, either the config changed after the round or the numbers did not come from here.

Note — use the same --since and the same amount the round used. Both are recorded in the ledger entry, so this is a lookup rather than a guess.

3. Read the policy

dedalo.toml is committed, and it is the whole policy. Four things to look at:

ReadAsk
[fees]Where does the money that is not paid to contributors go?
[wallets]Are these real, and does anybody say who controls them?
[attribution]Does the scoring match what the project says it rewards?
[git] ignore_emailsIs anybody excluded who should not be?

git log -p dedalo.toml shows every time the policy changed and who approved it. A funding policy that changes the round before a round is not necessarily wrong — but it is a thing to see rather than not see.

4. Look at who is not being paid

dedalo plan --amount 1000 --json | jq '.unresolved'

unresolved lists contributors who earned a share and have no wallet on file. A long list on a project that has run several rounds means people are earning and not being reached.

5. Check the money adds up

dedalo plan --amount 1000 --json |
  jq '[( .items[].amount | tonumber ), (.undistributed | tonumber)] | add == (.gross|tonumber)'

The code guarantees this and property tests hold it down. Checking it once yourself is how you find out that you understand the document rather than trusting the sentence that describes it.

What auditing this does not tell you

Being clear about the limits is the point of the exercise:

  • It does not tell you the money arrived. The ledger records what was planned and settled from Dedalo’s side. Whether a transaction was executed by the multisig, and whether contributors claimed, is a question for the chain.
  • It does not tell you the scoring is fair. It tells you the scoring is what the config says. Whether the config is fair is a judgement, and it is the project’s to make and yours to disagree with.
  • It does not audit the contract. The vault is unaudited and undeployed. See Funding from a multisig.
  • It does not verify identities. That a handle maps to a wallet is an assertion the maintainer made. Nothing checks that ada is the Ada you think.

For funders

If you are considering funding a project through Dedalo, the four checks above take about ten minutes and answer the question “does what they publish match what their repository produces”. That is a narrower question than “is this project worth funding”, and it is the one that can be answered mechanically.

The rest — whether the work is good, whether the split is fair, whether the maintainers are who they say — is the same judgement funding anything requires. Dedalo’s contribution is removing the part that used to require trust and can instead be arithmetic.