@@ -7,8 +7,10 @@ import {Role} from "../../../Role.sol";
7
7
8
8
import {IERC20 } from "../../../interface/IERC20.sol " ;
9
9
import {IInstallationCallback} from "../../../interface/IInstallationCallback.sol " ;
10
+ import {CrossChain} from "./CrossChain.sol " ;
10
11
import {OwnableRoles} from "@solady/auth/OwnableRoles.sol " ;
11
12
13
+ import {CCIPReceiver} from "@chainlink/ccip/applications/CCIPReceiver.sol " ;
12
14
import {IRouterClient} from "@chainlink/ccip/interfaces/IRouterClient.sol " ;
13
15
import {Client} from "@chainlink/ccip/libraries/Client.sol " ;
14
16
@@ -33,10 +35,12 @@ library ChainlinkCrossChainStorage {
33
35
34
36
}
35
37
36
- contract ChainlinkCrossChain is Module {
38
+ contract ChainlinkCrossChain is Module , CrossChain , CCIPReceiver {
37
39
38
40
error NotEnoughBalance (uint256 currentBalance , uint256 calculatedFees );
39
41
42
+ constructor (address _router , address _link ) CCIPReceiver (_router) {}
43
+
40
44
/*//////////////////////////////////////////////////////////////
41
45
MODULE CONFIG
42
46
//////////////////////////////////////////////////////////////*/
@@ -85,15 +89,15 @@ contract ChainlinkCrossChain is Module {
85
89
FALLBACK FUNCTIONS
86
90
//////////////////////////////////////////////////////////////*/
87
91
88
- function getRouter () external view returns (address ) {
92
+ function getRouter () public view override (CrossChain, CCIPReceiver) returns (address ) {
89
93
return _chainlinkCrossChainStorage ().router;
90
94
}
91
95
92
96
function getLinkToken () external view returns (address ) {
93
97
return _chainlinkCrossChainStorage ().linkToken;
94
98
}
95
99
96
- function setRouter (address router ) external {
100
+ function setRouter (address router ) external override {
97
101
_chainlinkCrossChainStorage ().router = router;
98
102
}
99
103
@@ -104,13 +108,16 @@ contract ChainlinkCrossChain is Module {
104
108
function sendCrossChainTransaction (
105
109
uint64 _destinationChain ,
106
110
address _callAddress ,
107
- address _recipient ,
108
- address _token ,
109
- uint256 _amount ,
110
111
bytes calldata _data ,
111
112
bytes calldata _extraArgs
112
- ) external {
113
- (address _feeTokenAddress , bytes memory ccipMessageExtraArgs ) = abi.decode (_extraArgs, (address , bytes ));
113
+ ) external payable override {
114
+ (
115
+ address _recipient ,
116
+ address _token ,
117
+ uint256 _amount ,
118
+ address _feeTokenAddress ,
119
+ bytes memory ccipMessageExtraArgs
120
+ ) = abi.decode (_extraArgs, (address , address , uint256 , address , bytes ));
114
121
115
122
if (_feeTokenAddress == address (0 )) {
116
123
_sendMessagePayNative (_destinationChain, _recipient, _data, _token, _amount, ccipMessageExtraArgs);
@@ -119,12 +126,32 @@ contract ChainlinkCrossChain is Module {
119
126
_destinationChain, _recipient, _data, _token, _amount, _feeTokenAddress, ccipMessageExtraArgs
120
127
);
121
128
}
129
+
130
+ onCrossChainTransactionSent (_destinationChain, _callAddress, _data, _extraArgs);
122
131
}
123
132
124
133
/*//////////////////////////////////////////////////////////////
125
134
INTERNAL FUNCTIONS
126
135
//////////////////////////////////////////////////////////////*/
127
136
137
+ function onCrossChainTransactionSent (
138
+ uint64 _destinationChain ,
139
+ address _callAddress ,
140
+ bytes calldata _payload ,
141
+ bytes calldata _extraArgs
142
+ ) internal override {
143
+ /// post cross chain transaction sent logic goes here
144
+ }
145
+
146
+ function onCrossChainTransactionReceived (
147
+ uint64 _sourceChain ,
148
+ address _sourceAddress ,
149
+ bytes memory _payload ,
150
+ bytes memory _extraArgs
151
+ ) internal override {
152
+ /// post cross chain transaction received logic goes here
153
+ }
154
+
128
155
function _sendMessagePayToken (
129
156
uint64 _destinationChain ,
130
157
address _recipient ,
@@ -190,6 +217,12 @@ contract ChainlinkCrossChain is Module {
190
217
});
191
218
}
192
219
220
+ function _ccipReceive (Client.Any2EVMMessage memory message ) internal override {
221
+ address sender = abi.decode (message.sender, (address ));
222
+ bytes memory payload = "" ;
223
+ onCrossChainTransactionReceived (message.sourceChainSelector, sender, message.data, payload);
224
+ }
225
+
193
226
function _chainlinkCrossChainStorage () internal pure returns (ChainlinkCrossChainStorage.Data storage ) {
194
227
return ChainlinkCrossChainStorage.data ();
195
228
}
0 commit comments