Skip to content

Commit 49d88ae

Browse files
authored
Merge pull request #284 from hyperledger-labs/module-erc165
Add ERC-165 to IIBCModule Signed-off-by: Jun Kimura <jun.kimura@datachain.jp>
2 parents da692ad + 8d854ba commit 49d88ae

File tree

15 files changed

+390
-121
lines changed

15 files changed

+390
-121
lines changed

.gas-snapshot

Lines changed: 47 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
1-
IBCMockAppTest:testHandshake() (gas: 4420488)
2-
IBCMockAppTest:testHandshakeBetweenDifferentPorts() (gas: 3334373)
3-
IBCMockAppTest:testPacketRelay() (gas: 13935239)
4-
IBCMockAppTest:testPacketTimeout() (gas: 4284263)
1+
IBCMockAppTest:testHandshake() (gas: 4420576)
2+
IBCMockAppTest:testHandshakeBetweenDifferentPorts() (gas: 3339589)
3+
IBCMockAppTest:testPacketRelay() (gas: 13935831)
4+
IBCMockAppTest:testPacketTimeout() (gas: 4284259)
55
IBCTest:testBenchmarkCreateMockClient() (gas: 233366)
66
IBCTest:testBenchmarkLCUpdateMockClient() (gas: 62005)
7-
IBCTest:testBenchmarkRecvPacket() (gas: 158870)
7+
IBCTest:testBenchmarkRecvPacket() (gas: 158888)
88
IBCTest:testBenchmarkSendPacket() (gas: 128432)
99
IBCTest:testBenchmarkUpdateMockClient() (gas: 160229)
1010
IBCTest:testToUint128((uint64,uint64)) (runs: 256, μ: 947, ~: 947)
11-
TestICS02:testCreateClient() (gas: 36576736)
12-
TestICS02:testInvalidCreateClient() (gas: 36473955)
13-
TestICS02:testInvalidUpdateClient() (gas: 36472863)
14-
TestICS02:testRegisterClient() (gas: 36128529)
15-
TestICS02:testRegisterClientDuplicatedClientType() (gas: 36113838)
16-
TestICS02:testRegisterClientInvalidClientType() (gas: 36143299)
17-
TestICS02:testUpdateClient() (gas: 36641063)
11+
TestICS02:testCreateClient() (gas: 36633805)
12+
TestICS02:testInvalidCreateClient() (gas: 36530922)
13+
TestICS02:testInvalidUpdateClient() (gas: 36529932)
14+
TestICS02:testRegisterClient() (gas: 36185598)
15+
TestICS02:testRegisterClientDuplicatedClientType() (gas: 36170907)
16+
TestICS02:testRegisterClientInvalidClientType() (gas: 36200368)
17+
TestICS02:testUpdateClient() (gas: 36698132)
1818
TestICS03Handshake:testConnOpenAck() (gas: 1858230)
1919
TestICS03Handshake:testConnOpenConfirm() (gas: 2054143)
2020
TestICS03Handshake:testConnOpenInit() (gas: 1429838)
@@ -29,43 +29,44 @@ TestICS03Version:testIsSupportedVersion() (gas: 7864)
2929
TestICS03Version:testPickVersion() (gas: 25327)
3030
TestICS03Version:testVerifyProposedVersion() (gas: 11777)
3131
TestICS03Version:testVerifySupportedFeature() (gas: 4153)
32-
TestICS04Handshake:testBindPort() (gas: 124350)
33-
TestICS04Handshake:testChanClose() (gas: 12973854)
34-
TestICS04Handshake:testChanOpenAck() (gas: 3459404)
35-
TestICS04Handshake:testChanOpenConfirm() (gas: 3770673)
36-
TestICS04Handshake:testChanOpenInit() (gas: 2543524)
37-
TestICS04Handshake:testChanOpenTry() (gas: 3099898)
38-
TestICS04Handshake:testInvalidChanOpenAck() (gas: 2439749)
39-
TestICS04Handshake:testInvalidChanOpenConfirm() (gas: 2517338)
32+
TestICS04Handshake:testBindPort() (gas: 458549)
33+
TestICS04Handshake:testChanClose() (gas: 12973942)
34+
TestICS04Handshake:testChanOpenAck() (gas: 3459492)
35+
TestICS04Handshake:testChanOpenConfirm() (gas: 3770761)
36+
TestICS04Handshake:testChanOpenInit() (gas: 2543590)
37+
TestICS04Handshake:testChanOpenTry() (gas: 3099942)
38+
TestICS04Handshake:testInvalidChanOpenAck() (gas: 2439771)
39+
TestICS04Handshake:testInvalidChanOpenConfirm() (gas: 2517382)
4040
TestICS04Handshake:testInvalidChanOpenInit() (gas: 1760558)
4141
TestICS04Handshake:testInvalidChanOpenTry() (gas: 1775528)
42-
TestICS04Packet:testAcknowledgementPacket() (gas: 3351116)
43-
TestICS04Packet:testInvalidSendPacket() (gas: 3579083)
44-
TestICS04Packet:testRecvPacket() (gas: 11006942)
45-
TestICS04Packet:testRecvPacketTimeoutHeight() (gas: 3259727)
46-
TestICS04Packet:testRecvPacketTimeoutTimestamp() (gas: 3284103)
47-
TestICS04Packet:testSendPacket() (gas: 6412442)
48-
TestICS04Packet:testTimeoutOnClose() (gas: 3553289)
49-
TestICS04Upgrade:testUpgradeAuthorityCancel() (gas: 46744545)
50-
TestICS04Upgrade:testUpgradeCannotCancelWithOldErrorReceipt() (gas: 3456630)
51-
TestICS04Upgrade:testUpgradeCannotRecvNextUpgradePacket() (gas: 5265976)
52-
TestICS04Upgrade:testUpgradeCounterpartyAdvanceNextSequenceBeforeOpen() (gas: 5236229)
53-
TestICS04Upgrade:testUpgradeCrossingHelloIncompatibleProposals() (gas: 4996384)
54-
TestICS04Upgrade:testUpgradeFull() (gas: 56608897)
55-
TestICS04Upgrade:testUpgradeInit() (gas: 3071908)
56-
TestICS04Upgrade:testUpgradeNoChanges() (gas: 2471936)
57-
TestICS04Upgrade:testUpgradeOutOfSync() (gas: 3904992)
58-
TestICS04Upgrade:testUpgradeRelaySuccessAtCounterpartyFlushComplete() (gas: 5237741)
59-
TestICS04Upgrade:testUpgradeRelaySuccessAtFlushing() (gas: 5610928)
60-
TestICS04Upgrade:testUpgradeSendPacketFailAtFlushingOrFlushComplete() (gas: 4070996)
61-
TestICS04Upgrade:testUpgradeTimeoutAbortAck() (gas: 17693913)
62-
TestICS04Upgrade:testUpgradeTimeoutAbortConfirm() (gas: 21333170)
63-
TestICS04Upgrade:testUpgradeTimeoutUpgrade() (gas: 71048576)
64-
TestICS04Upgrade:testUpgradeToOrdered() (gas: 56509239)
65-
TestICS04Upgrade:testUpgradeToUnordered() (gas: 45113597)
42+
TestICS04Packet:testAcknowledgementPacket() (gas: 3351204)
43+
TestICS04Packet:testInvalidSendPacket() (gas: 3579171)
44+
TestICS04Packet:testRecvPacket() (gas: 11007558)
45+
TestICS04Packet:testRecvPacketTimeoutHeight() (gas: 3259769)
46+
TestICS04Packet:testRecvPacketTimeoutTimestamp() (gas: 3284145)
47+
TestICS04Packet:testSendPacket() (gas: 6411842)
48+
TestICS04Packet:testTimeoutOnClose() (gas: 3553375)
49+
TestICS04Upgrade:testUpgradeAuthorityCancel() (gas: 46723464)
50+
TestICS04Upgrade:testUpgradeCannotCancelWithOldErrorReceipt() (gas: 3458838)
51+
TestICS04Upgrade:testUpgradeCannotRecvNextUpgradePacket() (gas: 5259191)
52+
TestICS04Upgrade:testUpgradeCounterpartyAdvanceNextSequenceBeforeOpen() (gas: 5230069)
53+
TestICS04Upgrade:testUpgradeCrossingHelloIncompatibleProposals() (gas: 5068281)
54+
TestICS04Upgrade:testUpgradeFull() (gas: 56559261)
55+
TestICS04Upgrade:testUpgradeInit() (gas: 3074224)
56+
TestICS04Upgrade:testUpgradeNoChanges() (gas: 2473090)
57+
TestICS04Upgrade:testUpgradeNotUpgradableModule() (gas: 3648610)
58+
TestICS04Upgrade:testUpgradeOutOfSync() (gas: 3905908)
59+
TestICS04Upgrade:testUpgradeRelaySuccessAtCounterpartyFlushComplete() (gas: 5230956)
60+
TestICS04Upgrade:testUpgradeRelaySuccessAtFlushing() (gas: 5604165)
61+
TestICS04Upgrade:testUpgradeSendPacketFailAtFlushingOrFlushComplete() (gas: 4069212)
62+
TestICS04Upgrade:testUpgradeTimeoutAbortAck() (gas: 17708385)
63+
TestICS04Upgrade:testUpgradeTimeoutAbortConfirm() (gas: 21315818)
64+
TestICS04Upgrade:testUpgradeTimeoutUpgrade() (gas: 70973805)
65+
TestICS04Upgrade:testUpgradeToOrdered() (gas: 56461648)
66+
TestICS04Upgrade:testUpgradeToUnordered() (gas: 45074517)
6667
TestICS04UpgradeApp:testUpgradeAuthorizationChanneNotFound() (gas: 61690)
67-
TestICS04UpgradeApp:testUpgradeAuthorizationRePropose() (gas: 2565532)
68-
TestICS04UpgradeApp:testUpgradeAuthorizationRemove() (gas: 2475992)
68+
TestICS04UpgradeApp:testUpgradeAuthorizationRePropose() (gas: 2565379)
69+
TestICS04UpgradeApp:testUpgradeAuthorizationRemove() (gas: 2475938)
6970
TestICS20:testAddressToHex(address) (runs: 256, μ: 22668, ~: 22804)
7071
TestICS20:testHexToAddress(string) (runs: 256, μ: 4776, ~: 4734)
7172
TestICS20:testIsEscapedString() (gas: 48979)

contracts/apps/commons/IBCAppBase.sol

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
// SPDX-License-Identifier: Apache-2.0
22
pragma solidity ^0.8.20;
33

4+
import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
45
import {Context} from "@openzeppelin/contracts/utils/Context.sol";
56
import {Packet} from "../../core/04-channel/IIBCChannel.sol";
67
import {IIBCModule} from "../../core/26-router/IIBCModule.sol";
78
import {IIBCModuleErrors} from "../../core/26-router/IIBCModuleErrors.sol";
89

9-
abstract contract AppBase is Context, IIBCModuleErrors {
10+
abstract contract AppBase is IERC165, Context, IIBCModuleErrors {
1011
/**
1112
* @dev Throws if called by any account other than the IBC contract.
1213
*/
@@ -28,14 +29,24 @@ abstract contract AppBase is Context, IIBCModuleErrors {
2829
revert IBCModuleInvalidSender(_msgSender());
2930
}
3031
}
32+
33+
/**
34+
* @dev Returns true if this contract implements the interface defined by
35+
* `interfaceId`. See the corresponding
36+
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]
37+
* to learn more about how these ids are created.
38+
*/
39+
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
40+
return interfaceId == type(IERC165).interfaceId || interfaceId == this.ibcAddress.selector;
41+
}
3142
}
3243

3344
/**
3445
* @dev Base contract of the IBC App protocol
3546
*/
3647
abstract contract IBCAppBase is AppBase, IIBCModule {
3748
/**
38-
* @dev See IIBCModule-onChanOpenInit
49+
* @dev See {IIBCModule-onChanOpenInit}
3950
*
4051
* NOTE: You should apply an `onlyIBC` modifier to the function if a derived contract overrides it.
4152
*/
@@ -48,7 +59,7 @@ abstract contract IBCAppBase is AppBase, IIBCModule {
4859
{}
4960

5061
/**
51-
* @dev See IIBCModule-onChanOpenTry
62+
* @dev See {IIBCModule-onChanOpenTry}
5263
*
5364
* NOTE: You should apply an `onlyIBC` modifier to the function if a derived contract overrides it.
5465
*/
@@ -61,35 +72,35 @@ abstract contract IBCAppBase is AppBase, IIBCModule {
6172
{}
6273

6374
/**
64-
* @dev See IIBCModule-onChanOpenAck
75+
* @dev See {IIBCModule-onChanOpenAck}
6576
*
6677
* NOTE: You should apply an `onlyIBC` modifier to the function if a derived contract overrides it.
6778
*/
6879
function onChanOpenAck(IIBCModule.MsgOnChanOpenAck calldata) external virtual override onlyIBC {}
6980

7081
/**
71-
* @dev See IIBCModule-onChanOpenConfirm
82+
* @dev See {IIBCModule-onChanOpenConfirm}
7283
*
7384
* NOTE: You should apply an `onlyIBC` modifier to the function if a derived contract overrides it.
7485
*/
7586
function onChanOpenConfirm(IIBCModule.MsgOnChanOpenConfirm calldata) external virtual override onlyIBC {}
7687

7788
/**
78-
* @dev See IIBCModule-onChanCloseInit
89+
* @dev See {IIBCModule-onChanCloseInit}
7990
*
8091
* NOTE: You should apply an `onlyIBC` modifier to the function if a derived contract overrides it.
8192
*/
8293
function onChanCloseInit(IIBCModule.MsgOnChanCloseInit calldata) external virtual override onlyIBC {}
8394

8495
/**
85-
* @dev See IIBCModule-onChanCloseConfirm
96+
* @dev See {IIBCModule-onChanCloseConfirm}
8697
*
8798
* NOTE: You should apply an `onlyIBC` modifier to the function if a derived contract overrides it.
8899
*/
89100
function onChanCloseConfirm(IIBCModule.MsgOnChanCloseConfirm calldata) external virtual override onlyIBC {}
90101

91102
/**
92-
* @dev See IIBCModule-onRecvPacket
103+
* @dev See {IIBCModule-onRecvPacket}
93104
*
94105
* NOTE: You should apply an `onlyIBC` modifier to the function if a derived contract overrides it.
95106
*/
@@ -102,16 +113,25 @@ abstract contract IBCAppBase is AppBase, IIBCModule {
102113
{}
103114

104115
/**
105-
* @dev See IIBCModule-onAcknowledgementPacket
116+
* @dev See {IIBCModule-onAcknowledgementPacket}
106117
*
107118
* NOTE: You should apply an `onlyIBC` modifier to the function if a derived contract overrides it.
108119
*/
109120
function onAcknowledgementPacket(Packet calldata, bytes calldata, address) external virtual override onlyIBC {}
110121

111122
/**
112-
* @dev See IIBCModule-onTimeoutPacket
123+
* @dev See {IIBCModule-onTimeoutPacket}
113124
*
114125
* NOTE: You should apply an `onlyIBC` modifier to the function if a derived contract overrides it.
115126
*/
116-
function onTimeoutPacket(Packet calldata, address relayer) external virtual onlyIBC {}
127+
function onTimeoutPacket(Packet calldata, address relayer) external virtual override onlyIBC {}
128+
129+
/**
130+
* @dev See {IERC165-supportsInterface}
131+
*
132+
* NOTE: This must return true if the `interfaceId` is equal to the `IIBCModule` interface.
133+
*/
134+
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AppBase) returns (bool) {
135+
return interfaceId == type(IIBCModule).interfaceId || super.supportsInterface(interfaceId);
136+
}
117137
}

0 commit comments

Comments
 (0)