Skip to content

Commit 7388376

Browse files
authored
Merge branch 'main' into deficake/common-predicates-extraction
2 parents d3133ba + 5ff4491 commit 7388376

14 files changed

+1635
-8
lines changed

.changeset/brown-suits-dream.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@fuel-bridge/solidity-contracts': minor
3+
---
4+
5+
Adds FuelMessagePortalV3 with increased granularity on withdrawals control

packages/solidity-contracts/.openzeppelin/sepolia.json

+251
Original file line numberDiff line numberDiff line change
@@ -2124,6 +2124,257 @@
21242124
},
21252125
"namespaces": {}
21262126
}
2127+
},
2128+
"6b4cbd57e8cd02a8286ea702d39b021791bb3a3f146c6b49ae17fd41b98342f2": {
2129+
"address": "0x800567f454c125A9Dd54D53c3a5A0277a601bf9a",
2130+
"txHash": "0x572fedb10b9af1eea8880a3ea5aa4850755cb7d8b4e3af01885a536dc40df487",
2131+
"layout": {
2132+
"solcVersion": "0.8.9",
2133+
"storage": [
2134+
{
2135+
"label": "_initialized",
2136+
"offset": 0,
2137+
"slot": "0",
2138+
"type": "t_uint8",
2139+
"contract": "Initializable",
2140+
"src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62",
2141+
"retypedFrom": "bool"
2142+
},
2143+
{
2144+
"label": "_initializing",
2145+
"offset": 1,
2146+
"slot": "0",
2147+
"type": "t_bool",
2148+
"contract": "Initializable",
2149+
"src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67"
2150+
},
2151+
{
2152+
"label": "__gap",
2153+
"offset": 0,
2154+
"slot": "1",
2155+
"type": "t_array(t_uint256)50_storage",
2156+
"contract": "ContextUpgradeable",
2157+
"src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36"
2158+
},
2159+
{
2160+
"label": "_paused",
2161+
"offset": 0,
2162+
"slot": "51",
2163+
"type": "t_bool",
2164+
"contract": "PausableUpgradeable",
2165+
"src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:29"
2166+
},
2167+
{
2168+
"label": "__gap",
2169+
"offset": 0,
2170+
"slot": "52",
2171+
"type": "t_array(t_uint256)49_storage",
2172+
"contract": "PausableUpgradeable",
2173+
"src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:116"
2174+
},
2175+
{
2176+
"label": "__gap",
2177+
"offset": 0,
2178+
"slot": "101",
2179+
"type": "t_array(t_uint256)50_storage",
2180+
"contract": "ERC165Upgradeable",
2181+
"src": "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol:41"
2182+
},
2183+
{
2184+
"label": "_roles",
2185+
"offset": 0,
2186+
"slot": "151",
2187+
"type": "t_mapping(t_bytes32,t_struct(RoleData)2335_storage)",
2188+
"contract": "AccessControlUpgradeable",
2189+
"src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61"
2190+
},
2191+
{
2192+
"label": "__gap",
2193+
"offset": 0,
2194+
"slot": "152",
2195+
"type": "t_array(t_uint256)49_storage",
2196+
"contract": "AccessControlUpgradeable",
2197+
"src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:259"
2198+
},
2199+
{
2200+
"label": "_status",
2201+
"offset": 0,
2202+
"slot": "201",
2203+
"type": "t_uint256",
2204+
"contract": "ReentrancyGuardUpgradeable",
2205+
"src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:38"
2206+
},
2207+
{
2208+
"label": "__gap",
2209+
"offset": 0,
2210+
"slot": "202",
2211+
"type": "t_array(t_uint256)49_storage",
2212+
"contract": "ReentrancyGuardUpgradeable",
2213+
"src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:80"
2214+
},
2215+
{
2216+
"label": "__gap",
2217+
"offset": 0,
2218+
"slot": "251",
2219+
"type": "t_array(t_uint256)50_storage",
2220+
"contract": "ERC1967UpgradeUpgradeable",
2221+
"src": "@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:211"
2222+
},
2223+
{
2224+
"label": "__gap",
2225+
"offset": 0,
2226+
"slot": "301",
2227+
"type": "t_array(t_uint256)50_storage",
2228+
"contract": "UUPSUpgradeable",
2229+
"src": "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol:107"
2230+
},
2231+
{
2232+
"label": "_incomingMessageSender",
2233+
"offset": 0,
2234+
"slot": "351",
2235+
"type": "t_bytes32",
2236+
"contract": "FuelMessagePortal",
2237+
"src": "contracts/fuelchain/FuelMessagePortal.sol:100"
2238+
},
2239+
{
2240+
"label": "_fuelChainState",
2241+
"offset": 0,
2242+
"slot": "352",
2243+
"type": "t_contract(FuelChainState)9078",
2244+
"contract": "FuelMessagePortal",
2245+
"src": "contracts/fuelchain/FuelMessagePortal.sol:103"
2246+
},
2247+
{
2248+
"label": "_outgoingMessageNonce",
2249+
"offset": 0,
2250+
"slot": "353",
2251+
"type": "t_uint256",
2252+
"contract": "FuelMessagePortal",
2253+
"src": "contracts/fuelchain/FuelMessagePortal.sol:106"
2254+
},
2255+
{
2256+
"label": "_incomingMessageSuccessful",
2257+
"offset": 0,
2258+
"slot": "354",
2259+
"type": "t_mapping(t_bytes32,t_bool)",
2260+
"contract": "FuelMessagePortal",
2261+
"src": "contracts/fuelchain/FuelMessagePortal.sol:109"
2262+
},
2263+
{
2264+
"label": "__gap",
2265+
"offset": 0,
2266+
"slot": "355",
2267+
"type": "t_array(t_uint256)49_storage",
2268+
"contract": "FuelMessagePortal",
2269+
"src": "contracts/fuelchain/FuelMessagePortal.sol:337"
2270+
},
2271+
{
2272+
"label": "totalDeposited",
2273+
"offset": 0,
2274+
"slot": "404",
2275+
"type": "t_uint256",
2276+
"contract": "FuelMessagePortalV2",
2277+
"src": "contracts/fuelchain/FuelMessagePortal/v2/FuelMessagePortalV2.sol:13"
2278+
},
2279+
{
2280+
"label": "__gap",
2281+
"offset": 0,
2282+
"slot": "405",
2283+
"type": "t_array(t_uint256)49_storage",
2284+
"contract": "FuelMessagePortalV2",
2285+
"src": "contracts/fuelchain/FuelMessagePortal/v2/FuelMessagePortalV2.sol:106"
2286+
},
2287+
{
2288+
"label": "withdrawalsPaused",
2289+
"offset": 0,
2290+
"slot": "454",
2291+
"type": "t_bool",
2292+
"contract": "FuelMessagePortalV3",
2293+
"src": "contracts/fuelchain/FuelMessagePortal/v3/FuelMessagePortalV3.sol:14"
2294+
},
2295+
{
2296+
"label": "messageIsBlacklisted",
2297+
"offset": 0,
2298+
"slot": "455",
2299+
"type": "t_mapping(t_bytes32,t_bool)",
2300+
"contract": "FuelMessagePortalV3",
2301+
"src": "contracts/fuelchain/FuelMessagePortal/v3/FuelMessagePortalV3.sol:15"
2302+
},
2303+
{
2304+
"label": "__gap",
2305+
"offset": 0,
2306+
"slot": "456",
2307+
"type": "t_array(t_uint256)49_storage",
2308+
"contract": "FuelMessagePortalV3",
2309+
"src": "contracts/fuelchain/FuelMessagePortal/v3/FuelMessagePortalV3.sol:97"
2310+
}
2311+
],
2312+
"types": {
2313+
"t_address": {
2314+
"label": "address",
2315+
"numberOfBytes": "20"
2316+
},
2317+
"t_array(t_uint256)49_storage": {
2318+
"label": "uint256[49]",
2319+
"numberOfBytes": "1568"
2320+
},
2321+
"t_array(t_uint256)50_storage": {
2322+
"label": "uint256[50]",
2323+
"numberOfBytes": "1600"
2324+
},
2325+
"t_bool": {
2326+
"label": "bool",
2327+
"numberOfBytes": "1"
2328+
},
2329+
"t_bytes32": {
2330+
"label": "bytes32",
2331+
"numberOfBytes": "32"
2332+
},
2333+
"t_contract(FuelChainState)9078": {
2334+
"label": "contract FuelChainState",
2335+
"numberOfBytes": "20"
2336+
},
2337+
"t_mapping(t_address,t_bool)": {
2338+
"label": "mapping(address => bool)",
2339+
"numberOfBytes": "32"
2340+
},
2341+
"t_mapping(t_bytes32,t_bool)": {
2342+
"label": "mapping(bytes32 => bool)",
2343+
"numberOfBytes": "32"
2344+
},
2345+
"t_mapping(t_bytes32,t_struct(RoleData)2335_storage)": {
2346+
"label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)",
2347+
"numberOfBytes": "32"
2348+
},
2349+
"t_struct(RoleData)2335_storage": {
2350+
"label": "struct AccessControlUpgradeable.RoleData",
2351+
"members": [
2352+
{
2353+
"label": "members",
2354+
"type": "t_mapping(t_address,t_bool)",
2355+
"offset": 0,
2356+
"slot": "0"
2357+
},
2358+
{
2359+
"label": "adminRole",
2360+
"type": "t_bytes32",
2361+
"offset": 0,
2362+
"slot": "1"
2363+
}
2364+
],
2365+
"numberOfBytes": "64"
2366+
},
2367+
"t_uint256": {
2368+
"label": "uint256",
2369+
"numberOfBytes": "32"
2370+
},
2371+
"t_uint8": {
2372+
"label": "uint8",
2373+
"numberOfBytes": "1"
2374+
}
2375+
},
2376+
"namespaces": {}
2377+
}
21272378
}
21282379
}
21292380
}

packages/solidity-contracts/contracts/fuelchain/FuelMessagePortal.sol

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ contract FuelMessagePortal is
9595
bytes32 internal _incomingMessageSender;
9696

9797
/// @notice The Fuel chain state contract
98-
FuelChainState private _fuelChainState;
98+
FuelChainState internal _fuelChainState;
9999

100100
/// @notice Nonce for the next message to be sent
101101
uint256 internal _outgoingMessageNonce;

packages/solidity-contracts/contracts/fuelchain/v2/FuelMessagePortalV2.sol packages/solidity-contracts/contracts/fuelchain/FuelMessagePortal/v2/FuelMessagePortalV2.sol

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// SPDX-License-Identifier: Apache-2.0
22
pragma solidity 0.8.9;
33

4-
import "../FuelMessagePortal.sol";
4+
import "../../FuelMessagePortal.sol";
55

66
/// @custom:oz-upgrades-unsafe-allow constructor state-variable-immutable
77
contract FuelMessagePortalV2 is FuelMessagePortal {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
pragma solidity 0.8.9;
3+
4+
import "../v2/FuelMessagePortalV2.sol";
5+
6+
/// @custom:oz-upgrades-unsafe-allow constructor state-variable-immutable
7+
contract FuelMessagePortalV3 is FuelMessagePortalV2 {
8+
using FuelBlockHeaderLib for FuelBlockHeader;
9+
using FuelBlockHeaderLiteLib for FuelBlockHeaderLite;
10+
11+
error MessageBlacklisted();
12+
error WithdrawalsPaused();
13+
14+
bool public withdrawalsPaused;
15+
mapping(bytes32 => bool) public messageIsBlacklisted;
16+
17+
constructor(uint256 _depositLimitGlobal) FuelMessagePortalV2(_depositLimitGlobal) {}
18+
19+
function pauseWithdrawals() external payable onlyRole(PAUSER_ROLE) {
20+
withdrawalsPaused = true;
21+
}
22+
23+
function unpauseWithdrawals() external payable onlyRole(PAUSER_ROLE) {
24+
withdrawalsPaused = false;
25+
}
26+
27+
function setMessageBlacklist(bytes32 messageId, bool value) external payable onlyRole(PAUSER_ROLE) {
28+
messageIsBlacklisted[messageId] = value;
29+
}
30+
31+
///////////////////////////////////////
32+
// Incoming Message Public Functions //
33+
///////////////////////////////////////
34+
35+
/// @notice Relays a message published on Fuel from a given block
36+
/// @param message The message to relay
37+
/// @param rootBlockHeader The root block for proving chain history
38+
/// @param blockHeader The block containing the message
39+
/// @param blockInHistoryProof Proof that the message block exists in the history of the root block
40+
/// @param messageInBlockProof Proof that message exists in block
41+
/// @dev Made payable to reduce gas costs
42+
function relayMessage(
43+
Message calldata message,
44+
FuelBlockHeaderLite calldata rootBlockHeader,
45+
FuelBlockHeader calldata blockHeader,
46+
MerkleProof calldata blockInHistoryProof,
47+
MerkleProof calldata messageInBlockProof
48+
) external payable virtual override whenNotPaused {
49+
if (withdrawalsPaused) {
50+
revert WithdrawalsPaused();
51+
}
52+
53+
//verify root block header
54+
if (!_fuelChainState.finalized(rootBlockHeader.computeConsensusHeaderHash(), rootBlockHeader.height)) {
55+
revert UnfinalizedBlock();
56+
}
57+
58+
//verify block in history
59+
if (
60+
!verifyBinaryTree(
61+
rootBlockHeader.prevRoot,
62+
abi.encodePacked(blockHeader.computeConsensusHeaderHash()),
63+
blockInHistoryProof.proof,
64+
blockInHistoryProof.key,
65+
rootBlockHeader.height
66+
)
67+
) revert InvalidBlockInHistoryProof();
68+
69+
//verify message in block
70+
bytes32 messageId = CryptographyLib.hash(
71+
abi.encodePacked(message.sender, message.recipient, message.nonce, message.amount, message.data)
72+
);
73+
74+
if (messageIsBlacklisted[messageId]) {
75+
revert MessageBlacklisted();
76+
}
77+
78+
if (
79+
!verifyBinaryTree(
80+
blockHeader.outputMessagesRoot,
81+
abi.encodePacked(messageId),
82+
messageInBlockProof.proof,
83+
messageInBlockProof.key,
84+
blockHeader.outputMessagesCount
85+
)
86+
) revert InvalidMessageInBlockProof();
87+
88+
//execute message
89+
_executeMessage(messageId, message);
90+
}
91+
92+
/**
93+
* @dev This empty reserved space is put in place to allow future versions to add new
94+
* variables without shifting down storage in the inheritance chain.
95+
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
96+
*/
97+
uint256[49] private __gap;
98+
}

0 commit comments

Comments
 (0)