# GNSDiamondCut

*Based on EIP-2535: Diamonds (*[*https://eips.ethereum.org/EIPS/eip-2535*](https://eips.ethereum.org/EIPS/eip-2535)*) Follows diamond-3 implementation (*[*https://github.com/mudgen/diamond-3-hardhat/*](https://github.com/mudgen/diamond-3-hardhat/)*) Manages all actions (calls, updates and initializations) related to the diamond and its facets.*

## fallback

```solidity
fallback() external payable
```

*Forwards call to the right facet using msg.sig using delegatecall. Reverts if signature is not known.*

## receive

```solidity
receive() external payable
```

*Allows the contract to receive ether*

## diamondCut

```solidity
function diamondCut(struct IDiamondStorage.FacetCut[] _faceCut, address _init, bytes _calldata) external
```

Add/replace/remove any number of functions and optionally execute a function with delegatecall

### Parameters

| Name       | Type                                                                                                                  | Description                                                                                                   |
| ---------- | --------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
| \_faceCut  | [IDiamondStorage.FacetCut\[\]](/developer/technical-reference/contracts/interfaces/types/idiamondstorage.md#facetcut) |                                                                                                               |
| \_init     | address                                                                                                               | The address of the contract or facet to execute \_calldata                                                    |
| \_calldata | bytes                                                                                                                 | A function call, including function selector and arguments \_calldata is executed with delegatecall on \_init |

## \_diamondCut

```solidity
function _diamondCut(struct IDiamondStorage.FacetCut[] _facetCut, address _init, bytes _calldata) internal
```

*Internal function for diamondCut()*

## \_addFunctions

```solidity
function _addFunctions(address _facetAddress, bytes4[] _functionSelectors) internal
```

*Adds the facet if it wasn't added yet, and adds its functions to the diamond*

### Parameters

| Name                | Type      | Description                   |
| ------------------- | --------- | ----------------------------- |
| \_facetAddress      | address   | address of the facet contract |
| \_functionSelectors | bytes4\[] | array of function selectors   |

## \_replaceFunctions

```solidity
function _replaceFunctions(address _facetAddress, bytes4[] _functionSelectors) internal
```

*Updates facet contract address for given function selectors*

### Parameters

| Name                | Type      | Description                   |
| ------------------- | --------- | ----------------------------- |
| \_facetAddress      | address   | address of the facet contract |
| \_functionSelectors | bytes4\[] | array of function selectors   |

## \_removeFunctions

```solidity
function _removeFunctions(address _facetAddress, bytes4[] _functionSelectors) internal
```

*Removes some function selectors of a facet from diamond*

### Parameters

| Name                | Type      | Description                   |
| ------------------- | --------- | ----------------------------- |
| \_facetAddress      | address   | address of the facet contract |
| \_functionSelectors | bytes4\[] | array of function selectors   |

## \_addFacet

```solidity
function _addFacet(struct IDiamondStorage.DiamondStorage s, address _facetAddress) internal
```

*Adds a new facet contract address to the diamond*

### Parameters

| Name           | Type                                                                                                                          | Description                       |
| -------------- | ----------------------------------------------------------------------------------------------------------------------------- | --------------------------------- |
| s              | [IDiamondStorage.DiamondStorage](/developer/technical-reference/contracts/interfaces/types/idiamondstorage.md#diamondstorage) | diamond storage pointer           |
| \_facetAddress | address                                                                                                                       | address of the new facet contract |

## \_addFunction

```solidity
function _addFunction(struct IDiamondStorage.DiamondStorage s, bytes4 _selector, uint96 _selectorPosition, address _facetAddress) internal
```

*Adds a new function to the diamond for a given facet contract*

### Parameters

| Name               | Type                                                                                                                          | Description                                                    |
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- |
| s                  | [IDiamondStorage.DiamondStorage](/developer/technical-reference/contracts/interfaces/types/idiamondstorage.md#diamondstorage) | diamond storage pointer                                        |
| \_selector         | bytes4                                                                                                                        | function selector                                              |
| \_selectorPosition | uint96                                                                                                                        | position of the function selector in the facet selectors array |
| \_facetAddress     | address                                                                                                                       | address of the facet contract                                  |

## \_removeFunction

```solidity
function _removeFunction(struct IDiamondStorage.DiamondStorage s, address _facetAddress, bytes4 _selector) internal
```

*Removes a function from a facet of the diamond*

### Parameters

| Name           | Type                                                                                                                          | Description                   |
| -------------- | ----------------------------------------------------------------------------------------------------------------------------- | ----------------------------- |
| s              | [IDiamondStorage.DiamondStorage](/developer/technical-reference/contracts/interfaces/types/idiamondstorage.md#diamondstorage) | diamond storage pointer       |
| \_facetAddress | address                                                                                                                       | address of the facet contract |
| \_selector     | bytes4                                                                                                                        | function selector             |

## \_initializeDiamondCut

```solidity
function _initializeDiamondCut(address _init, bytes _calldata) internal
```

*Initializes a facet after updating the diamond using delegatecall*

### Parameters

| Name       | Type    | Description                                   |
| ---------- | ------- | --------------------------------------------- |
| \_init     | address | address of the contract to execute \_calldata |
| \_calldata | bytes   | function call (selector and arguments)        |

## \_enforceHasContractCode

```solidity
function _enforceHasContractCode(address _contract) internal view
```

*Reverts if the given address is not a contract*

### Parameters

| Name       | Type    | Description      |
| ---------- | ------- | ---------------- |
| \_contract | address | address to check |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.gains.trade/developer/technical-reference/contracts/core/abstract/gnsdiamondcut.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
