123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- const { constants, time } = require('@openzeppelin/test-helpers');
- const { expectRevertCustomError } = require('../../../helpers/customError');
- const { AccessMode } = require('../../../helpers/enums');
- const { selector } = require('../../../helpers/methods');
- const AccessManager = artifacts.require('$AccessManager');
- const AccessManagedAdapter = artifacts.require('AccessManagedAdapter');
- const Ownable = artifacts.require('$Ownable');
- const groupId = web3.utils.toBN(1);
- contract('AccessManagedAdapter', function (accounts) {
- const [admin, user, other] = accounts;
- beforeEach(async function () {
- this.manager = await AccessManager.new(admin);
- this.adapter = await AccessManagedAdapter.new(this.manager.address);
- this.ownable = await Ownable.new(this.adapter.address);
- // add user to group
- await this.manager.$_grantGroup(groupId, user, 0, 0);
- });
- it('initial state', async function () {
- expect(await this.adapter.authority()).to.be.equal(this.manager.address);
- expect(await this.ownable.owner()).to.be.equal(this.adapter.address);
- });
- describe('Contract is Closed', function () {
- beforeEach(async function () {
- await this.manager.$_setContractMode(this.ownable.address, AccessMode.Closed);
- });
- it('directly call: reverts', async function () {
- await expectRevertCustomError(this.ownable.$_checkOwner({ from: user }), 'OwnableUnauthorizedAccount', [user]);
- });
- it('relayed call (with group): reverts', async function () {
- await expectRevertCustomError(
- this.adapter.relay(this.ownable.address, selector('$_checkOwner()'), { from: user }),
- 'AccessManagedUnauthorized',
- [user],
- );
- });
- it('relayed call (without group): reverts', async function () {
- await expectRevertCustomError(
- this.adapter.relay(this.ownable.address, selector('$_checkOwner()'), { from: other }),
- 'AccessManagedUnauthorized',
- [other],
- );
- });
- });
- describe('Contract is Open', function () {
- beforeEach(async function () {
- await this.manager.$_setContractMode(this.ownable.address, AccessMode.Open);
- });
- it('directly call: reverts', async function () {
- await expectRevertCustomError(this.ownable.$_checkOwner({ from: user }), 'OwnableUnauthorizedAccount', [user]);
- });
- it('relayed call (with group): success', async function () {
- await this.adapter.relay(this.ownable.address, selector('$_checkOwner()'), { from: user });
- });
- it('relayed call (without group): success', async function () {
- await this.adapter.relay(this.ownable.address, selector('$_checkOwner()'), { from: other });
- });
- });
- describe('Contract is in Custom mode', function () {
- beforeEach(async function () {
- await this.manager.$_setContractMode(this.ownable.address, AccessMode.Custom);
- });
- describe('function is open to specific group', function () {
- beforeEach(async function () {
- await this.manager.$_setFunctionAllowedGroup(this.ownable.address, selector('$_checkOwner()'), groupId);
- });
- it('directly call: reverts', async function () {
- await expectRevertCustomError(this.ownable.$_checkOwner({ from: user }), 'OwnableUnauthorizedAccount', [user]);
- });
- it('relayed call (with group): success', async function () {
- await this.adapter.relay(this.ownable.address, selector('$_checkOwner()'), { from: user });
- });
- it('relayed call (without group): reverts', async function () {
- await expectRevertCustomError(
- this.adapter.relay(this.ownable.address, selector('$_checkOwner()'), { from: other }),
- 'AccessManagedUnauthorized',
- [other],
- );
- });
- });
- describe('function is open to public group', function () {
- beforeEach(async function () {
- await this.manager.$_setFunctionAllowedGroup(
- this.ownable.address,
- selector('$_checkOwner()'),
- constants.MAX_UINT256,
- );
- });
- it('directly call: reverts', async function () {
- await expectRevertCustomError(this.ownable.$_checkOwner({ from: user }), 'OwnableUnauthorizedAccount', [user]);
- });
- it('relayed call (with group): success', async function () {
- await this.adapter.relay(this.ownable.address, selector('$_checkOwner()'), { from: user });
- });
- it('relayed call (without group): success', async function () {
- await this.adapter.relay(this.ownable.address, selector('$_checkOwner()'), { from: other });
- });
- });
- describe('function is available with execution delay', function () {
- const delay = 10;
- beforeEach(async function () {
- await this.manager.$_setExecuteDelay(groupId, user, delay);
- await this.manager.$_setFunctionAllowedGroup(this.ownable.address, selector('$_checkOwner()'), groupId);
- });
- it('unscheduled call reverts', async function () {
- await expectRevertCustomError(
- this.adapter.relay(this.ownable.address, selector('$_checkOwner()'), { from: user }),
- 'AccessManagedRequiredDelay',
- [user, delay],
- );
- });
- it('scheduled call succeeds', async function () {
- await this.manager.schedule(this.ownable.address, selector('$_checkOwner()'), { from: user });
- await time.increase(delay);
- await this.manager.relayViaAdapter(this.ownable.address, selector('$_checkOwner()'), this.adapter.address, {
- from: user,
- });
- });
- });
- });
- it('bubble revert reasons', async function () {
- const { address } = await Ownable.new(admin);
- await this.manager.$_setContractMode(address, AccessMode.Open);
- await expectRevertCustomError(
- this.adapter.relay(address, selector('$_checkOwner()')),
- 'OwnableUnauthorizedAccount',
- [this.adapter.address],
- );
- });
- });
|