Merge pull request #10003 from ethereum/more-tests-and-docs-for-mixed-abi-encoder-use-checks

More tests and some minimal docs for mixed ABI encoder use
This commit is contained in:
chriseth 2020-10-12 14:22:44 +02:00 committed by GitHub
commit e7603d7590
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 62 additions and 0 deletions

View File

@ -111,6 +111,14 @@ activate it using ``pragma experimental ABIEncoderV2;`` - we kept
the same pragma, even though it is not considered experimental
anymore.
The set of types supported by the new encoder is a strict superset of
the ones supported by the old one. Contracts that use it can interact with ones
that do not without limitations. The reverse is possible only as long as the
non-``ABIEncoderV2`` contract does not try to make calls that would require
decoding types only supported by the new encoder. The compiler can detect this
and will issue an error. Simply enabling ``ABIEncoderV2`` for your contract is
enough to make the error go away.
.. _smt_checker:
SMTChecker

View File

@ -0,0 +1,15 @@
struct Item {
uint x;
uint y;
}
contract D {
Item[][][] public items;
function test() public view returns (uint) {
// The autogenerated getters to not use ABI encoder.
(uint a, uint b) = this.items(1, 2, 3);
return a + b;
}
}
// ----

View File

@ -0,0 +1,17 @@
struct Item {
uint x;
uint y;
}
contract D {
Item[][][] public items;
function test() public view returns (uint) {
// The autogenerated getters to not use ABI encoder.
Item memory item = this.items(1, 2, 3);
return item.x + item.y;
}
}
// ----
// TypeError 7364: (202-240): Different number of components on the left hand side (1) than on the right hand side (2).
// TypeError 9574: (202-240): Type uint256 is not implicitly convertible to expected type struct Item memory.

View File

@ -0,0 +1,22 @@
==== Source: A ====
pragma experimental ABIEncoderV2;
library L {
struct Item {
uint x;
}
function f(uint) external view returns (Item memory) {}
}
==== Source: B ====
import "A";
contract D {
using L for uint;
function test() public {
uint(1).f();
}
}
// ----
// TypeError 2428: (B:86-97): The type of return parameter 1, struct L.Item, is only supported in ABIEncoderV2. Use "pragma experimental ABIEncoderV2;" to enable the feature.