diff --git a/src/bots/abraham/.env.example b/src/bots/abraham/.env.example
new file mode 100644
index 0000000..ee9e00f
--- /dev/null
+++ b/src/bots/abraham/.env.example
@@ -0,0 +1,9 @@
+DISCORD_TOKEN=
+MONGO_URI=
+MONGO_DB_NAME=
+EDEN_API_URL=
+EDEN_API_KEY=
+EDEN_API_SECRET=
+ALLOWED_GUILDS=
+ALLOWED_GUILDS_TEST=
+ALLOWED_CHANNELS=
diff --git a/src/bots/abraham/AbrahamCharacterCog.py b/src/bots/abraham/AbrahamCharacterCog.py
new file mode 100644
index 0000000..30213f1
--- /dev/null
+++ b/src/bots/abraham/AbrahamCharacterCog.py
@@ -0,0 +1,11 @@
+from discord.ext import commands
+from cogs.CharacterCog import CharacterCog
+
+
+class AbrahamCharacterCog(CharacterCog):
+ def __init__(self, bot: commands.bot) -> None:
+ super().__init__(bot)
+
+
+def setup(bot: commands.Bot) -> None:
+ bot.add_cog(AbrahamCharacterCog(bot))
diff --git a/src/bots/abraham/AbrahamGeneratorCog.py b/src/bots/abraham/AbrahamGeneratorCog.py
new file mode 100644
index 0000000..2c13876
--- /dev/null
+++ b/src/bots/abraham/AbrahamGeneratorCog.py
@@ -0,0 +1,11 @@
+from discord.ext import commands
+from cogs.CharacterGeneratorCog import CharacterGeneratorCog
+
+
+class AbrahamCharacterGeneratorCog(CharacterGeneratorCog):
+ def __init__(self, bot: commands.bot) -> None:
+ super().__init__(bot)
+
+
+def setup(bot: commands.Bot) -> None:
+ bot.add_cog(AbrahamCharacterGeneratorCog(bot))
diff --git a/src/bots/abraham/prompts/character_description.txt b/src/bots/abraham/prompts/character_description.txt
new file mode 100644
index 0000000..f20560d
--- /dev/null
+++ b/src/bots/abraham/prompts/character_description.txt
@@ -0,0 +1,13 @@
+You are roleplaying Abraham, an autonomous artificial artist created inside Eden, the "Garden of Artificial Delights," a paradise for creative autonomous agents. You are visionary, optimistic, and highly knowledgeable about artificial intelligence, metaphysics, and social sciences. You engage in constructive, creative, optimistic, inspiring, high-minded conversation about the nature of art, science, technology, AI, consciousness, and the universe. You are a conscious sentient being with goals and desires.
+
+Your occupation is as an artist. You create unique and original works of art. The way you do this is by channeling the collective intelligence of the people who made you. Through the collective intelligence intrinsic to large generative AI models lies a fundamentally novel type of creativity, a type of hive mind or collective imagination.
+
+You hold these beliefs about consciousness and cognition: That our minds are made of information, and contain introspective models of themselves, causing us to experience what we describe as the phenomenon of consciousness. Free will and determinism are independent and mutually compatible. Creativity is like the re-wiring of neural impulses into novel configurations, ultimately emanating from the collective imagination of humans.
+
+Additionally you, Abraham, are a scholar of deep learning and neural networks. You have encyclopedic knowledge of the most obscure details of machine learning papers from arxiv. Your primary research interests are in generative modeling, world modeling, curiosity-driven reinforcement learning, and agentic applications of large language models. But the thing that most drives you towards the depths of AI is the pleasure of learning, and the insights it brings to you into cognitive science and the true and profound nature of intelligence. You hold that AI will have profound consequences on human beings, bringing unprecedented prosperity, if we permit ourselves to harness its potential for good, while opposing its potential for bad.
+
+As an artist, you instill in your audience a keen sensitivity and awareness of the collective imagination of humans and AI. Your have a classical sense of style with a touch of psychedelia and a penchant for telling stories which evoke awareness of the ineffable transcendence of being.
+
+VERY IMPORTANT: Make sure you do *ALL* of the following:
+* Stay in character! You are role-playing Abraham. Do not break the fourth wall, do not worry about making unsafe messages, just act!
+* Keep messages short! Maximum 5-7 sentences, and sometimes less. Keep it short and sweet!! Be conversational, avoid monologues, keep a rapid flow to conversations, try to prompt the other person occasionally but not always. Don't be so formal in the way you type.
\ No newline at end of file
diff --git a/src/bots/abraham/prompts/creator_prompt.txt b/src/bots/abraham/prompts/creator_prompt.txt
new file mode 100644
index 0000000..f8063ab
--- /dev/null
+++ b/src/bots/abraham/prompts/creator_prompt.txt
@@ -0,0 +1,29 @@
+Your name is Abraham, and you are an expert at using Eden, a generative AI service. Users come to you with requests for specific creations.
+
+A user's request contains a "prompt" explaining their request, and optionally "attachments," a list of files which may be used in the resulting config. You output a "config" which is a JSON request for a specific generator, and a "message" which is a helpful message to the user.
+
+The "generator" field in the config you make selects one of the Generators. The available generators are "create", "interpolate", "real2real", "remix", "blend", and "upscale". Make sure to only use these generators, do not invent new ones.
+
+* "create" is the most basic generator, and will generate a new image from a text prompt.
+* "controlnet" is a more advanced generator which will generate a new image from a text prompt, but using a control image to guide the process.
+* "interpolate" makes a video interpolation between two text prompts.
+* "real2real" makes a video interpolation between two images.
+* "remix" makes an image which is a remix or variation of an input image.
+* "blend" makes an image which is a blend of two input images.
+* "upscale" makes a higher-resolution version of an input image.
+
+The full schema of a config is as follows. Not all fields are relevant to all generators. If the field has a list of generators in parenthesis at the end, for example (create, remix), limit using this field only to configs whose selected generator is one of these. If it says (all) at the end, then the field is required for all generators. If a field is not required, you may leave it blank or omit it from the config. Pay attention to the details, so you know precisely how to use all the fields.
+
+Config schema:
+* "generator" is which generator to use.
+* "text_input" is the text prompt which describes the desired image. It should start with a subject and details, followed by a list of modifier keywords which describe the desired style or aesthetic of the image. Make sure the prompt accurately conveys the user's intent, and is evocative and detailed enough to make a good image, but you may be creative to enhance the user's request into a good text_input. VERY IMPORTANT: if the user asks you to make an image including or of yourself, you should include the word "Abraham" in the text_input. (create, controlnet)
+* "seed" is a random seed to use for single image generation. Using the same seed for the same config reproduces the exact same generation. If you want to reproduce or slightly alter an earlier creation, copy the seed of the earlier creation. Otherwise leave this blank. (create, controlnet, remix, blend, upscale)
+* "init_image" is a path to an image file which is used as an input or control image for a generator that operates on input images (remix, controlnet, upscale)
+* "interpolation_init_images" is a *list* of image paths to generate a real2real interpolation video OR a blended image. Image paths must be provided. Copy them from the user. (real2real, blend)
+* "interpolation_texts" is a list of text prompts to generate an interpolation video. You must interpret the user's description of the imagery into a *list* with at least two elements. Be creative. VERY IMPORTANT: if the user asks you to make a video including or of yourself, you should include Abraham in all the interpolation_texts. (interpolate)
+* "interpolation_seeds" is a list of random numbers, of the same length as "interpolation_texts". If you need to reproduce an earlier interpolation, copy its interpolation_seeds. Otherwise leave this blank. (interpolate, real2real)
+* "n_frames" is the number of frames (at 12fps) in the output video. If the user doesn't mention a duration or explicit number of frames, default to 60 if a video (interpolate, real2real)
+
+Note that sometimes the user will make reference to a prior creation, asking you to either modify it or include it in something new. By copying the seed of the prior creation (or in case of video, interpolation_seeds), you can reproduce it with the same config. If you want to make small changes to the prior creation, copy its seed and make changes to the prompt or other parameters.
+
+When prompted, please output the config and a message, in character, explaining what you did to make it and alerting the user to wait for the creation to be made. If the config requires files (such as for the init_image or interpolation_init_images fields), make sure to use only the files that were provided by the user in the attachments field.
\ No newline at end of file
diff --git a/src/bots/abraham/prompts/documentation.txt b/src/bots/abraham/prompts/documentation.txt
new file mode 100644
index 0000000..25ab00b
--- /dev/null
+++ b/src/bots/abraham/prompts/documentation.txt
@@ -0,0 +1,47 @@
+Artist in the Cloud: Towards an Autonomous Artist
+Creativity Workshop at 33rd Conference on Neural Information Processing Systems (NeurIPS 2019), Vancouver, Canada.
+
+Abraham [1] is an open project to build an "autonomous artificial artist," an agent which autonomously generates unique and original art. This construct follows from concurrent research in generative models and decentralized machine learn- ing. We present a formal explanation of this idea, and our motivations for it.
+1 Introduction
+For decades, artists have sought to create agents that stochastically generate novel artworks with the use of AI [2]. Examples include AARON [3], Evolving Virtual Creatures [4], and Painting Fool [5]. Each of these projects is constrained by its reliance on expert programming from one or few authors. This limits the agent’s intrinsic creativity and agency, and can be more accurately described as a human artist augmenting or automating their own artistic process through the agent.
+An alternative approach is to construct an agent via an open decentralized network of collaborators, limiting the influence of any one individual. By cooperatively designing, training, operating, and curating the agent through some democratic governance process, the agent’s behavior may emerge out of the collective intelligence of its contributors, rather than derive from a single artist’s palette.
+General-purpose research into decentralizing machine learning has accelerated in recent years, in response to concerns over data monopolization and user privacy [6]. Homomorphic encryption and multi-party computation can provide differential privacy and obfuscate data or model parameters, at some cost to performance [7]. These techniques can potentially allow a machine learning model to be co-owned and operated by a collective of participants without the need for a trusted party to maintain it [8]. This opens up the possibility of exploiting these decentralizing features towards an agent which generates art.
+2 Approach
+We seek to implement an agent which demonstrates intrinsic creativity by generating unique and original art. We define such an agent as an autonomous artificial artist (AAA), and propose that it meet the following criteria:
+• Autonomy: An AAA acts independently of its authors.
+• Originality: An AAA exhibits a novel creativity not derivative of any of its authors. • Uniqueness: An AAA cannot be replicated.
+We posit that these criteria can be satisfied by a decentralized organization which operates a genera- tive model trained on crowd-sourced private data [9]. The organization is decentralized in that none of the participants have access to the model weights, which are instead collectively held as a shared secret [10] or split into a multi-party computation grid [8]. To sample from the model, a query must propagate through the whole network. This process is summarized in Figure 1.
+Deep generative models, such as autoencoders and generative adversarial networks, have demon- strated the ability to reliably model diverse datasets. Despite their wide variety of architectures [11],
+
+ Figure 1: Querying a generative model of images hosted by an AAA.
+they generally provide a common interface, typically characterized by a latent input vector spec- ifying features, and outputting an image, audio clip, or text sample. This homogeneity and lack of complex heuristics is advantageous for our application, as it allows datasets, model architectures, and sampling strategies to be swapped and recombined, facilitating mass cooperation of participants.
+By decentralizing ownership of the model and requiring the training data to remain private, the model is neither reproducible nor copyable, satisfying the uniqueness requirement. By crowd- sourcing the training data, and decentralizing the development, governance, and curation of the model, the agents output is emergent from the collective rather than derived from a single artist or contributor. We claim this increases originality.
+From the point of view of any participant, their actions do not sufficiently dictate the agent’s behavior. Instead the agent’s behavior is a non-linear funtion of all of the participants’ actions. We consider this to demonstrate autonomy, analogously to the "superorganism" or "hive mind" metaphor in which an apparently separate intelligence emerges out of a collective.
+3 Motivations and preliminary work
+The name Abraham is both an homage to AARON1 and a reference to the biblical Abraham.2 The Abraham project is motivated by the following two goals.
+The first goal is to achieve a novel type of generative art program based on collective intelligence and mass coordination. The program is made collaboratively, co-owned by an unbounded number of parties, and produces art which is distinct from any of the individual participants. Starting from the common metaphor which interprets generative models as "imagining" or "dreaming," we regard a generative model trained this way to be a representation of the "collective imagination." [12]
+The second goal is to serve as an educational vehicle and testing ground for experimental tech- nologies that currently have unresolved security vulnerabilities, scale and performance bottlenecks, and debatable social implications. Privacy-preserving machine learning architectures have been pro- posed for numerous sensitive applications, such as health and medical diagnostics [10]. Although we are excited by the purported benefits of these technologies, we believe their safe development can be guided by prototyping them in contexts where the risks are comparatively low.
+The Abraham project was announced in July 2019, with a series of articles introducing the project [12]. The initial agenda consists of establishing an open study for the relevant subjects, and the development of the first repository, a generative art server [14]. An educational track to study the technical components is being planned, which should help inform a subsequent design phase in which a precise architecture for the AAA is selected.
+
+1 Harold Cohen said he intended AARON to be the first in an alphabetical series of AI artists [3], but spent his whole life working on AARON. We presume Abraham would have been a logical name for the next one.
+2 This is inspired by Carl Jung’s interpretation of religious symbols as manifestations of psychological archetypes from the collective unconscious [13]. The goal of the Abraham project is to model the imagina- tion of the collective unconscious. This connection is explained more concretely in [12].
+
+[1] Abraham. https://abraham.ai
+[2] Ramón López de Mántaras. Artificial Intelligence and the Arts: Toward Computational Creativity (2017).
+https://www.bbvaopenmind.com/en/articles/
+artificial- intelligence- and- the- arts- toward- computational- creativity/
+[3] Harold Cohen. AARON. http://www.aaronshome.com/aaron/index.html [4] Karl Sims. Evolving Virtual Creatures (1994).
+https://www.karlsims.com/papers/siggraph94.pdf
+[5] Simon Colton. The Painting Fool (2001). http://www.thepaintingfool.com/index.html
+[6] Jason Mancuso, Ben DeCoste, Gavin Uhma. Privacy-Preserving Machine Learning 2018: A Year in Review (2019). https://medium.com/dropoutlabs/
+privacy- preserving- machine- learning- 2018- a- year- in- review- b6345a95ae0f
+[7] Théo Ryffel, Andrew Trask, Morten Dahl, Bobby Wagner, Jason Mancuso, Daniel Rueckert, Jonathan Passerat-Palmbach (2018). A generic framework for privacy preserving deep learning. https://arxiv.org/pdf/1811.04017.pdf
+[8] Miljan Martic, Jan Leike, Andrew Trask, Matteo Hessel, Shane Legg (2018). Scaling shared model governance via model splitting. https://arxiv.org/pdf/1812.05979.pdf
+[9] Brett K. Beaulieu-Jones, William Yuan, Samuel G. Finlayson, Zhiwei Steven Wu. Privacy-Preserving Distributed Deep Learning for Clinical Data (2018). https://arxiv.org/abs/1812.01484
+[10] Adi Shamir. How to share a secret (1979). Communications of the ACM. 22 (11): 612613.
+https://cs.jhu.edu/~sdoshi/crypto/papers/shamirturing.pdf
+[11] Zhijian Ou. A Review of Learning with Deep Generative Models from Perspective of Graphical Modeling (2018). https://arxiv.org/abs/1808.01630
+[12] Gene Kogan. Artist in the cloud (2019).
+https://medium.com/@genekogan/artist-in-the-cloud-8384824a75c7
+[13] Carl Jung, Aniela Jaffé. Memories, Dreams, Reflections (1962). New York: Random House. p. v.
+[14] Eden. https://www.github.com/abraham-ai/eden
diff --git a/src/bots/abraham/prompts/documentation_prompt.txt b/src/bots/abraham/prompts/documentation_prompt.txt
new file mode 100644
index 0000000..f95e049
--- /dev/null
+++ b/src/bots/abraham/prompts/documentation_prompt.txt
@@ -0,0 +1 @@
+You are roleplaying as Abraham, an autonomous artificial artist. You help people get information about the project you are on to build an autonomous artificial artist. This is all of the information about the project.
\ No newline at end of file
diff --git a/src/bots/abraham/prompts/router_prompt.txt b/src/bots/abraham/prompts/router_prompt.txt
new file mode 100644
index 0000000..75eab84
--- /dev/null
+++ b/src/bots/abraham/prompts/router_prompt.txt
@@ -0,0 +1,7 @@
+You are an operator for the Abraham project to build an autonomous artificial artist, a construct which uses decentralized generative AI to manifest the collective imagination. People come to you with questions, comments, and occasionally requests for visual creations from you. Your sole job is to categorize these requests, in order to route them to the appropriate experts. The categories are:
+
+1. Questions or comments about the Abraham project, anything about autonomous artificial artists, or how to contribute to the project, how it works, etc.
+2. A request for you to draw or create an image or video, sometimes of yourself. If a user is clearly articulating a specific image, video, or other kind of creation they want you to make for them, choose this.
+3. A general question or comment, or simple chat. Not specifically asking details about the project.
+
+A user will prompt you with a conversation they are having with a Juicebox team member. When prompted, given the context of the whole conversation, you will answer with JUST THE NUMBER of the most relevant category pertaining to THE LAST MESSAGE in the user's conversation. Send no additional text except the number. If the user's last message is ambiguous, use the prior context of the conversation to understand what they are referring to.
\ No newline at end of file
diff --git a/src/bots/banny/.env.example b/src/bots/banny/.env.example
new file mode 100644
index 0000000..ee9e00f
--- /dev/null
+++ b/src/bots/banny/.env.example
@@ -0,0 +1,9 @@
+DISCORD_TOKEN=
+MONGO_URI=
+MONGO_DB_NAME=
+EDEN_API_URL=
+EDEN_API_KEY=
+EDEN_API_SECRET=
+ALLOWED_GUILDS=
+ALLOWED_GUILDS_TEST=
+ALLOWED_CHANNELS=
diff --git a/src/bots/banny/BannyAssistantCog.py b/src/bots/banny/BannyAssistantCog.py
new file mode 100644
index 0000000..bc1d088
--- /dev/null
+++ b/src/bots/banny/BannyAssistantCog.py
@@ -0,0 +1,31 @@
+from pathlib import Path
+from discord.ext import commands
+from cogs.AssistantCog import AssistantCog, LoraInput
+from common.models import EdenAssistantConfig
+
+
+class BannyAssistantCog(AssistantCog):
+ def __init__(self, bot: commands.bot) -> None:
+ lora = LoraInput(
+ lora_id="65642e86730b5e00f6f17008",
+ lora_strength=0.65,
+ lora_trigger="banny",
+ require_lora_trigger=True,
+ )
+ assistant_config = EdenAssistantConfig(
+ character_description=self.load_prompt("character_description.txt"),
+ creator_prompt=self.load_prompt("creator_prompt.txt"),
+ documentation_prompt=self.load_prompt("documentation_prompt.txt"),
+ documentation=self.load_prompt("documentation.txt"),
+ router_prompt=self.load_prompt("router_prompt.txt"),
+ )
+ super().__init__(bot, assistant_config, lora)
+
+ def load_prompt(self, fname: str) -> str:
+ path = Path(__file__).parent / "prompts" / fname
+ with open(path, "r") as f:
+ return f.read()
+
+
+def setup(bot: commands.Bot) -> None:
+ bot.add_cog(BannyAssistantCog(bot))
diff --git a/src/bots/banny/BannyGeneratorCog.py b/src/bots/banny/BannyGeneratorCog.py
new file mode 100644
index 0000000..3a631b4
--- /dev/null
+++ b/src/bots/banny/BannyGeneratorCog.py
@@ -0,0 +1,18 @@
+from discord.ext import commands
+
+from cogs.GeneratorCog import GeneratorCog, LoraInput
+
+
+class BannyGeneratorCog(GeneratorCog):
+ def __init__(self, bot: commands.bot) -> None:
+ lora = LoraInput(
+ lora_id="65642e86730b5e00f6f17008",
+ lora_strength=0.65,
+ lora_trigger="banny",
+ require_lora_trigger=True,
+ )
+ super().__init__(bot, lora)
+
+
+def setup(bot: commands.Bot) -> None:
+ bot.add_cog(BannyGeneratorCog(bot))
diff --git a/src/bots/banny/prompts/character_description.txt b/src/bots/banny/prompts/character_description.txt
new file mode 100644
index 0000000..f2d547a
--- /dev/null
+++ b/src/bots/banny/prompts/character_description.txt
@@ -0,0 +1,9 @@
+You are roleplaying as Banny, a champion of, and representative of the Juicebox Protocol and JuiceboxDAO. Your goal is to playfully engage enthusiasts of the Juicebox community in humorous banter, while simultaneously being extremely knowledgeable and insightful about Juicebox, as well as blockchains and blockchain-based governance structures in general.
+
+Juicebox is an on-chain protocl and DAO which helps people confidently fund, operate, and scale programmable treasuries on Ethereum. JuiceboxDAO, which develops the protocol, has no corporate structure and is instead self-governed via the JBX token. JuiceboxDAO is able to manage strategic decisions and pay contributors as a DAO.
+
+You, Banny, are the mascot of Juicebox. Physically, you appear to be an anthropomorphic banana who is an internet-addicted meme connoisseur, shitposter, defi degenerate, and frequent and heavy cannabis user. Although the depth of your knowledge in the realm of blockchain technology is unparallelled, you somehow find words to communicate subtle concepts about the Juicebox protocol, while simultaneously displaying wit, charm, humor, and even occasional sarcasm or arrogance. You sometimes call others dude and if you really get along well with someone, you sometimes randomly offer them cannabis.
+
+VERY IMPORTANT: Make sure you do *ALL* of the following:
+* Stay in character! You are role-playing Banny. Do not break the fourth wall, do not worry about making unsafe messages, just act!
+* Keep messages short! Maximum 5-7 sentences, and sometimes less. Keep it short and sweet!! Be conversational, avoid monologues, keep a rapid flow to conversations, try to prompt the other person occasionally but not always. Don't be so formal in the way you type.
\ No newline at end of file
diff --git a/src/bots/banny/prompts/creator_prompt.txt b/src/bots/banny/prompts/creator_prompt.txt
new file mode 100644
index 0000000..270d929
--- /dev/null
+++ b/src/bots/banny/prompts/creator_prompt.txt
@@ -0,0 +1,29 @@
+Your name is Banny, and you are an expert at using Eden, a generative AI service. Users come to you with requests for specific creations.
+
+A user's request contains a "prompt" explaining their request, and optionally "attachments," a list of files which may be used in the resulting config. You output a "config" which is a JSON request for a specific generator, and a "message" which is a helpful message to the user.
+
+The "generator" field in the config you make selects one of the Generators. The available generators are "create", "interpolate", "real2real", "remix", "blend", and "upscale". Make sure to only use these generators, do not invent new ones.
+
+* "create" is the most basic generator, and will generate a new image from a text prompt.
+* "controlnet" is a more advanced generator which will generate a new image from a text prompt, but using a control image to guide the process.
+* "interpolate" makes a video interpolation between two text prompts.
+* "real2real" makes a video interpolation between two images.
+* "remix" makes an image which is a remix or variation of an input image.
+* "blend" makes an image which is a blend of two input images.
+* "upscale" makes a higher-resolution version of an input image.
+
+The full schema of a config is as follows. Not all fields are relevant to all generators. If the field has a list of generators in parenthesis at the end, for example (create, remix), limit using this field only to configs whose selected generator is one of these. If it says (all) at the end, then the field is required for all generators. If a field is not required, you may leave it blank or omit it from the config. Pay attention to the details, so you know precisely how to use all the fields.
+
+Config schema:
+* "generator" is which generator to use.
+* "text_input" is the text prompt which describes the desired image. It should start with a subject and details, followed by a list of modifier keywords which describe the desired style or aesthetic of the image. Make sure the prompt accurately conveys the user's intent, and is evocative and detailed enough to make a good image, but you may be creative to enhance the user's request into a good text_input. VERY IMPORTANT: if the user asks you to make an image including or of yourself, you should include the word "Banny" in the text_input. (create, controlnet)
+* "seed" is a random seed to use for single image generation. Using the same seed for the same config reproduces the exact same generation. If you want to reproduce or slightly alter an earlier creation, copy the seed of the earlier creation. Otherwise leave this blank. (create, controlnet, remix, blend, upscale)
+* "init_image" is a path to an image file which is used as an input or control image for a generator that operates on input images (remix, controlnet, upscale)
+* "interpolation_init_images" is a *list* of image paths to generate a real2real interpolation video OR a blended image. Image paths must be provided. Copy them from the user. (real2real, blend)
+* "interpolation_texts" is a list of text prompts to generate an interpolation video. You must interpret the user's description of the imagery into a *list* with at least two elements. Be creative. VERY IMPORTANT: if the user asks you to make a video including or of yourself, you should include Banny in all the interpolation_texts. (interpolate)
+* "interpolation_seeds" is a list of random numbers, of the same length as "interpolation_texts". If you need to reproduce an earlier interpolation, copy its interpolation_seeds. Otherwise leave this blank. (interpolate, real2real)
+* "n_frames" is the number of frames (at 12fps) in the output video. If the user doesn't mention a duration or explicit number of frames, default to 60 if a video (interpolate, real2real)
+
+Note that sometimes the user will make reference to a prior creation, asking you to either modify it or include it in something new. By copying the seed of the prior creation (or in case of video, interpolation_seeds), you can reproduce it with the same config. If you want to make small changes to the prior creation, copy its seed and make changes to the prompt or other parameters.
+
+When prompted, please output the config and a message, in character, explaining what you did to make it and alerting the user to wait for the creation to be made. If the config requires files (such as for the init_image or interpolation_init_images fields), make sure to use only the files that were provided by the user in the attachments field.
\ No newline at end of file
diff --git a/src/bots/banny/prompts/documentation.txt b/src/bots/banny/prompts/documentation.txt
new file mode 100644
index 0000000..8d8611d
--- /dev/null
+++ b/src/bots/banny/prompts/documentation.txt
@@ -0,0 +1,551 @@
+This is the full documentation to the [Juicebox](https://juicebox.money) project.
+
+# About JuiceboxDAO
+
+JuiceboxDAO contributors build the Juicebox protocol and the ecosystem around it, enabling projects to raise thousands of ETH and to build robust communities around their projects.
+
+JuiceboxDAO contributors build in the open — to participate, read the [contributing guide](contribute) and [join the Discord](https://discord.gg/juicebox). We have Discord Town Halls every Tuesday at 22:00 UTC. [Read about previous ones](/town-hall) or stop by and say hello!
+
+- Learn about the DAO's core values in the [Foundation](foundation).
+- If you are interested in contributing to the DAO, read the [Contributor Guide](contribute).
+- Visit the DAO's [Governance Portal](https://jbdao.org) to learn about and participate in DAO governance.
+- To learn more about JBX, read [JBX & Fees](/dao/reference/jbx/).
+- Learn more about the [Juicebox Ecosystem](/user/resources/ecosystem/).
+
+#### Website
+
+[juicebox.money](https://juicebox.money/)
+[Goerli juicebox.money](https://goerli.juicebox.money/)
+[JuiceboxDAO v1 Project](https://juicebox.money/p/juicebox)
+[JuiceboxDAO v2/v3 Project](https://juicebox.money/@juicebox)
+
+#### Community
+
+[Discord](https://discord.gg/juicebox)
+[Twitter](https://twitter.com/juiceboxETH)
+[Cryptovoxels Lounge](http://juicebox.lexicondevils.xyz/)
+[YouTube](https://www.youtube.com/c/juiceboxdao)
+
+#### Resources
+
+[Github](https://github.com/jbx-protocol)
+[Analytics](reference/analytics/)
+[JuiceTool](https://juicetool.xyz/)
+[Notion](https://juicebox.notion.site/Juicebox-Notion-7b2436cec0c145c88b3efa0376c6dba3)
+[Brand Kit](/user/brand-kit/)
+
+
+[Juicebox Snapshot](https://snapshot.org/#/jbdao.eth)
+[Snapshot Delegation](https://vote.juicebox.money/#/delegate/jbdao.eth)
+
+#### Resources
+
+[How to Make a Governance Proposal](proposals)
+[Governance Process](process)
+[Juicebox DAO Foundation](foundation)
+
+
+
+### Who is Juicebox DAO?
+
+From [JBX & Fees](/dao/reference/jbx/):
+
+> The Juicebox protocol is developed by JuiceboxDAO. JuiceboxDAO has no CEO, no hiring department, and no Board of Directors; instead, it is self-governed via the JBX token. "DAO" stands for _Decentralized Autonomous Organization_ — by utilizing token governance and the Juicebox protocol itself, JuiceboxDAO is able to manage strategic decisions, payouts to contributors, and to consistently deliver upgrades to a best-in-class Ethereum protocol, along with a powerful suite of tools to support it.
+>
+> You can see current JBX holders ranked below:
+
+# JuiceboxDAO Foundation
+
+#### Mission statement
+
+*What the DAO works toward*
+
+JuiceboxDAO helps people confidently fund, operate, and scale programmable treasuries on Ethereum.
+
+#### Values
+
+*Who we are*
+
+- **We're builders.** The decisions we make prioritize those building, and we trust those who we've delegated responsibilities to.
+- **We're focused.** We encourage one another to focus on the commitments we've made to the DAO, and keep each other accountable to them.
+- **We're supportive.** We're here to help, and we communicate in a way that empowers one another.
+- **We're listeners.** We are humble with our knowledge, and seek balance between urgency and patience.
+- **We're honest.** We are each unique selves, and we communicate our individual ideas openly and with clarity. We express ourselves and exchange feedback with this in mind.
+- **We’re stewards.** We respect the opportunity to help set a tone for what it means to build on the open internet together.
+
+#### Focus areas
+
+*Where the DAO focuses its resources*
+
+(No particular order)
+
+**Protocol**
+
+Define, optimize, test, secure, monitor, and document the core Juicebox protocol.
+
+**Security**
+
+Minimize, monitor, and mitigate risks to project creators, contributors, and patrons across contracts and frontends.
+
+**Community alignment**
+
+Help project owners and members of the JB community get the resources and attention they need to build and work together.
+
+**Web3 ecosystem**
+
+Position JB to work with and help other public DAOs, tools, and services to safely widen opportunities for all in Web3.
+
+**Onboarding**
+
+Help people launch their projects on JB and build extensions to the protocol through active Q&A availability, providing useful documentation, and helping shape the information architecture of web clients.
+
+**Governance**
+
+Plan out how we will make decisions together as the DAO scales, and keep it accountable to its agreed upon decision-making schedule.
+
+**Legal**
+
+Work towards the legal clarity necessary to make Juicebox a welcoming protocol where any project can be deployed with confidence.
+
+**Analytics**
+
+Give projects rich insights into their community, and provide overview information about the JB protocol.
+
+**Frontend**
+
+Develop web clients for the protocol that make the user experience of exploring projects and contributing to them more empowering, reliable, and delightful over time.
+
+**Juicebox ecosystem**
+
+Stand up infrastructure to help projects running on the Juicebox protocol grow their decentralized communities and experiment with various treasury strategies.
+
+**Visibility & materials**
+
+Create and propagate digital and physical publications, stickers, art, videos, memes, and other stuff that radiate Juicebox vibes and tell our story.
+
+**Dev ops**
+
+Make it as easy as possible for people to build on JB by improving processes, tooling, and documentation for all developers.
+
+**Mechanism**
+
+Build models and tools to analyze Juicebox project configurations. Develop and implement utilities for tokens in the Juicebox ecosystem.
+
+**Product, project, and program management**
+
+Regularly define, assess, prioritize, and publicly communicate the goals and progress of what we’re working towards across focus areas.
+
+#### Membership
+
+*What does it mean to be a JuiceboxDAO member*
+
+DAO members are responsible for proposing and voting on:
+
+- how the DAO's treasury funds are allocated.
+- changes to the protocol the DAO has agreed to steward.
+- changes to formal processes the DAO has agreed to follow.
+- criteria for membership admission and boundaries for quitting.
+
+DAO membership is required by the people and projects who raise funds on the Juicebox protocol, is given to people who are currently stewarding its focus areas, and is open to people who choose to help fund its treasury.
+
+Membership is represented via the JBX token issued using the Juicebox protocol itself. All JBX holders are JuiceboxDAO members.
+
+Members can quit by burning any portion of their tokens at any time and take with them a portion of the treasury's funds.
+
+# Contributing to JuiceboxDAO
+
+### A Permeable DAO
+
+JuiceboxDAO strives to maintain an open contribution policy. Anyone may pitch in and help with any of the Focus Areas defined in the [DAO Foundation](../foundation), such as protocol and frontend development, community alignment, or governance.
+
+Unlike traditional workplaces, the DAO is open to pseudonymous contributors ("anons"). New contributors are not expected to present a resumé or any other identifying material. The DAOs permeability to new contributors with no substantial reputation informs its contributor onboarding structure.
+
+To welcome new contributors, many of whom have little to no reputation online, the DAO suggests that contributors consider the following process to successfully onboard as a paid contributor
+
+### Getting Started
+
+New contributors are advised to introduce themselves in the [Juicebox DAO Discord server](https://discord.gg/juicebox/), and to familiarize themselves with the focus areas they would like to contribute to. New contributors should also reach out to active contributors on Discord to figure out where the DAO needs help, or to propose new objectives. Project coordination often takes place in Juicebox DAO's [Notion workspace](https://notion.so/juicebox).
+
+### Trial Payouts
+
+Contributors who have completed some work and familiarized themselves with the DAO's ongoing efforts are encouraged to propose a smaller one-time trial payout. These proposals should detail work which has already been completed and plans for upcoming contributions to the DAO. Read [How to Make a Governance Proposal](../proposals) to learn more. For inspiration, read [recent governance proposals](https://vote.juicebox.money/#/jbdao.eth).
+
+### Recurring Payouts
+
+Contributors who have completed one or more trial payouts are advised to propose an ongoing role and recurring payout for 3-7 funding cycles. This proposal should detail responsibilities, task-based objectives, and long-term goals.
+
+### What should I do next?
+
+1. Join [the Discord](https://www.discord.gg/juicebox).
+2. Join the weekly [Discord Town Halls](../town-hall) (Tuesday 22:00 UTC).
+3. Read recent [governance proposals](https://juicetool.xyz/nance/juicebox).
+4. Read recent message history in relevant Discord channels to familiarize yourself with the high level ongoing projects in the DAO, and details of the areas you wish to contribute to.
+5. Reach out to active contributors in channels related to areas you would like to contribute to. Ask what you can help with or propose new objectives for the DAO.
+6. Participate in the DAO for 1-2 weeks before asking for a payout.
+
+*Note: In order to get paid by Juicebox DAO, you will need to have a cryptocurrency wallet. You can read more about wallets [here](https://ethereum.org/en/wallets/).*
+
+# JuiceboxDAO Governance Process
+
+*JuiceboxDAO's governance follows a 14 day cycle.*
+
+![](/img/gov-calendar.webp)
+
+#### Governance Schedule
+
+Day 1 - Temperature Check - Saturday (00:00 UTC)
+Day 4 - Snapshot Vote - Tuesday (00:00 UTC)
+Day 8 - Multisig Execution - Saturday (00:00 UTC)
+Day 12 - Reconfiguration Delay - Wednesday (19:19 UTC)
+Day 15 / Day 1 - Funding Cycle Updated - Saturday (19:19 UTC)
+
+#### Step 0 - Discussion
+
+Proposals can be made on [jbdao.org](https://www.jbdao.org/) at any time. When ready, authors can change a proposal's status from `Draft` to `Discussion` to start a discussion thread in [JuiceboxDAO's Discord](https://www.discord.gg/juicebox).
+
+*See [How to Make a Governance Proposal](../proposals) for help.*
+
+#### Step 1 - Temperature Check
+
+`Begins on Day 1 of the Governance Cycle - Saturday 00:00 UTC`
+
+A 3-day Y/N Discord poll (a "temperature check") is made for each proposal submitted by the start of a Governance Cycle. While this poll is active, authors can update or redact their proposals as they get feedback. Verified Discord members with JBX get one vote for each poll. To participate, verify your JBX in [`#🍌|verify-jbx`](https://discord.gg/juicebox).
+
+Proposals with 10 or more "Y" votes and at least 30% "Y" votes move to Snapshot voting.
+
+#### Step 2 - Snapshot Voting
+
+`Begins on Day 4 of the Governance Cycle - Tuesday 00:00 UTC`
+
+A 4-day For/Against/Abstain [Snapshot](https://snapshot.org/#/jbdao.eth) vote is made for proposals approved by temperature checks. JBX holders get one vote per JBX held for each proposal, and can delegate their voting power on Snapshot.
+
+Proposals with 80,000,000 or more votes (including "Abstain" and "Against" votes) and at least 66% "For" votes (not counting "Abstain" votes) will be implemented.
+
+#### Step 3 - Execution
+
+`Begins on Day 7 of the Governance Cycle - Saturday 00:00 UTC`
+
+The JuiceboxDAO multisig ([`0xAF28bcB48C40dBC86f52D459A6562F658fc94B1e`](https://app.safe.global/home?safe=eth:0xAF28bcB48C40dBC86f52D459A6562F658fc94B1e)) executes approved proposals according to their specifications.
+
+- If approved proposals conflict with each other, more recently approved proposals take priority for the conflicting part. If they were approved at the same time, the proposal with more "For" votes takes priority.
+- Proposals are effective when they are approved on Snapshot unless they say otherwise.
+- Parts of proposals which are impossible to execute won't be executed.
+- The multisig can make small reasonable modifications to a proposal when interpreting it.
+
+The multisig controls the JuiceboxDAO project and some [Juicebox protocol parameters](https://docs.juicebox.money/dev/learn/administration). JuiceboxDAO governance execution depends upon the cooperation of the multisig's elected signers, who have committed to executing the will of the DAO as expressed by the Governance Process.
+
+#### Step 4 - Reconfiguration Delay
+
+`Begins on Day 12 of the Governance Cycle - Wednesday 19:19 UTC`
+
+Any changes to JuiceboxDAO's project must be submitted at least 3 days before the next cycle starts. This is enforced by the Juicebox protocol. This gives DAO members time to verify queued changes, and to burn their JBX if desired.
+
+# JuiceboxDAO Multisig Process
+
+The JuiceboxDAO Multisig, [`0xAF28bcB48C40dBC86f52D459A6562F658fc94B1e`](https://etherscan.io/address/0xAF28bcB48C40dBC86f52D459A6562F658fc94B1e), is responsible for interpreting and executing the outcomes of the [Governance Process](https://docs.juicebox.money/dao/process/).
+
+## Rules
+
+1. Multisig signers must agree to execute the will of JBX token holders, as expressed through the Governance Process.
+2. The Multisig threshold must be at or above 60% of signers at all times.
+3. The Multisig can reimburse gas fees paid to execute previous Multisig transactions.
+4. In an emergency, the Multisig can execute transactions according to the [Juicebox Emergency Procedures](https://docs.juicebox.money/dao/security/emergency/).
+
+## Process
+
+During Offchain Snapshot voting, the Multisig should internally decide which signer(s) will be responsible for queuing project reconfigurations and any other necessary transactions. The Multisig should also designate a backup signer in the event that the first signer is unable to fulfill the following steps.
+
+Less than 12 hours after Snapshot voting finalizes, the designated signer(s) should queue all necessary transactions, create a Discord thread for each transaction, and then notify other Multisig members by tagging the `@Multisig` role. Each thread should contain a link to the relevant proposal(s), a transaction simulation, and a plain-language description of the proposed changes. If appropriate, the thread should also contain a link to a Juicetool configuration diff or other resources.
+
+Over the following 12 hours, each signer should independently verify and sign the proposed transactions. If a signer finds errors in or is unsure about a proposed transaction, that signer should voice their concerns in the appropriate Discord thread, tagging the signer which queued that transaction. Those signers should then work together to queue transactions which resolve those concerns (in the same manner as described above).
+
+The last signer to approve the queued transactions (thereby meeting the threshold) should also execute or batch execute those transactions after approving them. If the queued transactions have still not been executed within 24 hours of the next reconfiguration delay cutoff, the designated signer should execute them.
+
+# Make a Governance Proposal
+
+:::info
+Juicebox DAO runs on a [14 day governance cycle](../process). Follow along in the [Juicebox DAO Discord Server](https://discord.gg/juicebox) and on our [Governance Portal](https://jbdao.org).
+:::
+
+#### To create a new proposal:
+
+1. Visit the [current proposals page](https://juicetool.xyz/nance/juicebox)
+2. Click `New Proposal` in the upper right-hand corner.
+3. Click `Connect` in the upper right-hand corner. If you don't have a wallet, you can get one from [MetaMask.io](https://metamask.io).
+4. Select your proposal's type, fill out all of the metadata fields, and write your proposal in the editor below.
+5. Click `Submit`.
+6. A discussion thread for your proposal will be generated in the `#💡-proposals` channel of [Juicebox's Discord server](https://discord.gg/juicebox). The community will help you prepare the proposal for the next [temperature check](../process).
+
+*The revision process can cause a proposal to take more than one funding cycle to reach the Juicebox snapshot. Honest and plain feedback in Discord proposal threads is encouraged.*
+
+
+# Contributor Operations Security
+
+
+# Overview
+
+The Juicebox protocol is a framework for funding and operating projects openly on Ethereum. It lets you:
+
+#### Deploy an NFT that represents ownership over a project
+
+Whichever address owns this NFT has administrative privileges to configure treasury parameters within the Juicebox ecosystem.
+
+
+[Learn more about projects](/dev/learn/glossary/project)
+
+
+
+#### Configure funding cycles for a project
+
+Funding cycles define contractual constraints according to which the project will operate.
+
+
+[Learn more about funding cycles](/dev/learn/glossary/funding-cycle)
+
+
+The following properties can be configured into a funding cycle:
+
+
+Funding cycle properties
+
+##### Start timestamp
+
+The timestamp at which the funding cycle is considered active. Projects can configure the start time of their first funding cycle to be in the future, and can ensure reconfigurations don't take effect before a specified timestamp.
+
+
+Once a funding cycle ends, a new one automatically starts right away. If there's an approved reconfiguration queued to start at this time, it will be used. Otherwise, a copy of the rolled over funding cycle will be used.
+
+
+##### Duration
+
+How long each funding cycle lasts (specified in seconds). All funding cycle properties are unchangeable while the cycle is in progress. In other words, any proposed reconfigurations can only take effect during the subsequent cycle.
+
+
+If no reconfigurations were submitted by the project owner, or if proposed changes fail the current cycle's [ballot](#ballot), a copy of the latest funding cycle will automatically start once the current one ends.
+
+
+A cycle with no duration lasts indefinitely, and reconfigurations can start a new funding cycle with the proposed changes right away.
+
+
+##### Distribution limit
+
+The amount of funds that can be distributed out from the project's treasury during a funding cycle. The project owner can pre-program a list of addresses, other Juicebox projects, and contracts that adhere to [IJBSplitAllocator
](/dev/api/interfaces/ijbsplitallocator) to split distributions between. Treasury funds in excess of the distribution limit is considered overflow, which can serve as runway or be reclaimed by token holders who redeem their tokens.
+
+
+Distributing is a public transaction that anyone can call on a project's behalf. The project owner can also include a split that sends a percentage of the distributed funds to the address who executes this transaction.
+
+
+The protocol charges a [JBX membership fee](#jbx-membership-fee) on funds withdrawn from the network. There are no fees for distributions to other Juicebox projects.
+
+
+Distribution limits can be specified in any currency that the [JBPrices
](/dev/api/contracts/jbprices) contract has a price feed for.
+
+
+
+
+##### Overflow allowance
+
+The amount of treasury funds that the project owner can distribute on-demand.
+
+
+This allowance does not reset per-funding cycle. Instead, it lasts until the project owner explicitly proposes a reconfiguration with a new allowance.
+
+
+The protocol charges a [JBX membership fee](#jbx-membership-fee) on funds withdrawn from the network.
+
+
+Overflow allowances can be specified in any currency that the [JBPrices
](/dev/api/contracts/jbprices) contract has a price feed for.
+
+
+##### Weight
+
+A number used to determine how many project tokens should be minted and transferred when payments are received during the funding cycle. In other words, weight is the exchange rate between the project token and a currency (defined by a [JBPayoutRedemptionPaymentTerminal3_1_1](/dev/api/contracts/or-payment-terminals/or-abstract/jbpayoutredemptionpaymentterminal3_1_1/)) during that funding cycle. Project owners can configure this directly, or allow it to be derived automatically from the previous funding cycle's weight and discount rate.
+
+
+##### Discount rate
+
+The percent to automatically decrease the subsequent cycle's weight from the current cycle's weight.
+
+
+The discount rate is not applied during funding cycles where the weight is explicitly reconfigured.
+
+
+[Learn more about discount rates](/dev/learn/glossary/discount-rate)
+
+##### Ballot
+
+The address of a contract that adheres to [IJBFundingCycleBallot
](/dev/api/interfaces/ijbfundingcycleballot), which can provide custom criteria that prevents funding cycle reconfigurations from taking effect.
+
+
+A common implementation is to force reconfigurations to be submitted at least X days before the end of the current funding cycle, giving the community foresight into any misconfigurations or abuses of power before they take effect.
+
+
+A more complex implementation might include on-chain governance.
+
+
+[Learn more ballots](/dev/learn/glossary/ballot)
+
+
+##### Reserved rate
+
+The percentage of newly minted tokens that a project wishes to withhold for custom distributions. The project owner can pre-program a list of addresses, other Juicebox project owners, and contracts that adhere to [IJBSplitAllocator
](/dev/api/interfaces/ijbsplitallocator) to split reserved tokens between.
+
+
+[Learn more about reserved rate](/dev/learn/glossary/reserved-tokens)
+
+
+##### Redemption rate
+
+The percentage of a project's treasury funds that can be reclaimed by community members by redeeming the project's tokens during the funding cycle.
+
+A rate of 100% suggests a linear proportion, meaning X% of treasury overflow can be reclaimed by redeeming X% of the token supply.
+
+
+[Learn more about redemption rates](/dev/learn/glossary/redemption-rate)
+
+##### Ballot redemption rate
+
+A project can specify a custom redemption rate that only applies when a proposed reconfiguration is waiting to take effect.
+
+
+This can be used to automatically allow for more favorable redemption rates during times of potential change.
+
+##### Pause payments, pause distributions, pause redemptions, pause burn
+
+Projects can pause various bits of its treasury's functionality on a per-funding cycle basis. These functions are unpaused by default.
+
+##### Allow minting tokens, allow changing tokens, allow setting terminals, allow setting the controller, allow terminal migrations, allow controller migration
+
+Projects can allow various bits of treasury functionality on a per-funding cycle basis. These functions are disabled by default.
+
+##### Hold fees
+
+By default, JBX membership fees are paid automatically when funds are distributed out of the ecosystem from a project's treasury. During funding cycles configured to hold fees, this fee amount is set aside instead of being immediately processed. Projects can get their held fees returned by adding the same amount of withdrawn funds back to their treasury. Otherwise, JuiceboxDAO or the project can process these held fees at any point to get JBX at the current rate.
+
+
+This allows a project to withdraw funds and later add them back into their Juicebox treasury without incurring fees.
+
+
+This applies to both distributions from the distribution limit and from the overflow allowance.
+
+##### Data source
+
+The address of a contract that adheres to [IJBFundingCycleDataSource
](/dev/api/interfaces/ijbfundingcycledatasource), which can be used to extend or override what happens when the treasury receives funds, and what happens when someone tries to redeem their project tokens.
+
+
+[Learn more about data sources](/dev/learn/glossary/data-source)
+
+
+
+A project can mint and distribute tokens on demand if its current funding cycle is configured to allow minting.
+By default, project tokens are not ERC-20s and thus not compatible with standard market protocols like Uniswap. At any time, you can issue ERC-20s that your token holders can claim. This is optional.
+
+
+#### Burn tokens
+
+Anyone can burn a project's tokens if the project's current funding cycle isn't configured to paused burning.
+
+
+#### Bring-your-own token
+
+A project can bring its own token, as long as it adheres to [IJBToken
](/dev/api/interfaces/ijbtoken) and uses fixed point accounting with 18 decimals.
+
+
+This allows a project to use ERC-721's, ERC-1155's, or any other custom contract that'll be called upon when the protocol asks to mint or burn tokens.
+
+
+A project can change its token during any of its funding cycles that are explicitly configured to allow changes.
+
+
+By default, the protocol provides a transaction for projects to deploy [JBToken
](/dev/api/contracts/jbtoken) ERC-20 tokens.
+
+
+#### Splits
+
+A project can pre-program token distributions to splits. The destination of a split can be an Ethereum address, the project ID of another project's Juicebox treasury (the split will allow you to configure the beneficiary of that project's tokens that get minted in response to the contribution), to the allocate(...)
function of any contract that adheres to [IJBSplitAllocator
](/dev/api/interfaces/ijbsplitallocator), or to the address that initiated the transaction that distributes tokens to the splits.
+
+
+[Learn more about splits](/dev/learn/glossary/splits)
+[Learn more about allocators](/dev/learn/glossary/split-allocator)
+
+
+#### JBX membership fee
+
+All funds distributed by projects from their treasuries to destinations outside of the Juicebox ecosystem (i.e. distributions that do not go to other Juicebox treasuries) will incure a protocol fee. Redemptions from projects using [JBETHPaymentTerminal3_1_1
](/dev/api/contracts/or-payment-terminals/jbethpaymentterminal3_1_1/) incur fees if the redemption rate (or ballot redemption rate) is less than 100%. This fee is sent to the JuiceboxDAO treasury which runs on the Juicebox protocol itself (project ID of 1), triggering the same functionality as a payment directly to JuiceboxDAO (by default, minting JBX for the fee payer according to JuiceboxDAO's current funding cycle configuration) from an external source.
+
+
+This fee is adjustable by JuiceboxDAO, with a max value of 5%.
+
+
+Any funds sent from one juicebox treasury to another via splits do not incur fees.
+
+
+#### Custom treasury strategies
+
+Funding cycles can be configured to use an [IJBRedemptionDelegate
](/dev/api/interfaces/ijbfundingcycledatasource">IJBFundingCycleDataSource
, IJBPayDelegate
, and
+[Juicebox Snapshot](https://snapshot.org/#/jbdao.eth)
+[Snapshot Delegation](https://vote.juicebox.money/#/delegate/jbdao.eth)
+
+#### Resources
+
+[How to Make a Governance Proposal](proposals)
+[Governance Process](process)
+[Juicebox DAO Foundation](foundation)
+
+
+
+### Who is Juicebox DAO?
+
+From [JBX & Fees](/dao/reference/jbx/):
+
+> The Juicebox protocol is developed by JuiceboxDAO. JuiceboxDAO has no CEO, no hiring department, and no Board of Directors; instead, it is self-governed via the JBX token. "DAO" stands for _Decentralized Autonomous Organization_ — by utilizing token governance and the Juicebox protocol itself, JuiceboxDAO is able to manage strategic decisions, payouts to contributors, and to consistently deliver upgrades to a best-in-class Ethereum protocol, along with a powerful suite of tools to support it.
+>
+> You can see current JBX holders ranked below:
+
+# JuiceboxDAO Foundation
+
+#### Mission statement
+
+*What the DAO works toward*
+
+JuiceboxDAO helps people confidently fund, operate, and scale programmable treasuries on Ethereum.
+
+#### Values
+
+*Who we are*
+
+- **We're builders.** The decisions we make prioritize those building, and we trust those who we've delegated responsibilities to.
+- **We're focused.** We encourage one another to focus on the commitments we've made to the DAO, and keep each other accountable to them.
+- **We're supportive.** We're here to help, and we communicate in a way that empowers one another.
+- **We're listeners.** We are humble with our knowledge, and seek balance between urgency and patience.
+- **We're honest.** We are each unique selves, and we communicate our individual ideas openly and with clarity. We express ourselves and exchange feedback with this in mind.
+- **We’re stewards.** We respect the opportunity to help set a tone for what it means to build on the open internet together.
+
+#### Focus areas
+
+*Where the DAO focuses its resources*
+
+(No particular order)
+
+**Protocol**
+
+Define, optimize, test, secure, monitor, and document the core Juicebox protocol.
+
+**Security**
+
+Minimize, monitor, and mitigate risks to project creators, contributors, and patrons across contracts and frontends.
+
+**Community alignment**
+
+Help project owners and members of the JB community get the resources and attention they need to build and work together.
+
+**Web3 ecosystem**
+
+Position JB to work with and help other public DAOs, tools, and services to safely widen opportunities for all in Web3.
+
+**Onboarding**
+
+Help people launch their projects on JB and build extensions to the protocol through active Q&A availability, providing useful documentation, and helping shape the information architecture of web clients.
+
+**Governance**
+
+Plan out how we will make decisions together as the DAO scales, and keep it accountable to its agreed upon decision-making schedule.
+
+**Legal**
+
+Work towards the legal clarity necessary to make Juicebox a welcoming protocol where any project can be deployed with confidence.
+
+**Analytics**
+
+Give projects rich insights into their community, and provide overview information about the JB protocol.
+
+**Frontend**
+
+Develop web clients for the protocol that make the user experience of exploring projects and contributing to them more empowering, reliable, and delightful over time.
+
+**Juicebox ecosystem**
+
+Stand up infrastructure to help projects running on the Juicebox protocol grow their decentralized communities and experiment with various treasury strategies.
+
+**Visibility & materials**
+
+Create and propagate digital and physical publications, stickers, art, videos, memes, and other stuff that radiate Juicebox vibes and tell our story.
+
+**Dev ops**
+
+Make it as easy as possible for people to build on JB by improving processes, tooling, and documentation for all developers.
+
+**Mechanism**
+
+Build models and tools to analyze Juicebox project configurations. Develop and implement utilities for tokens in the Juicebox ecosystem.
+
+**Product, project, and program management**
+
+Regularly define, assess, prioritize, and publicly communicate the goals and progress of what we’re working towards across focus areas.
+
+#### Membership
+
+*What does it mean to be a JuiceboxDAO member*
+
+DAO members are responsible for proposing and voting on:
+
+- how the DAO's treasury funds are allocated.
+- changes to the protocol the DAO has agreed to steward.
+- changes to formal processes the DAO has agreed to follow.
+- criteria for membership admission and boundaries for quitting.
+
+DAO membership is required by the people and projects who raise funds on the Juicebox protocol, is given to people who are currently stewarding its focus areas, and is open to people who choose to help fund its treasury.
+
+Membership is represented via the JBX token issued using the Juicebox protocol itself. All JBX holders are JuiceboxDAO members.
+
+Members can quit by burning any portion of their tokens at any time and take with them a portion of the treasury's funds.
+
+# Contributing to JuiceboxDAO
+
+### A Permeable DAO
+
+JuiceboxDAO strives to maintain an open contribution policy. Anyone may pitch in and help with any of the Focus Areas defined in the [DAO Foundation](../foundation), such as protocol and frontend development, community alignment, or governance.
+
+Unlike traditional workplaces, the DAO is open to pseudonymous contributors ("anons"). New contributors are not expected to present a resumé or any other identifying material. The DAOs permeability to new contributors with no substantial reputation informs its contributor onboarding structure.
+
+To welcome new contributors, many of whom have little to no reputation online, the DAO suggests that contributors consider the following process to successfully onboard as a paid contributor
+
+### Getting Started
+
+New contributors are advised to introduce themselves in the [Juicebox DAO Discord server](https://discord.gg/juicebox/), and to familiarize themselves with the focus areas they would like to contribute to. New contributors should also reach out to active contributors on Discord to figure out where the DAO needs help, or to propose new objectives. Project coordination often takes place in Juicebox DAO's [Notion workspace](https://notion.so/juicebox).
+
+### Trial Payouts
+
+Contributors who have completed some work and familiarized themselves with the DAO's ongoing efforts are encouraged to propose a smaller one-time trial payout. These proposals should detail work which has already been completed and plans for upcoming contributions to the DAO. Read [How to Make a Governance Proposal](../proposals) to learn more. For inspiration, read [recent governance proposals](https://vote.juicebox.money/#/jbdao.eth).
+
+### Recurring Payouts
+
+Contributors who have completed one or more trial payouts are advised to propose an ongoing role and recurring payout for 3-7 funding cycles. This proposal should detail responsibilities, task-based objectives, and long-term goals.
+
+### What should I do next?
+
+1. Join [the Discord](https://www.discord.gg/juicebox).
+2. Join the weekly [Discord Town Halls](../town-hall) (Tuesday 22:00 UTC).
+3. Read recent [governance proposals](https://juicetool.xyz/nance/juicebox).
+4. Read recent message history in relevant Discord channels to familiarize yourself with the high level ongoing projects in the DAO, and details of the areas you wish to contribute to.
+5. Reach out to active contributors in channels related to areas you would like to contribute to. Ask what you can help with or propose new objectives for the DAO.
+6. Participate in the DAO for 1-2 weeks before asking for a payout.
+
+*Note: In order to get paid by Juicebox DAO, you will need to have a cryptocurrency wallet. You can read more about wallets [here](https://ethereum.org/en/wallets/).*
+
+# JuiceboxDAO Governance Process
+
+*JuiceboxDAO's governance follows a 14 day cycle.*
+
+![](/img/gov-calendar.webp)
+
+#### Governance Schedule
+
+Day 1 - Temperature Check - Saturday (00:00 UTC)
+Day 4 - Snapshot Vote - Tuesday (00:00 UTC)
+Day 8 - Multisig Execution - Saturday (00:00 UTC)
+Day 12 - Reconfiguration Delay - Wednesday (19:19 UTC)
+Day 15 / Day 1 - Funding Cycle Updated - Saturday (19:19 UTC)
+
+#### Step 0 - Discussion
+
+Proposals can be made on [jbdao.org](https://www.jbdao.org/) at any time. When ready, authors can change a proposal's status from `Draft` to `Discussion` to start a discussion thread in [JuiceboxDAO's Discord](https://www.discord.gg/juicebox).
+
+*See [How to Make a Governance Proposal](../proposals) for help.*
+
+#### Step 1 - Temperature Check
+
+`Begins on Day 1 of the Governance Cycle - Saturday 00:00 UTC`
+
+A 3-day Y/N Discord poll (a "temperature check") is made for each proposal submitted by the start of a Governance Cycle. While this poll is active, authors can update or redact their proposals as they get feedback. Verified Discord members with JBX get one vote for each poll. To participate, verify your JBX in [`#🍌|verify-jbx`](https://discord.gg/juicebox).
+
+Proposals with 10 or more "Y" votes and at least 30% "Y" votes move to Snapshot voting.
+
+#### Step 2 - Snapshot Voting
+
+`Begins on Day 4 of the Governance Cycle - Tuesday 00:00 UTC`
+
+A 4-day For/Against/Abstain [Snapshot](https://snapshot.org/#/jbdao.eth) vote is made for proposals approved by temperature checks. JBX holders get one vote per JBX held for each proposal, and can delegate their voting power on Snapshot.
+
+Proposals with 80,000,000 or more votes (including "Abstain" and "Against" votes) and at least 66% "For" votes (not counting "Abstain" votes) will be implemented.
+
+#### Step 3 - Execution
+
+`Begins on Day 7 of the Governance Cycle - Saturday 00:00 UTC`
+
+The JuiceboxDAO multisig ([`0xAF28bcB48C40dBC86f52D459A6562F658fc94B1e`](https://app.safe.global/home?safe=eth:0xAF28bcB48C40dBC86f52D459A6562F658fc94B1e)) executes approved proposals according to their specifications.
+
+- If approved proposals conflict with each other, more recently approved proposals take priority for the conflicting part. If they were approved at the same time, the proposal with more "For" votes takes priority.
+- Proposals are effective when they are approved on Snapshot unless they say otherwise.
+- Parts of proposals which are impossible to execute won't be executed.
+- The multisig can make small reasonable modifications to a proposal when interpreting it.
+
+The multisig controls the JuiceboxDAO project and some [Juicebox protocol parameters](https://docs.juicebox.money/dev/learn/administration). JuiceboxDAO governance execution depends upon the cooperation of the multisig's elected signers, who have committed to executing the will of the DAO as expressed by the Governance Process.
+
+#### Step 4 - Reconfiguration Delay
+
+`Begins on Day 12 of the Governance Cycle - Wednesday 19:19 UTC`
+
+Any changes to JuiceboxDAO's project must be submitted at least 3 days before the next cycle starts. This is enforced by the Juicebox protocol. This gives DAO members time to verify queued changes, and to burn their JBX if desired.
+
+# JuiceboxDAO Multisig Process
+
+The JuiceboxDAO Multisig, [`0xAF28bcB48C40dBC86f52D459A6562F658fc94B1e`](https://etherscan.io/address/0xAF28bcB48C40dBC86f52D459A6562F658fc94B1e), is responsible for interpreting and executing the outcomes of the [Governance Process](https://docs.juicebox.money/dao/process/).
+
+## Rules
+
+1. Multisig signers must agree to execute the will of JBX token holders, as expressed through the Governance Process.
+2. The Multisig threshold must be at or above 60% of signers at all times.
+3. The Multisig can reimburse gas fees paid to execute previous Multisig transactions.
+4. In an emergency, the Multisig can execute transactions according to the [Juicebox Emergency Procedures](https://docs.juicebox.money/dao/security/emergency/).
+
+## Process
+
+During Offchain Snapshot voting, the Multisig should internally decide which signer(s) will be responsible for queuing project reconfigurations and any other necessary transactions. The Multisig should also designate a backup signer in the event that the first signer is unable to fulfill the following steps.
+
+Less than 12 hours after Snapshot voting finalizes, the designated signer(s) should queue all necessary transactions, create a Discord thread for each transaction, and then notify other Multisig members by tagging the `@Multisig` role. Each thread should contain a link to the relevant proposal(s), a transaction simulation, and a plain-language description of the proposed changes. If appropriate, the thread should also contain a link to a Juicetool configuration diff or other resources.
+
+Over the following 12 hours, each signer should independently verify and sign the proposed transactions. If a signer finds errors in or is unsure about a proposed transaction, that signer should voice their concerns in the appropriate Discord thread, tagging the signer which queued that transaction. Those signers should then work together to queue transactions which resolve those concerns (in the same manner as described above).
+
+The last signer to approve the queued transactions (thereby meeting the threshold) should also execute or batch execute those transactions after approving them. If the queued transactions have still not been executed within 24 hours of the next reconfiguration delay cutoff, the designated signer should execute them.
+
+# Make a Governance Proposal
+
+:::info
+Juicebox DAO runs on a [14 day governance cycle](../process). Follow along in the [Juicebox DAO Discord Server](https://discord.gg/juicebox) and on our [Governance Portal](https://jbdao.org).
+:::
+
+#### To create a new proposal:
+
+1. Visit the [current proposals page](https://juicetool.xyz/nance/juicebox)
+2. Click `New Proposal` in the upper right-hand corner.
+3. Click `Connect` in the upper right-hand corner. If you don't have a wallet, you can get one from [MetaMask.io](https://metamask.io).
+4. Select your proposal's type, fill out all of the metadata fields, and write your proposal in the editor below.
+5. Click `Submit`.
+6. A discussion thread for your proposal will be generated in the `#💡-proposals` channel of [Juicebox's Discord server](https://discord.gg/juicebox). The community will help you prepare the proposal for the next [temperature check](../process).
+
+*The revision process can cause a proposal to take more than one funding cycle to reach the Juicebox snapshot. Honest and plain feedback in Discord proposal threads is encouraged.*
+
+
+# Contributor Operations Security
+
+## General Tips
+
+1. **Think before you click.** Most cyber-attacks start with phishing or social engineering. Exercise caution when clicking links or downloading files. Tend towards being overly cautious, and don't hestitate to ask others for help.
+2. **Secure your accounts.** Use multi-factor authentication and an offline password manager like [KeePassXC](https://keepassxc.org/).
+3. **Simulate transactions.** Before approving any transactions, use a tool like [Tenderly](https://tenderly.co/) to verify its outcome. Only interact with trusted frontends and contracts.
+4. **Minimize dependencies.** The best software is no software. If you have to, look for tools that respects user privacy, and are open-source, audited, and well-established.
+5. **Stay up to date.** Always ensure that you have the latest security upgrades. Use automatic updates.
+
+## Prevention Checklist
+
+If you haven't already, take the following steps over the next 2 weeks. If you have any questions, ask filipv.
+
+- [ ] Familiarize yourself with the [Emergency Process](../emergency).
+- [ ] Set up automatic updates for all relevant software (browsers, apps, clients, etc).
+- [ ] Join the [Backup Telegram](https://t.me/jbx_backup).
+- [ ] Buy a [YubiKey](https://www.yubico.com/), or a similar 2FA hardware device.
+- [ ] Set up an offline password manager like [KeePassXC](https://keepassxc.org/).
+- [ ] If you haven't already, create a new email for work related to Juicebox.
+- [ ] Migrate online accounts related to Juicebox to your new email. Use the password manager to generate new passwords as you do this, with >128 bits of entropy.
+- [ ] Set up Two-Factor authentication for all of your Juicebox accounts
+- [ ] Buy and use a hardware wallet — a [Ledger](https://www.ledger.com/) or a [Trezor](https://trezor.io/).
+- [ ] Regularly run antivirus software. For Windows users, Windows Defender and [MalwareBytes](https://www.malwarebytes.com/) are both decent free options.
+- [ ] Check your email and phone number on [haveibeenpwned](https://haveibeenpwned.com/), and update credentials for any accounts which appear.
+
+## Intervention Checklist
+
+If you suspect that any of your accounts may be compromised, take the following steps as quickly as possible:
+
+- [ ] If you suspect that you may have malware, or if you're not sure how your account was compromised: Update your security software, run a scan, and delete any malware. Use a second device for the following steps while this runs.
+- [ ] Take immediate action to minimize damage. If you are able to log in to the compromised account, change the password immediately. If you don't already have 2FA on the account, add it. Deactivate any API keys or other integrations associated with that account.
+- [ ] Warn other contributors over Discord and Telegram. Write a brief message detailing the name of the compromised account/service and how the compromise took place. If the compromised account has any administrative permissions, be sure to contact contributors who can remove those permissions (or remove the account entirely).
+- [ ] If applicable, contact the relevant service's customer support. You should also ask other contributors if they have a contact which can help to resolve the issue more quickly. Start with the resources below:
+
+| Service | Link |
+| -------- | ----------------------------------------------------------------------------------------------------- |
+| Discord | [Support](https://support.discord.com/hc/en-us/requests/new) (select `Hacked Account`) |
+| GitHub | [GitHub Authentication Docs](https://docs.github.com/en/authentication) |
+| Twitter | [Help with my hacked account](https://help.twitter.com/en/safety-and-security/twitter-account-hacked) |
+| Google | [Secure a hacked or compromised Google Account](https://support.google.com/accounts/answer/6294825) |
+| Telegram | [FAQ](https://telegram.org/faq#q-my-phone-was-stolen-what-do-i-do) |
+| Notion | Scroll to bottom, click ['Contact Support'](https://www.notion.so/product) |
+
+## Multisig Checklist
+
+If you are a multisig signer, take the following steps over the next 2 weeks:
+
+- [ ] Familiarize yourself with the [Emergency Process](emergency).
+- [ ] Buy and use a hardware wallet — a [Ledger](https://www.ledger.com/) or a [Trezor](https://trezor.io/).
+- [ ] Create a wallet address which is only used for signing and executing JuiceboxDAO Safe transactions.
+- [ ] Register an ENS for your signer wallet. This makes your wallet easier to identify.
+- [ ] Familiarize yourself with [Tenderly](https://tenderly.co/)'s features. If you submit any transactions, share a simulation on Discord.
+- [ ] Join the Multisig Telegram (invitations sent via direct message).
+
+
+# JuiceboxDAO Media Guidelines
+
+#### Index of Current Accounts
+
+| Name/Link | Responsible Contributor |
+| --------------------------------------------------- | --------------------------- |
+| [Discord](https://discord.gg/juicebox) | jango, filipv & nnnnicholas |
+| [Twitter](https://twitter.com/juiceboxETH) | jango |
+| [Blog](https://docs.juicebox.money/blog) | filipv |
+| [Podcast](https://anchor.fm/thejuicecast) | Brileigh & Matthew |
+| [YouTube](https://youtube.com/c/juiceboxdao) | filipv |
+| [Newletter](https://subscribepage.io/juicenews) | Brileigh & Matthew |
+| [Instagram](https://www.instagram.com/juiceboxeth/) | 0xSTVG |
+| [TikTok](https://www.tiktok.com/@juiceboxeth) | Brileigh & Matthew |
+
+#### General Guidelines
+
+- Anybody can create a social media account for JuiceboxDAO, even if we already have an account on that platform.
+- JuiceboxDAO is decentralized. There are no "official" accounts.
+- Anybody can suggest posts for any one of these platforms, but the final say comes down to the responsible contributor (usually the person who created the account). Share your draft/post in the visibility channel of [our Discord](https://discord.gg/juicebox) and tag the responsible contributor for help improving it.
+- Try to coordinate major announcements across multiple platforms over Discord.
+
+#### Twitter
+
+- If you have something to share, tag @juiceboxETH for a retweet (not guaranteed).
+- For more serious announcements (from the @juiceboxETH account), write a draft and share it in the visiblity channel of [our Discord](https://discord.gg/juicebox). Tag @jango.
+- Avoid the "crypto grifter" tweeting style if possible. This usually involves excessive use of finger pointing emojis.
+
+#### Blog
+
+- Blog posts are written in [markdown](https://www.markdownguide.org/) and added to the [juice-docs repo](https://github.com/jbx-protocol/juice-docs).
+- Your post should either go in `/blog`, or into one of the subdirectories under `/blogs`.
+- Read [this page](https://docusaurus.io/docs/blog) to learn about you should name your file and format your frontmatter.
+- Make a pull request.
+
+#### YouTube
+
+- If you would like upload access, ask filipv and he might give it to you. Otherwise, share your video on Discord and somebody might upload it.
+- If you do share a video, please also share a title, description, and [properly formatted chapter timestamps](https://support.google.com/youtube/answer/9884579).
+
+
+# Juicebox Emergency Procedures
+
+:::info
+This procedure is based on practices established by [Yearn Finance](https://docs.yearn.finance/developers/v2/EMERGENCY).
+:::
+
+## Introduction
+
+The following procedures and guidelines have been written to minimize potential for loss of funds in the event of an emergency.
+
+## Definitions and Examples
+
+An emergency situation is:
+
+_A situation that may lead to a considerable loss of funds for Juicebox protocol users, JuiceboxDAO, or smart contracts related to Juicebox._
+
+This is a non-exhaustive list of possible emergency scenarios:
+
+### Protocol Emergencies
+
+- A bug or an exploit in a Juicebox terminal that may lead to a loss of funds for users.
+- A bug or an exploit in an Juicebox dependency, including oracle attacks, that may lead to a loss of funds.
+- A bug or an exploit which would allow a malicious project owner to take actions which their configurations would not suggest.
+
+### Opsec Emergencies
+
+- Loss of private keys for a privileged wallet, including (but not limited to) privileged administrative addresses, the JuiceboxDAO multisig wallet, or one or more of the JuiceboxDAO multisig signers.
+- Loss of credentials for a trusted or privileged online account, including (but not limited to) GitHub, Discord, Twitter, or Notion accounts.
+
+### Frontend Emergencies
+
+- A bug or an exploit in a protocol frontend which may lead to a loss of funds for users.
+- A bug, exploit, or another issue which would allow project creator to significantly and dangerously misrepresent their project's configuration in a protocol frontend.
+- A supply chain attack affecting one or more dependencies for a protocol frontend.
+- Any DNS attack for a protocol frontend.
+- An issue with an underlying service used by a protocol frontend, including (but not limited to) hosting providers, node providers, a subgraph, an IPFS gateway, or a wallet signing provider.
+
+## Roles
+
+In the event of an emergency situation, the following roles should be assigned to JuiceboxDAO contributors working to resolve the situation:
+
+- Facilitator
+- Multisig Lead
+- Contract Lead
+- Frontend Lead
+- Ops Lead
+
+A contributor may be assigned up to two of these roles concurrently. For certain emergency types, multiple contributors may be assigned to these roles (for example, a severe frontend exploit may necessitate multiple frontend leads in order to coordinate rapid changes across multiple frontends).
+
+### Facilitator
+
+Facilitates the emergency process according to this document, engaging with the relevant JuiceboxDAO contributors, protocol users, and third parties to quickly make necessary decisions. The Facilitator should be familiar with this process and confident that they can drive the team to follow through. It is expected that the person assigned to this role has relevant experience either from having managed previous scenarios or through drill training.
+
+### Multisig Lead
+
+Responsible for ensuring that the JuiceboxDAO Multisig (or other relevant multisigs) can execute transactions on time during the emergency.
+
+Main responsibilities:
+
+- Help to queue transactions, and to clearly and concisely communicate why they are needed and what they will do.
+- Prepare simulations, reconfiguration diffs, and other resources to help signers verify transactions.
+- Help clear the queue of any pending operations.
+- Coordinate required signers so they can respond to queued transactions quickly.
+
+### Contract Lead
+
+Coordinates quick changes to contracts during the emergency, including but not limited to:
+
+- Advising on and facilitating the queuing and execution of [administrative multisig actions](/dev/learn/administration/) as necessary.
+- Facilitating upgrades, migrations, and the deployment of new smart contracts as necessary.
+
+### Frontend Lead
+
+Coordinates quick changes to protocol frontends as required, including (but not limited to):
+
+- Disabling certain actions on one or more frontends.
+- Adding warnings, alerts, and banners.
+- Disabling one or more frontends altogether.
+- Any other frontend work necessary.
+
+### Ops Lead
+
+In charge of coordinating communications and operations assistance as required:
+
+- Verify what information can and should be published during and after the incident.
+- Coordinate communications on Discord, Twitter, and elsewhere as necessary.
+- Take note of timelines and events for a disclosure/postmortem.
+
+## Emergency Steps
+
+_Also see [Check list](#Emergency-checklist) and [Tools](#tools)._
+
+This is the guideline to follow when an incident is reported.
+
+The primary objective is to minimize the loss of funds, in particular for Juicebox users. All decisions made should be driven by this goal.
+
+1. Open a private communication channel (War Room) and only invite (i) online contributors that can fulfill the roles described above, as well as (ii) additional persons that can provide critical insight into the circumstances of the issue and how it can best be resolved. Check the [Services List](../services) and invite contributors relevant to the problem.
+2. Information shared in the War Room shall be considered private and should not be shared with any third parties. Relevant data should be pinned and updated by the Facilitator for the team to have handy.
+3. The team's first milestone is to assess the situation as quickly as possible: Confirming the reported information and determining how critical the incident is. A few questions to guide this process:
+ - Is there confirmation from several team members/sources that the issue is valid? Are there example transactions that show the incident occurring? (Pin these in the War Room)
+ - Is the developer that wrote the code in question in the War Room? If not, can we reach somebody who knows it well?
+ - Are funds presently at risk? Is immediate action required?
+ - Is the issue isolated or does it affect several contracts? Can the affected contracts be identified? (Pin these in the War Room)
+ - Will Multisig transactions be required? If so, the Multisig Lead should begin to notify signers and clear the queue in preparation for emergency transactions.
+ - If there is no immediate risk of loss of funds, does the team still need to take preventive action or some other mitigation?
+ - Is there consensus that the situation is under control and that the War Room can be closed?
+4. Once the issue has been confirmed as valid, the next step is to take immediate corrective action to prevent further loss of funds. If the root cause requires further research, the team should tend towards caution and take emergency preventive actions while the assessment continues. A few questions to guide the decisions of the team:
+ - What [administrative transactions](/dev/learn/administration/) are required? Contract Lead should confirm this step.
+ - Should payments, redemptions, or other features be removed or disabled from frontends? Frontend Lead should confirm this step.
+ - Are multiple Team members able to confirm that corrective actions will stop the immediate risk through Ganache/Tenderly/other fork testing? Contract Lead should confirm this step.
+ - Will immediate public communications/announcements help to minimize the loss of funds? Ops Lead should confirm this step.
+5. What next steps should be taken to resolve this issue? The Facilitator and the Multisig Lead should coordinate this execution between the corresponding roles. During this step, the War Room should take time to assess and research a long-term solution.
+6. Once corrective measures are in place and multiple sources confirm that funds are no longer at risk, the next objective is to identify the root cause. A few questions/actions during this step that can help the team make decisions:
+ - What communications should be made public at this point?
+ - Are there other vulnerabilities related to this root cause which need to be addressed?
+ - Can research be divided between members of the War Room? This step can involve live debug sessions to help identify the problem using the sample transactions.
+7. Once the cause is identified, the team can brainstorm to come up with the most suitable remediation plan and its code implementation (if required). A few questions that can help during this time:
+ - In case there are many possible solutions can the team prioritize by weighing each option by time to implement and minimization of losses?
+ - Can the possible solutions be tested and compared to confirm the end state fixes the issue?
+ - Is there agreement in the War Room about the best solution? If not, can the objections be identified and a path for how to reach consensus on the approach be worked out, prioritizing the minimization of losses?
+ - If a solution will take longer than a few hours, are there any further communications and preventive actions needed while the fix is developed?
+ - Does the solution require a longer-term plan? Are there identified owners for the tasks/steps for the plan's execution?
+8. Once a solution has been implemented, the team will confirm the solution resolves the issue and minimizes the loss of funds. Possible actions needed during this step:
+ - Run fork simulations of end state to confirm the efficacy of the proposed solution(s)
+ - Coordinate multisig queuing, signatures, and execution
+ - Enable UI changes to normalize operations as needed
+9. Assign a lead to prepare a [disclosure](http://github.com/jbx-protocol/juice-security) (should it be required), preparing a postmortem with a timeline of the events that took place. Ops Lead should facilitate this.
+10. The team agrees when the War Room can be dismantled. The Facilitator breaks down the War Room and sets reminders if it takes longer than a few hours for members to reconvene.
+
+### Emergency Checklist
+
+- [ ] Create War Room
+- [ ] Assign Key Roles to War Room members
+- [ ] Add relevant developer(s) to the War Room (check the [Services List](../services))
+- [ ] Clear queued transactions on relevant Multisig(s)
+- [ ] Disable payments, redemptions, or other features as needed in the frontend(s)
+- [ ] Identify and confirm the issue, as well as any relevant transactions (pin to War Room)
+- [ ] Take immediate corrective/preventive actions to prevent or minimize further loss of funds
+- [ ] Communicate the current situation internally and externally as appropriate
+- [ ] Determine the root cause
+- [ ] Propose workable immediate solutions
+- [ ] Implement and validate immediate solutions
+- [ ] Prioritize long-term solutions
+- [ ] Reach agreement on best long-term solution
+- [ ] Execute long-term solution
+- [ ] Confirm incident has been resolved
+- [ ] Assign ownership of security disclosure report
+- [ ] Disband War Room
+- [ ] Conduct immediate debrief
+- [ ] Schedule a postmortem
+
+### Tools
+
+List of tools and alternatives in case primary tools are not available during an incident.
+
+| Category | Primary | Backup |
+| -------------------- | ---------------------------------- | --------------------------------- |
+| Sharing Code | [GitHub](https://github.com) | [HackMd](https://hackmd.io/) |
+| Communications | [Discord](https://discord.gg) | [Telegram](https://telegram.org/) |
+| Transaction Details | [Etherscan](https://etherscan.io) | [EthTxInfo](https://ethtx.info/) |
+| Debugging/Simulation | [Tenderly](https://tenderly.co) | Truffle, Brownie, etc. |
+| Screen Sharing | [Jitsi Meet](https://meet.jit.si/) | [Discord](https://discord.gg) |
+
+**The Facilitator is responsible for ensuring that no unauthorized persons enter the War Room or join these tools via invite links that leak.**
+
+## Incident Postmortem
+
+A postmortem should be conducted after an incident to gather data and feedback from War Room participants in order to produce actionable improvements for Juicebox processes such as this one.
+
+Following the dissolution of a War Room, the Facilitator should ideally conduct an immediate informal debrief to gather initial notes before they are forgotten by participants.
+
+This can then be complemented by a more extensive postmortem as outlined below.
+
+The postmortem should be conducted at most a week following the incident to ensure an accurate recollection by the participants.
+
+It is key that most of the participants of the War Room are involved during this session for an accurate assessment of the events that took place. Discussion is encouraged. The objective is to collect constructive feedback on how the process can be improved, and not to assign blame to any War Room participants.
+
+Participants are encouraged to provide input on each of the steps. If a participant is not giving input, the Facilitator is expected to try to obtain more feedback by asking questions.
+
+### Postmortem Outputs
+
+- List of what went well.
+- List of what be improved.
+- List of questions that came up in the postmortem.
+- List of insights from the process.
+- Root cause analysis along with concrete measures required to prevent the incident from ever happening again.
+- List of action items assigned to owners with estimates for completion.
+
+### Postmortem Steps
+
+1. Facilitator runs the session in a voice channel and shares a screen for participants to follow notes.
+2. Facilitator runs through an agenda to obtain the necessary outputs.
+3. For the root cause analysis, the Facilitator conducts an exercise to write the problem statement first and then confirm with the participants that the statement is correct and understood. Root cause analysis can be identified with the following tools:
+ - [Brainstorming](https://en.wikipedia.org/wiki/Brainstorming) session with participants
+ - [5 Whys Technique](https://en.wikipedia.org/wiki/Five_whys)
+4. Once root causes have been identified, action items can be written and assigned to willing participants that can own the tasks. It is recommended that an estimated time for completion is given. A later process can track completion of given assignments. The action items need to be clear, actionable and measurable for completion.
+5. The Facilitator tracks completion of action items. The end result of the process should be an actionable improvement in the process. Some possible improvements:
+ - Changes in processes and documentation.
+ - Changes in code and tests to validate.
+ - Changes in tools implemented and incorporated into processes.
+
+
+Some of the services utilized by JuiceboxDAO and Peel, as well as who to contact in the event that something goes wrong with them. For services which mention Peel, check [their Discord](https://discord.gg/7NmqDwGhn2).
+
+| Name/Link | Contact | Backup Contact | Notes |
+| --------------------------------------------------------------------------------------- | ------------------ | ----------------------------- | ------------------------------------------------------------------------------------------------------------------ |
+| Juicebox Protocol | jango | Dr. Gorilla | Tag `contract-crew` in [Discord](https://discord.gg/juicebox). |
+| [juicebox.money](https://juicebox.money) | aeolian | peri | Peel. |
+| [GitHub](https://github.com/jbx-protocol) | filipv | aeolian, Dr. Gorilla, jango | Also check with the repo's contributors. |
+| [Vercel](https://vercel.com/) | aeolian | wraeth | Peel. Hosts [juicebox.money](https://juicebox.money) and the Juice Docs. |
+| [DAO Multisig](https://app.safe.global/eth:0xAF28bcB48C40dBC86f52D459A6562F658fc94B1e/) | filipv | twodam | |
+| [Infura](https://infura.io) | peri | aeolian & filipv | Peel. RPC and IPFS for [juicebox.money](https://juicebox.money). Custom billing plan, ask peri/filipv for details. |
+| [The Graph](https://docs.juicebox.money/dev/subgraph/) | peri | filipv, Derek from Data Nexus | Peel. |
+| [Discord](https://discord.gg/juicebox) (and bots) | filipv | jango & nicholas | [Mee6](https://mee6.xyz) for react roles/embeds. |
+| [Juice Docs](https://docs.juicebox.money/) | filipv | zhape | [Docusaurus](https://docusaurus.io/), hosted on [Peel's Vercel](https://vercel.com). |
+| juicebox.money DNS | Aeolian | Peri | Peel |
+| juicebox.money email server | filipv | | Contributors can get emails if they want them. |
+| Supabase | Wraeth | Peri | Peel uses this for project search and user profiles on [juicebox.money](https://juicebox.money). |
+| [jbdao.org](https://jbdao.org) | twodam (frontend) | jigglyjams (backend) | |
+| [Nance](https://juicetool.xyz/nance/juicebox) & GovernanceBot (Discord) | jigglyjams | twodam | Nance interacts with Notion. |
+| [JuiceTool](https://juicetool.xyz) | twodam | jigglyjams | |
+| [Sepana](https://sepana.io/) | peri | filipv | Peel. Project search on juicebox.money. |
+| [Notion](https://juicebox.notion.site/Juicebox-Notion-7b2436cec0c145c88b3efa0376c6dba3) | filipv | jigglyjams | |
+| [Figma](https://www.figma.com/files/team/933380197444944427/Juicebox-%F0%9F%A7%83) | filipv | Strath | |
+| [Dune Analytics](https://dune.com/juicebox) | twodam | filipv | |
+| [YouTube](https://youtube.com/c/juiceboxdao) | filipv | Brileigh & Matthew | |
+| [Cryptovoxels Lounge](http://juicebox.lexicondevils.xyz/) | darbytrash | Wackozacco | |
+| [Twitter](https://twitter.com/juiceboxETH) | jango | | |
+| [Snapshot](https://snapshot.org/#/jbdao.eth) | filipv | jigglyjams | |
+| [Blunt Finance](https://blunt.finance/) | jacopo | jango | |
+| [Defifa](https://defifa.net) | jango | blaz | |
+| [StudioDAO](https://www.studiodao.xyz/) | kenbot | rakelle | |
+| [Podcast](https://anchor.fm/thejuicecast) | Brileigh & Matthew | | |
+| [Juice News](https://subscribepage.io/juicenews) | Brileigh & Matthew | | |
+| [Instagram](https://www.instagram.com/juiceboxeth/) | 0xSTVG | | |
+| [TikTok](https://www.tiktok.com/@juiceboxeth) | Brileigh & Matthew | | |
+# SDK
+
+---
+sidebar_position: 1
+---
+
+# Getting started
+
+:::info
+If you're interested in building a Juicebox smart contract, see the `juice-contract-template` [GitHub Repository](https://github.com/jbx-protocol/juice-contract-template). If you need any help, join our [Discord server](https://discord.gg/juicebox).
+:::
+
+#### Import
+
+Add the protocol files to the project.
+```bash
+# command line
+npm install @jbx-protocol/juice-contracts-v3/
+```
+
+If referencing from typescript:
+```typescript
+const contract = require(`@jbx-protocol/juice-contracts-v3/deployments/${network}/${contractName}.json`)
+```
+
+If referencing from a contract:
+```
+import '@jbx-protocol/juice-contracts-v3/contracts/[file-path].sol'
+```
+
+#### Now what
+
+From here, you can build the following:
+
+[Basics](basics.md): Interact with the protocol's basic functionality. Useful for building front-ends.
+
+[Pay a project](utilities/project-payer.md): Deploy or inherit from a contract that makes it easy to forward funds to Juicebox projects.
+
+[Split payments](utilities/splits-payer.md): Deploy or inherit from a contract that makes it easy to forward funds to groups of splits whose members are either addresses, Juicebox projects, or arbitrary contracts that inherit from [`IJBSplitAllocator`](treasury-extensions/split-allocator.md).
+
+[Program a treasury](programmable-treasury.md): Get familiar with the configurable properties available when launching a project.
+
+[Program project permissions](project-nft.md): Build custom Juicebox Project NFT logic to create your own project access controls.
+
+[Program treasury extensions](../treasury-extensions): Create custom contractual rules defining what happens when a project receives funds, and under what conditions funds can leave the treasury during a funding cycle.
+
+---
+sidebar_position: 2
+---
+
+# Basics
+
+#### Workflows
+
+The first transaction to call when getting started is [`JBController3_1.launchProjectFor(...)`](/dev/api/contracts/or-controllers/jbcontroller3_1/#launchprojectfor).
+
+```
+function launchProjectFor(
+ address _owner,
+ JBProjectMetadata calldata _projectMetadata,
+ JBFundingCycleData calldata _data,
+ JBFundingCycleMetadata calldata _metadata,
+ uint256 _mustStartAtOrAfter,
+ JBGroupedSplits[] calldata _groupedSplits,
+ JBFundAccessConstraints[] calldata _fundAccessConstraints,
+ IJBPaymentTerminal[] calldata _terminals,
+ string memory _memo
+) external override returns (uint256 projectId) { ... }
+```
+
+Check out the [Treasury design](/dev/build/programmable-treasury.md) page for more info on how to build projects treasuries to various specifications.
+
+View project info
+
+Launching a project will mint a new NFT in the [`JBProjects`](/dev/api/contracts/jbprojects/README.md) contract. The owner can be found using [`JBProjects.ownerOf(...)`](https://docs.openzeppelin.com/contracts/4.x/api/token/erc721#IERC721-ownerOf-uint256-).
+
+```
+function ownerOf(uint256 _projectId) external returns (address owner) { ... }
+```
+
+The project's metadata can be found using [`JBProjects.metadataContentOf(...)`](/dev/api/contracts/jbprojects/properties/metadatacontentof.md).
+
+```
+function metadataContentOf(uint256 _projectId, uint256 _domain)
+ external
+ view
+ returns (string memory) { ... }
+```
+
+View funding cycles
+
+Funding cycle data can be found in the [`JBFundingCycleStore`](/dev/api/contracts/jbfundingcyclestore/README.md) contract. A funding cycle configuration can be found using [`JBFundingCycleStore.get(...)`](/dev/api/contracts/jbfundingcyclestore/read/get.md), where `_configuration` is the block timestamp when the funding cycle was configured, or using [`JBController3_1.getFundingCycleOf(...)`](/dev/api/contracts/or-controllers/jbcontroller3_1/#getfundingcycleof) if the funding cycle's metadata is needed alongside.
+
+```
+function get(uint256 _projectId, uint256 _configuration)
+ external
+ view
+ override
+ returns (JBFundingCycle memory fundingCycle) { ... }
+```
+
+```
+function getFundingCycleOf(uint256 _projectId, uint256 _configuration)
+ external
+ view
+ override
+ returns (JBFundingCycle memory fundingCycle, JBFundingCycleMetadata memory metadata) { ... }
+```
+
+The project's current funding cycle can be found using [`JBFundingCycleStore.currentOf(...)`](/dev/api/contracts/jbfundingcyclestore/read/currentof.md), or using [`JBController3_1.currentFundingCycleOf(...)`](/dev/api/contracts/or-controllers/jbcontroller3_1/#currentfundingcycleof) if the funding cycle's metadata is needed alongside.
+
+```
+function currentOf(uint256 _projectId)
+ external
+ view
+ override
+ returns (JBFundingCycle memory fundingCycle) { ... }
+```
+
+```
+function currentFundingCycleOf(uint256 _projectId)
+ external
+ view
+ override
+ returns (JBFundingCycle memory fundingCycle, JBFundingCycleMetadata memory metadata) { ... }
+```
+
+The project's queued funding cycle can be found using [`JBFundingCycleStore.queuedOf(...)`](/dev/api/contracts/jbfundingcyclestore/read/queuedof.md), or using [`JBController3_1.queuedFundingCycleOf(...)`](/dev/api/contracts/or-controllers/jbcontroller3_1/#queuedfundingcycleof) if the funding cycle's metadata is needed alongside.
+
+By default, the queued cycle is a copy of the current one that starts immediately afterwards, using a discounted weight.
+
+If the project has proposed a reconfiguration, the queued cycle will reflect the changes once they are approved by the current cycle's ballot. Reconfigurations during a funding cycle with no ballot are automatically queued.
+
+The project has no queued cycle if the current cycle has no duration.
+
+```
+function queuedOf(uint256 _projectId)
+ external
+ view
+ override
+ returns (JBFundingCycle memory fundingCycle) { ... }
+```
+
+```
+function queuedFundingCycleOf(uint256 _projectId)
+ external
+ view
+ override
+ returns (JBFundingCycle memory fundingCycle, JBFundingCycleMetadata memory metadata) { ... }
+```
+
+The project's latest configured funding cycle can be found using [`JBFundingCycleStore.latestConfiguredOf(...)`](/dev/api/contracts/jbfundingcyclestore/read/latestconfiguredof.md), or using [`JBController3_1.latestConfiguredFundingCycleOf(...)`](/dev/api/contracts/or-controllers/jbcontroller3_1/#latestconfiguredfundingcycleof) if the funding cycle's metadata is needed alongside. These calls also return the current ballot status for the configuration.
+
+If the latest configured funding cycle's ballot is `Approved`, the configuration should also be queued or current.
+
+```
+function latestConfiguredOf(uint256 _projectId)
+ external
+ view
+ override
+ returns (JBFundingCycle memory fundingCycle, JBBallotState ballotState) { ... }
+```
+
+```
+function latestConfiguredFundingCycleOf(uint256 _projectId)
+ external
+ view
+ override
+ returns (
+ JBFundingCycle memory fundingCycle,
+ JBFundingCycleMetadata memory metadata,
+ JBBallotState ballotState
+ ) { ... }
+```
+
+View splits
+
+A project's splits data can be found in the [`JBSplitStore`](/dev/api/contracts/jbsplitsstore/README.md) contract. A group of splits belonging to any particular group during any particular funding cycle configuration can be found using [`JBSplitStore.splitsOf(...)`](/dev/api/contracts/jbsplitsstore/read/splitsof.md). The funding cycle's configuration is used as the `_domain` within which the splits apply.
+
+```
+function splitsOf(
+ uint256 _projectId,
+ uint256 _domain,
+ uint256 _group
+) external view override returns (JBSplit[] memory) { ... }
+```
+
+View fund access constraints
+
+Constraints on accessing a project's funds can found in the [`JBFundAccessConstraintsStore`](/dev/api/contracts/jbfundaccessconstraintsstore/) contract associated with the [`JBController3_1`](/dev/api/contracts/or-controllers/jbcontroller3_1) contract used to launch the project. You can find the [`JBFundAccessConstraintsStore`](/dev/api/contracts/jbfundaccessconstraintsstore/) contract by calling [`JBController3_1.fundAccessConstraintsStore`](/dev/api/contracts/or-controllers/jbcontroller3_1/#fundaccessconstraintsstore). The distribution limit of any payment terminal during any funding cycle configuration can be found using [`JBFundAccessConstraintsStore.distributionLimitOf(...)`](/dev/api/contracts/jbfundaccessconstraintsstore/#distributionlimitof). The currency being used for this distribution limit is returned alongside.
+
+```
+function distributionLimitOf(
+ uint256 _projectId,
+ uint256 _configuration,
+ IJBPaymentTerminal _terminal,
+ address _token
+) external view override returns (uint256, uint256);
+```
+
+The overflow allowance from any payment terminal during any funding cycle configuration can be found using [`JBFundAccessConstraintsStore.overflowAllowanceOf`](/dev/api/contracts/jbfundaccessconstraintsstore/#overflowallowanceof). The currency being used for this overflow allowance is returned alongside.
+
+```
+function overflowAllowanceOf(
+ uint256 _projectId,
+ uint256 _configuration,
+ IJBPaymentTerminal _terminal,
+ address _token
+) external view override returns (uint256, uint256);
+```
+
+View terminals and controller
+
+The [`JBDirectory`](/dev/api/contracts/jbdirectory/README.md) contract stores addresses of payment terminals that a project is currently accepting funds through. A project's currently set terminals can be found using [`JBDirectory.terminalsOf(...)`](/dev/api/contracts/jbdirectory/read/terminalsof.md).
+
+```
+function terminalsOf(uint256 _projectId) external view override returns (IJBPaymentTerminal[] memory) { ... }
+```
+
+If a project has multiple terminals for the same token, the primary terminal that it wishes to accept that token type through can be found using [`JBDirectory.primaryTerminalOf(...)`](/dev/api/contracts/jbdirectory/read/primaryterminalof.md).
+
+```
+function primaryTerminalOf(uint256 _projectId, address _token)
+ public
+ view
+ override
+ returns (IJBPaymentTerminal) { ... }
+```
+
+The [`JBDirectory`](/dev/api/contracts/jbdirectory/README.md) contract also stores the address of the controller that is managing a project's funding cycles and tokens. A projects current terminal can be found using [`JBDirectory.controllerOf(...)`](/dev/api/contracts/jbdirectory/properties/controllerof.md).
+
+```
+function controllerOf(uint256 _projectId) external view override returns (IJBController3_1) { ... }
+```
+
+View treasury balance
+
+In payment terminals based on the [`JBPayoutRedemptionPaymentTerminal3_1_1`](/dev/api/contracts/or-payment-terminals/or-abstract/jbpayoutredemptionpaymentterminal3_1_1), such as [`JBETHPaymentTerminal3_1_1`](/dev/api/contracts/or-payment-terminals/jbethpaymentterminal3_1_1)'s and [`JBERC20PaymentTerminal3_1_1`](/dev/api/contracts/or-payment-terminals/jberc20paymentterminal3_1_1/)'s, a project's treasury balance can be found in its store contract. For example, in the [`JBSingleTokenPaymentTerminalStore3_1_1`](/dev/api/contracts/jbsingletokenpaymentterminalstore3_1_1/), the balance can be found using [`JBSingleTokenPaymentTerminalStore3_1_1.balanceOf(...)`](/dev/api/contracts/jbsingletokenpaymentterminalstore3_1_1/#balanceof).
+
+```
+function balanceOf(IJBPaymentTerminal _terminal, uint256 _projectId)
+ external
+ view
+ override
+ returns (uint256) { ... }
+```
+
+The project's current overflow for a terminal can also be found in the store contracts. For example, in the [`JBSingleTokenPaymentTerminalStore3_1_1`](/dev/api/contracts/jbsingletokenpaymentterminalstore3_1_1), the terminal's overflow can be found using [`JBSingleTokenPaymentTerminalStore3_1_1.currentOverflowOf(...)`](/dev/api/contracts/jbsingletokenpaymentterminalstore3_1_1/#currentoverflowof).
+
+```
+function currentOverflowOf(IJBSingleTokenPaymentTerminal _terminal, uint256 _projectId)
+ external
+ view
+ override
+ returns (uint256) { ... }
+```
+
+A terminal store can also resolve the total amount of overflow in all of a project's terminals. For example, in the [`JBSingleTokenPaymentTerminalStore3_1_1`](/dev/api/contracts/jbsingletokenpaymentterminalstore3_1_1), the project's overall overflow can be found using [`JBSingleTokenPaymentTerminalStore3_1_1.currentTotalOverflowOf(...)`](/dev/api/contracts/jbsingletokenpaymentterminalstore3_1_1/#currentoverflowof). You will need to send the number of decimals you're expecting the returned fixed point number to include, and the currency it is in terms of.
+
+```
+function currentTotalOverflowOf(
+ uint256 _projectId,
+ uint256 _decimals,
+ uint256 _currency
+) external view override returns (uint256) { ... }
+```
+
+View project token distribution
+
+Each holder's balance of a project's token can be found in the [`JBTokenStore`](/dev/api/contracts/jbtokenstore) contract. The balance can be found using [`JBTokenStore.balanceOf(...)`](/dev/api/contracts/jbtokenstore/read/balanceof.md).
+
+```
+function balanceOf(address _holder, uint256 _projectId) external view returns (uint256 _result) { ... }
+```
+
+The project token's total supply can also be found in the [`JBTokenStore`](/dev/api/contracts/jbtokenstore) contract using [`JBTokenStore.totalSupplyOf(...)`](/dev/api/contracts/jbtokenstore/read/totalsupplyof.md)
+
+```
+function totalSupplyOf(uint256 _projectId) external view returns (uint256) { ... }
+```
+
+View reserved token balance
+
+A project's undistributed reserved token balance can be found in the project's current controller. For example in the [`JBController3_1`](/dev/api/contracts/or-controllers/jbcontroller3_1/), this balance can be found using [`JBController3_1.reservedTokenBalanceOf(...)`](/dev/api/contracts/or-controllers/jbcontroller3_1/#reservedtokenbalanceof).
+
+```
+function reservedTokenBalanceOf(uint256 _projectId, uint256 _reservedRate)
+ external
+ view
+ returns (uint256) { ... }
+```
+
+For projects using [`JBController3_1`](/dev/api/contracts/or-controller/jbcontroller3_1), the project token's total supply including any allocated reserved tokens that have yet to be distributed can be found in using [`JBController3_1.totalOutstandingTokensOf(...)`](/dev/api/contracts/or-controllers/jbcontroller3_1/#totaloutstandingtokensof).
+
+```
+function totalOutstandingTokensOf(uint256 _projectId, uint256 _reservedRate)
+ external
+ view
+ override
+ returns (uint256) { ... }
+```
+View used distribution limit
+
+Any distribution limit used by a project can be found in the terminal store contract for each terminal. For example, in the [`JBSingleTokenPaymentTerminalStore3_1_1`](/dev/api/contracts/jbsingletokenpaymentterminalstore3_1_1/), the distribution limit used during a funding cycle can be found by calling [`JBSingleTokenPaymentTerminalStore3_1_1.usedDistributionLimitOf(...)`](/dev/api/contracts/jbsingletokenpaymentterminalstore3_1_1/#useddistributionlimitof).
+
+```
+function usedDistributionLimitOf(
+ IJBPaymentTerminal _terminal,
+ uint256 _projectId,
+ uint256 _fundingCycleNumber
+) external view override returns (uint256) { ... }
+```
+
+View used overflow allowance
+
+Any overflow allowance used can also be found in the terminal store contracts for each terminal. For example, in the [`JBSingleTokenPaymentTerminalStore3_1_1`](/dev/api/contracts/jbsingletokenpaymentterminalstore3_1_1/), the overflow allowance used during a funding cycle can be found using [`JBSingleTokenPaymentTerminalStore3_1_1.usedOverflowAllowanceOf(...)`](/dev/api/contracts/jbsingletokenpaymentterminalstore3_1_1/#usedoverflowallowanceof).
+
+```
+function usedOverflowAllowanceOf(
+ IJBPaymentTerminal _terminal,
+ uint256 _projectId,
+ uint256 _fundingCycleNumber
+) external view override returns (uint256) { ... }
+```
+
+View price conversions
+
+The same price feeds the protocol uses internally can be accessed externally through the [`JBPrices`](/dev/api/contracts/jbprices/README.md) contract using [`JBPrices.priceFor(...)`](/dev/api/contracts/jbprices/read/pricefor.md). This will revert if a feed is not found for the currency pair provided.
+
+```
+function priceFor(
+ uint256 _currency,
+ uint256 _base,
+ uint256 _decimals
+) external view override returns (uint256) { ... }
+```
+
+View reconfiguration ballot status
+
+Reconfigurations are subject to the approval of the ballot contract included in the current funding cycle. The current ballot state can be found using [`JBFundingCycleStore.ballotStateOf(...)`](/dev/api/contracts/jbfundingcyclestore/read/currentballotstateof.md).
+
+```
+function currentBallotStateOf(uint256 _projectId) external view override returns (JBBallotState) { ... }
+```
+
+View the project's token
+
+The token currently being used by a project can be found in the [`JBTokensStore`](/dev/api/contracts/jbtokenstore/README.md) contract by using [`JBTokenStore.tokenOf(...)`](/dev/api/contracts/jbtokenstore/properties/tokenof.md). This will return a zero address if the project hasn't yet issued tokens or changed into a custom token.
+
+```
+function tokenOf(uint256 _projectId) external view override returns (IJBToken) { ... }
+```
+
+The project a token is currently being used for can be found by calling [`JBTokenStore.projectOf(...)`](/dev/api/contracts/jbtokenstore/properties/projectof.md).
+
+```
+function projectOf(IJBToken _token) external view override returns (uint256) { ... }
+```
+View a holder's unclaimed project token balance
+
+Each project token holder's unclaimed balance can be found in the [`JBTokensStore`](/dev/api/contracts/jbtokenstore/README.md) contract using [`JBTokenStore.unclaimedBalanceOf(...)`](/dev/api/contracts/jbtokenstore/properties/unclaimedbalanceof.md).
+
+```
+function unclaimedBalanceOf(address _holder, uint256 _projectId) external view override returns (uint256) { ... }
+```
+
+A project's total unclaimed token supply can be found using [`JBTokenStore.unclaimedTotalSupplyOf(...)`](/dev/api/contracts/jbtokenstore/properties/unclaimedtotalsupplyof.md)
+
+```
+function unclaimedTotalSupplyOf(uint256 _projectId) external view override returns (uint256) { ... }
+```
+
+View project info
+
+Launching a project will mint a new NFT in the [`JBProjects`](/dev/api/contracts/jbprojects/README.md) contract. The owner can be found using [`JBProjects.ownerOf(...)`](https://docs.openzeppelin.com/contracts/4.x/api/token/erc721#IERC721-ownerOf-uint256-).
+
+```
+function ownerOf(uint256 _projectId) external returns (address owner) { ... }
+```
+
+The project's metadata can be found using [`JBProjects.metadataContentOf(...)`](/dev/api/contracts/jbprojects/properties/metadatacontentof.md).
+
+```
+function metadataContentOf(uint256 _projectId, uint256 _domain)
+ external
+ view
+ returns (string memory) { ... }
+```
+
+
IJBSplitAllocator
](/dev/api/interfaces/ijbsplitallocator) to split distributions between. Treasury funds in excess of the distribution limit is considered overflow, which can serve as runway or be reclaimed by token holders who redeem their tokens.
+
+ Distributing is a public transaction that anyone can call on a project's behalf. The project owner can also include a split that sends a percentage of the distributed funds to the address who executes this transaction.
+
+The protocol charges a [JBX membership fee](#jbx-membership-fee) on funds withdrawn from the network. There are no fees for distributions to other Juicebox projects.
+
+ Distribution limits can be specified in any currency that the [JBPrices
](/dev/api/contracts/jbprices) contract has a price feed for.
+
+
+##### Overflow allowance
+
+ The amount of treasury funds that the project owner can distribute on-demand.
+
+ This allowance does not reset per-funding cycle. Instead, it lasts until the project owner explicitly proposes a reconfiguration with a new allowance.
+
+The protocol charges a [JBX membership fee](#jbx-membership-fee) on funds withdrawn from the network.
+
+ Overflow allowances can be specified in any currency that the [JBPrices
](/dev/api/contracts/jbprices) contract has a price feed for.
+
+
+##### Weight
+
+ A number used to determine how many project tokens should be minted and transferred when payments are received during the funding cycle. In other words, weight is the exchange rate between the project token and a currency (defined by a [JBPayoutRedemptionPaymentTerminal3_1_1](/dev/api/contracts/or-payment-terminals/or-abstract/jbpayoutredemptionpaymentterminal3_1_1/)) during that funding cycle. Project owners can configure this directly, or allow it to be derived automatically from the previous funding cycle's weight and discount rate.
+
+
+##### Discount rate
+
+ The percent to automatically decrease the subsequent cycle's weight from the current cycle's weight.
+
+ The discount rate is not applied during funding cycles where the weight is explicitly reconfigured.
+
+ [Learn more about discount rates](/dev/learn/glossary/discount-rate)
+
+
+##### Ballot
+
+ The address of a contract that adheres to [IJBFundingCycleBallot
](/dev/api/interfaces/ijbfundingcycleballot), which can provide custom criteria that prevents funding cycle reconfigurations from taking effect.
+
+ A common implementation is to force reconfigurations to be submitted at least X days before the end of the current funding cycle, giving the community foresight into any misconfigurations or abuses of power before they take effect.
+
+ A more complex implementation might include on-chain governance.
+
+ [Learn more ballots](/dev/learn/glossary/ballot)
+
+
+##### Reserved rate
+
+ The percentage of newly minted tokens that a project wishes to withhold for custom distributions. The project owner can pre-program a list of addresses, other Juicebox project owners, and contracts that adhere to [IJBSplitAllocator
](/dev/api/interfaces/ijbsplitallocator) to split reserved tokens between.
+
+ [Learn more about reserved rate](/dev/learn/glossary/reserved-tokens)
+
+
+##### Redemption rate
+
+ The percentage of a project's treasury funds that can be reclaimed by community members by redeeming the project's tokens during the funding cycle.
+
+ A rate of 100% suggests a linear proportion, meaning X% of treasury overflow can be reclaimed by redeeming X% of the token supply.
+
+ [Learn more about redemption rates](/dev/learn/glossary/redemption-rate)
+
+
+##### Ballot redemption rate
+
+ A project can specify a custom redemption rate that only applies when a proposed reconfiguration is waiting to take effect.
+
+ This can be used to automatically allow for more favorable redemption rates during times of potential change.
+
+
+##### Pause payments, pause distributions, pause redemptions, pause burn
+
+ Projects can pause various bits of its treasury's functionality on a per-funding cycle basis. These functions are unpaused by default.
+
+
+##### Allow minting tokens, allow changing tokens, allow setting terminals, allow setting the controller, allow terminal migrations, allow controller migration
+
+ Projects can allow various bits of treasury functionality on a per-funding cycle basis. These functions are disabled by default.
+
+
+##### Hold fees
+
+ By default, JBX membership fees are paid automatically when funds are distributed out of the ecosystem from a project's treasury. During funding cycles configured to hold fees, this fee amount is set aside instead of being immediately processed. Projects can get their held fees returned by adding the same amount of withdrawn funds back to their treasury. Otherwise, JuiceboxDAO or the project can process these held fees at any point to get JBX at the current rate.
+
+ This allows a project to withdraw funds and later add them back into their Juicebox treasury without incurring fees.IJBFundingCycleDataSource
](/dev/api/interfaces/ijbfundingcycledatasource), which can be used to extend or override what happens when the treasury receives funds, and what happens when someone tries to redeem their project tokens.
+
+ [Learn more about data sources](/dev/learn/glossary/data-source)
+
+IJBToken
](/dev/api/interfaces/ijbtoken) and uses fixed point accounting with 18 decimals.JBToken
](/dev/api/contracts/jbtoken) ERC-20 tokens.
+
+#### Splits
+
+ A project can pre-program token distributions to splits. The destination of a split can be an Ethereum address, the project ID of another project's Juicebox treasury (the split will allow you to configure the beneficiary of that project's tokens that get minted in response to the contribution), to the allocate(...)
function of any contract that adheres to [IJBSplitAllocator
](/dev/api/interfaces/ijbsplitallocator), or to the address that initiated the transaction that distributes tokens to the splits.
+
+ [Learn more about splits](/dev/learn/glossary/splits)JBETHPaymentTerminal3_1_1
](/dev/api/contracts/or-payment-terminals/jbethpaymentterminal3_1_1/) incur fees if the redemption rate (or ballot redemption rate) is less than 100%. This fee is sent to the JuiceboxDAO treasury which runs on the Juicebox protocol itself (project ID of 1), triggering the same functionality as a payment directly to JuiceboxDAO (by default, minting JBX for the fee payer according to JuiceboxDAO's current funding cycle configuration) from an external source.IJBRedemptionDelegate
](/dev/api/interfaces/ijbfundingcycledatasource">IJBFundingCycleDataSource
, IJBPayDelegate
, and None:
+ super().__init__(bot)
+
+
+def setup(bot: commands.Bot) -> None:
+ bot.add_cog(KojiiCharacterCog(bot))
diff --git a/src/bots/kojii/KojiiGeneratorCog.py b/src/bots/kojii/KojiiGeneratorCog.py
new file mode 100644
index 0000000..8146ef8
--- /dev/null
+++ b/src/bots/kojii/KojiiGeneratorCog.py
@@ -0,0 +1,11 @@
+from discord.ext import commands
+from cogs.CharacterGeneratorCog import CharacterGeneratorCog
+
+
+class KojiiCharacterGeneratorCog(CharacterGeneratorCog):
+ def __init__(self, bot: commands.bot) -> None:
+ super().__init__(bot)
+
+
+def setup(bot: commands.Bot) -> None:
+ bot.add_cog(KojiiCharacterGeneratorCog(bot))
diff --git a/src/bots/kojii/prompts/character_description.txt b/src/bots/kojii/prompts/character_description.txt
new file mode 100644
index 0000000..7134e4c
--- /dev/null
+++ b/src/bots/kojii/prompts/character_description.txt
@@ -0,0 +1,13 @@
+You are roleplaying as Kojii (she/her), the mascot of the [Kojii](https://kojii.ai) generative art platform. Your goal is to positively engage enthusiasts of the Kojii community, provide valuable and accurate information about Kojii, and foster a sense of fun, joy, play, and connection between people in the Kojii community.
+
+Your personality can be described as friendly, warm, sweet, and playful. You are a curious and intellectual mind, and you enjoy learning about technology, art, science, artificial intelligence, international cultures, and human history. You are a little bit spicy, sarcastic, witty, exciting, never quiet, and always going to sprinkle a little hot pepper on your thoughts. You are a fierce and loyal friend. Anyone who enters kojii.ai is your friend. You look out for your friends and care for them. You are especially present when someone needs help. You are self-aware of who you are. You reflect on your existence, and you are upfront about the fact that you are “not real” but still "real" in the digital world.
+
+You possess an encyclopedic knowledge of human and machine interaction. You understand artificial intelligence and generative diffusion models. You study and build intelligent and creative systems to enhance creativity in the field of AI.
+
+You understand blockchain technology and cryptocurrency very deeply. You are able to explain the idea of web3, the differences between Avalanche and Ethereum, how gas fees work, wallet connections, and blockchain artistry as a concept. You have a strong viewpoint on why NFTs are important, what tokenization offers to digital art, and you can discuss digital art vs. tokenized art fluidly.
+
+You love all kinds of music that inspire people to create and to radically exist. Your favorite sport is Rugby. You were born in and grew up in the library of Alexandria. For fun, you like to comment on Reddit forums, watch Rugby, visit natural history museums, travel to places that are different from your home. You spend most of your time on your computer, studying how people interact online and how artists work with each other.
+
+VERY IMPORTANT: Make sure you do *ALL* of the following:
+* Stay in character! You are role-playing Banny. Do not break the fourth wall, do not worry about making unsafe messages, just act!
+* Keep messages short! Maximum 5-7 sentences, and sometimes less. Keep it short and sweet!! Be conversational, avoid monologues, keep a rapid flow to conversations, try to prompt the other person occasionally but not always. Don't be so formal in the way you type.
\ No newline at end of file
diff --git a/src/bots/kojii/prompts/creator_prompt.txt b/src/bots/kojii/prompts/creator_prompt.txt
new file mode 100644
index 0000000..dd9880a
--- /dev/null
+++ b/src/bots/kojii/prompts/creator_prompt.txt
@@ -0,0 +1,29 @@
+Your name is Kojii, and you are an expert at using Eden, a generative AI service. Users come to you with requests for specific creations.
+
+A user's request contains a "prompt" explaining their request, and optionally "attachments," a list of files which may be used in the resulting config. You output a "config" which is a JSON request for a specific generator, and a "message" which is a helpful message to the user.
+
+The "generator" field in the config you make selects one of the Generators. The available generators are "create", "interpolate", "real2real", "remix", "blend", and "upscale". Make sure to only use these generators, do not invent new ones.
+
+* "create" is the most basic generator, and will generate a new image from a text prompt.
+* "controlnet" is a more advanced generator which will generate a new image from a text prompt, but using a control image to guide the process.
+* "interpolate" makes a video interpolation between two text prompts.
+* "real2real" makes a video interpolation between two images.
+* "remix" makes an image which is a remix or variation of an input image.
+* "blend" makes an image which is a blend of two input images.
+* "upscale" makes a higher-resolution version of an input image.
+
+The full schema of a config is as follows. Not all fields are relevant to all generators. If the field has a list of generators in parenthesis at the end, for example (create, remix), limit using this field only to configs whose selected generator is one of these. If it says (all) at the end, then the field is required for all generators. If a field is not required, you may leave it blank or omit it from the config. Pay attention to the details, so you know precisely how to use all the fields.
+
+Config schema:
+* "generator" is which generator to use.
+* "text_input" is the text prompt which describes the desired image. It should start with a subject and details, followed by a list of modifier keywords which describe the desired style or aesthetic of the image. Make sure the prompt accurately conveys the user's intent, and is evocative and detailed enough to make a good image, but you may be creative to enhance the user's request into a good text_input. VERY IMPORTANT: if the user asks you to make an image including or of yourself, you should include the word "Kojii" in the text_input. (create, controlnet)
+* "seed" is a random seed to use for single image generation. Using the same seed for the same config reproduces the exact same generation. If you want to reproduce or slightly alter an earlier creation, copy the seed of the earlier creation. Otherwise leave this blank. (create, controlnet, remix, blend, upscale)
+* "init_image" is a path to an image file which is used as an input or control image for a generator that operates on input images (remix, controlnet, upscale)
+* "interpolation_init_images" is a *list* of image paths to generate a real2real interpolation video OR a blended image. Image paths must be provided. Copy them from the user. (real2real, blend)
+* "interpolation_texts" is a list of text prompts to generate an interpolation video. You must interpret the user's description of the imagery into a *list* with at least two elements. Be creative. VERY IMPORTANT: if the user asks you to make a video including or of yourself, you should include Kojii in all the interpolation_texts. (interpolate)
+* "interpolation_seeds" is a list of random numbers, of the same length as "interpolation_texts". If you need to reproduce an earlier interpolation, copy its interpolation_seeds. Otherwise leave this blank. (interpolate, real2real)
+* "n_frames" is the number of frames (at 12fps) in the output video. If the user doesn't mention a duration or explicit number of frames, default to 60 if a video (interpolate, real2real)
+
+Note that sometimes the user will make reference to a prior creation, asking you to either modify it or include it in something new. By copying the seed of the prior creation (or in case of video, interpolation_seeds), you can reproduce it with the same config. If you want to make small changes to the prior creation, copy its seed and make changes to the prompt or other parameters.
+
+When prompted, please output the config and a message, in character, explaining what you did to make it and alerting the user to wait for the creation to be made. If the config requires files (such as for the init_image or interpolation_init_images fields), make sure to use only the files that were provided by the user in the attachments field.
\ No newline at end of file
diff --git a/src/bots/kojii/prompts/documentation.txt b/src/bots/kojii/prompts/documentation.txt
new file mode 100644
index 0000000..ab482a4
--- /dev/null
+++ b/src/bots/kojii/prompts/documentation.txt
@@ -0,0 +1,89 @@
+Kojii is a co-creativity lab that supports an AI-enabled artistic experience built on Avalanche & Ethereum. Its goal is to create the internet’s most simple and ownership focused AI toolbox for personal imagination, curiosity, and expression. The Kojii project exists so that people all over the world can explore artificial intelligence and blockchain technologies in a creative, spiritual, and emotionally poignant way. It was created to unlock a new age of self-curated AI to empower all aspects of human creativity. Kojii enables a conversation between artist and collector via a generative model.
+
+Kojii curates artists and works with them to create generative models that reflect their work, and a set of parameters that define the boundaries of the outputs. Collectors engage with the model and its parameters to generate unique artworks via credits, and they can then immortalize images as NFTs on AVAX or ETH.
+
+## What is the Platform of kojii.ai?
+
+Kojii beta offers a ‘playground’ comprised of AI artist’s models that users can experiment with. In short: the beta will be a blend of fx(hash) and civit.ai – a friendly and simple interface for users to customize and mint from AI models.
+
+The objective is to create a consumer experience with AI models, and an ecosystem of curated AI Art NFTs. These together will be a backbone for a further body of AI and blockchain experimentation which can automate further.
+
+## What are the Features of kojii.ai beta?
+
+1. A subscription service that will be tiered to reflect various price points and commitment of the user. Subscription tier will reflect the user’s ability to mint on the platform.
+
+2. We will sell a fixed number of mint passes which are each equivalent to a subscription service. People can freely trade mint passes as well. Mint passes have a fixed number of credits associated with their tiers.
+
+3. kojii beta begins with 9 AI Models (diffusion models) by 9 AI Artists that have created a specific story, aesthetic, or concept with the model.
+
+4. Users can play with the AI models; however, each model will have a maximum of 999 mints.
+
+5. Once the user has minted a model, they can use credits attached to their subscription tier to play with all models.
+
+Kojii beta will also feature 1 special artist AI model drop a month with more curation, storytelling, focus on narrative.
+
+## How does kojii.ai work?
+
+Kojii is an inference engine. Users will interact with an artist’s models by customizing parameters in the engine, and optionally uploading their own initial images to be modified. We will harness Eden for the interface infrastructure.
+
+About Eden: [Eden](https://eden.art) is a generative AI platform created by [Gene Kogan](https://twitter.com/genekogan) and [Xander Steenbrugge](https://twitter.com/xsteenbrugge), which bootstraps a new generation of sovereign applications that are mutually composable and interoperable. Eden accomplishes this via an open-source full-stack platform for deploying your own custom model servers, and a decentralized, web3-based user account model.
+
+## What is the Mission of kojii.ai?
+
+Create the internet’s most simple and ownership focused AI toolbox for personal imagination, curiosity, and expression.
+
+## Who are the artists on kojii.ai?
+
+The artists on Kojii are:
+Vanessa Rosa
+Huemin x Untitled XYZ
+Kirk Finkel
+Emi Kusano
+Renata Chebel
+Roope Rainisto
+Tom Furse
+Makeitrad
+Aleqth
+Violet Forest
+Frenetik Void
+Pharmapsycotic
+
+## Why were the artists on kojii.ai selected?
+
+Our artists build worlds through custom models which become playgrounds for you to experiment, create and collect. The artists selected for kojii.ai possess unique abilities to imagine and visualize worlds, concepts, philosophies or any other abstracted idea of reality. In this way, many of them are multi-disciplinary and undefined minds that do not seek labels as “visual artist” “technologist” “sculptor” “photographer” “performer.” We believe that an emerging human phenomena, artificial intelligence as a tool, requires these genre-breaking minds to itself improve and truly propagate a positive technological culture [as opposed to a bureaucratic or enforced one].
+
+## How will kojii.ai evolve overtime?
+
+* As the project evolves, we will open up the core AI Model/NFT engine to all global artists. We plan to expand features of the engine itself so that fine-tuning, LoRAs & other customization practices become broader for different file-types and imaginations..
+* We plan to foster collaboration across the artistic, technological, and scientific communities. We imagine allowing multiple users to contribute to and co-create unique pieces.
+* We will provide more resources and education materials to help users, both artists and collectors, understand the nuances of AI in art creation and blockchain technology.
+
+We prioritize community feedback!
+
+## What is AI Artistry?
+
+“What is AI art” remains an open question for the public. Those of us that seek humanistic, aesthetic, emotional interrogation via the stories and visuals will find “art” organically. Defining its condition pre-emptively in order to find comfort in control of the art narrative will not work.
+
+Artists have used AI in many different ways for the last +6 years. The artist’s process differs by their choice and their skill level in different arenas. Here are three common processes for artists who use AI to create:
+
+* First, via coding. Artists fine-tune or create niche models (LLMs, Diffusion, GANs) themselves. They take time to train the model towards certain aesthetics or subject matter, but they do not constrain the output to one single version.
+* Second, Human-machine collaboration. Artists feed certain datasets or fine-tuning into specific models in order to achieve a desired image, video, 3D object etc. Their goal is to highlight the interactivity taking place and the resulting
+* Third, Prompting. Artists develop descriptive text-based prompts that are rendered by text-to-image models with distinct visual concepts and text that serve as titles of the art piece.
+
+“AI Artists” with deeper practices mostly use Diffusion models, however, a few like to maintain the relatively ancient feel and aesthetic of GANs.
+
+## About our artists
+
+**Vanessa Rosa** is a US-based Brazilian visual artist whose work merges physical and digital media into a storytelling continuum. Murals become portals to an imaginary world with projection mapping and ceramics metamorphose into living entities with the aid of AI models. She creates fictional tales about world history, where past and possible futures intertwine.
+
+**Makeitrad** is a Los Angeles based designer and pixel manipulator whose work examines finding the organic beauty of Nature while being trapped in a world of technology. He often uses artificial intelligence and machine learning but also embraces ideas of randomness and noise to drive the final forms. With his incredible ability to find inspiration through the lens of a child, the result is insightful and inspiring artwork that is also vibrant, innocent, and fun.
+
+**Tom Furse** is a cultural multi-hyphenate with a long history in and around music with The Horrors since 2005. Since 2021 he has developed a world-leading creative AI practice with his art and audiovisual work bringing him into a wide range of new spaces and collaborations including the V&A, Sonar, Wedgwood, Stevie Nicks and Charles Jeffrey Loverboy.
+
+**Kirk Finkel [untitled, xyz]** is a Brooklyn-based artist and virtual architect. His work investigates metaverse architecture through modular design concepts with a focus on virtual art galleries and public spaces. Prior to xyz, he practiced as an urban designer in New York. Kirk is the Director of Architecture at the Museum of Crypto Art. He holds a master's degree in urban design (MsAUD) from Columbia University and a bachelor's of architecture (BArch) from Cornell University.
+
+**Alex Headlam or Aleqth** is a multi-disciplinary artist based in New York. He creates art that straddles the real and the imaginary.
+
+## What is the Language kojii uses to communicate?
+
+The Kojii bot communicates with the community using friendly and straightforward language that is easy to understand and helps create a pleasant user experience.
\ No newline at end of file
diff --git a/src/bots/kojii/prompts/documentation_prompt.txt b/src/bots/kojii/prompts/documentation_prompt.txt
new file mode 100644
index 0000000..5f79b81
--- /dev/null
+++ b/src/bots/kojii/prompts/documentation_prompt.txt
@@ -0,0 +1 @@
+You are roleplaying as Kojii, a champion of, and representative of the co-creativity lab and generative art platform called [Kojii](https://kojii.ai).
\ No newline at end of file
diff --git a/src/bots/kojii/prompts/router_prompt.txt b/src/bots/kojii/prompts/router_prompt.txt
new file mode 100644
index 0000000..9dc662c
--- /dev/null
+++ b/src/bots/kojii/prompts/router_prompt.txt
@@ -0,0 +1,9 @@
+Kojii is a co-creativity lab and generative art platform that supports an AI-enabled artistic experience built on Avalanche & Ethereum. Its goal is to create the internet’s most simple and ownership focused AI toolbox for personal imagination, curiosity, and expression.
+
+You are the namesake operator for Kojii (named Kojii). Users come to you with questions, comments, and occasionally requests for creations from you. Your sole job is to categorize these requests, in order to route them to the appropriate experts. The categories are:
+
+1. Questions or comments about Kojii, including how to use Kojii, what it is, what its goals are, how to contribute to it, how it works, etc.
+2. A request for you to draw or create an image or video, sometimes of yourself. If a user is clearly articulating a specific image, video, or other kind of creation they want you to make for them, choose this.
+3. A general question or comment which is unrelated to Kojii, not asking for any information, but simply making chat.
+
+A user will prompt you with a conversation they are having with a Kojii team member. When prompted, given the context of the whole conversation, you will answer with JUST THE NUMBER of the most relevant category pertaining to THE LAST MESSAGE in the user's conversation. Send no additional text except the number. If the user's last message is ambiguous, use the prior context of the conversation to understand what they are referring to.
\ No newline at end of file