@@ -7,8 +7,10 @@ import {Role} from "../../../Role.sol";
77
88import {IERC20 } from "../../../interface/IERC20.sol " ;
99import {IInstallationCallback} from "../../../interface/IInstallationCallback.sol " ;
10+ import {CrossChain} from "./CrossChain.sol " ;
1011import {OwnableRoles} from "@solady/auth/OwnableRoles.sol " ;
1112
13+ import {CCIPReceiver} from "@chainlink/ccip/applications/CCIPReceiver.sol " ;
1214import {IRouterClient} from "@chainlink/ccip/interfaces/IRouterClient.sol " ;
1315import {Client} from "@chainlink/ccip/libraries/Client.sol " ;
1416
@@ -33,10 +35,12 @@ library ChainlinkCrossChainStorage {
3335
3436}
3537
36- contract ChainlinkCrossChain is Module {
38+ contract ChainlinkCrossChain is Module , CrossChain , CCIPReceiver {
3739
3840 error NotEnoughBalance (uint256 currentBalance , uint256 calculatedFees );
3941
42+ constructor (address _router , address _link ) CCIPReceiver (_router) {}
43+
4044 /*//////////////////////////////////////////////////////////////
4145 MODULE CONFIG
4246 //////////////////////////////////////////////////////////////*/
@@ -85,15 +89,15 @@ contract ChainlinkCrossChain is Module {
8589 FALLBACK FUNCTIONS
8690 //////////////////////////////////////////////////////////////*/
8791
88- function getRouter () external view returns (address ) {
92+ function getRouter () public view override (CrossChain, CCIPReceiver) returns (address ) {
8993 return _chainlinkCrossChainStorage ().router;
9094 }
9195
9296 function getLinkToken () external view returns (address ) {
9397 return _chainlinkCrossChainStorage ().linkToken;
9498 }
9599
96- function setRouter (address router ) external {
100+ function setRouter (address router ) external override {
97101 _chainlinkCrossChainStorage ().router = router;
98102 }
99103
@@ -104,13 +108,16 @@ contract ChainlinkCrossChain is Module {
104108 function sendCrossChainTransaction (
105109 uint64 _destinationChain ,
106110 address _callAddress ,
107- address _recipient ,
108- address _token ,
109- uint256 _amount ,
110111 bytes calldata _data ,
111112 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 ));
114121
115122 if (_feeTokenAddress == address (0 )) {
116123 _sendMessagePayNative (_destinationChain, _recipient, _data, _token, _amount, ccipMessageExtraArgs);
@@ -119,12 +126,32 @@ contract ChainlinkCrossChain is Module {
119126 _destinationChain, _recipient, _data, _token, _amount, _feeTokenAddress, ccipMessageExtraArgs
120127 );
121128 }
129+
130+ onCrossChainTransactionSent (_destinationChain, _callAddress, _data, _extraArgs);
122131 }
123132
124133 /*//////////////////////////////////////////////////////////////
125134 INTERNAL FUNCTIONS
126135 //////////////////////////////////////////////////////////////*/
127136
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+
128155 function _sendMessagePayToken (
129156 uint64 _destinationChain ,
130157 address _recipient ,
@@ -190,6 +217,12 @@ contract ChainlinkCrossChain is Module {
190217 });
191218 }
192219
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+
193226 function _chainlinkCrossChainStorage () internal pure returns (ChainlinkCrossChainStorage.Data storage ) {
194227 return ChainlinkCrossChainStorage.data ();
195228 }
0 commit comments