Files
openzeppelin-contracts/test/proxy/Clones.behaviour.js
Renan Souza ae69142379 Migrate proxy folder to ethersjs (#4746)
Co-authored-by: Hadrien Croubois <hadrien.croubois@gmail.com>
Co-authored-by: ernestognw <ernestognw@gmail.com>
2023-11-29 21:51:08 +00:00

142 lines
4.2 KiB
JavaScript

const { ethers } = require('hardhat');
const { expect } = require('chai');
module.exports = function shouldBehaveLikeClone() {
const assertProxyInitialization = function ({ value, balance }) {
it('initializes the proxy', async function () {
const dummy = await ethers.getContractAt('DummyImplementation', this.proxy);
expect(await dummy.value()).to.equal(value);
});
it('has expected balance', async function () {
expect(await ethers.provider.getBalance(this.proxy)).to.equal(balance);
});
};
describe('initialization without parameters', function () {
describe('non payable', function () {
const expectedInitializedValue = 10n;
beforeEach(async function () {
this.initializeData = await this.implementation.interface.encodeFunctionData('initializeNonPayable');
});
describe('when not sending balance', function () {
beforeEach('creating proxy', async function () {
this.proxy = await this.createClone(this.initializeData);
});
assertProxyInitialization({
value: expectedInitializedValue,
balance: 0,
});
});
describe('when sending some balance', function () {
const value = 10n ** 6n;
it('reverts', async function () {
await expect(this.createClone(this.initializeData, { value })).to.be.reverted;
});
});
});
describe('payable', function () {
const expectedInitializedValue = 100n;
beforeEach(async function () {
this.initializeData = await this.implementation.interface.encodeFunctionData('initializePayable');
});
describe('when not sending balance', function () {
beforeEach('creating proxy', async function () {
this.proxy = await this.createClone(this.initializeData);
});
assertProxyInitialization({
value: expectedInitializedValue,
balance: 0,
});
});
describe('when sending some balance', function () {
const value = 10n ** 6n;
beforeEach('creating proxy', async function () {
this.proxy = await this.createClone(this.initializeData, { value });
});
assertProxyInitialization({
value: expectedInitializedValue,
balance: value,
});
});
});
});
describe('initialization with parameters', function () {
describe('non payable', function () {
const expectedInitializedValue = 10n;
beforeEach(async function () {
this.initializeData = await this.implementation.interface.encodeFunctionData('initializeNonPayableWithValue', [
expectedInitializedValue,
]);
});
describe('when not sending balance', function () {
beforeEach('creating proxy', async function () {
this.proxy = await this.createClone(this.initializeData);
});
assertProxyInitialization({
value: expectedInitializedValue,
balance: 0,
});
});
describe('when sending some balance', function () {
const value = 10n ** 6n;
it('reverts', async function () {
await expect(this.createClone(this.initializeData, { value })).to.be.reverted;
});
});
});
describe('payable', function () {
const expectedInitializedValue = 42n;
beforeEach(function () {
this.initializeData = this.implementation.interface.encodeFunctionData('initializePayableWithValue', [
expectedInitializedValue,
]);
});
describe('when not sending balance', function () {
beforeEach('creating proxy', async function () {
this.proxy = await this.createClone(this.initializeData);
});
assertProxyInitialization({
value: expectedInitializedValue,
balance: 0,
});
});
describe('when sending some balance', function () {
const value = 10n ** 6n;
beforeEach('creating proxy', async function () {
this.proxy = await this.createClone(this.initializeData, { value });
});
assertProxyInitialization({
value: expectedInitializedValue,
balance: value,
});
});
});
});
};