Ann.sol is a full solution for distributing announcements cryptographically. It allows maintainers of token sales and DAOs to securely issue updates via a centralised, accessibly source.

Ann.sol only allows updates to be published after they've been audited by other parties. This ensures token sale contract addresses will never be replaced.

Ideally the announcer will have an ENS domain ready to go. Ideally they'd point the domain (or a subdomain, e.g. ann.cooltoken.eth) to their announcement contract.

The announcement contract accepts an IPFS hash (or arbitrary string, really) from the announcer (which is the owner). Before that announcement goes live, though, it must be approved by some of the auditors.

The auditors are set at the time of the contract creation and there is some minimum number required to release an announcement. The owner might set herself as the auditor (or some other accounts they control) - this is a Bad Idea (tm) in most cases. An exception might be at least 2 of 3 auditors required, where 1 auditor is an offline key held by the announcer, and 2 auditors are well known community members. Ideally the auditors are reasonably well known figures in the community and their role is to verify announcements are legitimate before they are published. Users should therefore be suspicious if the auditors are not publicly declared and confirmed. The verification process for the announcement can be done however they choose, such as over video chat, though they may also choose a more rigorous process. The idea is that this step, even if conducted in a very low effort manner, will prevent 99% of bad announcements getting through. (And, of course, it doesn't necessarily prevent the $5 wrench attack, but that's a topic for another day). Crucially, this is dependent on people and meaning, not just cryptography or the security of a web server.

Additionally, the auditors may choose to sound an alarm instead of giving the okay for any announcement. There is also a threshold for the number of alarms that must be triggered before an announcement is blacklisted.

If the announcement is an IPFS hash then the contents will be shown in the browser, otherwise the raw string will be shown.

Additionally, all config URLs are stored in js/1_config.js. If you download the repository and replace the URLs with local nodes you can use this site locally.

Finally: If you use a node with unlocked accounts this page will allow you to publish new announcements or audit announcements provided the account has the right permissions.

Open Source Stuff

Please see the /vendor folder for licenses.

Web3 is distributed under LGPL-3
js-ipfs-api is distributed under MIT
angularjs is distributed under MIT
ensutils is distributed under CC0-1.0
ramda is distributed under MIT
basscss is distributed under MIT
moment.js is distributed under MIT

Enter an ENS domain (or a raw address) here supporting the Ann.sol interface to begin:

  • Examples:
  • ann-sol.eth (announcements for Ann.sol, Mainnet)
  • 0xbf74cC2839b4B639062E37b6Ea53F3ed7964132c (ann-sol.eth address, Mainnet)
  • testann.test (Ropsten)
  • 0x88505b6BCe01ad9efA39AF57d3466739b3b04A12 (Ropsten)
  • 0xFDB130F24Cd1A5A6dF0010fff3C385E2Eb710f10 (Ropsten)
  • 0xbf74cC2839b4B639062E37b6Ea53F3ed7964132c (Mainnet)



Hosted via IPFS ({{annObj.rawMsg}}) Raw String in Blockchain

No announcements.



No pending announcements.



No pending announcements.

Address: {{annsol.address}}

Total Announcements: {{annsol.nMsg}}
Pending Announcements: {{ annsol.getNPending() }}
Alarmed Announcements: {{ annsol.getNAlarms() }}
Owner: {{annsol.owner}}
Auditors: {{ annsol.auditors.join(', ') }}

Create Announcement

Audit Announcement

Create new Ann.sol contract.

This will create a new Ann.sol instance owned by {{annsol.fromAddr}}. Please put ALL auditor addresses in below, separated by commas.

Web3 URL: