| Project | Each Juicebox project is represented as an NFT (ERC-721), managed in the Learn moreJBProjectscontract. The owner of this NFT is specified when the project is being created. Ownership over this NFT is used to enforce permissions needed to access several project-oriented transactions. Like any other NFT, ownership can be transferred from the original owner to any other address, such as a multi-sig wallet, voting contract, or burn address. | 
| Funding cycle | A project is expressed in terms of funding cycles. A funding cycle outlines the time-locked rules according to which a project wishes to operate. It is represented as a Learn moreJBFundingCycledata structure, and managed by theJBFundingCycleStorecontract. | 
| Tokens | The Juicebox protocol keeps track of tokens for each project. When a payment is made to a project, the protocol mints tokens for a specified beneficiary according to the rules of the project's current funding cycle. Tokens are managed in the JBTokenStorecontract. Projects can optionally call itsissueFor(...)transaction to issue an ERC-20 to represent their token. Once issued, anyone with a project's tokens can claim them from the protocol's internal accounting mechanism into their wallet to use around Web3. Projects can also bring their own token, so long as it adheres to the Learn moreIJBTokeninterface and uses 18 decimal fixed point accounting. | 
| Overflow | The Learn moreJBFundAccessConstraintsStorecontract has adistributionLimitOf(...)property which denotes how much funds a project can pull from its treasury to distribute to its preprogrammed payout splits during each funding cycle. Any funds in the treasury in excess of the current distribution limit is considered overflow. A project's overflow can be reclaimed by its community by redeeming tokens. A project can specify treasury funds or assets held outside of Juicebox contracts by attaching aIJBFundingCycleDataSourceto its funding cycles. | 
| Discount rate | Learn moreJBFundingCycledata structures have aweightproperty that is automatically derived from multiplying theweightof the previous funding cycle by thediscountRateof the previous cycle. The weight property can then be used to determine how many project tokens are distributed per unit of payment received during the funding cycle, or for any other functionality implement through a funding cycle's data source and delegates. A project can also customize its funding cycle's weight manually.
 | 
| Redemption rate | Learn moreJBFundingCycledata structures configured through theJBController3_1contract have aredemptionRatemetadata property that can be used to determine how much overflowed funds can be reclaimed by redeeming project tokens, or for any other functionality implemented in a funding cycle's data source and delegates.
 | 
| Reserved tokens | Learn moreJBFundingCycledata structures configured through theJBController3_1contract have areservedRatemetadata property which specifies the percentage of tokens minted as a result of newly received payments that should be reserved for distribution to preprogrammed reserved token splits.
 | 
| Splits | A Split is used to send a percent of a total amount to a preprogrammed address, Juicebox project, contract that inherits from Learn moreIJBSplitAllocator, or sender of the transaction causing the distribution to splits. Splits are represented withJBSplitdata structures, and managed by theJBSplitsStore. A split does not hold information about what is being split, it's simply a structure organizable into groups that maps a receiver to a percentage. | 
| Split allocator | A project can preconfigure splits to be directed to any contract that adheres to Learn moreIJBSplitAllocatorwhoseallocate(...)transaction will be called when tokens are distributed. | 
| Ballot | JBFundingCycledata structures have a ballot property which is the address of a contract that adheres to theIJBFundingCycleBallotinterface. This contract specifies the conditions that must be met for any proposed funding cycle reconfiguration to take effect.
 A ballot contract can be written to incorporate strict community voting requirements in order to make funding cycle changes, or to simply add a required buffer period between when a change is proposed and when it can take effect.Learn more | 
| Payment terminal | A project can be configured to use any contract that adheres to Learn moreIJBPaymentTerminalto manage its inflows and outflows of token funds. It can set its terminals usingJBDirectory.setTerminalsOf(...), and if it uses multiple tokens to manage funds for the same token, it can set the primary one where other Web3 contracts should send funds to usingJBDirectory.setPrimaryTerminalOf(...). | 
| Data source | JBFundingCycledata structures configured through theJBController3_1contract have adataSourcemetadata property which is the address of a contract that adheres to theIJBFundingCycleDataSource3_1_1interface.
 Including a data source allows projects to customize what happens when a payment is attempted to the project during a funding cycle, and what happens when a token is attempted to be redeemed during a funding cycle.Learn more | 
| Delegate | When a project receives a payment, its funding cycle's data source can specify the address of a contract that adheres to the IJBPayDelegate3_1_1whosedidPay(...)transaction will be called onceJBPayoutRedemptionPaymentTerminal3_1_1.pay(...)has been executed. Similarly, when a project's tokens are being redeemed, its funding cycle's data source can specify the address of a contract that adheres to the IJBRedemptionDelegate3_1_1whosedidRedeem(...)transaction will be called onceJBPayoutRedemptionPaymentTerminal3_1_1.redeemTokensOf(...)has been executed. These can be used by projects to customize what happens when it receives payments and when someone redeems its tokens.Learn more | 
| NFT Rewards | A project can use the NFT Rewards delegate if it wishes to distribute NFTs of any number of tiers to addresses who contribute during a particular set of funding cycles. These NFTs can then be used for redemptions instead of the standard project tokens if the project chooses to. Learn more | 
| Token Store | The Learn moreJBTokenStorecontract manages project token balances, minting, and burning for all projects on a version of the protocol. It must adhere to theIJBTokenStoreinterface, and its address can be found by reading a project'sJBController3_1.tokenStore. | 
| Operator | Addresses can give permissions to any other address to take specific actions throughout the Juicebox ecosystem on their behalf. These addresses are called Operators, and are managed through the Learn moreJBOperatorStorecontract. |