add a pluginInstanceWhitelist to register proxied plugins
This commit is contained in:
parent
ab0f8aa62f
commit
0f5c9738ed
|
@ -34,6 +34,9 @@ contract LPFactory is DAOFactory {
|
||||||
v.initialize(address(lp), _escapeHatchDestination);
|
v.initialize(address(lp), _escapeHatchDestination);
|
||||||
lp.initialize(address(v), _escapeHatchDestination);
|
lp.initialize(address(v), _escapeHatchDestination);
|
||||||
|
|
||||||
|
// register the lp instance w/ the kernel
|
||||||
|
kernel.setApp(kernel.APP_ADDR_NAMESPACE(), LP_APP_ID, address(lp));
|
||||||
|
|
||||||
_setPermissions(_root, acl, kernel, v, lp);
|
_setPermissions(_root, acl, kernel, v, lp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -155,7 +155,7 @@ contract LiquidPledgingBase is EscapableApp, LiquidPledgingStorage, PledgeAdmins
|
||||||
/// plugin contract for a specific Admin
|
/// plugin contract for a specific Admin
|
||||||
/// @param idAdmin The id of the admin being checked
|
/// @param idAdmin The id of the admin being checked
|
||||||
function checkAdminOwner(uint64 idAdmin) internal constant {
|
function checkAdminOwner(uint64 idAdmin) internal constant {
|
||||||
PledgeAdmin a = _findAdmin(idAdmin);
|
PledgeAdmin storage a = _findAdmin(idAdmin);
|
||||||
require(msg.sender == address(a.plugin) || msg.sender == a.addr);
|
require(msg.sender == address(a.plugin) || msg.sender == a.addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -302,7 +302,7 @@ contract LiquidPledgingBase is EscapableApp, LiquidPledgingStorage, PledgeAdmins
|
||||||
// Ensure that the pledge is not already at max pledge depth
|
// Ensure that the pledge is not already at max pledge depth
|
||||||
// and the project has not been canceled
|
// and the project has not been canceled
|
||||||
require(_getPledgeLevel(p) < MAX_INTERPROJECT_LEVEL);
|
require(_getPledgeLevel(p) < MAX_INTERPROJECT_LEVEL);
|
||||||
require(!_isProjectCanceled(idReceiver));
|
require(!isProjectCanceled(idReceiver));
|
||||||
|
|
||||||
uint64 oldPledge = _findOrCreatePledge(
|
uint64 oldPledge = _findOrCreatePledge(
|
||||||
p.owner,
|
p.owner,
|
||||||
|
@ -436,7 +436,7 @@ contract LiquidPledgingBase is EscapableApp, LiquidPledgingStorage, PledgeAdmins
|
||||||
Pledge storage p = _findPledge(idPledge);
|
Pledge storage p = _findPledge(idPledge);
|
||||||
|
|
||||||
require(_getPledgeLevel(p) < MAX_INTERPROJECT_LEVEL);
|
require(_getPledgeLevel(p) < MAX_INTERPROJECT_LEVEL);
|
||||||
require(!_isProjectCanceled(idReceiver));
|
require(!isProjectCanceled(idReceiver));
|
||||||
|
|
||||||
uint64 toPledge = _findOrCreatePledge(
|
uint64 toPledge = _findOrCreatePledge(
|
||||||
p.owner,
|
p.owner,
|
||||||
|
@ -452,9 +452,9 @@ contract LiquidPledgingBase is EscapableApp, LiquidPledgingStorage, PledgeAdmins
|
||||||
|
|
||||||
/// @notice `doTransfer` is designed to allow for pledge amounts to be
|
/// @notice `doTransfer` is designed to allow for pledge amounts to be
|
||||||
/// shifted around internally.
|
/// shifted around internally.
|
||||||
/// @param from This is the id of the pledge from which value will be transfered.
|
/// @param from This is the id of the pledge from which value will be transferred.
|
||||||
/// @param to This is the id of the pledge that value will be transfered to.
|
/// @param to This is the id of the pledge that value will be transferred to.
|
||||||
/// @param _amount The amount of value that will be transfered.
|
/// @param _amount The amount of value that will be transferred.
|
||||||
function _doTransfer(uint64 from, uint64 to, uint _amount) internal {
|
function _doTransfer(uint64 from, uint64 to, uint _amount) internal {
|
||||||
uint amount = _callPlugins(true, from, to, _amount);
|
uint amount = _callPlugins(true, from, to, _amount);
|
||||||
if (from == to) {
|
if (from == to) {
|
||||||
|
@ -512,7 +512,7 @@ contract LiquidPledgingBase is EscapableApp, LiquidPledgingStorage, PledgeAdmins
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(admin.adminType == PledgeAdminType.Project);
|
assert(admin.adminType == PledgeAdminType.Project);
|
||||||
if (!_isProjectCanceled(p.owner)) {
|
if (!isProjectCanceled(p.owner)) {
|
||||||
return idPledge;
|
return idPledge;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,18 +27,26 @@ contract LiquidPledgingPlugins is AragonApp, LiquidPledgingStorage, LiquidPledgi
|
||||||
|
|
||||||
bytes32 constant public PLUGIN_MANAGER_ROLE = keccak256("PLUGIN_MANAGER_ROLE");
|
bytes32 constant public PLUGIN_MANAGER_ROLE = keccak256("PLUGIN_MANAGER_ROLE");
|
||||||
|
|
||||||
function addValidPlugin(bytes32 contractHash) auth(PLUGIN_MANAGER_ROLE) public {
|
function addValidPluginInstance(address addr) auth(PLUGIN_MANAGER_ROLE) public {
|
||||||
pluginWhitelist[contractHash] = true;
|
pluginInstanceWhitelist[addr] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function addValidPlugins(bytes32[] contractHashes) external auth(PLUGIN_MANAGER_ROLE) {
|
function addValidPluginContract(bytes32 contractHash) auth(PLUGIN_MANAGER_ROLE) public {
|
||||||
|
pluginContractWhitelist[contractHash] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function addValidPluginContracts(bytes32[] contractHashes) external auth(PLUGIN_MANAGER_ROLE) {
|
||||||
for (uint8 i = 0; i < contractHashes.length; i++) {
|
for (uint8 i = 0; i < contractHashes.length; i++) {
|
||||||
addValidPlugin(contractHashes[i]);
|
addValidPluginContract(contractHashes[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function removeValidPlugin(bytes32 contractHash) external authP(PLUGIN_MANAGER_ROLE, arr(contractHash)) {
|
function removeValidPluginContract(bytes32 contractHash) external authP(PLUGIN_MANAGER_ROLE, arr(contractHash)) {
|
||||||
pluginWhitelist[contractHash] = false;
|
pluginContractWhitelist[contractHash] = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeValidPluginInstance(address addr) external auth(PLUGIN_MANAGER_ROLE) {
|
||||||
|
pluginInstanceWhitelist[addr] = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function useWhitelist(bool useWhitelist) external auth(PLUGIN_MANAGER_ROLE) {
|
function useWhitelist(bool useWhitelist) external auth(PLUGIN_MANAGER_ROLE) {
|
||||||
|
@ -50,9 +58,15 @@ contract LiquidPledgingPlugins is AragonApp, LiquidPledgingStorage, LiquidPledgi
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// first check pluginInstances
|
||||||
|
if (pluginInstanceWhitelist[addr]) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the addr isn't a valid instance, check the contract code
|
||||||
bytes32 contractHash = getCodeHash(addr);
|
bytes32 contractHash = getCodeHash(addr);
|
||||||
|
|
||||||
return pluginWhitelist[contractHash];
|
return pluginContractWhitelist[contractHash];
|
||||||
}
|
}
|
||||||
|
|
||||||
function getCodeHash(address addr) public view returns(bytes32) {
|
function getCodeHash(address addr) public view returns(bytes32) {
|
||||||
|
|
|
@ -50,7 +50,10 @@ contract LiquidPledgingStorage {
|
||||||
/// index number by the hash of that pledge
|
/// index number by the hash of that pledge
|
||||||
mapping (bytes32 => uint64) hPledge2idx;
|
mapping (bytes32 => uint64) hPledge2idx;
|
||||||
|
|
||||||
mapping (bytes32 => bool) pluginWhitelist;
|
// this whitelist is for non-proxied plugins
|
||||||
|
mapping (bytes32 => bool) pluginContractWhitelist;
|
||||||
|
// this whitelist is for proxied plugins
|
||||||
|
mapping (address => bool) pluginInstanceWhitelist;
|
||||||
bool public whitelistDisabled = false;
|
bool public whitelistDisabled = false;
|
||||||
|
|
||||||
ILPVault public vault;
|
ILPVault public vault;
|
||||||
|
|
|
@ -307,24 +307,11 @@ contract PledgeAdmins is AragonApp, LiquidPledgingPlugins {
|
||||||
plugin = address(a.plugin);
|
plugin = address(a.plugin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
///////////////////
|
|
||||||
// Internal methods
|
|
||||||
///////////////////
|
|
||||||
|
|
||||||
/// @notice A getter to look up a Admin's details
|
|
||||||
/// @param idAdmin The id for the Admin to lookup
|
|
||||||
/// @return The PledgeAdmin struct for the specified Admin
|
|
||||||
function _findAdmin(uint64 idAdmin) internal view returns (PledgeAdmin storage) {
|
|
||||||
require(idAdmin < admins.length);
|
|
||||||
return admins[idAdmin];
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @notice A getter to find if a specified Project has been canceled
|
/// @notice A getter to find if a specified Project has been canceled
|
||||||
/// @param projectId The Admin id number used to specify the Project
|
/// @param projectId The Admin id number used to specify the Project
|
||||||
/// @return True if the Project has been canceled
|
/// @return True if the Project has been canceled
|
||||||
function _isProjectCanceled(uint64 projectId)
|
function isProjectCanceled(uint64 projectId)
|
||||||
internal constant returns (bool)
|
public constant returns (bool)
|
||||||
{
|
{
|
||||||
PledgeAdmin storage a = _findAdmin(projectId);
|
PledgeAdmin storage a = _findAdmin(projectId);
|
||||||
|
|
||||||
|
@ -341,7 +328,19 @@ contract PledgeAdmins is AragonApp, LiquidPledgingPlugins {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return _isProjectCanceled(a.parentProject);
|
return isProjectCanceled(a.parentProject);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////
|
||||||
|
// Internal methods
|
||||||
|
///////////////////
|
||||||
|
|
||||||
|
/// @notice A getter to look up a Admin's details
|
||||||
|
/// @param idAdmin The id for the Admin to lookup
|
||||||
|
/// @return The PledgeAdmin struct for the specified Admin
|
||||||
|
function _findAdmin(uint64 idAdmin) internal view returns (PledgeAdmin storage) {
|
||||||
|
require(idAdmin < admins.length);
|
||||||
|
return admins[idAdmin];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @notice Find the level of authority a specific Project has
|
/// @notice Find the level of authority a specific Project has
|
||||||
|
|
|
@ -99,7 +99,7 @@ describe('LiquidPledging plugins test', function () {
|
||||||
it('Should deploy TestSimpleProjectPlugin and add project', async function () {
|
it('Should deploy TestSimpleProjectPlugin and add project', async function () {
|
||||||
// add plugin as valid plugin
|
// add plugin as valid plugin
|
||||||
const codeHash = web3.utils.soliditySha3(simpleProjectPluginRuntimeByteCode);
|
const codeHash = web3.utils.soliditySha3(simpleProjectPluginRuntimeByteCode);
|
||||||
await liquidPledging.addValidPlugin(codeHash, { $extraGas: 200000 });
|
await liquidPledging.addValidPluginContract(codeHash, { $extraGas: 200000 });
|
||||||
|
|
||||||
// deploy new plugin
|
// deploy new plugin
|
||||||
const factoryContract = await new web3.eth.Contract(simpleProjectPluginFactoryAbi)
|
const factoryContract = await new web3.eth.Contract(simpleProjectPluginFactoryAbi)
|
||||||
|
|
Loading…
Reference in New Issue