github.com/ethereum/go-ethereum@v1.16.1/accounts/abi/bind/v2/internal/contracts/nested_libraries/contract.sol (about)

     1  // SPDX-License-Identifier: MIT
     2  pragma solidity ^0.8.26;
     3  
     4  
     5  //  L1
     6  //   \
     7  //     L2  L3   L1
     8  //      \ /    /
     9  //       L4   /
    10  //        \  /
    11  //         C1
    12  //
    13  library L1 {
    14      function Do(uint256 val) public pure returns (uint256) {
    15          return uint256(1);
    16      }
    17  }
    18  
    19  library L2 {
    20      function Do(uint256 val) public pure returns (uint256) {
    21          return L1.Do(val) + uint256(1);
    22      }
    23  }
    24  
    25  library L3 {
    26      function Do(uint256 val) public pure returns (uint256) {
    27          return uint256(1);
    28      }
    29  }
    30  
    31  library L4 {
    32      function Do(uint256 val) public pure returns (uint256) {
    33          return L2.Do(uint256(val)) + L3.Do(uint256(val)) + uint256(1);
    34      }
    35  }
    36  
    37  contract C1 {
    38      function Do(uint256 val) public pure  returns (uint256 res) {
    39          return L4.Do(uint256(val)) + L1.Do(uint256(0)) + uint256(1);
    40      }
    41  
    42      constructor(uint256 v1, uint256 v2) {
    43          // do something with these
    44      }
    45  }
    46  
    47  // second contract+libraries: slightly different library deps than V1, but sharing several
    48  //  L1
    49  //   \
    50  //     L2b  L3  L1
    51  //      \  /   /
    52  //       L4b  /
    53  //        \  /
    54  //         C2
    55  //
    56  library L4b {
    57          function Do(uint256 val) public pure returns (uint256) {
    58              return L2b.Do(uint256(val)) + uint256(1);
    59          }
    60  }
    61  
    62  library L2b {
    63          function Do(uint256 val) public pure returns (uint256) {
    64              return L1.Do(uint256(val)) + uint256(1);
    65          }
    66  }
    67  
    68  contract C2 {
    69      function Do(uint256 val) public pure  returns (uint256 res) {
    70          return L4b.Do(uint256(val)) + L1.Do(uint256(0)) + uint256(1);
    71      }
    72  
    73      constructor(uint256 v1, uint256 v2) {
    74          // do something with these
    75      }
    76  }