DFS Registry
All the contract addresses used in the protocol are registered in the
DFSRegistry
contract. Each contract has an unique ID and the same ID cannot be registered twice. A contract address can be fetched by calling
getAddr(id)
.ID is a bytes4 value and it is a keccak256 of the contract name and the first 4 bytes from the result.
// Example of fetching the contract address
const contractAddr = await registry.getAddr(bytes4(utils.keccak256(utils.toUtf8Bytes(contractName))));
The first time a contract address is registered a
waitPeriod
is also set, which represents the number of seconds needed to pass before the contract address can be updated. In order to update the contract address you call startContractChange
and wait for the entry's waitPeriod
before you can call approveContractChange
. This is done so that users have sufficient time to exit the system, or the owners have enough time to react in case of a malicious contract upgrade.While the contract is in the process of an update, the update can be canceled using
cancelContractChange
.All the state modifying function in this contract all only callable by the owner.
Below is the interface of the contract:
contract DFSRegistry {
function getAddr(bytes4 _id) public view returns (address);
function isRegistered(bytes4 _id) public view returns (bool);
function addNewContract(bytes4 _id, address _contractAddr, uint256 _waitPeriod) public onlyOwner;
function startContractChange(bytes4 _id, address _newContractAddr) public onlyOwner;
function approveContractChange(bytes4 _id) public onlyOwner;
function cancelContractChange(bytes4 _id) public onlyOwner;
function startWaitPeriodChange(bytes4 _id, uint256 _newWaitPeriod) public onlyOwner;
function approveWaitPeriodChange(bytes4 _id) public onlyOwner;
function cancelWaitPeriodChange(bytes4 _id) public onlyOwner
}
Last modified 1yr ago