You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(propose): require a Proposal Commitment acknowledgment
Adds a public commitment proposers acknowledge before submitting, and
records that acknowledgment in the proposal description that goes onchain.
- New /propose/terms page (EN + PT-BR) with the 7-clause commitment
- Checkbox on the preview step, gating the submit button
- One-line footer appended to the description, always English and version
stamped, so the record stays searchable and auditable across the DAO
The form schema keeps `termsAccepted` optional because ActionForms saves
each transaction through the whole form's handleSubmit — requiring it there
would block adding the transactions needed to reach the checkbox. The hard
requirement lives in proposalSubmissionSchema, which the server action
parses, so the client cannot skip it.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: messages/en/metadata.json
+4Lines changed: 4 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -111,5 +111,9 @@
111
111
"migrate": {
112
112
"title": "Gnars Migration — Gnars DAO",
113
113
"description": "Consolidate your scattered Zora coins into $gnars in one batched flow. Routed through ZORA, with a burn on every migration to strengthen $gnars liquidity."
114
+
},
115
+
"proposeTerms": {
116
+
"title": "Proposal Commitment — Gnars DAO",
117
+
"description": "The public commitment every proposer acknowledges before submitting a proposal to Gnars DAO."
Copy file name to clipboardExpand all lines: messages/en/propose.json
+42-1Lines changed: 42 additions & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -225,7 +225,10 @@
225
225
"failedToSubmit": "Failed to submit proposal",
226
226
"thirdwebNotConfigured": "Thirdweb client not configured",
227
227
"connectWalletToSubmit": "Connect wallet to submit a proposal",
228
-
"pleaseFixErrors": "Please fix validation errors before submitting"
228
+
"pleaseFixErrors": "Please fix validation errors before submitting",
229
+
"termsLabel": "I have read and accept the <link>Gnars Proposal Commitment</link>",
230
+
"termsHint": "A short note recording this acknowledgment is appended to your proposal description.",
231
+
"termsRequired": "You must accept the Proposal Commitment before submitting."
229
232
},
230
233
"droposalBuilder": {
231
234
"media": {
@@ -295,5 +298,43 @@
295
298
},
296
299
"breadcrumbCreate": "Create Proposal",
297
300
"breadcrumbTemplates": "Templates"
301
+
},
302
+
"terms": {
303
+
"title": "Proposal Commitment",
304
+
"subtitle": "A public commitment, not a legal contract. It is enforced by transparency and reputation, not by courts.",
305
+
"intro": "By submitting a proposal to Gnars DAO, you acknowledge the following.",
306
+
"callout": "Gnars is built on action over talk. Approval is not just access to funds — it is trust from the community.",
307
+
"clauses": {
308
+
"goodFaith": {
309
+
"title": "Good faith",
310
+
"body": "I have described the scope, timeline, budget, and deliverables of this proposal accurately, and I intend to execute it as written."
311
+
},
312
+
"treasuryRespect": {
313
+
"title": "Treasury respect",
314
+
"body": "Treasury funds are community resources, not casual capital. If this proposal is approved, I will keep spending aligned with the approved plan."
315
+
},
316
+
"noSilence": {
317
+
"title": "No silence",
318
+
"body": "I will post progress updates as propdates while the work is in flight, and I will report delays, blockers, or changes in scope publicly and early — before trust breaks."
319
+
},
320
+
"proofOfWork": {
321
+
"title": "Proof of work",
322
+
"body": "Updates will include evidence the work exists: links, commits, repos, files, media, transactions, or live pages."
323
+
},
324
+
"finalReport": {
325
+
"title": "Final report",
326
+
"body": "When the work is done, I will post a closing report covering what was delivered, how the budget was used, what remains reusable, and what I learned."
327
+
},
328
+
"openByDefault": {
329
+
"title": "Open by default",
330
+
"body": "Where applicable, code, media, documentation, and creative outputs will be delivered CC0 or open-source. Any part that cannot be shared openly is disclosed in the proposal itself."
331
+
},
332
+
"proportionalSafeguards": {
333
+
"title": "Proportional safeguards",
334
+
"body": "I understand that larger requests may be expected to use milestone-based releases, shared custody, or both, and that voters will weigh this when deciding."
Copy file name to clipboardExpand all lines: messages/pt-br/metadata.json
+4Lines changed: 4 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -111,5 +111,9 @@
111
111
"migrate": {
112
112
"title": "Migração Gnars — Gnars DAO",
113
113
"description": "Consolide suas coins da Zora espalhadas em $gnars em um fluxo em lote. Roteado via ZORA, com queima a cada migração para fortalecer a liquidez de $gnars."
114
+
},
115
+
"proposeTerms": {
116
+
"title": "Compromisso de Proposta — Gnars DAO",
117
+
"description": "O compromisso público que todo proponente aceita antes de enviar uma proposta para a Gnars DAO."
Copy file name to clipboardExpand all lines: messages/pt-br/propose.json
+42-1Lines changed: 42 additions & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -225,7 +225,10 @@
225
225
"failedToSubmit": "Falha ao enviar proposta",
226
226
"thirdwebNotConfigured": "Cliente Thirdweb não configurado",
227
227
"connectWalletToSubmit": "Conecte a wallet para enviar uma proposta",
228
-
"pleaseFixErrors": "Por favor, corrija os erros de validação antes de enviar"
228
+
"pleaseFixErrors": "Por favor, corrija os erros de validação antes de enviar",
229
+
"termsLabel": "Li e aceito o <link>Compromisso de Proposta da Gnars</link>",
230
+
"termsHint": "Uma linha registrando esse aceite é anexada à descrição da sua proposta.",
231
+
"termsRequired": "Você precisa aceitar o Compromisso de Proposta antes de enviar."
229
232
},
230
233
"droposalBuilder": {
231
234
"media": {
@@ -295,5 +298,43 @@
295
298
},
296
299
"breadcrumbCreate": "Criar Proposta",
297
300
"breadcrumbTemplates": "Templates"
301
+
},
302
+
"terms": {
303
+
"title": "Compromisso de Proposta",
304
+
"subtitle": "Um compromisso público, não um contrato legal. Vale por transparência e reputação, não por tribunal.",
305
+
"intro": "Ao enviar uma proposta para a Gnars DAO, você reconhece o seguinte.",
306
+
"callout": "A Gnars é feita de ação, não de discurso. Aprovação não é só acesso a fundos — é confiança da comunidade.",
307
+
"clauses": {
308
+
"goodFaith": {
309
+
"title": "Boa-fé",
310
+
"body": "Descrevi o escopo, o prazo, o orçamento e as entregas desta proposta de forma honesta, e pretendo executá-la como está escrito."
311
+
},
312
+
"treasuryRespect": {
313
+
"title": "Respeito ao tesouro",
314
+
"body": "O tesouro é recurso da comunidade, não dinheiro solto. Se esta proposta for aprovada, mantenho os gastos alinhados com o plano aprovado."
315
+
},
316
+
"noSilence": {
317
+
"title": "Sem sumiço",
318
+
"body": "Vou postar updates de progresso como propdates enquanto o trabalho estiver rolando, e avisar sobre atrasos, bloqueios ou mudança de escopo em público e cedo — antes de quebrar a confiança."
319
+
},
320
+
"proofOfWork": {
321
+
"title": "Prova de trabalho",
322
+
"body": "Os updates vêm com evidência de que o trabalho existe: links, commits, repositórios, arquivos, mídia, transações ou páginas no ar."
323
+
},
324
+
"finalReport": {
325
+
"title": "Relatório final",
326
+
"body": "Quando terminar, posto um relatório de fechamento contando o que foi entregue, como o orçamento foi usado, o que fica reutilizável e o que aprendi."
327
+
},
328
+
"openByDefault": {
329
+
"title": "Aberto por padrão",
330
+
"body": "Quando fizer sentido, código, mídia, documentação e outputs criativos saem em CC0 ou open-source. O que não puder ser aberto fica declarado na própria proposta."
331
+
},
332
+
"proportionalSafeguards": {
333
+
"title": "Salvaguardas proporcionais",
334
+
"body": "Entendo que pedidos maiores podem exigir liberação por milestone, custódia compartilhada ou ambos, e que quem vota vai levar isso em conta."
0 commit comments