Policy manager contract
As discussed in Layered 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:
GOVERNANCEQUOTE @eventESCROWINIT-CALLTRANSFER-CALLMINT-CALLBURN-CALLOFFER-CALLWITHDRAW-CALLBUY-CALLSALE-GUARD-CALLFUNGIBLE-TRANSFER-CALLUPDATE-QUOTE-PRICE @eventSALE-WHITELIST @eventCONCRETE-POLICY @eventOFFERBUYWITHDRAW
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.