# How to Submit an NNS motion Proposal (WIP)

**URL:** <https://forum.dfinity.org/t/how-to-submit-an-nns-motion-proposal-wip/8498>\
**Category:** Developers\
**Created:** [November 10, 2021, 11:26pm UTC](https://forum.dfinity.org/t/how-to-submit-an-nns-motion-proposal-wip/8498 "2021-11-10T23:26:08Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![diegop](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/diegop/32/569_2.png) [@diegop](https://forum.dfinity.org/u/diegop)\
**Post date:** [November 10, 2021, 11:26pm UTC](https://forum.dfinity.org/t/how-to-submit-an-nns-motion-proposal-wip/8498/1 "2021-11-10T23:26:08Z")

</div>

I am working on the easy-to-follow version, but I thought I would at least put the basic steps for the more technical of you.

Caveat: these are my own personal notes and not very user-friendly.

# 1. Create a neuron with a dissolve delay and link itg to dfx (you do this step only once)

- I created this neuron using keysmith quill and dfx

a. Install the [keysmith](https://github.com/dfinity/keysmith):  
b. Create seed phrase: `$ keysmith generate -o seed.txt`  
c. Create private.pem: `$ keysmith private-key -o private.pem`  
d. Create Ledger account: `$ keysmith account -i 0`

## 1.1. Install that key into dfx and create an identity (in my case it was called “proposals”) on dfx:

a. `$ dfx identity import proposals private.pem`

- If you see “creating identity: proposals” in the terminal, this means it worked\*
- further reading on dfx identities: [World Computer | Internet Computer](https://smartcontracts.org/docs/developers-guide/cli-reference/dfx-identity.html)

## 1.2 Find the public IDs on [quill](https://github.com/dfinity/quill) and dfx to ensure the principals are the same

a. With quill installed, go to: `$ target/release/quill --pem-file private.pem public-ids`  
b. `$ dfx --identity proposals ledger account-id`

## 1.3 Send at least 1 ICP to the account in 1.2 (to create the neuron)

## 1.4 Now that your account has ICP, use quill to spawn a neuron

`$ target/release/quill --pem-file private.pem neuron-stake --name $NAME --amount $AMOUNT > message.json`  
`$ target/release/quill send message.json`

- this spawned neuron: `148885932052941245`

## 1.5 Increase neuron dissolve to at least 6 months with quill

- **One year: 31557600**  
`$ quill --pem-file private.pem neuron-manage 148885932052941245 --additional-dissolve-delay-seconds 31557600 > message.json`  
`$ target/release/quill send message.json`

- in my case, the neuron is `5241875388871980017`

# 2. Send a message to the governance canister using dfx’s ability to send messages (you do this every time you want to send a proposal):

\*Once I set up everything in step #1, I only do step #2 every time I want to create a motion proposal

- governance canister candid web UI: [DFINITY Canister Candid UI](https://a4gq6-oaaaa-aaaab-qaa4q-cai.raw.ic0.app/?id=rrkah-fqaaa-aaaaa-aaaaq-cai)

- method to use: **manage\_neuron**

- **dfx command template:**

`$ dfx --identity proposals canister --network ic --no-wallet call rrkah-fqaaa-aaaaa-aaaaq-cai manage_neuron '(record {id = null; command=opt variant {MakeProposal=record {url="XXXXXXXXXXXX"; action=opt variant {Motion=record {motion_text="XXXXXXXXXXXX"}}; summary="XXXXXXXXXXXX"}}; neuron_id_or_subaccount=opt variant {NeuronId=record {id=XXXXXXXXXXXX:nat64}}})'`

- **actual dfx command I used:**

`$ dfx --identity proposals canister --network ic --no-wallet call rrkah-fqaaa-aaaaa-aaaaq-cai manage_neuron '(record {id = null; command=opt variant {MakeProposal=record {url=""; title=”In the NNS Frontend dapp, add cycle_dao’s neuron (5967494994762486275) so people can follow cycle_dao”;action=opt variant {Motion=record {motion_text=""}}; summary=”As part of liquid democracy, neuron holders can choose to follow the voting choices of other neurons. This can be done manually, but a very common and consumer-friendly way is to use the ‘follow neuron’ functionality in the NNS Frontend dapp. To further decentralization, this proposal is to add cycle_dao’s neuron: 5967494994762486275.”}}; neuron_id_or_subaccount=opt variant {NeuronId=record {id=5241875388871980017:nat64}}})'`

---

<div class="post-metadata">

**Author:** ![diegop](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/diegop/32/569_2.png) [@diegop](https://forum.dfinity.org/u/diegop)\
**Post date:** [November 10, 2021, 11:27pm UTC](https://forum.dfinity.org/t/how-to-submit-an-nns-motion-proposal-wip/8498/2 "2021-11-10T23:27:56Z")

</div>

Caveat: careful with formatting mistakes from copy/paste in regards to " " characters

---

<div class="post-metadata">

**Author:** ![diegop](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/diegop/32/569_2.png) [@diegop](https://forum.dfinity.org/u/diegop)\
**Post date:** [November 10, 2021, 11:31pm UTC](https://forum.dfinity.org/t/how-to-submit-an-nns-motion-proposal-wip/8498/3 "2021-11-10T23:31:37Z")

</div>

This is the payload I used for this NNS Motion proposal: [Internet Computer Network Status](https://dashboard.internetcomputer.org/proposal/28713)

Food for thought: I did a lot of playing around with the Candid web UI to find the best way for me to get comfortable.

---

<div class="post-metadata">

**Author:** ![wpb](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/wpb/32/39944_2.png) [@wpb](https://forum.dfinity.org/u/wpb)\
**Post date:** [November 13, 2021, 4:23pm UTC](https://forum.dfinity.org/t/how-to-submit-an-nns-motion-proposal-wip/8498/4 "2021-11-13T16:23:24Z")

</div>

Is it necessary to follow step 1 to create a neuron that has permission to make a proposal? Is it possible to use a neuron that was created with the NNS app? @diegop

---

<div class="post-metadata">

**Author:** ![wpb](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/wpb/32/39944_2.png) [@wpb](https://forum.dfinity.org/u/wpb)\
**Post date:** [November 14, 2021, 5:19am UTC](https://forum.dfinity.org/t/how-to-submit-an-nns-motion-proposal-wip/8498/5 "2021-11-14T05:19:04Z")

</div>

I set up the neuronID using dfx, quill, and keysmith and can see the neuron in ic.rocks with over 1 ICP and a dissolve delay of 1 year. When I run the call below in the Candid UI, I get the error message below. What else needs to be done to enable this neuron to make a motion proposal?

manage\_neuron(record {id=null; command=opt variant {MakeProposal=record {url=""; title=opt “This is a test title”; action=opt variant {Motion=record {motion\_text=""}}; summary=“This is a test summary”}}; neuron\_id\_or\_subaccount=opt variant {NeuronId=record {id=12008772471346176261}}})

(record {command=opt variant {Error=record {error\_message=“Caller not authorized to propose.”; error\_type=3}}})

---

<div class="post-metadata">

**Author:** ![levi](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/levi/32/22608_2.png) [@levi](https://forum.dfinity.org/u/levi)\
**Post date:** [November 14, 2021, 4:33pm UTC](https://forum.dfinity.org/t/how-to-submit-an-nns-motion-proposal-wip/8498/6 "2021-11-14T16:33:20Z")

</div>

The error is because the candid ui always sends calls as the anonymous caller. To call the manage\_neuron method is with the caller/identity that controls the neuron. In Diego’s case he is using the identity he created called ‘proposals’

> [@diegop](#):
>
> $ dfx --identity proposals …

---

<div class="post-metadata">

**Author:** ![wpb](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/wpb/32/39944_2.png) [@wpb](https://forum.dfinity.org/u/wpb)\
**Post date:** [November 14, 2021, 7:27pm UTC](https://forum.dfinity.org/t/how-to-submit-an-nns-motion-proposal-wip/8498/7 "2021-11-14T19:27:44Z")

</div>

So just to make sure I understand, this error message will always occur when trying to call manage\_neuron with Candid UI because I can’t send it (and therefore authorize it) with the identity that I created for this neuron ID. Basically, it sounds like I have come as far as possible with testing short of submitting an actual proposal and losing 1 ICP for the test because of a Rejected proposal. Does that sound about right or are there other ways of testing the manage\_neuron command with my neuron and identity without actually making a proposal? I suppose this may be the reason why several people have submitted test proposals in the past. @levi

---

<div class="post-metadata">

**Author:** ![levi](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/levi/32/22608_2.png) [@levi](https://forum.dfinity.org/u/levi)\
**Post date:** [November 14, 2021, 11:22pm UTC](https://forum.dfinity.org/t/how-to-submit-an-nns-motion-proposal-wip/8498/8 "2021-11-14T23:22:35Z")

</div>

Sounds right, I dont know of a way to test it without making a live one. maybe on a local replica if you can get the governance canister running on it.

---

<div class="post-metadata">

**Author:** ![diegop](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/diegop/32/569_2.png) [@diegop](https://forum.dfinity.org/u/diegop)\
**Post date:** [November 16, 2021, 7:35pm UTC](https://forum.dfinity.org/t/how-to-submit-an-nns-motion-proposal-wip/8498/9 "2021-11-16T19:35:21Z")

</div>

I will be honest, I actually created a live one while testing 🙂 since I started creating them a few months ago when the IC was still baking, and it was my job to actually help write the docs.

Of course, it cost me ICP, but i figured “hey that is the cost of sending proposals”.

Could I have started up a local version of the Governance Canister? I guess so, but i found it easier to do this for testing:

1. Craft the message via the Candid UI of Governance Canister: [DFINITY Canister Candid UI](https://a4gq6-oaaaa-aaaab-qaa4q-cai.raw.ic0.app/?id=rrkah-fqaaa-aaaaa-aaaaq-cai)

- this allowed me to type check the arguments and inputs even if it the message did not work for lack of authorization or neuron with ICP

1. Once I was relatively certain of the arguments I wanted, I then sent a real proposal with a neuron that had a few ICP for me

- Personally (and this is indicative of how early I was in the documentation process), the whole experience took me a few hours and cost me maybe 2 ICP.

(fwiw yes I actually did buy ICP on Coinbase in order to have a “start from scratch” experience and identify any pain points)

---

<div class="post-metadata">

**Author:** ![dostro](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/dostro/32/1161_2.png) [@dostro](https://forum.dfinity.org/u/dostro)\
**Post date:** [December 8, 2021, 8:22pm UTC](https://forum.dfinity.org/t/how-to-submit-an-nns-motion-proposal-wip/8498/10 "2021-12-08T20:22:33Z")

</div>

@diegop unless I’m missing something, the title in step 1.2 ("… ensure the principals are the same") should be to ensure the account IDs are the same because `$ dfx --identity proposals ledger account-id` only returns the account ID, right?

---

<div class="post-metadata">

**Author:** ![skilesare](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/skilesare/32/5609_2.png) [@skilesare](https://forum.dfinity.org/u/skilesare)\
**Post date:** [December 8, 2021, 9:11pm UTC](https://forum.dfinity.org/t/how-to-submit-an-nns-motion-proposal-wip/8498/11 "2021-12-08T21:11:33Z")

</div>

> [@wpb](#):
>
> Is it necessary to follow step 1 to create a neuron that has permission to make a proposal? Is it possible to use a neuron that was created with the NNS app?

You may have figured this out in the last 25 days, but you can add a hot key to your NNS neuron and issue manage\_neuron calls from it.

---

<div class="post-metadata">

**Author:** ![diegop](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/diegop/32/569_2.png) [@diegop](https://forum.dfinity.org/u/diegop)\
**Post date:** [December 8, 2021, 9:27pm UTC](https://forum.dfinity.org/t/how-to-submit-an-nns-motion-proposal-wip/8498/12 "2021-12-08T21:27:59Z")

</div>

Yes you are right those only return account IDs. I must have meant “check accounts”. I need to do a review of the intent, but quick glance leads me to believe you are right.

---

<div class="post-metadata">

**Author:** ![diegop](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/diegop/32/569_2.png) [@diegop](https://forum.dfinity.org/u/diegop)\
**Post date:** [December 8, 2021, 9:28pm UTC](https://forum.dfinity.org/t/how-to-submit-an-nns-motion-proposal-wip/8498/13 "2021-12-08T21:28:41Z")

</div>

> [@skilesare](#):
>
> You may have figured this out in the last 25 days, but you can add a hot key to your NNS neuron and issue manage\_neuron calls from it.

I believe this is correct, but I have not tested this.

---

<div class="post-metadata">

**Author:** ![diegop](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/diegop/32/569_2.png) [@diegop](https://forum.dfinity.org/u/diegop)\
**Post date:** [January 31, 2022, 10:53pm UTC](https://forum.dfinity.org/t/how-to-submit-an-nns-motion-proposal-wip/8498/14 "2022-01-31T22:53:46Z")

</div>

**Update** : I am moving this to the wiki and cleaning up certain parts:

[https://wiki.internetcomputer.org/wiki/How-To:\_Create\_an\_NNS\_motion\_proposal](https://wiki.internetcomputer.org/wiki/How-To:_Create_an_NNS_motion_proposal)

---

<div class="post-metadata">

**Author:** ![diegop](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/diegop/32/569_2.png) [@diegop](https://forum.dfinity.org/u/diegop)\
**Post date:** [February 2, 2022, 10:03pm UTC](https://forum.dfinity.org/t/how-to-submit-an-nns-motion-proposal-wip/8498/15 "2022-02-02T22:03:07Z")

</div>

Update:

This page is much cleaner. Please use the wiki: [How-To: Create an NNS motion proposal - Internet Computer Wiki](https://wiki.internetcomputer.org/wiki/How-To:_Create_an_NNS_motion_proposal#Check_dashboard_to_see_proposal_was_successful)

---

<div class="post-metadata">

**Author:** ![icme](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/icme/32/4327_2.png) [@icme](https://forum.dfinity.org/u/icme)\
**Post date:** [March 29, 2022, 2:39am UTC](https://forum.dfinity.org/t/how-to-submit-an-nns-motion-proposal-wip/8498/16 "2022-03-29T02:39:49Z")

</div>

Keysmith was just deprecated, per the README - [GitHub - dfinity/keysmith: Hierarchical Deterministic Key Derivation for the Internet Computer](https://github.com/dfinity/keysmith)

Can you update the wiki to reflect this?

---

<div class="post-metadata">

**Author:** ![diegop](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/diegop/32/569_2.png) [@diegop](https://forum.dfinity.org/u/diegop)\
**Post date:** [March 29, 2022, 3:12am UTC](https://forum.dfinity.org/t/how-to-submit-an-nns-motion-proposal-wip/8498/17 "2022-03-29T03:12:38Z")

</div>

Yes will do. Good catch. That should make things simpler.

---

<div class="post-metadata">

**Author:** ![ysyms](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/ysyms/32/5173_2.png) [@ysyms](https://forum.dfinity.org/u/ysyms)\
**Post date:** [March 31, 2022, 8:39pm UTC](https://forum.dfinity.org/t/how-to-submit-an-nns-motion-proposal-wip/8498/18 "2022-03-31T20:39:46Z")

</div>

I would like to submit some suggestions, but have encountered some problems.

dfx --identity proposals canister --network ic --no-wallet call rrkah-fqaaa-aaaaa-aaaaq-cai manage\_neuron '(record {id = null; command=opt variant {MakeProposal=record {url=""; title="$TITLE";action=opt variant {Motion=record {motion\_text="$MOTION\_TEXT"}}; summary="

$SUMMARY

"}}; neuron\_id\_or\_subaccount=opt variant {NeuronId=record {id=$NEURON\_ID:nat64}}})’

Here is the command to initiate a proposal using dfx.  
I need to replace $SUMMARY with proposal content,But the proposals are multi-line, so I can’t enter them in one command. I can only use ‘\n’ to replace all newlines in the proposal. Is there any way to make it simpler

---

<div class="post-metadata">

**Author:** ![diegop](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/diegop/32/569_2.png) [@diegop](https://forum.dfinity.org/u/diegop)\
**Post date:** [March 31, 2022, 8:44pm UTC](https://forum.dfinity.org/t/how-to-submit-an-nns-motion-proposal-wip/8498/19 "2022-03-31T20:44:32Z")

</div>

Hmmm I submit multi like proposals all the time by copy pasting from a markdown file. Would it help you if I paste the exact command I used?

---

<div class="post-metadata">

**Author:** ![ysyms](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/ysyms/32/5173_2.png) [@ysyms](https://forum.dfinity.org/u/ysyms)\
**Post date:** [April 1, 2022, 1:49am UTC](https://forum.dfinity.org/t/how-to-submit-an-nns-motion-proposal-wip/8498/21 "2022-04-01T01:49:03Z")

</div>

dfx --identity proposals canister --network ic --no-wallet call rrkah-fqaaa-aaaaa-aaaaq-cai manage\_neuron ‘(record {id = null; command=opt variant {MakeProposal=record {url=“[https://medium.com/@ysyms/如何在nns发起动议提案-fca251185ab4](https://medium.com/@ysyms/%E5%A6%82%E4%BD%95%E5%9C%A8nns%E5%8F%91%E8%B5%B7%E5%8A%A8%E8%AE%AE%E6%8F%90%E6%A1%88-fca251185ab4)”; title="$(title.md)";action=opt variant {Motion=record {motion\_text="$(title.md)"}}; summary="$(proposals.md)"}}; neuron\_id\_or\_subaccount=opt variant {NeuronId=record {id=16392997059792243989:nat64}}})’

[Next page](https://forum.dfinity.org/t/how-to-submit-an-nns-motion-proposal-wip/8498.md?page=2)
