diff --git a/src/components/strings.tsx b/src/components/strings.tsx index 36d781c32f..2d80c61a48 100644 --- a/src/components/strings.tsx +++ b/src/components/strings.tsx @@ -35,6 +35,21 @@ export const CYCLE_EXPLANATION = ( ) +export const RULESET_EXPLANATION = ( + +

With unlocked rulesets, you can edit your project's rules at any time.

+

+ With locked rulesets, you can lock your project's rules for a period of time + (like 3 minutes, 2 years, or 14 days), helping you build trust with your + supporters. +

+

+ This choice isn't permanent — you can switch between locked and unlocked + rulesets in the future. +

+
+) + export const LOCKED_PAYOUT_EXPLANATION = ( If locked, this payout can't be edited or removed until the lock expires or diff --git a/src/locales/messages.pot b/src/locales/messages.pot index 1dfce92901..5f24b83532 100644 --- a/src/locales/messages.pot +++ b/src/locales/messages.pot @@ -179,6 +179,9 @@ msgstr "" msgid "Payout recipients:" msgstr "" +msgid "Your project's first ruleset will start on <0>{0} at {1}. Your project will be visible on <1>juicebox.money once you finish setting your project up, but supporters won't be able to pay or interact with it until the first ruleset begins." +msgstr "" + msgid "Lock until" msgstr "" @@ -437,6 +440,9 @@ msgstr "" msgid "Payer issuance rate" msgstr "" +msgid "None of your project's ETH can be paid out. All ETH will stay in your project for token redemptions or use in future rulesets." +msgstr "" + msgid "Project Details" msgstr "" @@ -542,6 +548,9 @@ msgstr "" msgid "This cycle has upcoming changes" msgstr "" +msgid "<0/> Your project's rules cannot be edited during the first ruleset." +msgstr "" + msgid "While enabled, the project owner can change the project's <0>payment terminals at any time." msgstr "" @@ -557,6 +566,9 @@ msgstr "" msgid "You would receive <0/>" msgstr "" +msgid "Simple token rules that will work for most projects. You can edit these rules in future rulesets." +msgstr "" + msgid "The issuance reduction rate is disabled if you are using unlocked cycles (because they have no duration)." msgstr "" @@ -833,6 +845,9 @@ msgstr "" msgid "Automated" msgstr "" +msgid "Ruleset" +msgstr "" + msgid "Back to settings" msgstr "" @@ -1046,6 +1061,9 @@ msgstr "" msgid "No overflow" msgstr "" +msgid "A fixed amount of ETH can be paid out from your project each ruleset. You can send specific ETH amounts (or ETH amounts based on USD values) to one or more recipients. Any remaining ETH will stay in your project for token redemptions or use in future rulesets." +msgstr "" + msgid "Export tokens CSV" msgstr "" @@ -1181,6 +1199,9 @@ msgstr "" msgid "No results" msgstr "" +msgid "The project's owner can edit the project's rules and start new rulesets at any time." +msgstr "" + msgid "ETH transfers to project" msgstr "" @@ -1202,6 +1223,9 @@ msgstr "" msgid "Fee from <0><1/>" msgstr "" +msgid "Reserved percent" +msgstr "" + msgid "Later" msgstr "" @@ -1214,6 +1238,9 @@ msgstr "" msgid "{receivedTokenSymbolText} Token" msgstr "" +msgid "Ruleset #1 starts when you create your project. With unlocked rulesets, you can edit your project's rules at any time. This gives you more flexibility, but may appear risky to supporters. Switching to locked rulesets will help you build supporter confidence." +msgstr "" + msgid "Issuance reduction rate:" msgstr "" @@ -1418,6 +1445,9 @@ msgstr "" msgid "<0>Juicebox is a <1>governance-minimal protocol. There are only a few levers that can be tuned, none of which impose changes for users without their consent. The Juicebox governance smart contract can adjust these levers.<2>The Juicebox protocol is governed by a community of JBX token holders who vote on proposals fortnightly.<3>Juicebox is on-chain and non-custodial. Project creators actually own their projects, and JuiceboxDAO has no way to access project's ETH or change their rules." msgstr "" +msgid "<0>With unlocked rulesets, you can edit your project's rules at any time.<1>With locked rulesets, you can lock your project's rules for a period of time (like 3 minutes, 2 years, or 14 days), helping you build trust with your supporters.<2>This choice isn't permanent — you can switch between locked and unlocked rulesets in the future." +msgstr "" + msgid "Pay {projectTitle}" msgstr "" @@ -1784,6 +1814,9 @@ msgstr "" msgid "Created project" msgstr "" +msgid "Next ruleset, the project will issue {0} tokens per 1 ETH. The ruleset after that, the project will issue {1} tokens per 1 ETH." +msgstr "" + msgid "An address is required" msgstr "" @@ -1802,6 +1835,9 @@ msgstr "" msgid "Project rules" msgstr "" +msgid "Set a duration for locked rulesets." +msgstr "" + msgid "Upload" msgstr "" @@ -2105,6 +2141,9 @@ msgstr "" msgid "Reset website" msgstr "" +msgid "Decay percent" +msgstr "" + msgid "Payout allocated to this project's {versionName} payment terminal. <0>Learn more." msgstr "" @@ -2420,6 +2459,9 @@ msgstr "" msgid "While enabled, the project owner can change the project's <0>controller at any time." msgstr "" +msgid "<0>With Locked Rulesets, your project's rules are locked for a period of time.<1><2>This helps build trust with your contributors." +msgstr "" + msgid "Ruleset #" msgstr "" @@ -2501,6 +2543,9 @@ msgstr "" msgid "Disclose any details to your contributors before they pay your project." msgstr "" +msgid "The issuance rate is reduced by this percentage every ruleset (every <0>{0}). The higher this rate, the more incentive to pay this project earlier." +msgstr "" + msgid "One or more reserved token recipients" msgstr "" @@ -2615,6 +2660,9 @@ msgstr "" msgid "Your edits will take effect in <0>cycle #{0}. The current cycle (#{currentFCNumber}) won't be altered." msgstr "" +msgid "Leave this blank to start your first ruleset immediately after you finish setting up your project." +msgstr "" + msgid "All of this project's ETH will be paid out. Token holders will receive <0>no ETH when redeeming their tokens." msgstr "" @@ -2642,6 +2690,9 @@ msgstr "" msgid "Give permissions to {0} on project #{projectId}" msgstr "" +msgid "Pay out ETH from your project to any Ethereum wallet or Juicebox project. ETH which <0>isn't paid out will be available for token redemptions, or for use in future rulesets. Payouts reset each ruleset." +msgstr "" + msgid "<0>Juicebox has had <1>multiple security audits, and has handled tens of thousands of ETH through its protocol.<2>However, Juicebox is still experimental software. Although the Juicebox contract team have done their part to shape the smart contracts for public use and have tested the code thoroughly, the risk of exploits is never 0%.<3>Due to their public nature, any exploits to the contracts may have irreversible consequences, including loss of ETH. Please use Juicebox with caution.<4><5>Learn more about the risks." msgstr "" @@ -2855,6 +2906,9 @@ msgstr "" msgid "Paying another Juicebox project may mint its tokens. Select an address to receive these tokens." msgstr "" +msgid "Set a future date & time to start your project's first ruleset." +msgstr "" + msgid "Get help planning or setting up my project." msgstr "" @@ -3071,6 +3125,9 @@ msgstr "" msgid "Connect wallet to deploy" msgstr "" +msgid "Unlocked Rulesets" +msgstr "" + msgid "Your wallet isn't allowed to process held fees." msgstr "" @@ -3086,6 +3143,9 @@ msgstr "" msgid "Check User Wallet Address" msgstr "" +msgid "Rulesets" +msgstr "" + msgid "Set ENS text record for {ensName}" msgstr "" @@ -3140,6 +3200,9 @@ msgstr "" msgid "Yes, start over" msgstr "" +msgid "Ruleset #1 starts when you create your project. With locked rulesets, if you edit your project's rules during Ruleset #1, those edits will be <0>queued for the next ruleset." +msgstr "" + msgid "All {tokensText} will go to the project owner:" msgstr "" @@ -3314,6 +3377,9 @@ msgstr "" msgid "{0} is not a valid integer" msgstr "" +msgid "Rulesets & Payouts" +msgstr "" + msgid "The unallocated portion of your total will go to the wallet that owns the project by default." msgstr "" @@ -3431,6 +3497,9 @@ msgstr "" msgid "No changes" msgstr "" +msgid "After {0} (your first ruleset), your project will not issue any tokens unless you edit the issuance rate." +msgstr "" + msgid "Project ENS name" msgstr "" @@ -3446,6 +3515,9 @@ msgstr "" msgid "After {0} (your first cycle), your project will not issue any tokens unless you edit the issuance rate." msgstr "" +msgid "In other words: instead of taking effect immediately, those edits will take effect when the next ruleset starts (Ruleset #2). If you need more flexibility, switch to unlocked rulesets." +msgstr "" + msgid "New NFTs will available on your project page shortly." msgstr "" @@ -3560,6 +3632,9 @@ msgstr "" msgid "Redeem {tokensLabel} for ETH" msgstr "" +msgid "Locked Rulesets" +msgstr "" + msgid "Made a mistake?" msgstr "" @@ -4223,6 +4298,9 @@ msgstr "" msgid "The maximum supply of this NFT in circulation." msgstr "" +msgid "Each ruleset, the project will issue {discountRate}% fewer tokens per ETH." +msgstr "" + msgid "Payout and reserved token recipients cannot exceed 100%" msgstr "" @@ -4301,6 +4379,9 @@ msgstr "" msgid "End" msgstr "" +msgid "The issuance reduction rate is disabled if you are using unlocked rulesets (because they have no duration)." +msgstr "" + msgid "Message sent!" msgstr "" diff --git a/src/packages/v4/components/Create/Create.tsx b/src/packages/v4/components/Create/Create.tsx index 0078ff9fd5..2657e4b7c6 100644 --- a/src/packages/v4/components/Create/Create.tsx +++ b/src/packages/v4/components/Create/Create.tsx @@ -2,15 +2,13 @@ import { t, Trans } from '@lingui/macro' import { DeployButtonText } from 'components/buttons/DeployProjectButtonText' import Loading from 'components/Loading' import { - CYCLE_EXPLANATION, RECONFIG_RULES_EXPLANATION, + RULESET_EXPLANATION, } from 'components/strings' import { readNetwork } from 'constants/networks' import { NetworkName } from 'models/networkName' import { useRouter } from 'next/router' -import { CreateBadge } from './components/CreateBadge' import { FundingCyclesPage } from './components/pages/FundingCycles/FundingCyclesPage' -import { NftRewardsPage } from './components/pages/NftRewards/NftRewardsPage' import { PayoutsPage } from './components/pages/PayoutsPage/PayoutsPage' import { ProjectDetailsPage } from './components/pages/ProjectDetails/ProjectDetailsPage' import { ProjectTokenPage } from './components/pages/ProjectToken/ProjectTokenPage' @@ -49,8 +47,8 @@ export function Create() { @@ -61,8 +59,8 @@ export function Create() { Pay out ETH from your project to any Ethereum wallet or Juicebox project. ETH which isn't paid out will be available for - token redemptions, or for use in future cycles. Payouts reset - each cycle. + token redemptions, or for use in future rulesets. Payouts reset + each ruleset. } > @@ -83,7 +81,7 @@ export function Create() { > - @@ -96,7 +94,7 @@ export function Create() { } > - + */} Edit Deadline} diff --git a/src/packages/v4/components/Create/components/Wizard/hooks/useSteps.ts b/src/packages/v4/components/Create/components/Wizard/hooks/useSteps.ts index 1947d1ff9c..2c58a52f47 100644 --- a/src/packages/v4/components/Create/components/Wizard/hooks/useSteps.ts +++ b/src/packages/v4/components/Create/components/Wizard/hooks/useSteps.ts @@ -8,10 +8,10 @@ import { WizardContext } from '../contexts/WizardContext' const stepNames = (): Record => { return { projectDetails: t`Details`, - fundingCycles: t`Cycles`, + fundingCycles: t`Rulesets`, payouts: t`Payouts`, projectToken: t`Token`, - nftRewards: t`NFTs`, + // nftRewards: t`NFTs`, reconfigurationRules: t`Deadline`, reviewDeploy: t`Deploy`, } diff --git a/src/packages/v4/components/Create/components/pages/FundingCycles/FundingCyclesPage.tsx b/src/packages/v4/components/Create/components/pages/FundingCycles/FundingCyclesPage.tsx index 7caef86242..0bda8587e0 100644 --- a/src/packages/v4/components/Create/components/pages/FundingCycles/FundingCyclesPage.tsx +++ b/src/packages/v4/components/Create/components/pages/FundingCycles/FundingCyclesPage.tsx @@ -41,16 +41,16 @@ const FundingCycleCallout: React.FC> = () => {

- Cycle #1 starts when you create your project. With locked cycles, - if you edit your project's rules during Cycle #1, those edits will - be queued for the next cycle. + Ruleset #1 starts when you create your project. With locked rulesets, + if you edit your project's rules during Ruleset #1, those edits will + be queued for the next ruleset.

In other words: instead of taking effect immediately, those edits - will take effect when the next cycle starts (Cycle #2). If you - need more flexibility, switch to unlocked cycles. + will take effect when the next ruleset starts (Ruleset #2). If you + need more flexibility, switch to unlocked rulesets.

@@ -59,10 +59,10 @@ const FundingCycleCallout: React.FC> = () => { return ( - Cycle #1 starts when you create your project. With unlocked cycles, + Ruleset #1 starts when you create your project. With unlocked rulesets, you can edit your project's rules at any time. This gives you more flexibility, but may appear risky to supporters. Switching to locked - cycles will help you build supporter confidence. + rulesets will help you build supporter confidence. ) @@ -117,13 +117,13 @@ export const FundingCyclesPage = () => { name="automated" title={
- Locked Cycles{' '} + Locked Rulesets{' '}

- With Locked Cycles, your project's rules are + With Locked Rulesets, your project's rules are locked for a period of time.

@@ -137,20 +137,20 @@ export const FundingCyclesPage = () => { />

} - description={t`Set a duration for locked cycles.`} + description={t`Set a duration for locked rulesets.`} icon={} > Your project's rules cannot be - edited during the first cycle. + edited during the first ruleset. } rules={lockPageRulesWrapper([ - durationMustExistRule({ label: t`Cycle duration` }), + durationMustExistRule({ label: t`Ruleset duration` }), ])} > @@ -158,8 +158,8 @@ export const FundingCyclesPage = () => { } /> @@ -183,14 +183,14 @@ export const FundingCyclesPage = () => { Set a future date & time to start your project's first - cycle. + ruleset. } extra={ launchDate ? ( - Your project's first cycle will start on{' '} + Your project's first ruleset will start on{' '} { . Your project will be visible on{' '} juicebox.money once you finish setting your project up, but supporters won't be able to - pay or interact with it until the first cycle begins. + pay or interact with it until the first ruleset begins. ) : ( - Leave this blank to start your first cycle immediately + Leave this blank to start your first ruleset immediately after you finish setting up your project. ) diff --git a/src/packages/v4/components/Create/components/pages/FundingCycles/hooks/useFundingCyclesForm.ts b/src/packages/v4/components/Create/components/pages/FundingCycles/hooks/useFundingCyclesForm.ts index 31f668ec79..50593d7694 100644 --- a/src/packages/v4/components/Create/components/pages/FundingCycles/hooks/useFundingCyclesForm.ts +++ b/src/packages/v4/components/Create/components/pages/FundingCycles/hooks/useFundingCyclesForm.ts @@ -35,7 +35,7 @@ export const useFundingCyclesForm = () => { : undefined if (!fundingCycleData.duration?.length || selection !== 'automated') { - // Return default values if the user hasn't selected a funding cycle type yet. + // Return default values if the user hasn't selected a funding ruleset type yet. return { duration: { duration: 14, unit: 'days' }, selection, launchDate } } diff --git a/src/packages/v4/components/Create/components/pages/PayoutsPage/components/TreasuryOptionsRadio.tsx b/src/packages/v4/components/Create/components/pages/PayoutsPage/components/TreasuryOptionsRadio.tsx index 0389eae6df..b595c6d095 100644 --- a/src/packages/v4/components/Create/components/pages/PayoutsPage/components/TreasuryOptionsRadio.tsx +++ b/src/packages/v4/components/Create/components/pages/PayoutsPage/components/TreasuryOptionsRadio.tsx @@ -45,11 +45,11 @@ export function TreasuryOptionsRadio() { const calloutText = useMemo(() => { switch (treasuryOption) { case 'amount': - return t`A fixed amount of ETH can be paid out from your project each cycle. You can send specific ETH amounts (or ETH amounts based on USD values) to one or more recipients. Any remaining ETH will stay in your project for token redemptions or use in future cycles.` + return t`A fixed amount of ETH can be paid out from your project each ruleset. You can send specific ETH amounts (or ETH amounts based on USD values) to one or more recipients. Any remaining ETH will stay in your project for token redemptions or use in future rulesets.` case 'unlimited': return t`All of your project's ETH can be paid out at any time. You can send percentages of that ETH to one or more recipients.` case 'zero': - return t`None of your project's ETH can be paid out. All ETH will stay in your project for token redemptions or use in future cycles.` + return t`None of your project's ETH can be paid out. All ETH will stay in your project for token redemptions or use in future rulesets.` } }, [treasuryOption]) diff --git a/src/packages/v4/components/Create/components/pages/ProjectToken/ProjectTokenPage.tsx b/src/packages/v4/components/Create/components/pages/ProjectToken/ProjectTokenPage.tsx index f28ba94cac..1201c3c2eb 100644 --- a/src/packages/v4/components/Create/components/pages/ProjectToken/ProjectTokenPage.tsx +++ b/src/packages/v4/components/Create/components/pages/ProjectToken/ProjectTokenPage.tsx @@ -73,7 +73,7 @@ export const ProjectTokenPage: React.FC< description={ Simple token rules that will work for most projects. You can - edit these rules in future cycles. + edit these rules in future rulesets. } > diff --git a/src/packages/v4/components/Create/components/pages/ProjectToken/components/CustomTokenSettings/CustomTokenSettings.tsx b/src/packages/v4/components/Create/components/pages/ProjectToken/components/CustomTokenSettings/CustomTokenSettings.tsx index 1a245d56ef..c3489e99c5 100644 --- a/src/packages/v4/components/Create/components/pages/ProjectToken/components/CustomTokenSettings/CustomTokenSettings.tsx +++ b/src/packages/v4/components/Create/components/pages/ProjectToken/components/CustomTokenSettings/CustomTokenSettings.tsx @@ -88,7 +88,7 @@ export const CustomTokenSettings = () => { - +
Set aside a percentage of token issuance for the wallets and @@ -128,13 +128,15 @@ export const CustomTokenSettings = () => { - +
- - The issuance rate is reduced by this percentage every cycle (every{' '} - {formatFundingCycleDuration(duration)}). The higher this rate, the - more incentive to pay this project earlier. - + + + The issuance rate is reduced by this percentage every ruleset (every{' '} + {formatFundingCycleDuration(duration)}). The higher this rate, the + more incentive to pay this project earlier. + + { The issuance reduction rate is disabled if you are using - unlocked cycles (because they have no duration). + unlocked rulesets (because they have no duration). ) : ( @@ -168,22 +170,22 @@ export const CustomTokenSettings = () => { ) : discountRate === 100 ? ( After {formatFundingCycleDuration(duration)} (your first - cycle), your project will not issue any tokens unless you edit + ruleset), your project will not issue any tokens unless you edit the issuance rate. ) : ( <>

- Each cycle, the project will issue {discountRate}% fewer + Each ruleset, the project will issue {discountRate}% fewer tokens per ETH.{' '}

- Next cycle, the project will issue{' '} + Next ruleset, the project will issue{' '} {formatAmount(secondFundingCycleMintRate)} tokens per 1 - ETH. The cycle after that, the project will issue{' '} + ETH. The ruleset after that, the project will issue{' '} {formatAmount(thirdFundingCycleMintRate)} tokens per 1 ETH. diff --git a/src/packages/v4/components/Create/components/pages/ProjectToken/components/DefaultSettings.tsx b/src/packages/v4/components/Create/components/pages/ProjectToken/components/DefaultSettings.tsx index ac3008a5e6..9aafd3154e 100644 --- a/src/packages/v4/components/Create/components/pages/ProjectToken/components/DefaultSettings.tsx +++ b/src/packages/v4/components/Create/components/pages/ProjectToken/components/DefaultSettings.tsx @@ -24,11 +24,11 @@ export const DefaultSettings: React.FC< )} tokens / ETH`, tooltip: MINT_RATE_EXPLANATION, }, - [t`Reserved rate`]: { + [t`Reserved percent`]: { data: `${ProjectTokenForm.DefaultSettings.reservedTokensPercentage}%`, tooltip: RESERVED_RATE_EXPLANATION, }, - [t`Issuance reduction rate`]: { + [t`Decay percent`]: { data: `${ProjectTokenForm.DefaultSettings.discountRate}%`, tooltip: DISCOUNT_RATE_EXPLANATION, }, diff --git a/src/packages/v4/components/Create/components/pages/ReconfigurationRules/ReconfigurationRulesPage.tsx b/src/packages/v4/components/Create/components/pages/ReconfigurationRules/ReconfigurationRulesPage.tsx index bf24fbeb3a..2ca930ce45 100644 --- a/src/packages/v4/components/Create/components/pages/ReconfigurationRules/ReconfigurationRulesPage.tsx +++ b/src/packages/v4/components/Create/components/pages/ReconfigurationRules/ReconfigurationRulesPage.tsx @@ -5,12 +5,11 @@ import { Callout } from 'components/Callout/Callout' import { JuiceSwitch } from 'components/inputs/JuiceSwitch' import { CONTROLLER_CONFIG_EXPLANATION, - CONTROLLER_MIGRATION_EXPLANATION, HOLD_FEES_EXPLANATION, PAUSE_PAYMENTS_EXPLANATION, RECONFIG_RULES_WARN, TERMINAL_CONFIG_EXPLANATION, - TERMINAL_MIGRATION_EXPLANATION, + TERMINAL_MIGRATION_EXPLANATION } from 'components/strings' import { CREATE_FLOW } from 'constants/fathomEvents' import { FEATURE_FLAGS } from 'constants/featureFlags' @@ -125,12 +124,6 @@ export const ReconfigurationRulesPage = () => { > - - -

diff --git a/src/packages/v4/components/Create/components/pages/ReviewDeploy/ReviewDeployPage.tsx b/src/packages/v4/components/Create/components/pages/ReviewDeploy/ReviewDeployPage.tsx index 08d992e223..17d5d5554e 100644 --- a/src/packages/v4/components/Create/components/pages/ReviewDeploy/ReviewDeployPage.tsx +++ b/src/packages/v4/components/Create/components/pages/ReviewDeploy/ReviewDeployPage.tsx @@ -24,7 +24,6 @@ import { WizardContext } from '../../Wizard/contexts/WizardContext' import { FundingConfigurationReview } from './components/FundingConfigurationReview/FundingConfigurationReview' import { ProjectDetailsReview } from './components/ProjectDetailsReview/ProjectDetailsReview' import { ProjectTokenReview } from './components/ProjectTokenReview/ProjectTokenReview' -import { RewardsReview } from './components/RewardsReview/RewardsReview' import { RulesReview } from './components/RulesReview/RulesReview' enum ReviewDeployKey { @@ -149,7 +148,7 @@ export const ReviewDeployPage = () => { key={ReviewDeployKey.FundingConfiguration} header={
- Cycles & Payouts + Rulesets & Payouts
} > @@ -165,7 +164,7 @@ export const ReviewDeployPage = () => { > - { } > - + */} { <>
{fundingCycles}
} /> { } /> {formatReservedRate( @@ -60,7 +60,7 @@ export const ProjectTokenReview = () => { } /> {formatDiscountRate(