|
|
|
const { time } = require('@openzeppelin/test-helpers');
|
|
|
|
const { MAX_UINT64 } = require('./constants');
|
|
|
|
const { namespaceSlot } = require('./namespaced-storage');
|
|
|
|
const {
|
|
|
|
time: { setNextBlockTimestamp },
|
|
|
|
} = require('@nomicfoundation/hardhat-network-helpers');
|
|
|
|
|
|
|
|
function buildBaseRoles() {
|
|
|
|
const roles = {
|
|
|
|
ADMIN: {
|
|
|
|
id: web3.utils.toBN(0),
|
|
|
|
},
|
|
|
|
SOME_ADMIN: {
|
|
|
|
id: web3.utils.toBN(17),
|
|
|
|
},
|
|
|
|
SOME_GUARDIAN: {
|
|
|
|
id: web3.utils.toBN(35),
|
|
|
|
},
|
|
|
|
SOME: {
|
|
|
|
id: web3.utils.toBN(42),
|
|
|
|
},
|
|
|
|
PUBLIC: {
|
|
|
|
id: MAX_UINT64,
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
// Names
|
|
|
|
Object.entries(roles).forEach(([name, role]) => (role.name = name));
|
|
|
|
|
|
|
|
// Defaults
|
|
|
|
for (const role of Object.keys(roles)) {
|
|
|
|
roles[role].admin = roles.ADMIN;
|
|
|
|
roles[role].guardian = roles.ADMIN;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Admins
|
|
|
|
roles.SOME.admin = roles.SOME_ADMIN;
|
|
|
|
|
|
|
|
// Guardians
|
|
|
|
roles.SOME.guardian = roles.SOME_GUARDIAN;
|
|
|
|
|
|
|
|
return roles;
|
|
|
|
}
|
|
|
|
|
|
|
|
const formatAccess = access => [access[0], access[1].toString()];
|
|
|
|
|
|
|
|
const MINSETBACK = time.duration.days(5);
|
|
|
|
const EXPIRATION = time.duration.weeks(1);
|
|
|
|
|
|
|
|
const EXECUTION_ID_STORAGE_SLOT = namespaceSlot('AccessManager', 3n);
|
|
|
|
const CONSUMING_SCHEDULE_STORAGE_SLOT = namespaceSlot('AccessManaged', 0n);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @requires this.{manager, caller, target, calldata}
|
|
|
|
*/
|
|
|
|
async function scheduleOperation(manager, { caller, target, calldata, delay }) {
|
|
|
|
const timestamp = await time.latest();
|
|
|
|
const scheduledAt = timestamp.addn(1);
|
|
|
|
await setNextBlockTimestamp(scheduledAt); // Fix next block timestamp for predictability
|
|
|
|
const { receipt } = await manager.schedule(target, calldata, scheduledAt.add(delay), {
|
|
|
|
from: caller,
|
|
|
|
});
|
|
|
|
|
|
|
|
return {
|
|
|
|
receipt,
|
|
|
|
scheduledAt,
|
|
|
|
operationId: hashOperation(caller, target, calldata),
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
const hashOperation = (caller, target, data) =>
|
|
|
|
web3.utils.keccak256(web3.eth.abi.encodeParameters(['address', 'address', 'bytes'], [caller, target, data]));
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
buildBaseRoles,
|
|
|
|
formatAccess,
|
|
|
|
MINSETBACK,
|
|
|
|
EXPIRATION,
|
|
|
|
EXECUTION_ID_STORAGE_SLOT,
|
|
|
|
CONSUMING_SCHEDULE_STORAGE_SLOT,
|
|
|
|
scheduleOperation,
|
|
|
|
hashOperation,
|
|
|
|
};
|