Skip to content

Commit

Permalink
remove status and minStake (#401)
Browse files Browse the repository at this point in the history
This PR removes the minStake and status from the GATEWAY contracts. 

Previously we had this as we only have collateral based PermissionMode
and the idea is to use these parameters to control in the Gateway to
enforce some control over different subnets. But now we are moving
towards different `PermissionMode` and these parameters no longer
required.

Note that `minStake` is a parameter applied to all subnets created, but
for `PermissionMode.Federated`, there is no collateral requirements, so
a `minStake` in the Gateway must be 0. Anything above zero will prevent
`Federated` subnet to be register in the gateway. If `minStake` is
always 0, just remove this parameter.

At the same time, `status` will be deprecated as well as collateral
alone does not manage the status of the subnet. Overall, subnets are
managing their own stake requirements and status, so that the gateway
does not really need to be aware of subnet’s status and status is not
used anywhere except for listing subnets. Subnet’s status is managed in
SubnetActor now, in bootstrapped and killed parameters, Gateway no
longer needs to maintain the status.
  • Loading branch information
cryptoAtwill authored Dec 21, 2023
1 parent 903ade6 commit 8632617
Show file tree
Hide file tree
Showing 17 changed files with 773 additions and 857 deletions.
427 changes: 203 additions & 224 deletions .storage-layouts/GatewayActorModifiers.json

Large diffs are not rendered by default.

427 changes: 203 additions & 224 deletions .storage-layouts/GatewayDiamond.json

Large diffs are not rendered by default.

304 changes: 170 additions & 134 deletions .storage-layouts/SubnetActorDiamond.json

Large diffs are not rendered by default.

304 changes: 170 additions & 134 deletions .storage-layouts/SubnetActorModifiers.json

Large diffs are not rendered by default.

5 changes: 0 additions & 5 deletions src/GatewayDiamond.sol
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ contract GatewayDiamond {
struct ConstructorParams {
SubnetID networkName;
uint256 bottomUpCheckPeriod;
uint256 minCollateral;
// deprecated (for now): no `msgFee` currenlty charged for cross-net messages
uint256 msgFee;
uint8 majorityPercentage;
Expand All @@ -37,9 +36,6 @@ contract GatewayDiamond {
}

constructor(IDiamond.FacetCut[] memory _diamondCut, ConstructorParams memory params) {
if (params.minCollateral == 0) {
revert InvalidCollateral();
}
// The bottomUpCheckPeriod should be non-zero for now.
if (params.bottomUpCheckPeriod == 0) {
revert InvalidSubmissionPeriod();
Expand All @@ -66,7 +62,6 @@ contract GatewayDiamond {
s.crossMsgRelayerRewards = FEATURE_CROSSMSG_RELAYER_REWARDS;

s.networkName = params.networkName;
s.minStake = params.minCollateral;
s.bottomUpCheckPeriod = params.bottomUpCheckPeriod;
s.minCrossMsgFee = params.msgFee;
s.majorityPercentage = params.majorityPercentage;
Expand Down
13 changes: 0 additions & 13 deletions src/enums/Status.sol

This file was deleted.

5 changes: 0 additions & 5 deletions src/gateway/GatewayGetterFacet.sol
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,6 @@ contract GatewayGetterFacet {
return s.totalSubnets;
}

/// @notice Returns the minimum stake required for instantiating a subnet.
function minStake() external view returns (uint256) {
return s.minStake;
}

/// @notice Returns the maximum number of messages per bottom-up batch.
function maxMsgsPerBottomUpBatch() external view returns (uint64) {
return s.maxMsgsPerBottomUpBatch;
Expand Down
11 changes: 0 additions & 11 deletions src/gateway/GatewayManagerFacet.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import {GatewayActorModifiers} from "../lib/LibGatewayActorStorage.sol";
import {SubnetActorGetterFacet} from "../subnet/SubnetActorGetterFacet.sol";
import {BURNT_FUNDS_ACTOR} from "../constants/Constants.sol";
import {CrossMsg} from "../structs/CrossNet.sol";
import {Status} from "../enums/Status.sol";
import {FvmAddress} from "../structs/FvmAddress.sol";
import {SubnetID, Subnet, SupplySource} from "../structs/Subnet.sol";
import {Membership, SupplyKind} from "../structs/Subnet.sol";
Expand Down Expand Up @@ -50,7 +49,6 @@ contract GatewayManagerFacet is GatewayActorModifiers, ReentrancyGuard {

subnet.id = subnetId;
subnet.stake = collateral;
subnet.status = Status.Active;
subnet.genesisEpoch = block.number;
subnet.circSupply = genesisCircSupply;

Expand All @@ -72,12 +70,6 @@ contract GatewayManagerFacet is GatewayActorModifiers, ReentrancyGuard {
}

subnet.stake += msg.value;

if (subnet.status == Status.Inactive) {
if (subnet.stake >= s.minStake) {
subnet.status = Status.Active;
}
}
}

/// @notice release collateral for an existing subnet.
Expand All @@ -99,9 +91,6 @@ contract GatewayManagerFacet is GatewayActorModifiers, ReentrancyGuard {

subnet.stake -= amount;

if (subnet.stake < s.minStake) {
subnet.status = Status.Inactive;
}
payable(subnet.id.getActor()).sendValue(amount);
}

Expand Down
5 changes: 0 additions & 5 deletions src/gateway/router/BottomUpRouterFacet.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import {ISubnetActor} from "../../interfaces/ISubnetActor.sol";
import {GatewayActorModifiers} from "../../lib/LibGatewayActorStorage.sol";
import {BottomUpMsgBatch} from "../../structs/CrossNet.sol";
import {LibGateway} from "../../lib/LibGateway.sol";
import {Status} from "../../enums/Status.sol";
import {BatchNotCreated, BatchAlreadyExists, InvalidBatchEpoch, NotEnoughSubnetCircSupply, SubnetNotActive, SubnetNotFound, InvalidBatchSource, MaxMsgsPerBatchExceeded, BatchWithNoMessages, InvalidCrossMsgDstSubnet, NotRegisteredSubnet, InvalidCrossMsgNonce} from "../../errors/IPCErrors.sol";
import {Subnet} from "../../structs/Subnet.sol";
import {LibQuorum} from "../../lib/LibQuorum.sol";
Expand Down Expand Up @@ -45,10 +44,6 @@ contract BottomUpRouterFacet is GatewayActorModifiers {
if (!subnetExists) {
revert SubnetNotFound();
}
// cross-net messages can't be executed in inactive subnets.
if (subnet.status != Status.Active) {
revert SubnetNotActive();
}

uint256 totalValue;
uint256 totalFee;
Expand Down
5 changes: 0 additions & 5 deletions src/gateway/router/CheckpointingFacet.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import {GatewayActorModifiers} from "../../lib/LibGatewayActorStorage.sol";
import {BottomUpCheckpoint} from "../../structs/CrossNet.sol";
import {LibGateway} from "../../lib/LibGateway.sol";
import {LibQuorum} from "../../lib/LibQuorum.sol";
import {Status} from "../../enums/Status.sol";
import {Subnet} from "../../structs/Subnet.sol";
import {QuorumObjKind} from "../../structs/Quorum.sol";
import {Address} from "openzeppelin-contracts/utils/Address.sol";
Expand Down Expand Up @@ -37,10 +36,6 @@ contract CheckpointingFacet is GatewayActorModifiers {
if (!checkpoint.subnetID.equals(subnet.id)) {
revert InvalidSubnet();
}
// only active subnets can commit checkpoints
if (subnet.status != Status.Active) {
revert SubnetNotActive();
}

if (s.checkpointRelayerRewards) {
// slither-disable-next-line unused-return
Expand Down
2 changes: 0 additions & 2 deletions src/lib/LibGatewayActorStorage.sol
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,6 @@ struct GatewayActorStorage {
bytes32[] subnetKeys;
/// @notice path to the current network
SubnetID networkName;
/// @notice Minimum stake required to create a new subnet
uint256 minStake;
/// @notice minimum fee amount charged per cross message
uint256 minCrossMsgFee;
/// @notice majority percentage value (must be greater than or equal to 51)
Expand Down
2 changes: 0 additions & 2 deletions src/structs/Subnet.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ pragma solidity 0.8.19;

import {SubnetID} from "./Subnet.sol";
import {FvmAddress} from "./FvmAddress.sol";
import {Status} from "../enums/Status.sol";
import {MaxPQ} from "../lib/priority/LibMaxPQ.sol";
import {MinPQ} from "../lib/priority/LibMinPQ.sol";

Expand All @@ -22,7 +21,6 @@ struct Subnet {
uint256 circSupply;
uint64 topDownNonce;
uint64 appliedBottomUpNonce;
Status status;
SubnetID id;
}

Expand Down
28 changes: 8 additions & 20 deletions test/IntegrationTestBase.sol
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import "../src/errors/IPCErrors.sol";

import {EMPTY_BYTES, METHOD_SEND} from "../src/constants/Constants.sol";
import {ConsensusType} from "../src/enums/ConsensusType.sol";
import {Status} from "../src/enums/Status.sol";
import {IDiamond} from "../src/interfaces/IDiamond.sol";
import {CrossMsg, BottomUpCheckpoint, StorableMsg, ParentFinality} from "../src/structs/CrossNet.sol";
import {FvmAddress} from "../src/structs/FvmAddress.sol";
Expand Down Expand Up @@ -126,7 +125,6 @@ contract TestGatewayActor is Test, TestParams {
networkName: SubnetID({root: ROOTNET_CHAINID, route: new address[](0)}),
bottomUpCheckPeriod: DEFAULT_CHECKPOINT_PERIOD,
msgFee: DEFAULT_CROSS_MSG_FEE,
minCollateral: DEFAULT_COLLATERAL_AMOUNT,
majorityPercentage: DEFAULT_MAJORITY_PERCENTAGE,
genesisValidators: new Validator[](0),
activeValidatorsLimit: DEFAULT_ACTIVE_VALIDATORS_LIMIT
Expand Down Expand Up @@ -653,7 +651,7 @@ contract IntegrationTestBase is Test, TestParams, TestRegistry, TestSubnetActor,

function fund(address funderAddress, uint256 fundAmount, SupplyKind mode) public {
// funding subnets is free, we do not need cross msg fee
(SubnetID memory subnetId, , uint256 nonceBefore, , uint256 circSupplyBefore, ) = getSubnet(address(saManager));
(SubnetID memory subnetId, , uint256 nonceBefore, , uint256 circSupplyBefore) = getSubnet(address(saManager));

uint256 expectedTopDownMsgsLength = gwGetter.getSubnetTopDownMsgsLength(subnetId) + 1;
uint256 expectedNonce = nonceBefore + 1;
Expand All @@ -667,7 +665,7 @@ contract IntegrationTestBase is Test, TestParams, TestRegistry, TestSubnetActor,
gwManager.fundWithToken(subnetId, FvmAddressHelper.from(funderAddress), fundAmount);
}

(, , uint256 nonce, , uint256 circSupply, ) = getSubnet(address(saManager));
(, , uint256 nonce, , uint256 circSupply) = getSubnet(address(saManager));

require(gwGetter.getSubnetTopDownMsgsLength(subnetId) == expectedTopDownMsgsLength, "unexpected lengths");

Expand Down Expand Up @@ -764,12 +762,12 @@ contract IntegrationTestBase is Test, TestParams, TestRegistry, TestSubnetActor,
function addStake(uint256 stakeAmount, address subnetAddress) public {
uint256 balanceBefore = subnetAddress.balance;

(, uint256 stakedBefore, , , , ) = getSubnet(subnetAddress);
(, uint256 stakedBefore, , , ) = getSubnet(subnetAddress);

gwManager.addStake{value: stakeAmount}();

uint256 balanceAfter = subnetAddress.balance;
(, uint256 stakedAfter, , , , ) = getSubnet(subnetAddress);
(, uint256 stakedAfter, , , ) = getSubnet(subnetAddress);

require(balanceAfter == balanceBefore - stakeAmount, "unexpected balance");
require(stakedAfter == stakedBefore + stakeAmount, "unexpected stake");
Expand All @@ -780,7 +778,7 @@ contract IntegrationTestBase is Test, TestParams, TestRegistry, TestSubnetActor,

manager.register{value: collateral}(0);

(SubnetID memory id, uint256 stake, uint256 topDownNonce, , uint256 circSupply, Status status) = getSubnetGW(
(SubnetID memory id, uint256 stake, uint256 topDownNonce, , uint256 circSupply) = getSubnetGW(
subnetAddress,
gw
);
Expand All @@ -794,7 +792,6 @@ contract IntegrationTestBase is Test, TestParams, TestRegistry, TestSubnetActor,
require(stake == collateral, "unexpected stake");
require(topDownNonce == 0, "unexpected nonce");
require(circSupply == 0, "unexpected circSupply");
require(status == Status.Active, "unexpected status");
}

function registerSubnet(uint256 collateral, address subnetAddress) public {
Expand All @@ -804,27 +801,18 @@ contract IntegrationTestBase is Test, TestParams, TestRegistry, TestSubnetActor,
function getSubnetGW(
address subnetAddress,
GatewayDiamond gw
) public returns (SubnetID memory, uint256, uint256, uint256, uint256, Status) {
) public returns (SubnetID memory, uint256, uint256, uint256, uint256) {
gwManager = GatewayManagerFacet(address(gw));
gwGetter = GatewayGetterFacet(address(gw));

SubnetID memory subnetId = gwGetter.getNetworkName().createSubnetId(subnetAddress);

Subnet memory subnet = gwGetter.subnets(subnetId.toHash());

return (
subnet.id,
subnet.stake,
subnet.topDownNonce,
subnet.appliedBottomUpNonce,
subnet.circSupply,
subnet.status
);
return (subnet.id, subnet.stake, subnet.topDownNonce, subnet.appliedBottomUpNonce, subnet.circSupply);
}

function getSubnet(
address subnetAddress
) public returns (SubnetID memory, uint256, uint256, uint256, uint256, Status) {
function getSubnet(address subnetAddress) public returns (SubnetID memory, uint256, uint256, uint256, uint256) {
return getSubnetGW(subnetAddress, gatewayDiamond);
}
}
Loading

0 comments on commit 8632617

Please sign in to comment.