# Bounties Pallet ### Config 1. `pallet_bounties` uses the following `pallet_treasury` config types: - `type ApproveOrigin` (`approve_bounty` and `propose_curator`). - `type RejectOrigin` (`close_bounty` and a special case for `unassign_curator`). - `type OnSlash` (used when a slash occurs). On the other hand, `pallet_treasury` points to `pallet_bounties` at: - `type SpendFunds` (allows `pallet_bounties` to spend treasury funds). 2. `pallet_bounties` also points out to `pallet_child_bounties` at: - `type ChildBountyManager` (`child_bounties_count` and `children_curator_fees`). ``` impl pallet_bounties::Config for Runtime { type Event = Event; type BountyDepositBase = BountyDepositBase; type BountyDepositPayoutDelay = BountyDepositPayoutDelay; type BountyUpdatePeriod = BountyUpdatePeriod; type CuratorDepositMultiplier = CuratorDepositMultiplier; type CuratorDepositMin = CuratorDepositMin; type CuratorDepositMax = CuratorDepositMax; type BountyValueMinimum = BountyValueMinimum; type DataDepositPerByte = DataDepositPerByte; type MaximumReasonLength = MaximumReasonLength; type WeightInfo = pallet_bounties::weights::SubstrateWeight<Runtime>; type ChildBountyManager = ChildBounties; } impl pallet_treasury::Config for Runtime { ... type ApproveOrigin = EitherOfDiverse< EnsureRoot<AccountId>, EnsureProportionAtLeast<AccountId, CouncilCollective, 3, 5>, >; type RejectOrigin = EitherOfDiverse< EnsureRoot<AccountId>, EnsureProportionMoreThan<AccountId, CouncilCollective, 1, 2>, >; ... type SpendFunds = Bounties; ... } ``` ### Extrinsics 1. [`propose_bounty(origin, value, description)`](https://github.com/paritytech/substrate/blob/master/frame/bounties/src/lib.rs#L336) * Propose a new bounty. * `origin` ('proposer`) must have funds to be reserved. * `value` must be >= `T::BountyValueMinimum`. * `description` must fit in a `BoundedVec<u8, u32::MAX>`. * `proposer` must reserve deposit an amount. * Create a new bounty with `Proposed` and increment the global bounties counter `BountyCount<T>`. 2. [`approve_bounty(origin, bounty_id)`](https://github.com/paritytech/substrate/blob/master/frame/bounties/src/lib.rs#L355) * Approve a bounty proposal. * `origin` must be a valid `T::ApproveOrigin` (from `pallet_treasury`). * `bounty_id` must be valid (<= `BountyCount<T>`). * Check if it's possible to append `bounty_id` to `BountyApprovals::<T>`, otherwise it returns `TooManyQueued`. * Set status to `Approved`. 3. [`propose_curator(origin, bounty_id, curator, fee)`](https://github.com/paritytech/substrate/blob/master/frame/bounties/src/lib.rs#L383) * Assign an account to a bounty as candidate curator. * `origin` must be in `T::ApproveOrigin` (from `pallet_treasury`). * bounty's status must be `Funded` (otherwise `UnexpectedStatus`). * `curator` is the account who will manage this bounty. * `fee` is the curator fee, which must be less than the bounty's value. * Set status to `CuratorProposed`. 4. [`accept_curator(origin, bounty_id)`](https://github.com/paritytech/substrate/blob/master/frame/bounties/src/lib.rs#L513) * Accept a bounty assignment from the Council, setting a curator deposit. * `origin` must be the assigned curator of the bounty. * A deposit will be reserved from the curator and refund upon successful payout. * Set status to `Active`. 5. [`extend_bounty_expiry(origin, bounty_id, _remark)`](https://github.com/paritytech/substrate/blob/master/frame/bounties/src/lib.rs#L756) * Extend the expiry block number of the bounty and stay active. * `origin`must be the curator of the bounty. * `remark`: additional information. (`TODO: Not being used!`). * bounty's status must be `Active`. 6. [`award_bounty(origin, bounty_id, beneficiary)`](https://github.com/paritytech/substrate/blob/master/frame/bounties/src/lib.rs#L555) * Award bounty to a beneficiary account. The beneficiary will be able to claim the funds after a delay (`T::BountyDepositPayoutDelay`). * `origin` must be the curator of the bounty. * Ensure that there are no active child bounties (otherwise `HasActiveChildBounty`). * Set status to `PendingPayout` with `beneficiary` and `unlock_at` (delay). 7. [`claim_bounty(origin, bounty_id)`](https://github.com/paritytech/substrate/blob/master/frame/bounties/src/lib.rs#L602) * Claim the payout from an awarded bounty after payout delay. * `origin` must be the beneficiary of the bounty. (`TODO: Wrong, anyone can trigger it.`) * bounty's status must be `PendingPayout`. * Set `Bounties[bounty_id] = None`. * Remove the bounty's description from `BountyDescriptions`. 8. [`unassign_curator(origin, bounty_id)`](https://github.com/paritytech/substrate/blob/master/frame/bounties/src/lib.rs#L428) * Unassign an accepted curator from a bounty. * `origin` can be: * the curator, signaling that they don't want to curate anymore (no slash). * `T::RejectOrigin` (from `pallet_treasury`), in that case we slash the curator, considering them malicious or inactive. * anybody else, slash if the curator is inactive. * Set status to `Funded` (so another curator can be assigned to it). 9. [`close_bounty(origin, bounty_id)`](https://github.com/paritytech/substrate/blob/master/frame/bounties/src/lib.rs#L666) * Cancel a proposed or active bounty. * `origin` must be in `T::RejectOrigin`. * Check for the bounty's status to handle different situations. * If the bounty is ready to be closed, set `Bounties[bounty_id] = None`. * Remove the bounty's description from `BountyDescriptions`. ---