|
@@ -143,6 +143,7 @@ describe('Address', function () {
|
|
|
// which cause a mockFunctionOutOfGas function to crash Ganache and the
|
|
|
// subsequent tests before running out of gas.
|
|
|
it('reverts when the called function runs out of gas', async function () {
|
|
|
+ this.timeout(10000);
|
|
|
if (coverage) { return this.skip(); }
|
|
|
const abiEncodedCall = web3.eth.abi.encodeFunctionCall({
|
|
|
name: 'mockFunctionOutOfGas',
|
|
@@ -154,7 +155,7 @@ describe('Address', function () {
|
|
|
this.mock.functionCall(this.contractRecipient.address, abiEncodedCall),
|
|
|
'Address: low-level call failed',
|
|
|
);
|
|
|
- }).timeout(5000);
|
|
|
+ });
|
|
|
|
|
|
it('reverts when the called function throws', async function () {
|
|
|
const abiEncodedCall = web3.eth.abi.encodeFunctionCall({
|
|
@@ -285,4 +286,107 @@ describe('Address', function () {
|
|
|
});
|
|
|
});
|
|
|
});
|
|
|
+
|
|
|
+ describe('functionStaticCall', function () {
|
|
|
+ beforeEach(async function () {
|
|
|
+ this.contractRecipient = await CallReceiverMock.new();
|
|
|
+ });
|
|
|
+
|
|
|
+ it('calls the requested function', async function () {
|
|
|
+ const abiEncodedCall = web3.eth.abi.encodeFunctionCall({
|
|
|
+ name: 'mockStaticFunction',
|
|
|
+ type: 'function',
|
|
|
+ inputs: [],
|
|
|
+ }, []);
|
|
|
+
|
|
|
+ const receipt = await this.mock.functionStaticCall(this.contractRecipient.address, abiEncodedCall);
|
|
|
+
|
|
|
+ expectEvent(receipt, 'CallReturnValue', { data: '0x1234' });
|
|
|
+ });
|
|
|
+
|
|
|
+ it('reverts on a non-static function', async function () {
|
|
|
+ const abiEncodedCall = web3.eth.abi.encodeFunctionCall({
|
|
|
+ name: 'mockFunction',
|
|
|
+ type: 'function',
|
|
|
+ inputs: [],
|
|
|
+ }, []);
|
|
|
+
|
|
|
+ await expectRevert(
|
|
|
+ this.mock.functionStaticCall(this.contractRecipient.address, abiEncodedCall),
|
|
|
+ 'Address: low-level static call failed',
|
|
|
+ );
|
|
|
+ });
|
|
|
+
|
|
|
+ it('bubbles up revert reason', async function () {
|
|
|
+ const abiEncodedCall = web3.eth.abi.encodeFunctionCall({
|
|
|
+ name: 'mockFunctionRevertsReason',
|
|
|
+ type: 'function',
|
|
|
+ inputs: [],
|
|
|
+ }, []);
|
|
|
+
|
|
|
+ await expectRevert(
|
|
|
+ this.mock.functionStaticCall(this.contractRecipient.address, abiEncodedCall),
|
|
|
+ 'CallReceiverMock: reverting',
|
|
|
+ );
|
|
|
+ });
|
|
|
+
|
|
|
+ it('reverts when address is not a contract', async function () {
|
|
|
+ const [ recipient ] = accounts;
|
|
|
+ const abiEncodedCall = web3.eth.abi.encodeFunctionCall({
|
|
|
+ name: 'mockFunction',
|
|
|
+ type: 'function',
|
|
|
+ inputs: [],
|
|
|
+ }, []);
|
|
|
+ await expectRevert(
|
|
|
+ this.mock.functionStaticCall(recipient, abiEncodedCall),
|
|
|
+ 'Address: static call to non-contract',
|
|
|
+ );
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ describe('functionDelegateCall', function () {
|
|
|
+ beforeEach(async function () {
|
|
|
+ this.contractRecipient = await CallReceiverMock.new();
|
|
|
+ });
|
|
|
+
|
|
|
+ it('delegate calls the requested function', async function () {
|
|
|
+ const abiEncodedCall = web3.eth.abi.encodeFunctionCall({
|
|
|
+ name: 'mockFunctionWritesStorage',
|
|
|
+ type: 'function',
|
|
|
+ inputs: [],
|
|
|
+ }, []);
|
|
|
+
|
|
|
+ const receipt = await this.mock.functionDelegateCall(this.contractRecipient.address, abiEncodedCall);
|
|
|
+
|
|
|
+ expectEvent(receipt, 'CallReturnValue', { data: '0x1234' });
|
|
|
+
|
|
|
+ expect(await this.mock.sharedAnswer()).to.equal('42');
|
|
|
+ });
|
|
|
+
|
|
|
+ it('bubbles up revert reason', async function () {
|
|
|
+ const abiEncodedCall = web3.eth.abi.encodeFunctionCall({
|
|
|
+ name: 'mockFunctionRevertsReason',
|
|
|
+ type: 'function',
|
|
|
+ inputs: [],
|
|
|
+ }, []);
|
|
|
+
|
|
|
+ await expectRevert(
|
|
|
+ this.mock.functionDelegateCall(this.contractRecipient.address, abiEncodedCall),
|
|
|
+ 'CallReceiverMock: reverting',
|
|
|
+ );
|
|
|
+ });
|
|
|
+
|
|
|
+ it('reverts when address is not a contract', async function () {
|
|
|
+ const [ recipient ] = accounts;
|
|
|
+ const abiEncodedCall = web3.eth.abi.encodeFunctionCall({
|
|
|
+ name: 'mockFunction',
|
|
|
+ type: 'function',
|
|
|
+ inputs: [],
|
|
|
+ }, []);
|
|
|
+ await expectRevert(
|
|
|
+ this.mock.functionDelegateCall(recipient, abiEncodedCall),
|
|
|
+ 'Address: delegate call to non-contract',
|
|
|
+ );
|
|
|
+ });
|
|
|
+ });
|
|
|
});
|