The NNS requires voters to be active participants, this is to ensure the best interest of the protocol, aligning incentives with longterm interests. However, the reality is that most users, even most developers, do not have the time or technical ability to evaluate every proposal.
Therefore we follow people on the NNS, trusting that they have our best interests at heart. In reality, as stakers, what we really care about are the incentives.. It’s possible that some participants may feel, that those they have been following might not actually have their best interests at heart. It’s possible that some may even be actively campaigning to divert a percentage of your depreciating slashed rewards, to their own neurons.
You could log into the NNS every day and manually click the buttons over and over. However this creates an issue because it’s time consuming, and it also forces you to look at the value of your assets which may be psychologically troubling. Fortunately there’s another way..
Install dfx via the official documentation.
Create identity with --storage-mode=plaintext to bypass password prompts.
Add your PID as a hotkey in the NNS dapp.
Run this bash script every 3 days. It rejects all proposals to ensure no pennies go to named neurons.
#!/bin/bash
# --- CONFIGURATION ---
NEURON_ID="YOUR_NEURON_ID_HERE" # <--- Put your 8-year or 2-year Neuron ID here
CANISTER_ID="rrkah-fqaaa-aaaaa-aaaaq-cai"
if [ "$NEURON_ID" == "YOUR_NEURON_ID_HERE" ]; then
echo "Error: Please set your NEURON_ID in the script."
exit 1
fi
export DFX_WARNING=-mainnet_plaintext_identity
echo "Fetching open proposals to reject..."
# 1. Get the IDs of all open proposals
# We use the same serialization-safe call from before
PROPOSAL_IDS=$(dfx canister --network ic call "$CANISTER_ID" list_proposals \
"(record {
include_reward_status = vec {1 : int32};
omit_large_fields = opt true;
include_status = vec {1 : int32};
before_proposal = null;
limit = 100 : nat32;
exclude_topic = vec {} : vec int32;
include_all_manage_neuron_proposals = opt true;
})" --output json | jq -r '.proposal_info[] | .id[0].id')
if [ -z "$PROPOSAL_IDS" ]; then
echo "No open proposals found."
exit 0
fi
# 2. Iterate and Vote
for PID in $PROPOSAL_IDS; do
echo "Processing Proposal ID: $PID"
# We call manage_neuron to register the vote
# vote = 2 is REJECT
dfx canister --network ic call "$CANISTER_ID" manage_neuron \
"(record {
id = opt record {id = $NEURON_ID : nat64};
command = opt variant {
RegisterVote = record {
vote = 2 : int32;
proposal = opt record {id = $PID : nat64}
}
}
})"
echo "Rejected $PID."
sleep 0.5 # Small delay to be kind to the network/rate limits
done
echo "Done. All retrieved proposals have been rejected."