Skip to content

Commit 477b621

Browse files
authored
Merge pull request #14274 from ethereum/enable-access-to-foreign-events
2 parents 37506b1 + 5893e09 commit 477b621

File tree

6 files changed

+40
-10
lines changed

6 files changed

+40
-10
lines changed

Changelog.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
### 0.8.21 (unreleased)
22

33
Language Features:
4-
4+
* Allow qualified access to events from other contracts.
55

66
Compiler Features:
77
* Commandline Interface: Add ``--ast-compact-json`` output in assembler mode.

libsolidity/ast/AST.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1261,7 +1261,7 @@ class EventDefinition: public CallableDeclaration, public StructurallyDocumented
12611261
FunctionTypePointer functionType(bool /*_internal*/) const override;
12621262

12631263
bool isVisibleInDerivedContracts() const override { return true; }
1264-
bool isVisibleViaContractTypeAccess() const override { return false; /* TODO */ }
1264+
bool isVisibleViaContractTypeAccess() const override { return true; }
12651265

12661266
EventDefinitionAnnotation& annotation() const override;
12671267

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,49 @@
11
library L {
22
event E();
33
}
4+
45
library S {
56
event E(uint);
67
}
8+
79
library T {
810
event E();
911
}
1012

13+
interface I {
14+
event E();
15+
}
16+
17+
contract B {
18+
event E();
19+
}
20+
1121
contract D {
1222
event F();
1323
}
1424

1525
contract C is D {
16-
function test1() external pure returns (bytes32, bytes32) {
26+
function test1() external pure returns (bytes32, bytes32, bytes32, bytes32) {
1727
assert(L.E.selector == T.E.selector);
28+
assert(I.E.selector == L.E.selector);
29+
assert(T.E.selector == I.E.selector);
30+
assert(B.E.selector == T.E.selector);
1831

1932
assert(L.E.selector != S.E.selector);
2033
assert(T.E.selector != S.E.selector);
34+
assert(I.E.selector != S.E.selector);
35+
assert(B.E.selector != S.E.selector);
2136

22-
return (L.E.selector, S.E.selector);
37+
return (L.E.selector, S.E.selector, I.E.selector, B.E.selector);
2338
}
2439

2540
bytes32 s1 = L.E.selector;
2641
bytes32 s2 = S.E.selector;
2742
bytes32 s3 = T.E.selector;
28-
function test2() external returns (bytes32, bytes32, bytes32) {
29-
return (s1, s2, s3);
43+
bytes32 s4 = I.E.selector;
44+
bytes32 s5 = B.E.selector;
45+
function test2() external returns (bytes32, bytes32, bytes32, bytes32, bytes32) {
46+
return (s1, s2, s3, s4, s5);
3047
}
3148

3249
function test3() external returns (bytes32) {
@@ -36,6 +53,6 @@ contract C is D {
3653
// ====
3754
// compileViaYul: also
3855
// ----
39-
// test1() -> 0x92bbf6e823a631f3c8e09b1c8df90f378fb56f7fbc9701827e1ff8aad7f6a028, 0x2ff0672f372fbe844b353429d4510ea5e43683af134c54f75f789ff57bc0c0
40-
// test2() -> 0x92bbf6e823a631f3c8e09b1c8df90f378fb56f7fbc9701827e1ff8aad7f6a028, 0x2ff0672f372fbe844b353429d4510ea5e43683af134c54f75f789ff57bc0c0, 0x92bbf6e823a631f3c8e09b1c8df90f378fb56f7fbc9701827e1ff8aad7f6a028
56+
// test1() -> 0x92bbf6e823a631f3c8e09b1c8df90f378fb56f7fbc9701827e1ff8aad7f6a028, 0x2ff0672f372fbe844b353429d4510ea5e43683af134c54f75f789ff57bc0c0, 0x92bbf6e823a631f3c8e09b1c8df90f378fb56f7fbc9701827e1ff8aad7f6a028, 0x92bbf6e823a631f3c8e09b1c8df90f378fb56f7fbc9701827e1ff8aad7f6a028
57+
// test2() -> 0x92bbf6e823a631f3c8e09b1c8df90f378fb56f7fbc9701827e1ff8aad7f6a028, 0x2ff0672f372fbe844b353429d4510ea5e43683af134c54f75f789ff57bc0c0, 0x92bbf6e823a631f3c8e09b1c8df90f378fb56f7fbc9701827e1ff8aad7f6a028, 0x92bbf6e823a631f3c8e09b1c8df90f378fb56f7fbc9701827e1ff8aad7f6a028, 0x92bbf6e823a631f3c8e09b1c8df90f378fb56f7fbc9701827e1ff8aad7f6a028
4158
// test3() -> 0x28811f5935c16a099486acb976b3a6b4942950a1425a74e9eb3e9b7f7135e12a

test/libsolidity/syntaxTests/events/event_selector_access_foreign_contract.sol

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,3 @@ contract C {
88
}
99
}
1010
// ----
11-
// TypeError 9582: (110-113): Member "E" not found or not visible after argument-dependent lookup in type(contract D).

test/libsolidity/syntaxTests/events/event_selector_access_interface.sol

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,3 @@ contract C {
88
}
99
}
1010
// ----
11-
// TypeError 9582: (111-114): Member "E" not found or not visible after argument-dependent lookup in type(contract I).

test/libsolidity/syntaxTests/events/event_selector_syntax.sol

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,34 @@ library L {
22
event E(bytes32, bool, bytes indexed);
33
}
44

5+
interface I {
6+
event E(bytes32, bool, bytes indexed);
7+
}
8+
9+
contract A {
10+
event E(bytes32, bool, bytes indexed);
11+
}
12+
513
contract B {
614
event E(bytes32, bool, bytes indexed);
715
}
816

917
contract C is B {
1018
bytes32 public librarySelector = L.E.selector;
19+
bytes32 public interfaceSelector = I.E.selector;
20+
bytes32 public foreignContractSelector = A.E.selector;
1121
bytes32 inheritedSelector = E.selector;
1222

1323
function f() public {
1424
assert(librarySelector == L.E.selector);
25+
assert(interfaceSelector == I.E.selector);
26+
assert(foreignContractSelector == A.E.selector);
1527
assert(E.selector == B.E.selector);
1628

1729
emit E(E.selector, true, "123");
30+
emit I.E((B.E.selector), true, "123");
31+
emit A.E((B.E.selector), true, "123");
1832
emit L.E((B.E.selector), true, "123");
1933
}
2034
}
35+
// ----

0 commit comments

Comments
 (0)