> 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/sumtokontorakutono.md).

# スマートコントラクトの構造

```solidity
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

contract SimpleStorage {
    uint storedData;

    function set(uint x) public {
        storedData = x;
    }

    function get() public view returns (uint) {
        return storedData;
    }
}
```

#### ライセンス情報

```solidity
// SPDX-License-Identifier: UNLICENSED
```

1行目にはライセンス情報を記述します。本格的なプロダクトを開発する場合は正確に設定する必要があります。

#### バージョン情報

```solidity
pragma solidity ^0.8.13;
```

Solidityバージョン0.8.13以上でコンパイルされることを指定しています。pragmaは、コンパイラに対して特定の指示を与えるためのもので、^0.8.13は0.8.13以上かつ1.0未満のバージョンを指定しています。できる限り最新のバージョンを使用することが推奨されています。

#### コントラクト名

```solidity
contract SimpleStorage {
```

SimpleStorageというコントラクト名になります。

#### 外部コントラクトのインポート

```solidity
// OpenZeppelinからERC20コントラクトをインポートする。
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
```

#### コントラクトの継承

```solidity
// ERC20コントラクトを継承して、ERC20トークンを作成する。
contract USDCToken is ERC20 {
```

#### コメント

```
// 1行のコメント

/*
複数行のコメント
*/
```

#### ステート変数の宣言

```solidity
contract SimpleStorage {
    uint storedData; // ステート変数
    int x = 10; // 宣言時に初期化も可能
    // ...
}
```

#### 関数

```solidity
contract SimpleStorage {
    uint storedData;

    function set(uint x) public {　// 関数
        storedData = x;
    }
}
```

#### コンストラクタ

```solidity
contract AMM {
    IERC20 private _tokenX;
    IERC20 private _tokenY;

    // コンストラクタ: デプロイするときに一度だけ実行されて、ステート変数が初期化されます。　
    constructor(IERC20 tokenX, IERC20 tokenY) {
        _tokenX = tokenX;
        _tokenY = tokenY;
    }
}
```

```solidity
contract USDCToken is ERC20 {
    // ERC20("USDC Token", "USDC") は、親コントラクト ERC20 のコンストラクタを呼び出しています。
    // この呼び出しにより、トークンの名前が "USDC Token"、シンボルが "USDC" となります。
    constructor() ERC20("USDC Token", "USDC") {
        _mint(msg.sender, 10000 ether);
    }
}
```

#### イベント

<pre class="language-solidity"><code class="lang-solidity"><strong>// イベントの定義
</strong><strong>event HighestBidIncreased(address bidder, uint amount); // Event
</strong>
contract SimpleAuction {
    function bid() public payable {
        // コントラクトから外部に通知を送り、EVMのログとして記録されます
        emit HighestBidIncreased(msg.sender, msg.value); // イベントを発行
    }
}
</code></pre>

#### Struct

```solidity
contract Ballot {
    struct Voter { // Struct
        uint weight;
        bool voted;
        address delegate;
        uint vote;
    }
}
```

#### Enum

```solidity
contract Purchase {
    enum State { Created, Locked, Inactive } // Enum
}
```

#### Errors

```solidity
// エラーの定義
error NotEnoughFunds(uint requested, uint available);

contract Token {
    mapping(address => uint) balances;
    
    function transfer(address to, uint amount) public {
        uint balance = balances[msg.sender];
        if (balance < amount)
            // errorはrevertコマンドと一緒に使うことができて、文字列にするよりガスを低く抑えることができます　
            revert NotEnoughFunds(amount, balance);
        // ...
    }
}
```
