-
Notifications
You must be signed in to change notification settings - Fork 6
/
PassthroughRouter.sol
86 lines (71 loc) · 2.82 KB
/
PassthroughRouter.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.21;
import {Auth} from "./../../src/util/Auth.sol";
interface PrecompileLike {
function execute(
bytes32 commandId,
string calldata sourceChain,
string calldata sourceAddress,
bytes calldata payload
) external;
}
interface GatewayLike {
function handle(bytes memory message) external;
}
/// @title PassthroughRouter
/// @notice Routing contract that accepts any incomming messages and forwards them
/// to the gateway and solely emits an event for outgoing messages.
contract PassthroughRouter is Auth {
address internal constant PRECOMPILE = 0x0000000000000000000000000000000000000800;
bytes32 internal constant FAKE_COMMAND_ID = keccak256("FAKE_COMMAND_ID");
GatewayLike public gateway;
event Route(string destinationChain, string destinationContractAddress, bytes payload);
event ExecuteOnDomain(string sourceChain, string sourceAddress, bytes payload);
event ExecuteOnCentrifuge(string sourceChain, string sourceAddress, bytes payload);
event File(bytes32 indexed what, address addr);
constructor() {
wards[msg.sender] = 1;
emit Rely(msg.sender);
}
function file(bytes32 what, address addr) external {
if (what == "gateway") {
gateway = GatewayLike(addr);
} else {
revert("LocalRouter/file-unrecognized-param");
}
emit File(what, addr);
}
/// @notice From Centrifuge to LP on other domain. Just emits an event.
/// Just used on Centrifuge.
function callContract(
string calldata destinationChain,
string calldata destinationContractAddress,
bytes calldata payload
) public {
emit Route(destinationChain, destinationContractAddress, payload);
}
/// @notice From other domain to Centrifuge. Just emits an event.
/// Just used on EVM domains.
function send(bytes calldata message) public {
emit Route("LP-EVM-Domain", "Passthrough-Contract", message);
}
/// @notice Execute message on centrifuge
function executeOnCentrifuge(string calldata sourceChain, string calldata sourceAddress, bytes calldata payload)
external
{
PrecompileLike precompile = PrecompileLike(PRECOMPILE);
precompile.execute(FAKE_COMMAND_ID, sourceChain, sourceAddress, payload);
emit ExecuteOnCentrifuge(sourceChain, sourceAddress, payload);
}
/// @notice Execute message on other domain
function executeOnDomain(
string calldata sourceChain,
string calldata sourceAddress,
bytes calldata payload
) external {
gateway.handle(payload);
emit ExecuteOnDomain(sourceChain, sourceAddress, payload);
}
// Added to be ignored in coverage report
function test() public {}
}