-
Notifications
You must be signed in to change notification settings - Fork 6
/
Forwarder.sol
75 lines (62 loc) · 2.36 KB
/
Forwarder.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
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.26;
import {Auth} from "src/Auth.sol";
import {AxelarGatewayLike} from "src/gateway/adapters/axelar/Adapter.sol";
interface PrecompileLike {
function execute(
bytes32 commandId,
string calldata sourceChain,
string calldata sourceAddress,
bytes calldata payload
) external;
}
// A contract to be deployed on Centrifuge-EVM in order to forward axelar tx to
// the precompile.
contract AxelarForwarder is Auth {
// Represents the precompile address on Centrifuge. Precompile is located at `address(2048)` which is
// 0x0000000000000000000000000000000000000800 in hex.
address internal constant PRECOMPILE = 0x0000000000000000000000000000000000000800;
AxelarGatewayLike public axelarGateway;
// --- Events ---
event File(bytes32 indexed what, address data);
event Forwarded(bytes32 commandId, string sourceChain, string sourceAddress, bytes payload);
constructor(address axelarGateway_) {
axelarGateway = AxelarGatewayLike(axelarGateway_);
wards[msg.sender] = 1;
emit Rely(msg.sender);
}
// --- Administration ---
function file(bytes32 what, address data) external auth {
if (what == "axelarGateway") {
axelarGateway = AxelarGatewayLike(data);
} else {
revert("AxelarForwarder/file-unrecognized-param");
}
emit File(what, data);
}
// --- Incoming ---
function execute(
bytes32 commandId,
string calldata sourceChain,
string calldata sourceAddress,
bytes calldata payload
) public {
require(
axelarGateway.validateContractCall(commandId, sourceChain, sourceAddress, keccak256(payload)),
"AxelarForwarder/not-approved-by-gateway"
);
PrecompileLike precompile = PrecompileLike(PRECOMPILE);
precompile.execute(commandId, sourceChain, sourceAddress, payload);
emit Forwarded(commandId, sourceChain, sourceAddress, payload);
}
function executeWithToken(
bytes32, //commandId,
string calldata, //sourceChain,
string calldata, //sourceAddress,
bytes calldata, //payload,
string calldata, //tokenSymbol,
uint256 //amount
) external pure {
revert("AxelarForwarder/execute-with-token-not-supported");
}
}