> For the complete documentation index, see [llms.txt](https://my-organization-23.gitbook.io/solidity-basic/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://my-organization-23.gitbook.io/solidity-basic/no-1.md).

# 関数の修飾子

関数の修飾子

* `pure`: ステート変数の更新と読み取りができないようにする

```solidity
// Solidity コードの例
contract PureExample {
    // pureが付いているため、ステート変数へのアクセスやEtherの受け取りはできない
    function add(uint256 a, uint256 b) external pure returns (uint256) {
        // ステート変数へのアクセスやEtherの受け取りがないため、pureが使える
        return a + b;
    }
}
```

* `view`: ステート変数の更新はできないが、読み取りはできるようにする

```solidity
// Solidity コードの例
contract ViewExample {
    // viewが付いているため、ステート変数へのアクセスは読み取り専用で、変更はできない
    function getData() external view returns (uint256) {
        // ステート変数へのアクセスは読み取り専用であるため、変更はできない
        uint256 data = 42;

        return data;
    }
}

```

* `payable`: その関数がネイティブトークンを受け取ることができるようになります。

```solidity
// Solidity コードの例
contract PayableExample {
    // payableが付いているため、この関数はネイティブトークンを受け取れる
    function receiveEther() external payable {
        // msg.valueを使用してネイティブトークンの量を取得
        uint256 amount = msg.value;

        // ここでネイティブトークンの処理を行う
    }
}
```

* `modifier` (カスタム修飾子)

```solidity
contract AMM {
    // カスタム修飾子
    modifier activePool() {
        // このカスタム修飾子が付けられた関数の前にrequireのチェックが必ず実行されます　
        require(totalShare > 0, "Zero Liquidity");
        _;
    }

    // カスタム修飾子
    modifier validToken(IERC20 token) {
        // このカスタム修飾子が付けられた関数の前にrequireのチェックが必ず実行されます　
        require(
            token == _tokenX || token == _tokenY,
            "Token is not in the pool"
        );
        _;
    }

    // カスタム修飾子としてactivePoolとvalidToken(inToken)がついています
    function getEquivalentToken(
        IERC20 inToken,
        uint256 amountIn
    ) public view activePool validToken(inToken) returns (uint256) {
        IERC20 outToken = _pairToken(inToken);

        return (totalAmount[outToken] * amountIn) / totalAmount[inToken];
    }
}
```
