Figure out which proposals passed by fetching the message via channel.fetchMessage and looking through its .reactions.

For each proposal in temp check:

If (thumbs ups≥10 && thumbs up/(thumbs up + thumbs downs) ≥ 0.3), set status to “offchain voting”. Else, set status to cancelled.

Export approved proposals using notion-to-md’s .pageToMarkdown function.

Upload markdown files to IPFS using Pinata SDK’s .pinFileToIPFS function (free account will suffice at first, since proposals will be small text files).

Once IPFS file is uploaded, use Pinata SDK’s .pinList to retrieve link and add to Notion database in corresponding IPFS field.

Create proposal on Snapshot using Snapshot.js. Something like this:

import { Web3Provider } from '@ethersproject/providers';

const web3 = new Web3Provider(window.ethereum);
const [account] = await web3.listAccounts();

const receipt = await client.proposal(web3, account, {
  space: 'jbdao.eth',
  type: 'single-choice',
  title: '<PROPOSAL TITLE HERE>',
  body: '<Imported from markdown file (with addition)>',
  choices: ['Yes', 'No', 'Abstain'],
  start: <unix timestamp here>,
  end: <last unix timestamp + 345600 (4 days)>,
  snapshot: <most recent ETH block>,
  network: '1',
  strategies: JSON.stringify({}),
  plugins: JSON.stringify({}),
  metadata: JSON.stringify({})
});

Start Unix timestamp can be the current timestamp i.e. Math.floor(Date.now() / 1000);

End should be Math.floor(Date.now() / 1000) + 345600;

The most recent ETH block can come from web3.js: await web3.eth.getBlockNumber()

The following should be added to the bottom of the body:

---
[Discussion Thread](<LINK>)|[Temperature Check](<LINK>)|[IPFS](<LINK>)|[Translations](<LINK>)

The translations link can be taken from a field in the proposal itself (feel free to make this field in the proposals databases. Translators can put finished proposal translations there. If the field is empty, then omit from the Snapshot body).

Once proposals are on Snapshot, add the snapshot link to the corresponding proposal field.

Post an announcement in #announcements in the following format:

Offchain voting at <https://snapshot.org/#/jbdao.eth> for FC#<current> is open until <t:Math.floor(Date.now() / 1000) + 345600> @governance announcements

Functionality below this line is NOT necessary—just extra: