Awesome
1. Introduction (Summary)
Summary: The DssCdpManager
(aka manager
) was created to enable a formalized process for CDPs to be transferred between owners. In short, the manager
works by having a dss
wrapper that allows users to interact with their CDPs in an easy way, treating them as non-fungible tokens (NFTs).
2. Contract Details
Key Functionalities (as defined in the smart contract)
cdpAllow(uint cdp, address usr, uint ok)
: Allow/Disallow (ok
)usr
to managecdp
.urnAllow(address usr, uint ok)
: Allow/Disallow (ok
)usr
to accessmsg.sender
space (for sending a position inquit
).open(bytes32 ilk, address usr)
: Opens a new CDP forusr
to be used for anilk
collateral type.give(uint cdp, address dst)
: Transferscdp
todst
.frob(uint cdp, int dink, int dart)
: Increments/decrements thedink
amount of collateral locked and increments/decrements thedart
amount of debt in thecdp
depositing the generated DAI or collateral freed in thecdp
address.flux(bytes32 ilk, uint cdp, address dst, uint wad)
: Moveswad
(precision 18) amount of collateralilk
fromcdp
todst
.flux(uint cdp, address dst, uint wad)
: Moveswad
amount ofcdp
collateral fromcdp
todst
.move(uint cdp, address dst, uint rad)
: Movesrad
(precision 45) amount of DAI fromcdp
todst
.quit(uint cdp, address dst)
: Moves the collateral locked and debt generated fromcdp
todst
.enter(address src, uint cdp)
: Moves the collateral locked and debt generated fromsrc
tocdp
.shift(uint cdpSrc, uint cdpDst)
: Moves the collateral locked and debt generated fromcdpSrc
tocdpDst
.
Note: dst
refers to the destination address.
Storage Layout
vat
: core contract address that holds the CDPs.cdpi
: Auto incremental id.urns
: MappingCDPId => UrnHandler
list
: MappingCDPId => Prev & Next CDPIds
(double linked list)owns
: MappingCDPId => Owner
ilks
: MappingCDPId => Ilk
(collateral type)first
: MappingOwner => First CDPId
last
: MappingOwner => Last CDPId
count
: MappingOwner => Amount of CDPs
cdpCan
: MappingOwner => CDPId => Allowed Addr => True/False
urnCan
: MappingUrn => Allowed Addr => True/False
3. Key Mechanisms & Concepts
Summary
The CDP manager was created as a way to enable CDPs to be treated more like assets that can be exchanged as non-fungible tokens (NFT) would. Originally when created, the dss core contracts did not have the functionality to enable the transfer of CDP positions, hence the CDP manager was created to wrap this functionality and enable transferring between users. Since then, the core contracts have also implemented a native transfer functionality called fork
which allows the transferring of a CDP to another address. However, there is a restriction, which is that the address owner that will be receiving the CDP needs to provide authorization that they do in fact want to receive it. This was created for the situation when a user is transferring the collateral that is locked as well as the debt generated. If you are simply moving collateral to another address, there is no issue but in the case that you are also transferring the debt generated, there is a chance of putting a perfectly safe CDP in a risky position. This makes the contract functionality a little more restrictive. Therefore, the CDP manager is a good option to keep a simple way of transferring CDPs and recognizing them via a numeric Id.
High-level Purpose
- The
manager
receives thevat
address in its creation and acts as an interface contract between it and the users. - The
manager
keeps an internal registry ofid => owner
andid => urn
allowing for theowner
to executevat
functions for theirurn
via themanager
. - The
manager
keeps a double linked list structure that allows the retrieval of all the CDPs that anowner
has via on-chain calls.- In short, this is what the
GetCdps
is for. This contract is a helper contract that allows the fetching of all the CDPs in just one call.
- In short, this is what the
CDP Manager Usage Example (common path):
- A User executes
open
and gets aCDPId
in return. - After this, the
CDPId
gets associated with anurn
withmanager.urns(cdpId)
and thenjoin
's collateral to it. - After the user executes
frob
, the generated DAI will remain in the CDP'surn
. Then the user canmove
it at a later point in time.- Note that this is the same process for collateral that is freed after
frob
. The user canflux
it to another address at a later time.
- Note that this is the same process for collateral that is freed after
- In the case where a user wants to abandon the
manager
, they can usequit
as a way to migrate their position of their CDP to anotherdst
address.
4. Gotchas (Potential source of user error)
- For the developers who want to integrate with the
manager
, they will need to understand that the CDP actions are still in theurn
environment. Regardless of this, themanager
tries to abstract theurn
usage by aCDPId
. This means that developers will need to get theurn
(urn = manager.urns(cdpId)
) to allow thejoin
ing of collateral to that CDP. - As the
manager
assigns a specificilk
perCDPId
and doesn't allow others to use it for theirs, there is a secondflux
function which expects anilk
parameter. This function has the simple purpose of taking out collateral that was wrongly sent to a CDP that can't handle it/is incompatible. - Frob Function:
- When you
frob
in the CDP manager, you generate new DAI in thevat
via the CDP manager which is then deposited in theurn
that the CDP manager manages. - You would need to manually use the
flux
ormove
functions to get the DAI or collateral out.
- When you
5. Failure Modes (Bounds on Operating Conditions & External Risk Factors)
Potential Issues around Chain Reorganization
When open
is executed, a new urn
is created and a cdpId
is assigned to it for a specific owner
. If the user uses join
to add collateral to the urn
immediately after the transaction is mined, there is a chance that a reorganization of the chain occurs. This would result in the user losing the ownership of that cdpId
/urn
pair, therefore losing their collateral. However, this issue can only arise when avoiding the use of the proxy functions (https://github.com/makerdao/dss-proxy-actions) via a profile proxy (https://github.com/dapphub/ds-proxy) as the user will open
the cdp
and join
collateral in the same transaction.