Policy manager contract
As discussed in Contract architecture, the policy manager provides a standard for collecting and distributing fungibles and ensures that all of the policies applied to tokens are enforced. The policy manager provides the following key features:
- The ability to customize and manage token behavior and attributes by enforcing built-in and custom policies.
- Consistent and predictable policy enforcement.
- The ability to stack multiple policies to craft the exact behavior requirement for every token.
- A standardized interface for all policies through
kip.token-policy-v2.
Source code: policy-manager.pact
Tables and schemas
The policy manager contract defines the following tables and schemas:
- Ledgers table: Ensures functions are initiated only from the ledger.
- Concrete policies table: Maintains concrete policy information for each token.
- Sale whitelist table: Lists valid whitelisted sale contracts.
- Quotes table: Archives quotes for quoted sales.
- Ledger schema: Contains the module reference governed by the policy manager, adhering strictly to the ledger-v1 interface.
- Concrete policies schema: Includes the module reference, strictly using the token-policy-v2 interface.
Capabilities
The policy manager supports a comprehensive set of capabilities to cover a wide array of functionalities:
- GOVERNANCE
- QUOTE @event
- ESCROW
- INIT-CALL
- TRANSFER-CALL
- MINT-CALL
- BURN-CALL
- OFFER-CALL
- WITHDRAW-CALL
- BUY-CALL
- SALE-GUARD-CALL
- FUNGIBLE-TRANSFER-CALL
- UPDATE-QUOTE-PRICE @event
- SALE-WHITELIST @event
- CONCRETE-POLICY @event
- OFFER
- BUY
- WITHDRAW
Functions
As a general rule, all of the enforce-** functions require the ledger::**-CALL
capability to be in scope to ensure that functions are initiated from the ledger.
The enforce-** functions then extract the policy list from the token input, which lists
the associated policies.
The policy manager defines the following functions:
- 
enforce-init: Initiates policies::enforce-initatmarmalade-v2.ledger.create-token.
- 
enforce-mint: Executes policies::enforce-mintatmarmalade-v2.ledger.mint.
- 
enforce-burn: Activates policies::enforce-burnatmarmalade-v2.ledger.burn.
- 
enforce-offer: Runs policies::enforce-offeratmarmalade-v2.ledger.offer(step 0 ofmarmalade-v2.ledger.sale). Here, an optionalquoteparameter can be accessed in theenv-datafield. If a quote is identified, the offer saves this quote, and escrow accounts are generated. Otherwise, the offer continues without quotes.
- 
enforce-withdraw: Operates policies::enforce-withdrawatmarmalade-v2.ledger.withdraw(step 1 rollback ofmarmalade-v2.ledger.sale).
- 
enforce-buy: Engages policies::enforce-buyatmarmalade-v2.ledger.buy(step 1 ofmarmalade-v2.ledger.sale).
- 
write-concrete-policy: This function registers a concrete policy modref into the concrete policies table. 
- 
get-escrow-account: Returns the fungible escrow account created for quoted sales at enforce-offer. The escrow account receives the fungible from the buyer and distributes the fungibles to the policies and the seller at the buy step. 
- 
write-concrete-policy: Registers concrete policy modrefinto the concrete-policies table.
- 
get-concrete-policy: Returns the modrefof the concrete policy.
- 
enforce-sale-pact: Ensures that the sale parameter provided to the function is equal to the ID of the currently executing pact. It does this by calling the pact-idfunction to retrieve the ID of the currently executing pact and comparing it to the provided sale parameter. If they are not equal, an exception will be thrown.