A canister wallet, dao builder, and multi-sig: Axon v2

ICDevs is extremely excited to push out an update to Axon that enables it to be an on-chain wallet, DAO builder, Canister Deployer, or multi-sig wallet.

Axon was an early IC dapp that helped users manage neurons while providing basic multi-sig and DAO functionality. More than a year later @wang 's foundation is one of the premier dapps and Motoko implementations built for the IC.

@3oltan, and @aiv have added a number of features with a bit of help from myself. DFINITY funded the bounty Assigned: ICDevs.org Bounty 2 - Add generic DAO functions and interface to Axon. Some of this work was funded by Origyn Foundation as well.

Each Axon that is created is its own canister that can hold tokens and/or call other canister via a DAO based framework

User start by visiting the Axon Dashboard:

This will list your different axons. Some can be public and some can be private. You can deploy your own AXON Controller canister and make it so that only you can approve new axons. It can be like your own little wallet of wallets.

You can create a new axon:
image

Most features can be changed later so this is not a set of decisions to be stressed over. Each new Axon does require transferring 1T cycles to a new canister, so make sure you’ve loaded it up.

Set up your parameters:

For example, if this is a 2 of 3 multi-sig you might add the three principals, decide who can propose, give each user 1 token and restrict token transfer. This way signers can’t transfer their tokens.

Once created you’ll see your new axon:

This is a 1 of 2 multisig. All of the old Axon neuron management features are still there, but we’ve added the ability to propose calling other canisters from your Axon. This means you can send tokens to the account/principal of the axon and then send them out later.

Clicking “Canister Command” will open the canister command dialog:

The above command will send 1 ICP to the ICDevs Community Fund. (Cool features like named canisters would be a cool feature to add in a future bounty don’t you think?)

Each Propsal will allow users to vote on it as an open proposal. Once you hit quorum and passing threshold the command will be called by your axon. In this proposal I sent some ICP to the Community fund that I had previously sent to the axon:

You can see the corresponding transaction here: ICSCAN

We’ve also added Burning tokens and Motion proposals:

image

Here we do a motion to declare @bob11 Sheriff of the DAO. This motion doesn’t execute code and is just a ‘poll’.

Here is the full feature set of what we have released for v2.

Add the following features to the back end of axon:

  • Added an Axon level “manage axon” option that is a “Motion”. If this motion passes or fails, there is no action taken, it iss just recorded as part of the app. The Motion has a URL Field and a Text Field.
  • Added an administrator role that can be used to limit the ability to create new axons. (we will be deploying a new instance and only ICDevs will be able to create axons on our server…this is due to cycle issues with the public instance…others can do the same)
  • Added the ability for a proposer to burn a members token.
  • Added “the ability for a proposer to burn a member’s token” as a flag on set policy.
  • Added the ability for transfers of governance tokens to be restricted.
  • Added “the ability to restrict token transfers” as a flag on set policy.
  • Added a “command” proposal that lets a proposer suggest calling any function on the IC. Once approved, the function is called.
  • Can update the master of the axon(maybe event to one of your proxies to “blackhole” to your dao.)
  • Update the axon user interface(a next.js app)

Added the new flags to the Manage Neuron dialog

  • Added a burn token button and function that is only available to a proposer
  • Removed the transfer Added a burn token button and function that is only available to a proposer
  • Removed the transfer button on the ledger if restricted
  • Added a screen to view a motion
  • updated the logo and theme to focus on ICDevs.org powered by Axon - This is configurable for other organizations - see axon_ui readme
  • added an about link that links to an anchor at the bottom of the page where we can add informational html to the page.
  • added the call_raw functionality to allow a proposal that calls a function with a payload.
  • added the command interface.button on the ledger if restricted
  • Added a screen to view a motion
  • updated the logo and theme to focus on ICDevs.org powered by Axon - This is configurable for other organizations - see axon_ui readme
  • added an about link that links to an anchor at the bottom of the page where we can add informational html to the page.
  • added the call_raw functionality to allow a proposal that calls a function with a payload.
  • added the command interface.

Unfortunately the Ledger for each axon is currently a very limited token. In the future we’d love to directly incorporate ICRC-1 into the proxy so that each proxy would get is own ICRC1 token out of the box. Watch the Skies!

There are also some other improvements that would help with performance and scalability that we’ll be looking at in the future as well as some UI improvements for calling functions and understanding what has been called.

If you want a feature, suggest it at Issues · icdevs/axon · GitHub

We also liberally accept Pull Requests. The project is MIT Licensed, so use it as you see fit.

The back end is motoko and the front end is next.js.

If you would like to test it out you can clone the repo and deploy your own instance. It generally works locally, but there are some hang up with auto loading .did files. If you don’t like the ICDevs theming, I believe there are instructions for swapping out the log and changing the CSS to a theme of your liking.

If you don’t want to deploy your own, sent 1 ICP(each Axon takes 1T cycles…I’ll put any leftover into a donation for ICDevs) to 93a3506e08e88e1f65f85990451038f7a232b6f860ee706b42cc9edec96eecee and Ping me with the Name you want for you axon and your principal. I’ll set you up with a basic single signer and you can configure it however you want using the managed functionality after that. It will be located at https://77i6o-oqaaa-aaaag-qbm6q-cai.ic0.app/ (trying to get axon.icdevs.org pointed there).

We’ll be relaunching the ICDevs developer advisory and board process so that we can formally accept and vote on thing on a public Axon.

20 Likes

Can we get a list of production canister ids so we can inspect their candid interface?

3 Likes

The Axon Controler: DFINITY Canister Candid UI
The Axon Proxy(the wallet): DFINITY Canister Candid UI

3 Likes

Just curious, why not ICRC3? or is that implied by the ICRC1?

1 Like

I’d imagine that would be added as well…it is still in specification.

1 Like

wow this is really huge, I’ve been looking for a multisign wallet for a long time.
Also, easy to understand interface, will definitely be a major testing ground for next bootcamp.

Can’t wait for named canisters, ICRC Tokens and further development

thanks for the contribution, keep it up!

4 Likes

Axon v2.0.1 is now on GitHub - icdevs/axon: Neuron management canister.

This release allows you to send cycles to your canister calls from your proxy wallet. (So now you can deploy canisters via vote). Also, you can select a set of minters if you want other contracts to control your token supply. Those canisters can mint/burn.

v2.0.1

  • Fixed Bug that would not allow execution if not immediate.

  • Allowed step on percentage up to .000001

  • Fixed a bug where anyone could update the canister settings of a child axon.

  • Added a note and cycles to Canister calls

  • Added the ability to upgrade proxies via upgrade pathway.

  • Added migration framework

  • Added Ability to have minting principals so contracts can control supply

3 Likes

Is it possible for this multi-sig wallet to create a neuron with Axon and do voting? If not yet, is this planned for the future?

It can control a blackholed Neuron trustlessly. You need to follow How to create a decentralized community neuron and set the proxy axon created as the hotkey. But I don’t think hotkeys can spawn maturity, so this might not work for something where you want to pay out maturity.

3 Likes

v2.1.0

  • moved system of record for balances to Proxy canister

  • added ICRC-1 to Proxy Canister

  • added mint_batch and burn_batch to axon for large scale burning/minting - warning - will be processed in series with awaits between each burn/mint batch of 10 - return order not guaranteed

hi, i was getting data (a daily json file) from the orginal axon.ooo

what happened to it? is it possible for me to get that file generated again?

specifically i was using https://axon.ooo/api/axon/2

so i would need to create a new axon right? the API is working the same as before?

I’ve tried to create an axon and got this error:

Call was rejected: Request ID: 47e82f9feaed265a6a818960a2b6b028d03de92b3eba034883784cd785dfdf02 Reject code: Reject text: Canister vq3jg-tiaaa-aaaao-ag2uq-cai trapped explicitly: assertion failed at Axon.mo:534.5-534.52

i was getting a json file before in this format, is it possible to get this again from this new system or not?

{“neurons”:[{“id”:[{“id”:“XXXXXX”}],“controller”:[“XXXXXXX”],“kyc_verified”:true,“not_for_profit”:false,“maturity_e8s_equivalent”:“0”,“cached_neuron_stake_e8s”:“0”,“created_timestamp_seconds”:“1647482062”,“aging_since_timestamp_seconds”:“18446744073709551615”,“hot_keys”:[“XXXXXX”,“XXXXXX”],“account”:“XXXXXX”,“dissolve_state”:[{“WhenDissolvedTimestampSeconds”:“1648087255”}],“followees”:[[4,{“followees”:[{“id”:“XXXXXX”}]}],[1,{“followees”:[{“id”:“XXXXXX”}]}],[14,{“followees”:[{“id”:“XXXXXX”}]}],[0,{“followees”:[{“id”:“XXXXXX”}]}]],“neuron_fees_e8s”:“0”,“transfer”:}, …