ETH Price: $2,530.45 (-2.41%)

Transaction Decoder

Block:
16949861 at Mar-31-2023 09:30:23 PM +UTC
Transaction Fee:
0.006115972273075539 ETH $15.48
Gas Used:
220,801 Gas / 27.699024339 Gwei

Emitted Events:

224 WETH9.Deposit( dst=[Receiver] TokenBridge, wad=10000000000000 )
225 OptimizedTransparentUpgradeableProxy.0xdf21c415b78ed2552cc9971249e32a053abce6087a0ae0fbf3f78db5174a3493( 0xdf21c415b78ed2552cc9971249e32a053abce6087a0ae0fbf3f78db5174a3493, 000000000000000000000000000000000000000000000000000178c9907589c7 )
226 UltraLightNodeV2.RelayerParams( adapterParams=0x0002000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000FE1A07C8F0EF76C9A610796F8231D238DAA415DB65A7CDA0F1FDCFC6215A20B4507EE, outboundProofType=2 )
227 OptimizedTransparentUpgradeableProxy.0x4e41ee13e03cd5e0446487b524fdc48af6acf26c074dacdbdfb6b574b42c8146( 0x4e41ee13e03cd5e0446487b524fdc48af6acf26c074dacdbdfb6b574b42c8146, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000002, 000000000000000000000000000000000000000000000000000000000000000f, 00000000000000000000000050002cdfe7ccb0c41f519c6eb0653158d11cd907, 00000000000000000000000000000000000000000000000000015132e45256c2 )
228 UltraLightNodeV2.Packet( payload=0x0000000000008C22006550002CDFE7CCB0C41F519C6EB0653158D11CD907006CF22BEDE237A07E121B56D91A491EB7BCDFD1F5907926A9E58338F964A01B17FA00000000000000000000000000C02AAA39B223FE8D0A0E5C4F27EAD9083C756CC27C8F0EF76C9A610796F8231D238DAA415DB65A7CDA0F1FDCFC6215A20B4507EE000000000000000A )
229 TokenBridge.Send( token=0x00000000...000000000, from=[Sender] 0x1b7321fc0e7abb4d1b999e039575de1906e8bf2f, to=7C8F0EF76C9A610796F8231D238DAA415DB65A7CDA0F1FDCFC6215A20B4507EE, amountLD=10000000000000 )

Account State Difference:

  Address   Before After State Difference Code
0x1B7321FC...906e8Bf2F
0.0175907 Eth
Nonce: 0
0.01067969164530538 Eth
Nonce: 1
0.00691100835469462
0x4D73AdB7...401A178E2
(Layer Zero: Ultra Light Node v2)
14.048469746532407319 Eth14.0492547826140264 Eth0.000785036081619081
0x50002CdF...8d11cd907
(Layer Zero: Aptos Bridge)
0x5B905fE0...FAbf76068
(LayerZero: Nonce)
0x66A71Dce...C225Cd675
(LayerZero: Ethereum Endpoint)
(BuildAI.net)
1.665040552337648522 Eth1.665062632437648522 Eth0.0000220801
0xC02aaA39...83C756Cc2 3,781,337.193404384190793694 Eth3,781,337.193414384190793694 Eth0.00001

Execution Trace

ETH 0.000795036081619081 TokenBridge.sendETHToAptos( _toAddress=7C8F0EF76C9A610796F8231D238DAA415DB65A7CDA0F1FDCFC6215A20B4507EE, _amountLD=10000000000000, _callParams=[{name:refundAddress, type:address, order:1, indexed:false, value:0x1B7321FC0e7ABb4d1b999E039575De1906e8Bf2F, valueString:0x1B7321FC0e7ABb4d1b999E039575De1906e8Bf2F}, {name:zroPaymentAddress, type:address, order:2, indexed:false, value:0x0000000000000000000000000000000000000000, valueString:0x0000000000000000000000000000000000000000}], _adapterParams=0x0002000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000FE1A07C8F0EF76C9A610796F8231D238DAA415DB65A7CDA0F1FDCFC6215A20B4507EE )
  • ETH 0.00001 WETH9.CALL( )
  • ETH 0.000785036081619081 Endpoint.send( _dstChainId=108, _destination=0xF22BEDE237A07E121B56D91A491EB7BCDFD1F5907926A9E58338F964A01B17FA50002CDFE7CCB0C41F519C6EB0653158D11CD907, _payload=0x00000000000000000000000000C02AAA39B223FE8D0A0E5C4F27EAD9083C756CC27C8F0EF76C9A610796F8231D238DAA415DB65A7CDA0F1FDCFC6215A20B4507EE000000000000000A, _refundAddress=0x1B7321FC0e7ABb4d1b999E039575De1906e8Bf2F, _zroPaymentAddress=0x0000000000000000000000000000000000000000, _adapterParams=0x0002000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000FE1A07C8F0EF76C9A610796F8231D238DAA415DB65A7CDA0F1FDCFC6215A20B4507EE )
    • ETH 0.000785036081619081 UltraLightNodeV2.send( _ua=0x50002CdFe7CCb0C41F519c6Eb0653158d11cd907, 35874, _dstChainId=108, _path=0xF22BEDE237A07E121B56D91A491EB7BCDFD1F5907926A9E58338F964A01B17FA50002CDFE7CCB0C41F519C6EB0653158D11CD907, _payload=0x00000000000000000000000000C02AAA39B223FE8D0A0E5C4F27EAD9083C756CC27C8F0EF76C9A610796F8231D238DAA415DB65A7CDA0F1FDCFC6215A20B4507EE000000000000000A, _refundAddress=0x1B7321FC0e7ABb4d1b999E039575De1906e8Bf2F, _zroPaymentAddress=0x0000000000000000000000000000000000000000, _adapterParams=0x0002000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000FE1A07C8F0EF76C9A610796F8231D238DAA415DB65A7CDA0F1FDCFC6215A20B4507EE )
      • NonceContract.increment( _chainId=108, _ua=0x50002CdFe7CCb0C41F519c6Eb0653158d11cd907, _path=0xF22BEDE237A07E121B56D91A491EB7BCDFD1F5907926A9E58338F964A01B17FA50002CDFE7CCB0C41F519C6EB0653158D11CD907 ) => ( 35874 )
        • Endpoint.getSendLibraryAddress( _userApplication=0x50002CdFe7CCb0C41F519c6Eb0653158d11cd907 ) => ( sendLibraryAddress=0x4D73AdB72bC3DD368966edD0f0b2148401A178E2 )
        • OptimizedTransparentUpgradeableProxy.5886ea65( )
          • 0xdd55f55cb9a39ef1eed4ee1a84ee1b7411be306a.5886ea65( )
            • OptimizedTransparentUpgradeableProxy.7bc3c9ab( )
              • 0xb26ac124db9439edb7de503ef62e3d3d4e29090c.7bc3c9ab( )
              • OptimizedTransparentUpgradeableProxy.c5e193cd( )
                • 0xccef13cfeb6873c167f62a365548a57c9ed29dc5.c5e193cd( )
                  • OptimizedTransparentUpgradeableProxy.7bc3c9ab( )
                    • 0xb26ac124db9439edb7de503ef62e3d3d4e29090c.7bc3c9ab( )
                    • TreasuryV2.getFees( payInZro=False, relayerFee=414282084092359, oracleFee=370753997526722 ) => ( 0 )
                      File 1 of 9: TokenBridge
                      1
                      {"Address.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)\n\npragma solidity ^0.8
                          .1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is
                          a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false
                          is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n *
                          types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract
                          will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You
                          shouldn\u0027t rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged.
                          It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by
                          calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n
                           // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only
                          stored at the end\n // of the constructor execution.\n\n return account.code.length \u003e 0;\n }\n\n /**\n * @dev
                          Replacement for Solidity\u0027s `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n
                          *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the
                          2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n
                           *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because
                          control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n *
                          {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions
                          -pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n
                          require(address(this).balance \u003e= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\"
                          );\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity
                          function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n
                           *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n
                           * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and
                          -global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * -
                          `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function
                          functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level
                          call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage`
                          as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address
                          target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return
                          functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes
                          -}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract
                          must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n
                           */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns
                          (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n
                           * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback
                          revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target
                          ,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require
                          (address(this).balance \u003e= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non
                          -contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success,
                          returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but
                          performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data)
                          internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n
                          /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n *
                          _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory
                          errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n
                           (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n
                          }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n
                           * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n
                           return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address
                          -functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n
                           function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns
                          (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory
                          returndata) = target.delegatecall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool
                          to verifies that a low level call was successful, and revert if it wasn\u0027t, either by bubbling the\n * revert reason using the provided one
                          .\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n
                           string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else
                          {\n // Look for revert reason and bubble it up if present\n if (returndata.length \u003e 0) {\n // The easiest
                          way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n
                           let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n
                           } else {\n revert(errorMessage);\n }\n }\n }\n}\n"},"BytesLib.sol":{"content":"// SPDX-License
                          -Identifier: Unlicense\n/*\n * @title Solidity Bytes Arrays Utils\n * @author Gonçalo Sá \u003cgoncalo.sa@consensys.net\u003e\n *\n * @dev Bytes
                          tightly packed arrays utility library for ethereum contracts written in Solidity.\n * The library lets you concatenate, slice and type cast
                          bytes arrays both in memory and storage.\n */\npragma solidity \u003e=0.8.0 \u003c0.9.0;\n\n\nlibrary BytesLib {\n function concat(\n
                          bytes memory _preBytes,\n bytes memory _postBytes\n )\n internal\n pure\n returns (bytes memory)\n {\n bytes memory
                          tempBytes;\n\n assembly {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory
                          variables.\n tempBytes := mload(0x40)\n\n // Store the length of the first bytes array at the beginning of\n // the memory
                          for tempBytes.\n let length := mload(_preBytes)\n mstore(tempBytes, length)\n\n // Maintain a memory counter for the
                          current write location in the\n // temp bytes array by adding the 32 bytes for the array length to\n // the starting location.\n
                           let mc := add(tempBytes, 0x20)\n // Stop copying when the memory counter reaches the length of the\n // first bytes array.\n
                           let end := add(mc, length)\n\n for {\n // Initialize a copy counter to the start of the _preBytes data,\n
                           // 32 bytes into its memory.\n let cc := add(_preBytes, 0x20)\n } lt(mc, end) {\n // Increase both counters
                          by 32 bytes each iteration.\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n // Write the
                          _preBytes data into the tempBytes memory 32 bytes\n // at a time.\n mstore(mc, mload(cc))\n }\n\n //
                          Add the length of _postBytes to the current length of tempBytes\n // and store it as the new length in the first 32 bytes of the\n //
                          tempBytes memory.\n length := mload(_postBytes)\n mstore(tempBytes, add(length, mload(tempBytes)))\n\n // Move the
                          memory counter back from a multiple of 0x20 to the\n // actual end of the _preBytes data.\n mc := end\n // Stop copying
                          when the memory counter reaches the new combined\n // length of the arrays.\n end := add(mc, length)\n\n for {\n
                           let cc := add(_postBytes, 0x20)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n
                           } {\n mstore(mc, mload(cc))\n }\n\n // Update the free-memory pointer by padding our last write
                          location\n // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\n // next 32 byte block, then round down to the
                          nearest multiple of\n // 32. If the sum of the length of the two arrays is zero then add\n // one before rounding down to leave a
                          blank 32 bytes (the length block with 0).\n mstore(0x40, and(\n add(add(end, iszero(add(length, mload(_preBytes)))), 31),\n
                           not(31) // Round down to the nearest 32 bytes.\n ))\n }\n\n return tempBytes;\n }\n\n function
                          concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal {\n assembly {\n // Read the first 32 bytes of _preBytes
                          storage, which is the length\n // of the array. (We don\u0027t need to use the offset into the slot\n // because arrays use the
                          entire slot.)\n let fslot := sload(_preBytes.slot)\n // Arrays of 31 bytes or less have an even value in their slot,\n //
                          while longer arrays have an odd value. The actual length is\n // the slot divided by two for odd values, and the lowest order\n //
                          byte divided by two for even values.\n // If the slot is even, bitwise and the slot with 255 and divide by\n // two to get the length
                          . If the slot is odd, bitwise and the slot\n // with -1 and divide by two.\n let slength := div(and(fslot, sub(mul(0x100, iszero
                          (and(fslot, 1))), 1)), 2)\n let mlength := mload(_postBytes)\n let newlength := add(slength, mlength)\n // slength can
                          contain both the length and contents of the array\n // if length \u003c 32 bytes so let\u0027s prepare for that\n // v. http
                          ://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\n switch add(lt(slength, 32), lt(newlength,
                          32))\n case 2 {\n // Since the new array still fits in the slot, we just need to\n // update the contents of the
                          slot.\n // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length\n sstore(\n
                           _preBytes.slot,\n // all the modifications to the slot are inside this\n // next block\n add(\n
                           // we can just add to the slot contents because the\n // bytes we want to change are the LSBs\n fslot,\n
                           add(\n mul(\n div(\n // load the bytes from memory\n mload(add(_postBytes
                          , 0x20)),\n // zero all bytes to the right\n exp(0x100, sub(32, mlength))\n ),\n // and
                          now shift left the number of bytes to\n // leave space for the length in the slot\n exp(0x100, sub(32, newlength))\n
                           ),\n // increase length by the double of the memory\n // bytes length\n mul(mlength, 2
                          )\n )\n )\n )\n }\n case 1 {\n // The stored value fits in the slot,
                          but the combined value\n // will exceed it.\n // get the keccak hash to get the contents of the array\n mstore
                          (0x0, _preBytes.slot)\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\n\n // save new length\n
                          sstore(_preBytes.slot, add(mul(newlength, 2), 1))\n\n // The contents of the _postBytes array start 32 bytes into\n // the
                          structure. Our first read should obtain the `submod`\n // bytes that can fit into the unused space in the last word\n // of
                          the stored array. To get this, we read 32 bytes starting\n // from `submod`, so the data we read overlaps with the array\n //
                          contents by `submod` bytes. Masking the lowest-order\n // `submod` bytes allows us to add that value directly to the\n //
                          stored value.\n\n let submod := sub(32, slength)\n let mc := add(_postBytes, submod)\n let end := add
                          (_postBytes, mlength)\n let mask := sub(exp(0x100, submod), 1)\n\n sstore(\n sc,\n add
                          (\n and(\n fslot,\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00\n
                           ),\n and(mload(mc), mask)\n )\n )\n\n for {\n mc := add(mc, 0x20
                          )\n sc := add(sc, 1)\n } lt(mc, end) {\n sc := add(sc, 1)\n mc := add(mc,
                          0x20)\n } {\n sstore(sc, mload(mc))\n }\n\n mask := exp(0x100, sub(mc, end))\n\n
                           sstore(sc, mul(div(mload(mc), mask), mask))\n }\n default {\n // get the keccak hash to get the
                          contents of the array\n mstore(0x0, _preBytes.slot)\n // Start copying to the last used word of the stored array.\n
                           let sc := add(keccak256(0x0, 0x20), div(slength, 32))\n\n // save new length\n sstore(_preBytes.slot, add(mul
                          (newlength, 2), 1))\n\n // Copy over the first `submod` bytes of the new data as in\n // case 1 above.\n let
                          slengthmod := mod(slength, 32)\n let mlengthmod := mod(mlength, 32)\n let submod := sub(32, slengthmod)\n
                           let mc := add(_postBytes, submod)\n let end := add(_postBytes, mlength)\n let mask := sub(exp(0x100, submod), 1
                          )\n\n sstore(sc, add(sload(sc), and(mload(mc), mask)))\n\n for {\n sc := add(sc, 1)\n
                           mc := add(mc, 0x20)\n } lt(mc, end) {\n sc := add(sc, 1)\n mc := add(mc, 0x20)\n
                           } {\n sstore(sc, mload(mc))\n }\n\n mask := exp(0x100, sub(mc, end))\n\n
                          sstore(sc, mul(div(mload(mc), mask), mask))\n }\n }\n }\n\n function slice(\n bytes memory _bytes,\n uint256
                          _start,\n uint256 _length\n )\n internal\n pure\n returns (bytes memory)\n {\n require(_length + 31 \u003e= _length,
                          \"slice_overflow\");\n require(_bytes.length \u003e= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n
                           assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes
                          as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice
                          result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that
                          partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we
                          don\u0027t care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n
                           // we\u0027re done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod
                          := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes
                          (lengthmod == 0)\n // the following copy loop was copying the origin\u0027s length\n // and then ending prematurely not
                          copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end :=
                          add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as
                          the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end)
                          {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc
                          ))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array
                          padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a
                          zero-length slice let\u0027s just return a zero-length array\n default {\n tempBytes := mload(0x40)\n //zero
                          out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore
                          (tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function
                          toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\n require(_bytes.length \u003e= _start + 20,
                          \"toAddress_outOfBounds\");\n address tempAddress;\n\n assembly {\n tempAddress := div(mload(add(add(_bytes, 0x20), _start
                          )), 0x1000000000000000000000000)\n }\n\n return tempAddress;\n }\n\n function toUint8(bytes memory _bytes, uint256 _start)
                          internal pure returns (uint8) {\n require(_bytes.length \u003e= _start + 1 , \"toUint8_outOfBounds\");\n uint8 tempUint;\n\n
                          assembly {\n tempUint := mload(add(add(_bytes, 0x1), _start))\n }\n\n return tempUint;\n }\n\n function toUint16
                          (bytes memory _bytes, uint256 _start) internal pure returns (uint16) {\n require(_bytes.length \u003e= _start + 2, \"toUint16_outOfBounds\"
                          );\n uint16 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x2), _start))\n }\n\n return
                          tempUint;\n }\n\n function toUint32(bytes memory _bytes, uint256 _start) internal pure returns (uint32) {\n require(_bytes.length
                          \u003e= _start + 4, \"toUint32_outOfBounds\");\n uint32 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x4),
                          _start))\n }\n\n return tempUint;\n }\n\n function toUint64(bytes memory _bytes, uint256 _start) internal pure returns (uint64)
                          {\n require(_bytes.length \u003e= _start + 8, \"toUint64_outOfBounds\");\n uint64 tempUint;\n\n assembly {\n
                          tempUint := mload(add(add(_bytes, 0x8), _start))\n }\n\n return tempUint;\n }\n\n function toUint96(bytes memory _bytes,
                          uint256 _start) internal pure returns (uint96) {\n require(_bytes.length \u003e= _start + 12, \"toUint96_outOfBounds\");\n uint96
                          tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0xc), _start))\n }\n\n return tempUint;\n }\n\n
                          function toUint128(bytes memory _bytes, uint256 _start) internal pure returns (uint128) {\n require(_bytes.length \u003e= _start + 16,
                          \"toUint128_outOfBounds\");\n uint128 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x10), _start))\n
                           }\n\n return tempUint;\n }\n\n function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) {\n
                          require(_bytes.length \u003e= _start + 32, \"toUint256_outOfBounds\");\n uint256 tempUint;\n\n assembly {\n tempUint :=
                          mload(add(add(_bytes, 0x20), _start))\n }\n\n return tempUint;\n }\n\n function toBytes32(bytes memory _bytes, uint256 _start)
                          internal pure returns (bytes32) {\n require(_bytes.length \u003e= _start + 32, \"toBytes32_outOfBounds\");\n bytes32 tempBytes32;\n\n
                           assembly {\n tempBytes32 := mload(add(add(_bytes, 0x20), _start))\n }\n\n return tempBytes32;\n }\n\n
                          function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) {\n bool success = true;\n\n assembly
                          {\n let length := mload(_preBytes)\n\n // if lengths don\u0027t match the arrays are not equal\n switch eq(length,
                          mload(_postBytes))\n case 1 {\n // cb is a circuit breaker in the for loop since there\u0027s\n // no said
                          feature for inline assembly loops\n // cb = 1 - don\u0027t breaker\n // cb = 0 - break\n let cb := 1\n\n
                           let mc := add(_preBytes, 0x20)\n let end := add(mc, length)\n\n for {\n let cc := add
                          (_postBytes, 0x20)\n // the next line is the loop condition:\n // while(uint256(mc \u003c end) + cb == 2)\n
                           } eq(add(lt(mc, end), cb), 2) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n
                           // if any of these checks fails then arrays are not equal\n if iszero(eq(mload(mc), mload(cc))) {\n
                           // unsuccess:\n success := 0\n cb := 0\n }\n }\n }\n
                           default {\n // unsuccess:\n success := 0\n }\n }\n\n return success;\n }\n\n
                          function equalStorage(\n bytes storage _preBytes,\n bytes memory _postBytes\n )\n internal\n view\n returns (bool)\n
                          {\n bool success = true;\n\n assembly {\n // we know _preBytes_offset is 0\n let fslot := sload(_preBytes.slot)\n
                           // Decode the length of the stored array like in concatStorage().\n let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot,
                          1))), 1)), 2)\n let mlength := mload(_postBytes)\n\n // if lengths don\u0027t match the arrays are not equal\n switch
                          eq(slength, mlength)\n case 1 {\n // slength can contain both the length and contents of the array\n // if length
                          \u003c 32 bytes so let\u0027s prepare for that\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state
                          -variables-in-storage\n if iszero(iszero(slength)) {\n switch lt(slength, 32)\n case 1 {\n
                           // blank the last byte which is the length\n fslot := mul(div(fslot, 0x100), 0x100)\n\n
                           if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {\n // unsuccess:\n success := 0\n
                           }\n }\n default {\n // cb is a circuit breaker in the for loop since
                          there\u0027s\n // no said feature for inline assembly loops\n // cb = 1 - don\u0027t breaker\n
                           // cb = 0 - break\n let cb := 1\n\n // get the keccak hash to get the contents of the array\n
                           mstore(0x0, _preBytes.slot)\n let sc := keccak256(0x0, 0x20)\n\n let mc := add
                          (_postBytes, 0x20)\n let end := add(mc, mlength)\n\n // the next line is the loop condition:\n
                           // while(uint256(mc \u003c end) + cb == 2)\n for {} eq(add(lt(mc, end), cb), 2) {\n sc
                          := add(sc, 1)\n mc := add(mc, 0x20)\n } {\n if iszero(eq(sload(sc),
                          mload(mc))) {\n // unsuccess:\n success := 0\n cb := 0\n
                           }\n }\n }\n }\n }\n default {\n
                           // unsuccess:\n success := 0\n }\n }\n\n return success;\n }\n}\n"},"Context.sol":{"content":"// SPDX
                          -License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information
                          about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg
                          .sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n
                          * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for
                          intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n
                           return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n"}
                          ,"draft-IERC20Permit.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit
                          .sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined
                          in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account\u0027s ERC20
                          allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account
                          doesn\u0027t\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev
                          Sets `value` as the allowance of `spender` over ``owner``\u0027s tokens,\n * given ``owner``\u0027s signed approval.\n *\n * IMPORTANT:
                          The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n
                           * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`,
                          `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must
                          use ``owner``\u0027s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips
                          .ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address
                          spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n
                           * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n
                           * Every successful call to {permit} increases ``owner``\u0027s nonce by one. This\n * prevents a signature from being used multiple times.\n
                           */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the
                          encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function
                          DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n"},"ExcessivelySafeCall.sol":{"content":"// SPDX-License-Identifier: MIT OR Apache-2
                          .0\npragma solidity \u003e=0.7.6;\n\nlibrary ExcessivelySafeCall {\n uint256 constant LOW_28_MASK =\n
                          0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff;\n\n /// @notice Use when you _really_ really _really_ don\u0027t trust the
                          called\n /// contract. This prevents the called contract from causing reversion of\n /// the caller in as many ways as we can.\n /// @dev
                          The main difference between this and a solidity low-level call is\n /// that we limit the number of bytes that the callee can cause to be\n
                          /// copied to caller memory. This prevents stupid things like malicious\n /// contracts returning 10,000,000 bytes causing a local OOG when
                          copying\n /// to memory.\n /// @param _target The address to call\n /// @param _gas The amount of gas to forward to the remote contract\n
                           /// @param _maxCopy The maximum number of bytes of returndata to copy\n /// to memory.\n /// @param _calldata The data to send to the
                          remote contract\n /// @return success and returndata, as `.call()`. Returndata is capped to\n /// `_maxCopy` bytes.\n function
                          excessivelySafeCall(\n address _target,\n uint256 _gas,\n uint16 _maxCopy,\n bytes memory _calldata\n ) internal
                          returns (bool, bytes memory) {\n // set up for assembly call\n uint256 _toCopy;\n bool _success;\n bytes memory
                          _returnData = new bytes(_maxCopy);\n // dispatch message to recipient\n // by assembly calling \"handle\" function\n // we
                          call via assembly to avoid memcopying a very large returndata\n // returned by a malicious contract\n assembly {\n
                          _success := call(\n _gas, // gas\n _target, // recipient\n 0, // ether value\n add(_calldata, 0x20), //
                          inloc\n mload(_calldata), // inlen\n 0, // outloc\n 0 // outlen\n )\n // limit our copy to 256
                          bytes\n _toCopy := returndatasize()\n if gt(_toCopy, _maxCopy) {\n _toCopy := _maxCopy\n }\n
                           // Store the length of the copied bytes\n mstore(_returnData, _toCopy)\n // copy the bytes from returndata[0:_toCopy]\n
                           returndatacopy(add(_returnData, 0x20), 0, _toCopy)\n }\n return (_success, _returnData);\n }\n\n /// @notice Use when you
                          _really_ really _really_ don\u0027t trust the called\n /// contract. This prevents the called contract from causing reversion of\n /// the
                          caller in as many ways as we can.\n /// @dev The main difference between this and a solidity low-level call is\n /// that we limit the number
                          of bytes that the callee can cause to be\n /// copied to caller memory. This prevents stupid things like malicious\n /// contracts returning
                          10,000,000 bytes causing a local OOG when copying\n /// to memory.\n /// @param _target The address to call\n /// @param _gas The amount
                          of gas to forward to the remote contract\n /// @param _maxCopy The maximum number of bytes of returndata to copy\n /// to memory.\n ///
                          @param _calldata The data to send to the remote contract\n /// @return success and returndata, as `.call()`. Returndata is capped to\n ///
                          `_maxCopy` bytes.\n function excessivelySafeStaticCall(\n address _target,\n uint256 _gas,\n uint16 _maxCopy,\n
                          bytes memory _calldata\n ) internal view returns (bool, bytes memory) {\n // set up for assembly call\n uint256 _toCopy;\n
                          bool _success;\n bytes memory _returnData = new bytes(_maxCopy);\n // dispatch message to recipient\n // by assembly calling
                          \"handle\" function\n // we call via assembly to avoid memcopying a very large returndata\n // returned by a malicious contract\n
                           assembly {\n _success := staticcall(\n _gas, // gas\n _target, // recipient\n add(_calldata, 0x20),
                          // inloc\n mload(_calldata), // inlen\n 0, // outloc\n 0 // outlen\n )\n // limit our copy to
                          256 bytes\n _toCopy := returndatasize()\n if gt(_toCopy, _maxCopy) {\n _toCopy := _maxCopy\n }\n
                           // Store the length of the copied bytes\n mstore(_returnData, _toCopy)\n // copy the bytes from returndata[0:_toCopy]\n
                           returndatacopy(add(_returnData, 0x20), 0, _toCopy)\n }\n return (_success, _returnData);\n }\n\n /**\n * @notice
                          Swaps function selectors in encoded contract calls\n * @dev Allows reuse of encoded calldata for functions with identical\n * argument
                          types but different names. It simply swaps out the first 4 bytes\n * for the new selector. This function modifies memory in place, and should\n
                           * only be used with caution.\n * @param _newSelector The new 4-byte selector\n * @param _buf The encoded contract args\n */\n
                          function swapSelector(bytes4 _newSelector, bytes memory _buf)\n internal\n pure\n {\n require(_buf.length \u003e= 4);\n
                          uint256 _mask = LOW_28_MASK;\n assembly {\n // load the first word of\n let _word := mload(add(_buf, 0x20))\n //
                          mask out the top 4 bytes\n // /x\n _word := and(_word, _mask)\n _word := or(_newSelector, _word)\n mstore
                          (add(_buf, 0x20), _word)\n }\n }\n}\n"},"IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated
                          v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface
                          IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that
                          `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when
                          the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval
                          (address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n
                          function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n
                          function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller\u0027s account
                          to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n
                           function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that
                          `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value
                          changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns
                          (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller\u0027s tokens.\n *\n * Returns a boolean
                          value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n
                           * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this
                          race\n * condition is to first reduce the spender\u0027s allowance to 0 and set the\n * desired value afterwards:\n * https://github
                          .com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender,
                          uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism.
                          `amount` is then deducted from the caller\u0027s\n * allowance.\n *\n * Returns a boolean value indicating whether the operation
                          succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n
                          uint256 amount\n ) external returns (bool);\n}\n"},"ILayerZeroEndpoint.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity
                          \u003e=0.5.0;\n\nimport \"./ILayerZeroUserApplicationConfig.sol\";\n\ninterface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig {\n //
                          @notice send a LayerZero message to the specified address at a LayerZero endpoint.\n // @param _dstChainId - the destination chain identifier\n
                           // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains\n // @param _payload - a
                          custom bytes payload to send to the destination contract\n // @param _refundAddress - if the source transaction is cheaper than the amount of
                          value passed, refund the additional amount to this address\n // @param _zroPaymentAddress - the address of the ZRO token holder who would pay
                          for the transaction\n // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on
                          destination\n function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address
                          _zroPaymentAddress, bytes calldata _adapterParams) external payable;\n\n // @notice used by the messaging library to publish verified payload\n
                           // @param _srcChainId - the source chain identifier\n // @param _srcAddress - the source contract (as bytes) at the source chain\n //
                          @param _dstAddress - the address on destination chain\n // @param _nonce - the unbound message ordering nonce\n // @param _gasLimit - the gas
                          limit for external contract execution\n // @param _payload - verified payload to send to the destination contract\n function receivePayload
                          (uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external;\n\n //
                          @notice get the inboundNonce of a lzApp from a source chain which could be EVM or non-EVM chain\n // @param _srcChainId - the source chain
                          identifier\n // @param _srcAddress - the source chain contract address\n function getInboundNonce(uint16 _srcChainId, bytes calldata
                          _srcAddress) external view returns (uint64);\n\n // @notice get the outboundNonce from this source chain which, consequently, is always an EVM\n
                           // @param _srcAddress - the source chain contract address\n function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view
                          returns (uint64);\n\n // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery\n //
                          @param _dstChainId - the destination chain identifier\n // @param _userApplication - the user app address on this EVM chain\n // @param
                          _payload - the custom message to send over LayerZero\n // @param _payInZRO - if false, user app pays the protocol fee in native token\n //
                          @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain\n function estimateFees(uint16
                          _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee
                          , uint zroFee);\n\n // @notice get this Endpoint\u0027s immutable source identifier\n function getChainId() external view returns (uint16
                          );\n\n // @notice the interface to retry failed message on this Endpoint destination\n // @param _srcChainId - the source chain identifier\n
                           // @param _srcAddress - the source chain contract address\n // @param _payload - the payload to be retried\n function retryPayload(uint16
                          _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external;\n\n // @notice query if any STORED payload (message blocking) at the
                          endpoint.\n // @param _srcChainId - the source chain identifier\n // @param _srcAddress - the source chain contract address\n function
                          hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool);\n\n // @notice query if the _libraryAddress is
                          valid for sending msgs.\n // @param _userApplication - the user app address on this EVM chain\n function getSendLibraryAddress(address
                          _userApplication) external view returns (address);\n\n // @notice query if the _libraryAddress is valid for receiving msgs.\n // @param
                          _userApplication - the user app address on this EVM chain\n function getReceiveLibraryAddress(address _userApplication) external view returns
                          (address);\n\n // @notice query if the non-reentrancy guard for send() is on\n // @return true if the guard is on. false otherwise\n
                          function isSendingPayload() external view returns (bool);\n\n // @notice query if the non-reentrancy guard for receive() is on\n // @return
                          true if the guard is on. false otherwise\n function isReceivingPayload() external view returns (bool);\n\n // @notice get the configuration
                          of the LayerZero messaging library of the specified version\n // @param _version - messaging library version\n // @param _chainId - the
                          chainId for the pending config change\n // @param _userApplication - the contract address of the user application\n // @param _configType -
                          type of configuration. every messaging library has its own convention.\n function getConfig(uint16 _version, uint16 _chainId, address
                          _userApplication, uint _configType) external view returns (bytes memory);\n\n // @notice get the send() LayerZero messaging library version\n
                           // @param _userApplication - the contract address of the user application\n function getSendVersion(address _userApplication) external view
                          returns (uint16);\n\n // @notice get the lzReceive() LayerZero messaging library version\n // @param _userApplication - the contract address
                          of the user application\n function getReceiveVersion(address _userApplication) external view returns (uint16);\n}\n"},"ILayerZeroReceiver.sol"
                          :{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity \u003e=0.5.0;\n\ninterface ILayerZeroReceiver {\n // @notice LayerZero endpoint
                          will invoke this function to deliver the message on the destination\n // @param _srcChainId - the source endpoint identifier\n // @param
                          _srcAddress - the source sending contract address from the source chain\n // @param _nonce - the ordered message nonce\n // @param _payload -
                          the signed payload is the UA bytes has encoded to be sent\n function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce,
                          bytes calldata _payload) external;\n}\n"},"ILayerZeroUserApplicationConfig.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity
                          \u003e=0.5.0;\n\ninterface ILayerZeroUserApplicationConfig {\n // @notice set the configuration of the LayerZero messaging library of the
                          specified version\n // @param _version - messaging library version\n // @param _chainId - the chainId for the pending config change\n //
                          @param _configType - type of configuration. every messaging library has its own convention.\n // @param _config - configuration in the bytes.
                          can encode arbitrary content.\n function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external;\n\n
                          // @notice set the send() LayerZero messaging library version to _version\n // @param _version - new messaging library version\n function
                          setSendVersion(uint16 _version) external;\n\n // @notice set the lzReceive() LayerZero messaging library version to _version\n // @param
                          _version - new messaging library version\n function setReceiveVersion(uint16 _version) external;\n\n // @notice Only when the UA needs to
                          resume the message flow in blocking mode and clear the stored payload\n // @param _srcChainId - the chainId of the source chain\n // @param
                          _srcAddress - the contract address of the source contract at the source chain\n function forceResumeReceive(uint16 _srcChainId, bytes calldata
                          _srcAddress) external;\n}\n"},"ITokenBridge.sol":{"content":"// SPDX-License-Identifier: BUSL-1.1\n\npragma solidity \u003e=0.6.0;\npragma
                          experimental ABIEncoderV2;\n\nimport \"./LzLib.sol\";\n\ninterface ITokenBridge {\n enum PacketType {\n SEND_TO_APTOS,\n
                          RECEIVE_FROM_APTOS\n }\n\n function sendToAptos(\n address _token,\n bytes32 _toAddress,\n uint _amountLD,\n
                          LzLib.CallParams calldata _callParams,\n bytes calldata _adapterParams\n ) external payable;\n\n function sendETHToAptos(\n
                          bytes32 _toAddress,\n uint _amountLD,\n LzLib.CallParams calldata _callParams,\n bytes calldata _adapterParams\n ) external
                          payable;\n\n function quoteForSend(LzLib.CallParams calldata _callParams, bytes calldata _adapterParams)\n external\n view\n
                           returns (uint nativeFee, uint zroFee);\n\n event Send(address indexed token, address indexed from, bytes32 indexed to, uint amountLD);\n
                          event Receive(address indexed token, address indexed to, uint amountLD);\n event RegisterToken(address token);\n event SetBridgeBP(uint
                          bridgeFeeBP);\n event SetWETH(address weth);\n event SetGlobalPause(bool paused);\n event SetTokenPause(address token, bool paused);\n
                          event SetLocalChainId(uint16 localChainId);\n event SetAptosChainId(uint16 aptosChainId);\n event SetUseCustomAdapterParams(bool
                          useCustomAdapterParams);\n event WithdrawFee(address indexed token, address to, uint amountLD);\n event WithdrawTVL(address indexed token,
                          address to, uint amountLD);\n event EnableEmergencyWithdraw(bool enabled, uint unlockTime);\n}\n"},"IWETH.sol":{"content":"// SPDX-License
                          -Identifier: BUSL-1.1\n\npragma solidity \u003e=0.5.0;\n\ninterface IWETH {\n function deposit() external payable;\n\n function transfer
                          (address to, uint value) external returns (bool);\n\n function withdraw(uint) external;\n\n function approve(address to, uint value) external
                          returns (bool);\n}\n"},"LzApp.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./Ownable.sol\";\nimport \"
                          ./ILayerZeroReceiver.sol\";\nimport \"./ILayerZeroUserApplicationConfig.sol\";\nimport \"./ILayerZeroEndpoint.sol\";\nimport \"./BytesLib.sol\"
                          ;\n\n/*\n * a generic LzReceiver implementation\n */\nabstract contract LzApp is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig {\n
                           using BytesLib for bytes;\n\n ILayerZeroEndpoint public immutable lzEndpoint;\n mapping(uint16 =\u003e bytes) public trustedRemoteLookup;\n
                           mapping(uint16 =\u003e mapping(uint16 =\u003e uint)) public minDstGasLookup;\n address public precrime;\n\n event SetPrecrime(address
                          precrime);\n event SetTrustedRemote(uint16 _remoteChainId, bytes _path);\n event SetTrustedRemoteAddress(uint16 _remoteChainId, bytes
                          _remoteAddress);\n event SetMinDstGas(uint16 _dstChainId, uint16 _type, uint _minDstGas);\n\n constructor(address _endpoint) {\n
                          lzEndpoint = ILayerZeroEndpoint(_endpoint);\n }\n\n function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes
                          calldata _payload) public virtual override {\n // lzReceive must be called by the endpoint for security\n require(_msgSender() ==
                          address(lzEndpoint), \"LzApp: invalid endpoint caller\");\n\n bytes memory trustedRemote = trustedRemoteLookup[_srcChainId];\n // if
                          will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote.\n require(_srcAddress
                          .length == trustedRemote.length \u0026\u0026 trustedRemote.length \u003e 0 \u0026\u0026 keccak256(_srcAddress) == keccak256(trustedRemote), \"LzApp
                          : invalid source sending contract\");\n\n _blockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);\n }\n\n // abstract function
                          - the default behaviour of LayerZero is blocking. See: NonblockingLzApp if you dont need to enforce ordered messaging\n function
                          _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual;\n\n function _lzSend
                          (uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams, uint
                          _nativeFee) internal virtual {\n bytes memory trustedRemote = trustedRemoteLookup[_dstChainId];\n require(trustedRemote.length != 0,
                          \"LzApp: destination chain is not a trusted source\");\n lzEndpoint.send{value: _nativeFee}(_dstChainId, trustedRemote, _payload,
                          _refundAddress, _zroPaymentAddress, _adapterParams);\n }\n\n function _checkGasLimit(uint16 _dstChainId, uint16 _type, bytes memory
                          _adapterParams, uint _extraGas) internal view virtual {\n uint providedGasLimit = _getGasLimit(_adapterParams);\n uint minGasLimit =
                          minDstGasLookup[_dstChainId][_type] + _extraGas;\n require(minGasLimit \u003e 0, \"LzApp: minGasLimit not set\");\n require
                          (providedGasLimit \u003e= minGasLimit, \"LzApp: gas limit is too low\");\n }\n\n function _getGasLimit(bytes memory _adapterParams) internal
                          pure virtual returns (uint gasLimit) {\n require(_adapterParams.length \u003e= 34, \"LzApp: invalid adapterParams\");\n assembly {\n
                           gasLimit := mload(add(_adapterParams, 34))\n }\n }\n\n //---------------------------UserApplication config
                          ----------------------------------------\n function getConfig(uint16 _version, uint16 _chainId, address, uint _configType) external view returns
                          (bytes memory) {\n return lzEndpoint.getConfig(_version, _chainId, address(this), _configType);\n }\n\n // generic config for
                          LayerZero user Application\n function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external override
                          onlyOwner {\n lzEndpoint.setConfig(_version, _chainId, _configType, _config);\n }\n\n function setSendVersion(uint16 _version)
                          external override onlyOwner {\n lzEndpoint.setSendVersion(_version);\n }\n\n function setReceiveVersion(uint16 _version) external
                          override onlyOwner {\n lzEndpoint.setReceiveVersion(_version);\n }\n\n function forceResumeReceive(uint16 _srcChainId, bytes calldata
                          _srcAddress) external override onlyOwner {\n lzEndpoint.forceResumeReceive(_srcChainId, _srcAddress);\n }\n\n // _path = abi
                          .encodePacked(remoteAddress, localAddress)\n // this function set the trusted path for the cross-chain communication\n function
                          setTrustedRemote(uint16 _srcChainId, bytes calldata _path) external onlyOwner {\n trustedRemoteLookup[_srcChainId] = _path;\n emit
                          SetTrustedRemote(_srcChainId, _path);\n }\n\n function setTrustedRemoteAddress(uint16 _remoteChainId, bytes calldata _remoteAddress) external
                          onlyOwner {\n trustedRemoteLookup[_remoteChainId] = abi.encodePacked(_remoteAddress, address(this));\n emit SetTrustedRemoteAddress
                          (_remoteChainId, _remoteAddress);\n }\n\n function getTrustedRemoteAddress(uint16 _remoteChainId) external view returns (bytes memory) {\n
                           bytes memory path = trustedRemoteLookup[_remoteChainId];\n require(path.length != 0, \"LzApp: no trusted path record\");\n
                          return path.slice(0, path.length - 20); // the last 20 bytes should be address(this)\n }\n\n function setPrecrime(address _precrime) external
                          onlyOwner {\n precrime = _precrime;\n emit SetPrecrime(_precrime);\n }\n\n function setMinDstGas(uint16 _dstChainId, uint16
                          _packetType, uint _minGas) external onlyOwner {\n require(_minGas \u003e 0, \"LzApp: invalid minGas\");\n
                          minDstGasLookup[_dstChainId][_packetType] = _minGas;\n emit SetMinDstGas(_dstChainId, _packetType, _minGas);\n }\n\n
                          //--------------------------- VIEW FUNCTION ----------------------------------------\n function isTrustedRemote(uint16 _srcChainId, bytes
                          calldata _srcAddress) external view returns (bool) {\n bytes memory trustedSource = trustedRemoteLookup[_srcChainId];\n return
                          keccak256(trustedSource) == keccak256(_srcAddress);\n }\n}\n"},"LzLib.sol":{"content":"// SPDX-License-Identifier: BUSL-1.1\n\npragma solidity
                          \u003e=0.6.0;\npragma experimental ABIEncoderV2;\n\nlibrary LzLib {\n // LayerZero communication\n struct CallParams {\n address
                          payable refundAddress;\n address zroPaymentAddress;\n }\n\n
                          //---------------------------------------------------------------------------\n // Address type handling\n\n struct AirdropParams {\n
                          uint airdropAmount;\n bytes32 airdropAddress;\n }\n\n function buildAdapterParams(LzLib.AirdropParams memory _airdropParams, uint
                          _uaGasLimit) internal pure returns (bytes memory adapterParams) {\n if (_airdropParams.airdropAmount == 0 \u0026\u0026 _airdropParams
                          .airdropAddress == bytes32(0x0)) {\n adapterParams = buildDefaultAdapterParams(_uaGasLimit);\n } else {\n
                          adapterParams = buildAirdropAdapterParams(_uaGasLimit, _airdropParams);\n }\n }\n\n // Build Adapter Params\n function
                          buildDefaultAdapterParams(uint _uaGas) internal pure returns (bytes memory) {\n // txType 1\n // bytes [2 32 ]\n
                          // fields [txType extraGas]\n return abi.encodePacked(uint16(1), _uaGas);\n }\n\n function buildAirdropAdapterParams(uint _uaGas,
                          AirdropParams memory _params) internal pure returns (bytes memory) {\n require(_params.airdropAmount \u003e 0, \"Airdrop amount must be
                          greater than 0\");\n require(_params.airdropAddress != bytes32(0x0), \"Airdrop address must be set\");\n\n // txType 2\n //
                          bytes [2 32 32 bytes[] ]\n // fields [txType extraGas dstNativeAmt dstNativeAddress]\n return abi
                          .encodePacked(uint16(2), _uaGas, _params.airdropAmount, _params.airdropAddress);\n }\n\n function getGasLimit(bytes memory _adapterParams)
                          internal pure returns (uint gasLimit) {\n require(_adapterParams.length == 34 || _adapterParams.length \u003e 66, \"Invalid adapterParams\"
                          );\n assembly {\n gasLimit := mload(add(_adapterParams, 34))\n }\n }\n\n // Decode Adapter Params\n function
                          decodeAdapterParams(bytes memory _adapterParams) internal pure returns (uint16 txType, uint uaGas, uint airdropAmount, address payable
                          airdropAddress) {\n require(_adapterParams.length == 34 || _adapterParams.length \u003e 66, \"Invalid adapterParams\");\n assembly
                          {\n txType := mload(add(_adapterParams, 2))\n uaGas := mload(add(_adapterParams, 34))\n }\n require(txType == 1
                          || txType == 2, \"Unsupported txType\");\n require(uaGas \u003e 0, \"Gas too low\");\n\n if (txType == 2) {\n assembly {\n
                           airdropAmount := mload(add(_adapterParams, 66))\n airdropAddress := mload(add(_adapterParams, 86))\n }\n
                           }\n }\n\n //---------------------------------------------------------------------------\n // Address type handling\n // TODO:
                          testing\n function bytes32ToAddress(bytes32 _bytes32Address) internal pure returns (address _address) {\n require(bytes12(_bytes32Address
                          ) == bytes12(0), \"Invalid address\"); // first 12 bytes should be empty\n return address(uint160(uint(_bytes32Address)));\n }\n\n
                          function addressToBytes32(address _address) internal pure returns (bytes32 _bytes32Address) {\n return bytes32(uint(uint160(_address)));\n
                           }\n}\n"},"NonblockingLzApp.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./LzApp.sol\";\nimport \"
                          ./ExcessivelySafeCall.sol\";\n\n/*\n * the default LayerZero messaging behaviour is blocking, i.e. any failed message will block the channel\n *
                          this abstract class try-catch all fail messages and store locally for future retry. hence, non-blocking\n * NOTE: if the srcAddress is not
                          configured properly, it will still block the message pathway from (srcChainId, srcAddress)\n */\nabstract contract NonblockingLzApp is LzApp {\n
                           using ExcessivelySafeCall for address;\n\n constructor(address _endpoint) LzApp(_endpoint) {}\n\n mapping(uint16 =\u003e mapping(bytes
                          =\u003e mapping(uint64 =\u003e bytes32))) public failedMessages;\n\n event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce,
                          bytes _payload, bytes _reason);\n event RetryMessageSuccess(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes32 _payloadHash);\n\n
                          // overriding the virtual function in LzReceiver\n function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce,
                          bytes memory _payload) internal virtual override {\n (bool success, bytes memory reason) = address(this).excessivelySafeCall(gasleft(), 150,
                          abi.encodeWithSelector(this.nonblockingLzReceive.selector, _srcChainId, _srcAddress, _nonce, _payload));\n // try-catch all errors
                          /exceptions\n if (!success) {\n failedMessages[_srcChainId][_srcAddress][_nonce] = keccak256(_payload);\n emit
                          MessageFailed(_srcChainId, _srcAddress, _nonce, _payload, reason);\n }\n }\n\n function nonblockingLzReceive(uint16 _srcChainId, bytes
                          calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public virtual {\n // only internal transaction\n require(_msgSender()
                          == address(this), \"NonblockingLzApp: caller must be LzApp\");\n _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);\n
                          }\n\n //@notice override this function\n function _nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes
                          memory _payload) internal virtual;\n\n function retryMessage(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata
                          _payload) public payable virtual {\n // assert there is message to retry\n bytes32 payloadHash =
                          failedMessages[_srcChainId][_srcAddress][_nonce];\n require(payloadHash != bytes32(0), \"NonblockingLzApp: no stored message\");\n
                          require(keccak256(_payload) == payloadHash, \"NonblockingLzApp: invalid payload\");\n // clear the stored message\n
                          failedMessages[_srcChainId][_srcAddress][_nonce] = bytes32(0);\n // execute the message. revert if it fails again\n
                          _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);\n emit RetryMessageSuccess(_srcChainId, _srcAddress, _nonce, payloadHash
                          );\n }\n}\n"},"Ownable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol
                          )\n\npragma solidity ^0.8.0;\n\nimport \"./Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n
                          * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the
                          one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will
                          make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract
                          Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n
                           /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _transferOwnership
                          (_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n
                          _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view
                          virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function
                          _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n *
                          @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current
                          owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only
                          available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n
                           /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n
                           function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero
                          address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`
                          ).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n
                          address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n"},"ReentrancyGuard.sol"
                          :{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\n\n/**\n *
                          @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant}
                          modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because
                          there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n *
                          those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about
                          reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul
                          /[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up
                          a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot\u0027s contents, replace the bits taken up by
                          the boolean, and then write\n // back. This is the compiler\u0027s defense against contract upgrades and\n // pointer aliasing, and it cannot
                          be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to
                          nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction\u0027s gas, it is best to
                          keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant
                          _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor() {\n _status =
                          _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant`
                          function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the
                          `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant()
                          {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\"
                          );\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the
                          original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n
                          }\n}\n"},"SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20
                          .sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./draft-IERC20Permit.sol\";\nimport \"./Address.sol\";\n\n/**\n * @title
                          SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value
                          (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you
                          can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`,
                          etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n function safeTransfer(\n IERC20 token,\n address to,\n
                          uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n
                          function safeTransferFrom(\n IERC20 token,\n address from,\n address to,\n uint256 value\n ) internal {\n
                          _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This
                          function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use
                          {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20 token,\n address
                          spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or
                          when resetting it to zero. To increase and decrease it, use\n // \u0027safeIncreaseAllowance\u0027 and \u0027safeDecreaseAllowance\u0027\n
                           require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non
                          -zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n
                          function safeIncreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n uint256
                          newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector,
                          spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n
                           ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance
                          \u003e= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n
                          _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n function safePermit(\n
                           IERC20Permit token,\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n
                           bytes32 r,\n bytes32 s\n ) internal {\n uint256 nonceBefore = token.nonces(owner);\n token.permit(owner, spender,
                          value, deadline, v, r, s);\n uint256 nonceAfter = token.nonces(owner);\n require(nonceAfter == nonceBefore + 1, \"SafeERC20: permit
                          did not succeed\");\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the
                          requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The
                          token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function
                          _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity\u0027s
                          return data size checking mechanism, since\n // we\u0027re implementing it ourselves. We use {Address.functionCall} to perform this call,
                          which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes
                          memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length \u003e 0) {\n
                           // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n
                          }\n}\n"},"TokenBridge.sol":{"content":"// SPDX-License-Identifier: BUSL-1.1\n\npragma solidity 0.8.15;\n\nimport \"./ReentrancyGuard.sol\";\nimport
                          \"./SafeERC20.sol\";\nimport \"./NonblockingLzApp.sol\";\nimport \"./LzLib.sol\";\n\nimport \"./IWETH.sol\";\nimport \"./ITokenBridge.sol\"
                          ;\n\ncontract TokenBridge is ITokenBridge, NonblockingLzApp, ReentrancyGuard {\n using SafeERC20 for IERC20;\n\n uint public constant
                          BP_DENOMINATOR = 10000;\n uint8 public constant SHARED_DECIMALS = 6;\n\n uint16 public aptosChainId;\n\n uint public bridgeFeeBP;\n\n
                          mapping(address =\u003e uint64) public tvlSDs; // token address =\u003e tvl\n mapping(address =\u003e bool) public supportedTokens;\n mapping
                          (address =\u003e bool) public pausedTokens; // token address =\u003e paused\n mapping(address =\u003e uint) public ld2sdRates; // token address
                          =\u003e rate\n address public weth;\n\n bool public useCustomAdapterParams;\n bool public globalPaused;\n bool public
                          emergencyWithdrawEnabled;\n uint public emergencyWithdrawTime;\n\n modifier whenNotPaused(address _token) {\n require(!globalPaused
                          \u0026\u0026 !pausedTokens[_token], \"TokenBridge: paused\");\n _;\n }\n\n modifier emergencyWithdrawUnlocked() {\n require
                          (emergencyWithdrawEnabled \u0026\u0026 block.timestamp \u003e= emergencyWithdrawTime, \"TokenBridge: emergency withdraw locked\");\n _;\n
                           }\n\n constructor(\n address _layerZeroEndpoint,\n uint16 _aptosChainId\n ) NonblockingLzApp(_layerZeroEndpoint) {\n
                          aptosChainId = _aptosChainId;\n }\n\n function sendToAptos(\n address _token,\n bytes32 _toAddress,\n uint _amountLD,\n
                           LzLib.CallParams calldata _callParams,\n bytes calldata _adapterParams\n ) external payable override whenNotPaused(_token)
                          nonReentrant {\n require(supportedTokens[_token], \"TokenBridge: token is not supported\");\n\n // lock token\n _amountLD =
                          _removeDust(_token, _amountLD);\n _amountLD = _lockTokenFrom(_token, msg.sender, _amountLD);\n\n // add tvl\n uint64 amountSD
                          = _LDtoSD(_token, _amountLD);\n require(amountSD \u003e 0, \"TokenBridge: amountSD must be greater than 0\");\n tvlSDs[_token] +=
                          amountSD;\n\n // send to aptos\n _sendToken(_token, _toAddress, amountSD, _callParams, _adapterParams, msg.value);\n emit Send
                          (_token, msg.sender, _toAddress, _amountLD);\n }\n\n function sendETHToAptos(\n bytes32 _toAddress,\n uint _amountLD,\n
                          LzLib.CallParams calldata _callParams,\n bytes calldata _adapterParams\n ) external payable override whenNotPaused(weth) nonReentrant {\n
                           address _weth = weth; // save gas\n require(_weth != address(0) \u0026\u0026 supportedTokens[_weth], \"TokenBridge: ETH is not
                          supported\");\n _amountLD = _removeDust(_weth, _amountLD);\n require(_amountLD \u003e 0, \"TokenBridge: amount must be greater than
                          0\");\n require(msg.value \u003e= _amountLD, \"TokenBridge: fee not enough\");\n\n // wrap eth and add tvl\n IWETH(_weth
                          ).deposit{value: _amountLD}();\n uint64 amountSD = _LDtoSD(_weth, _amountLD);\n tvlSDs[_weth] += amountSD;\n\n // send to
                          aptos\n _sendToken(_weth, _toAddress, amountSD, _callParams, _adapterParams, msg.value - _amountLD);\n emit Send(address(0), msg
                          .sender, _toAddress, _amountLD);\n }\n\n function quoteForSend(LzLib.CallParams calldata _callParams, bytes calldata _adapterParams)\n
                           external\n view\n returns (uint nativeFee, uint zroFee)\n {\n _checkAdapterParams(_adapterParams);\n bytes memory
                          payload = _encodeSendPayload(address(0), bytes32(0), 0);\n bool payInZRO = _callParams.zroPaymentAddress != address(0);\n return\n
                           lzEndpoint.estimateFees(aptosChainId, address(this), payload, payInZRO, _adapterParams);\n }\n\n // ---------------------- owner
                          functions ----------------------\n function registerToken(address _token) external onlyOwner {\n require(_token != address(0),
                          \"TokenBridge: invalid token address\");\n require(!supportedTokens[_token], \"TokenBridge: token already registered\");\n\n uint8
                          localDecimals = _tokenDecimals(_token);\n require(\n localDecimals \u003e= SHARED_DECIMALS,\n \"TokenBridge: decimals
                          must be \u003e= SHARED_DECIMALS\"\n );\n\n supportedTokens[_token] = true;\n ld2sdRates[_token] = 10**(localDecimals -
                          SHARED_DECIMALS);\n emit RegisterToken(_token);\n }\n\n function setBridgeFeeBP(uint _bridgeFeeBP) external onlyOwner {\n
                          require(_bridgeFeeBP \u003c= BP_DENOMINATOR, \"TokenBridge: bridge fee \u003e 100%\");\n bridgeFeeBP = _bridgeFeeBP;\n emit
                          SetBridgeBP(_bridgeFeeBP);\n }\n\n function setWETH(address _weth) external onlyOwner {\n require(_weth != address(0), \"TokenBridge:
                          invalid token address\");\n weth = _weth;\n emit SetWETH(_weth);\n }\n\n function setGlobalPause(bool _paused) external
                          onlyOwner {\n globalPaused = _paused;\n emit SetGlobalPause(_paused);\n }\n\n function setTokenPause(address _token, bool
                          _paused) external onlyOwner {\n pausedTokens[_token] = _paused;\n emit SetTokenPause(_token, _paused);\n }\n\n function
                          setAptosChainId(uint16 _aptosChainId) external onlyOwner {\n aptosChainId = _aptosChainId;\n emit SetAptosChainId(_aptosChainId);\n
                           }\n\n function setUseCustomAdapterParams(bool _useCustomAdapterParams) external onlyOwner {\n useCustomAdapterParams =
                          _useCustomAdapterParams;\n emit SetUseCustomAdapterParams(_useCustomAdapterParams);\n }\n\n function withdrawFee(\n address
                          _token,\n address _to,\n uint _amountLD\n ) public onlyOwner {\n uint feeLD = accruedFeeLD(_token);\n require
                          (_amountLD \u003c= feeLD, \"TokenBridge: fee not enough\");\n\n IERC20(_token).safeTransfer(_to, _amountLD);\n emit WithdrawFee
                          (_token, _to, _amountLD);\n }\n\n function withdrawTVL(\n address _token,\n address _to,\n uint64 _amountSD\n )
                          public onlyOwner emergencyWithdrawUnlocked {\n tvlSDs[_token] -= _amountSD;\n\n uint amountLD = _SDtoLD(_token, _amountSD);\n
                          IERC20(_token).safeTransfer(_to, amountLD);\n emit WithdrawTVL(_token, _to, amountLD);\n }\n\n function withdrawEmergency(address
                          _token, address _to) external onlyOwner {\n // modifier redundant for extra safety\n withdrawFee(_token, _to, accruedFeeLD(_token
                          ));\n withdrawTVL(_token, _to, tvlSDs[_token]);\n }\n\n function enableEmergencyWithdraw(bool enabled) external onlyOwner {\n
                          emergencyWithdrawEnabled = enabled;\n emergencyWithdrawTime = enabled ? block.timestamp + 1 weeks : 0; // overrides existing lock time\n
                           emit EnableEmergencyWithdraw(enabled, emergencyWithdrawTime);\n }\n\n // override the renounce ownership inherited by zeppelin ownable\n
                           function renounceOwnership() public override onlyOwner {}\n\n // receive ETH from WETH\n receive() external payable {}\n\n function
                          accruedFeeLD(address _token) public view returns (uint) {\n uint tvlLD = _SDtoLD(_token, tvlSDs[_token]);\n return IERC20(_token
                          ).balanceOf(address(this)) - tvlLD;\n }\n\n // ---------------------- internal functions ----------------------\n function
                          _nonblockingLzReceive(\n uint16 _srcChainId,\n bytes memory,\n uint64,\n bytes memory _payload\n ) internal override
                          {\n require(_srcChainId == aptosChainId, \"TokenBridge: invalid source chain id\");\n\n (address token, address to, uint64 amountSD,
                          bool unwrap) = _decodeReceivePayload(_payload);\n require(!globalPaused \u0026\u0026 !pausedTokens[token], \"TokenBridge: paused\");\n
                           require(supportedTokens[token], \"TokenBridge: token is not supported\");\n\n // sub tvl\n uint64 tvlSD = tvlSDs[token];\n
                          require(tvlSD \u003e= amountSD, \"TokenBridge: insufficient liquidity\");\n tvlSDs[token] = tvlSD - amountSD;\n\n // pay fee\n
                           uint amountLD = _SDtoLD(token, amountSD);\n (amountLD, ) = bridgeFeeBP \u003e 0 ? _payFee(amountLD) : (amountLD, 0);\n\n // redeem
                          token to receiver\n if (token == weth \u0026\u0026 unwrap) {\n _redeemETHTo(weth, payable(to), amountLD);\n emit
                          Receive(address(0), to, amountLD);\n } else {\n to = to == address(0) ? address(0xdEaD) : to; // avoid failure in safeTransfer
                          ()\n IERC20(token).safeTransfer(to, amountLD);\n emit Receive(token, to, amountLD);\n }\n }\n\n function
                          _redeemETHTo(\n address _weth,\n address payable _to,\n uint _amountLD\n ) internal {\n IWETH(_weth).withdraw
                          (_amountLD);\n _to.transfer(_amountLD);\n }\n\n function _lockTokenFrom(\n address _token,\n address _from,\n
                          uint _amountLD\n ) internal returns (uint) {\n // support token with transfer fee\n uint balanceBefore = IERC20(_token).balanceOf
                          (address(this));\n IERC20(_token).safeTransferFrom(_from, address(this), _amountLD);\n uint balanceAfter = IERC20(_token).balanceOf
                          (address(this));\n return balanceAfter - balanceBefore;\n }\n\n function _tokenDecimals(address _token) internal view returns (uint8)
                          {\n (bool success, bytes memory data) = _token.staticcall(\n abi.encodeWithSignature(\"decimals()\")\n );\n require
                          (success, \"TokenBridge: failed to get token decimals\");\n return abi.decode(data, (uint8));\n }\n\n function _payFee(uint _amountLD)
                          internal view returns (uint amountAfterFee, uint fee) {\n fee = (_amountLD * bridgeFeeBP) / BP_DENOMINATOR;\n amountAfterFee =
                          _amountLD - fee;\n }\n\n function _sendToken(\n address _token,\n bytes32 _toAddress,\n uint64 _amountSD,\n LzLib
                          .CallParams calldata _callParams,\n bytes calldata _adapterParams,\n uint _fee\n ) internal {\n _checkAdapterParams
                          (_adapterParams);\n bytes memory payload = _encodeSendPayload(_token, _toAddress, _amountSD);\n _lzSend(\n aptosChainId,\n
                           payload,\n _callParams.refundAddress,\n _callParams.zroPaymentAddress,\n _adapterParams,\n
                          _fee\n );\n }\n\n // send payload: packet type(1) + remote token(32) + receiver(32) + amount(8)\n function _encodeSendPayload(\n
                           address _token,\n bytes32 _toAddress,\n uint64 _amountSD\n ) internal pure returns (bytes memory) {\n bytes32
                          tokenBytes32 = LzLib.addressToBytes32(_token);\n return\n abi.encodePacked(uint8(PacketType.SEND_TO_APTOS), tokenBytes32,
                          _toAddress, _amountSD);\n }\n\n // receive payload: packet type(1) + remote token(32) + receiver(32) + amount(8) + unwrap flag(1)\n
                          function _decodeReceivePayload(bytes memory _payload)\n internal\n pure\n returns (\n address token,\n
                          address to,\n uint64 amountSD,\n bool unwrap\n )\n {\n require(_payload.length == 74, \"TokenBridge: invalid
                          payload length\");\n PacketType packetType = PacketType(uint8(_payload[0]));\n require(packetType == PacketType.RECEIVE_FROM_APTOS,
                          \"TokenBridge: unknown packet type\");\n assembly {\n token := mload(add(_payload, 33))\n to := mload(add(_payload, 65
                          ))\n amountSD := mload(add(_payload, 73))\n }\n unwrap = uint8(_payload[73]) == 1;\n }\n\n function
                          _checkAdapterParams(bytes calldata _adapterParams) internal view {\n if (useCustomAdapterParams) {\n _checkGasLimit(aptosChainId,
                          uint16(PacketType.SEND_TO_APTOS), _adapterParams, 0);\n } else {\n require(_adapterParams.length == 0, \"TokenBridge:
                          _adapterParams must be empty.\");\n }\n }\n\n function _SDtoLD(address _token, uint64 _amountSD) internal view returns (uint) {\n
                           return _amountSD * ld2sdRates[_token];\n }\n\n function _LDtoSD(address _token, uint _amountLD) internal view returns (uint64) {\n
                          uint amountSD = _amountLD / ld2sdRates[_token];\n require(amountSD \u003c= type(uint64).max, \"TokenBridge: amountSD overflow\");\n
                          return uint64(amountSD);\n }\n\n function _removeDust(address _token, uint _amountLD) internal view returns (uint) {\n return _SDtoLD
                          (_token, _LDtoSD(_token, _amountLD));\n }\n}\n"}}
                      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                      File 2 of 9: WETH9
                      1
                      2
                      3
                      4
                      5
                      6
                      7
                      8
                      9
                      10
                      11
                      12
                      13
                      14
                      15
                      16
                      // Copyright (C) 2015, 2016, 2017 Dapphub
                      // This program is free software: you can redistribute it and/or modify
                      // it under the terms of the GNU General Public License as published by
                      // the Free Software Foundation, either version 3 of the License, or
                      // (at your option) any later version.
                      // This program is distributed in the hope that it will be useful,
                      // but WITHOUT ANY WARRANTY; without even the implied warranty of
                      // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
                      // GNU General Public License for more details.
                      // You should have received a copy of the GNU General Public License
                      // along with this program. If not, see <http://www.gnu.org/licenses/>.
                      pragma solidity ^0.4.18;
                      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                      File 3 of 9: OptimizedTransparentUpgradeableProxy
                      1
                      2
                      3
                      4
                      5
                      6
                      7
                      8
                      9
                      10
                      11
                      12
                      13
                      14
                      15
                      16
                      // SPDX-License-Identifier: MIT
                      pragma solidity ^0.7.0;
                      /**
                      * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
                      * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to
                      * be specified by overriding the virtual {_implementation} function.
                      *
                      * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
                      * different contract through the {_delegate} function.
                      *
                      * The success and return data of the delegated call will be returned back to the caller of the proxy.
                      */
                      abstract contract Proxy {
                      /**
                      * @dev Delegates the current call to `implementation`.
                      *
                      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                      File 4 of 9: UltraLightNodeV2
                      1
                      {"Address.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.7.0;\n\n/**\n * @dev Collection of functions related to the address
                          type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is
                          unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n
                           * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n
                           * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was
                          destroyed\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on
                          extcodesize, which returns 0 for contracts in\n // construction, since the code is only stored at the end of the\n // constructor
                          execution.\n\n uint256 size;\n // solhint-disable-next-line no-inline-assembly\n assembly { size := extcodesize(account) }\n
                           return size \u003e 0;\n }\n\n /**\n * @dev Replacement for Solidity\u0027s `transfer`: sends `amount` wei to\n * `recipient`,
                          forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n
                           * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds
                          via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys
                          -transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create
                          reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security
                          -considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address
                          payable recipient, uint256 amount) internal {\n require(address(this).balance \u003e= amount, \"Address: insufficient balance\");\n\n
                           // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\n (bool success, ) = recipient.call{ value: amount }(\"\");\n
                          require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call
                          using a low level `call`. A\n * plain`call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If
                          `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns
                          the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables
                          .html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a
                          contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall
                          (address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\"
                          );\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback
                          revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data,
                          string memory errorMessage) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n
                          /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n
                          *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function
                          must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256
                          value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\"
                          );\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with
                          `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function
                          functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\n
                          require(address(this).balance \u003e= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to
                          non-contract\");\n\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, bytes memory returndata) = target.call{
                          value: value }(data);\n return _verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address
                          -functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function
                          functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data,
                          \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string
                          -}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address
                          target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\n require(isContract(target), \"Address:
                          static call to non-contract\");\n\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, bytes memory returndata) =
                          target.staticcall(data);\n return _verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address
                          -functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n
                          function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target,
                          data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string
                          -}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall
                          (address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\n require(isContract(target), \"Address:
                          delegate call to non-contract\");\n\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, bytes memory returndata) =
                          target.delegatecall(data);\n return _verifyCallResult(success, returndata, errorMessage);\n }\n\n function _verifyCallResult(bool
                          success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\n if (success) {\n return
                          returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length \u003e 0) {\n
                           // The easiest way to bubble the revert reason is using memory via assembly\n\n // solhint-disable-next-line no-inline
                          -assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata
                          ), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n"},"Buffer
                          .sol":{"content":"// SPDX-License-Identifier: BUSL-1.1\n\n// https://github.com/ensdomains/buffer\n\npragma solidity ^0.7.0;\n\n/**\n * @dev A
                          library for working with mutable byte buffers in Solidity.\n *\n * Byte buffers are mutable and expandable, and provide a variety of primitives\n *
                          for writing to them. At any time you can fetch a bytes object containing the\n * current contents of the buffer. The bytes object should not be
                          stored between\n * operations, as it may change due to resizing of the buffer.\n */\nlibrary Buffer {\n /**\n * @dev Represents a mutable
                          buffer. Buffers have a current value (buf) and\n * a capacity. The capacity may be longer than the current value, in\n * which
                          case it can be extended without the need to allocate more memory.\n */\n struct buffer {\n bytes buf;\n uint capacity;\n
                          }\n\n /**\n * @dev Initializes a buffer with an initial capacity.a co\n * @param buf The buffer to initialize.\n * @param capacity
                          The number of bytes of space to allocate the buffer.\n * @return The buffer, for chaining.\n */\n function init(buffer memory buf, uint
                          capacity) internal pure returns (buffer memory) {\n if (capacity % 32 != 0) {\n capacity += 32 - (capacity % 32);\n }\n
                           // Allocate space for the buffer data\n buf.capacity = capacity;\n assembly {\n let ptr := mload(0x40)\n
                          mstore(buf, ptr)\n mstore(ptr, 0)\n mstore(0x40, add(32, add(ptr, capacity)))\n }\n return buf;\n }\n\n\n
                           /**\n * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf
                          The buffer to append to.\n * @param off The start offset to write to.\n * @param rawData The data to append.\n * @param len The number
                          of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function writeRawBytes(\n buffer memory buf,\n
                          uint off,\n bytes memory rawData,\n uint offData,\n uint len\n ) internal pure returns (buffer memory) {\n if (off +
                          len \u003e buf.capacity) {\n resize(buf, max(buf.capacity, len + off) * 2);\n }\n\n uint dest;\n uint src;\n
                           assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer
                          data\n let buflen := mload(bufptr)\n // Start address = buffer address + offset + sizeof(buffer length)\n dest :=
                          add(add(bufptr, 32), off)\n // Update buffer length if we\u0027re extending it\n if gt(add(len, off), buflen) {\n
                           mstore(bufptr, add(len, off))\n }\n src := add(rawData, offData)\n }\n\n // Copy word-length chunks while
                          possible\n for (; len \u003e= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n
                           dest += 32;\n src += 32;\n }\n\n // Copy remaining bytes\n uint mask = 256**(32 - len) - 1;\n assembly {\n
                           let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart,
                          srcpart))\n }\n\n return buf;\n }\n\n /**\n * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\n
                           * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The start offset to write to.\n * @param
                          data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function
                          write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns (buffer memory) {\n require(len \u003c= data.length
                          );\n\n if (off + len \u003e buf.capacity) {\n resize(buf, max(buf.capacity, len + off) * 2);\n }\n\n uint dest;\n
                           uint src;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of
                          existing buffer data\n let buflen := mload(bufptr)\n // Start address = buffer address + offset + sizeof(buffer length)\n
                           dest := add(add(bufptr, 32), off)\n // Update buffer length if we\u0027re extending it\n if gt(add(len, off), buflen) {\n
                           mstore(bufptr, add(len, off))\n }\n src := add(data, 32)\n }\n\n // Copy word-length chunks while
                          possible\n for (; len \u003e= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n
                           dest += 32;\n src += 32;\n }\n\n // Copy remaining bytes\n uint mask = 256**(32 - len) - 1;\n assembly {\n
                           let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart,
                          srcpart))\n }\n\n return buf;\n }\n\n function append(buffer memory buf, bytes memory data) internal pure returns (buffer
                          memory) {\n return write(buf, buf.buf.length, data, data.length);\n }\n\n function resize(buffer memory buf, uint capacity) private
                          pure {\n bytes memory oldbuf = buf.buf;\n init(buf, capacity);\n append(buf, oldbuf);\n }\n\n function max(uint a, uint
                          b) private pure returns (uint) {\n if (a \u003e b) {\n return a;\n }\n return b;\n }\n}\n"},"Context.sol"
                          :{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity \u003e=0.6.0 \u003c0.8.0;\n\n/*\n * @dev Provides information about the current
                          execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data,
                          they should not be accessed in such a direct\n * manner, since when dealing with GSN meta-transactions the account sending and\n * paying for
                          execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate,
                          library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address payable) {\n
                          return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes memory) {\n this; // silence state mutability
                          warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\n return msg.data;\n }\n}\n"},"IERC20.sol"
                          :{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.7.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n
                          */\ninterface IERC20 {\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns
                          (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view
                          returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller\u0027s account to `recipient`.\n *\n * Returns a boolean
                          value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address recipient,
                          uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to
                          spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or
                          {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n *
                          @dev Sets `amount` as the allowance of `spender` over the caller\u0027s tokens.\n *\n * Returns a boolean value indicating whether the
                          operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use
                          both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to
                          first reduce the spender\u0027s allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues
                          /20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external
                          returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\n * allowance mechanism. `amount` is then
                          deducted from the caller\u0027s\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n
                           * Emits a {Transfer} event.\n */\n function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\n\n
                           /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may
                          be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance
                          of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed
                          owner, address indexed spender, uint256 value);\n}\n"},"ILayerZeroEndpoint.sol":{"content":"// SPDX-License-Identifier: BUSL-1.1\n\npragma solidity
                          \u003e=0.5.0;\n\nimport \"./ILayerZeroUserApplicationConfig.sol\";\n\ninterface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig {\n //
                          @notice send a LayerZero message to the specified address at a LayerZero endpoint.\n // @param _dstChainId - the destination chain identifier\n
                           // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains\n // @param _payload - a
                          custom bytes payload to send to the destination contract\n // @param _refundAddress - if the source transaction is cheaper than the amount of
                          value passed, refund the additional amount to this address\n // @param _zroPaymentAddress - the address of the ZRO token holder who would pay
                          for the transaction\n // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on
                          destination\n function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address
                          _zroPaymentAddress, bytes calldata _adapterParams) external payable;\n\n // @notice used by the messaging library to publish verified payload\n
                           // @param _srcChainId - the source chain identifier\n // @param _srcAddress - the source contract (as bytes) at the source chain\n //
                          @param _dstAddress - the address on destination chain\n // @param _nonce - the unbound message ordering nonce\n // @param _gasLimit - the gas
                          limit for external contract execution\n // @param _payload - verified payload to send to the destination contract\n function receivePayload
                          (uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external;\n\n //
                          @notice get the inboundNonce of a receiver from a source chain which could be EVM or non-EVM chain\n // @param _srcChainId - the source chain
                          identifier\n // @param _srcAddress - the source chain contract address\n function getInboundNonce(uint16 _srcChainId, bytes calldata
                          _srcAddress) external view returns (uint64);\n\n // @notice get the outboundNonce from this source chain which, consequently, is always an EVM\n
                           // @param _srcAddress - the source chain contract address\n function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view
                          returns (uint64);\n\n // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery\n //
                          @param _dstChainId - the destination chain identifier\n // @param _userApplication - the user app address on this EVM chain\n // @param
                          _payload - the custom message to send over LayerZero\n // @param _payInZRO - if false, user app pays the protocol fee in native token\n //
                          @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain\n function estimateFees(uint16
                          _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee
                          , uint zroFee);\n\n // @notice get this Endpoint\u0027s immutable source identifier\n function getChainId() external view returns (uint16
                          );\n\n // @notice the interface to retry failed message on this Endpoint destination\n // @param _srcChainId - the source chain identifier\n
                           // @param _srcAddress - the source chain contract address\n // @param _payload - the payload to be retried\n function retryPayload(uint16
                          _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external;\n\n // @notice query if any STORED payload (message blocking) at the
                          endpoint.\n // @param _srcChainId - the source chain identifier\n // @param _srcAddress - the source chain contract address\n function
                          hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool);\n\n // @notice query if the _libraryAddress is
                          valid for sending msgs.\n // @param _userApplication - the user app address on this EVM chain\n function getSendLibraryAddress(address
                          _userApplication) external view returns (address);\n\n // @notice query if the _libraryAddress is valid for receiving msgs.\n // @param
                          _userApplication - the user app address on this EVM chain\n function getReceiveLibraryAddress(address _userApplication) external view returns
                          (address);\n\n // @notice query if the non-reentrancy guard for send() is on\n // @return true if the guard is on. false otherwise\n
                          function isSendingPayload() external view returns (bool);\n\n // @notice query if the non-reentrancy guard for receive() is on\n // @return
                          true if the guard is on. false otherwise\n function isReceivingPayload() external view returns (bool);\n\n // @notice get the configuration
                          of the LayerZero messaging library of the specified version\n // @param _version - messaging library version\n // @param _chainId - the
                          chainId for the pending config change\n // @param _userApplication - the contract address of the user application\n // @param _configType -
                          type of configuration. every messaging library has its own convention.\n function getConfig(uint16 _version, uint16 _chainId, address
                          _userApplication, uint _configType) external view returns (bytes memory);\n\n // @notice get the send() LayerZero messaging library version\n
                           // @param _userApplication - the contract address of the user application\n function getSendVersion(address _userApplication) external view
                          returns (uint16);\n\n // @notice get the lzReceive() LayerZero messaging library version\n // @param _userApplication - the contract address
                          of the user application\n function getReceiveVersion(address _userApplication) external view returns (uint16);\n}\n"}
                          ,"ILayerZeroMessagingLibrary.sol":{"content":"// SPDX-License-Identifier: BUSL-1.1\n\npragma solidity \u003e=0.7.0;\n\nimport \"
                          ./ILayerZeroUserApplicationConfig.sol\";\n\ninterface ILayerZeroMessagingLibrary {\n // send(), messages will be inflight.\n function send
                          (address _userApplication, uint64 _lastNonce, uint16 _chainId, bytes calldata _destination, bytes calldata _payload, address payable refundAddress,
                          address _zroPaymentAddress, bytes calldata _adapterParams) external payable;\n\n // estimate native fee at the send side\n function
                          estimateFees(uint16 _chainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view
                          returns (uint nativeFee, uint zroFee);\n\n //---------------------------------------------------------------------------\n // setConfig /
                          getConfig are User Application (UA) functions to specify Oracle, Relayer, blockConfirmations, libraryVersion\n function setConfig(uint16
                          _chainId, address _userApplication, uint _configType, bytes calldata _config) external;\n\n function getConfig(uint16 _chainId, address
                          _userApplication, uint _configType) external view returns (bytes memory);\n}\n"},"ILayerZeroMessagingLibraryV2.sol":{"content":"// SPDX-License
                          -Identifier: BUSL-1.1\n\npragma solidity \u003e=0.7.0;\n\nimport \"./ILayerZeroUserApplicationConfig.sol\";\nimport \"./ILayerZeroMessagingLibrary
                          .sol\";\n\ninterface ILayerZeroMessagingLibraryV2 is ILayerZeroMessagingLibrary {\n function getOutboundNonce(uint16 _chainId, bytes calldata
                          _path) external view returns (uint64);\n}\n"},"ILayerZeroOracleV2.sol":{"content":"// SPDX-License-Identifier: BUSL-1.1\n\npragma solidity \u003e=0
                          .7.0;\n\ninterface ILayerZeroOracleV2 {\n // @notice query price and assign jobs at the same time\n // @param _dstChainId - the destination
                          endpoint identifier\n // @param _outboundProofType - the proof type identifier to specify proof to be relayed\n // @param
                          _outboundBlockConfirmation - block confirmation delay before relaying blocks\n // @param _userApplication - the source sending contract
                          address\n function assignJob(uint16 _dstChainId, uint16 _outboundProofType, uint64 _outboundBlockConfirmation, address _userApplication)
                          external returns (uint price);\n\n // @notice query the oracle price for relaying block information to the destination chain\n // @param
                          _dstChainId the destination endpoint identifier\n // @param _outboundProofType the proof type identifier to specify the data to be relayed\n
                          // @param _outboundBlockConfirmation - block confirmation delay before relaying blocks\n // @param _userApplication - the source sending
                          contract address\n function getFee(uint16 _dstChainId, uint16 _outboundProofType, uint64 _outboundBlockConfirmation, address _userApplication)
                          external view returns (uint price);\n\n // @notice withdraw the accrued fee in ultra light node\n // @param _to - the fee receiver\n //
                          @param _amount - the withdrawal amount\n function withdrawFee(address payable _to, uint _amount) external;\n}\n"},"ILayerZeroReceiver.sol"
                          :{"content":"// SPDX-License-Identifier: BUSL-1.1\n\npragma solidity \u003e=0.5.0;\n\ninterface ILayerZeroReceiver {\n // @notice LayerZero
                          endpoint will invoke this function to deliver the message on the destination\n // @param _srcChainId - the source endpoint identifier\n //
                          @param _srcAddress - the source sending contract address from the source chain\n // @param _nonce - the ordered message nonce\n // @param
                          _payload - the signed payload is the UA bytes has encoded to be sent\n function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64
                          _nonce, bytes calldata _payload) external;\n}\n"},"ILayerZeroRelayerV2.sol":{"content":"// SPDX-License-Identifier: BUSL-1.1\n\npragma solidity
                          \u003e=0.7.0;\n\ninterface ILayerZeroRelayerV2 {\n // @notice query price and assign jobs at the same time\n // @param _dstChainId - the
                          destination endpoint identifier\n // @param _outboundProofType - the proof type identifier to specify proof to be relayed\n // @param
                          _userApplication - the source sending contract address. relayers may apply price discrimination to user apps\n // @param _payloadSize - the
                          length of the payload. it is an indicator of gas usage for relaying cross-chain messages\n // @param _adapterParams - optional parameters for
                          extra service plugins, e.g. sending dust tokens at the destination chain\n function assignJob(uint16 _dstChainId, uint16 _outboundProofType,
                          address _userApplication, uint _payloadSize, bytes calldata _adapterParams) external returns (uint price);\n\n // @notice query the relayer
                          price for relaying the payload and its proof to the destination chain\n // @param _dstChainId - the destination endpoint identifier\n //
                          @param _outboundProofType - the proof type identifier to specify proof to be relayed\n // @param _userApplication - the source sending contract
                          address. relayers may apply price discrimination to user apps\n // @param _payloadSize - the length of the payload. it is an indicator of gas
                          usage for relaying cross-chain messages\n // @param _adapterParams - optional parameters for extra service plugins, e.g. sending dust tokens at
                          the destination chain\n function getFee(uint16 _dstChainId, uint16 _outboundProofType, address _userApplication, uint _payloadSize, bytes
                          calldata _adapterParams) external view returns (uint price);\n\n // @notice withdraw the accrued fee in ultra light node\n // @param _to -
                          the fee receiver\n // @param _amount - the withdrawal amount\n function withdrawFee(address payable _to, uint _amount) external;\n}\n"}
                          ,"ILayerZeroTreasury.sol":{"content":"// SPDX-License-Identifier: BUSL-1.1\n\npragma solidity \u003e=0.5.0;\n\ninterface ILayerZeroTreasury {\n
                          function getFees(bool payInZro, uint relayerFee, uint oracleFee) external view returns (uint);\n}\n"},"ILayerZeroUltraLightNodeV2.sol":{"content":"
                          // SPDX-License-Identifier: BUSL-1.1\n\npragma solidity \u003e=0.7.0;\npragma abicoder v2;\n\ninterface ILayerZeroUltraLightNodeV2 {\n //
                          Relayer functions\n function validateTransactionProof(uint16 _srcChainId, address _dstAddress, uint _gasLimit, bytes32 _lookupHash, bytes32
                          _blockData, bytes calldata _transactionProof) external;\n\n // an Oracle delivers the block data using updateHash()\n function updateHash
                          (uint16 _srcChainId, bytes32 _lookupHash, uint _confirmations, bytes32 _blockData) external;\n\n // can only withdraw the receivable of the msg
                          .sender\n function withdrawNative(address payable _to, uint _amount) external;\n\n function withdrawZRO(address _to, uint _amount) external
                          ;\n\n // view functions\n function getAppConfig(uint16 _remoteChainId, address _userApplicationAddress) external view returns
                          (ApplicationConfiguration memory);\n\n function accruedNativeFee(address _address) external view returns (uint);\n\n struct
                          ApplicationConfiguration {\n uint16 inboundProofLibraryVersion;\n uint64 inboundBlockConfirmations;\n address relayer;\n
                           uint16 outboundProofType;\n uint64 outboundBlockConfirmations;\n address oracle;\n }\n\n event HashReceived(uint16 indexed
                          srcChainId, address indexed oracle, bytes32 lookupHash, bytes32 blockData, uint confirmations);\n event RelayerParams(bytes adapterParams,
                          uint16 outboundProofType);\n event Packet(bytes payload);\n event InvalidDst(uint16 indexed srcChainId, bytes srcAddress, address indexed
                          dstAddress, uint64 nonce, bytes32 payloadHash);\n event PacketReceived(uint16 indexed srcChainId, bytes srcAddress, address indexed dstAddress,
                          uint64 nonce, bytes32 payloadHash);\n event AppConfigUpdated(address indexed userApplication, uint indexed configType, bytes newConfig);\n
                          event AddInboundProofLibraryForChain(uint16 indexed chainId, address lib);\n event EnableSupportedOutboundProof(uint16 indexed chainId, uint16
                          proofType);\n event SetChainAddressSize(uint16 indexed chainId, uint size);\n event SetDefaultConfigForChainId(uint16 indexed chainId, uint16
                          inboundProofLib, uint64 inboundBlockConfirm, address relayer, uint16 outboundProofType, uint64 outboundBlockConfirm, address oracle);\n event
                          SetDefaultAdapterParamsForChainId(uint16 indexed chainId, uint16 indexed proofType, bytes adapterParams);\n event SetLayerZeroToken(address
                          indexed tokenAddress);\n event SetRemoteUln(uint16 indexed chainId, bytes32 uln);\n event SetTreasury(address indexed treasuryAddress);\n
                          event WithdrawZRO(address indexed msgSender, address indexed to, uint amount);\n event WithdrawNative(address indexed msgSender, address indexed
                          to, uint amount);\n}\n"},"ILayerZeroUserApplicationConfig.sol":{"content":"// SPDX-License-Identifier: BUSL-1.1\n\npragma solidity \u003e=0.5.0
                          ;\n\ninterface ILayerZeroUserApplicationConfig {\n // @notice set the configuration of the LayerZero messaging library of the specified
                          version\n // @param _version - messaging library version\n // @param _chainId - the chainId for the pending config change\n // @param
                          _configType - type of configuration. every messaging library has its own convention.\n // @param _config - configuration in the bytes. can
                          encode arbitrary content.\n function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external;\n\n //
                          @notice set the send() LayerZero messaging library version to _version\n // @param _version - new messaging library version\n function
                          setSendVersion(uint16 _version) external;\n\n // @notice set the lzReceive() LayerZero messaging library version to _version\n // @param
                          _version - new messaging library version\n function setReceiveVersion(uint16 _version) external;\n\n // @notice Only when the UA needs to
                          resume the message flow in blocking mode and clear the stored payload\n // @param _srcChainId - the chainId of the source chain\n // @param
                          _srcAddress - the contract address of the source contract at the source chain\n function forceResumeReceive(uint16 _srcChainId, bytes calldata
                          _srcAddress) external;\n}\n"},"ILayerZeroValidationLibrary.sol":{"content":"// SPDX-License-Identifier: BUSL-1.1\n\npragma solidity \u003e=0.7.0
                          ;\npragma abicoder v2;\n\nimport \"./LayerZeroPacket.sol\";\n\ninterface ILayerZeroValidationLibrary {\n function validateProof(bytes32
                          blockData, bytes calldata _data, uint _remoteAddressSize) external returns (LayerZeroPacket.Packet memory packet);\n}\n"},"LayerZeroPacket.sol"
                          :{"content":"// SPDX-License-Identifier: BUSL-1.1\n\npragma solidity 0.7.6;\n\nimport \"./Buffer.sol\";\nimport \"./SafeMath.sol\";\n\nlibrary
                          LayerZeroPacket {\n using Buffer for Buffer.buffer;\n using SafeMath for uint;\n\n struct Packet {\n uint16 srcChainId;\n
                          uint16 dstChainId;\n uint64 nonce;\n address dstAddress;\n bytes srcAddress;\n bytes32 ulnAddress;\n bytes
                          payload;\n }\n\n function getPacket(\n bytes memory data,\n uint16 srcChain,\n uint sizeOfSrcAddress,\n bytes32
                          ulnAddress\n ) internal pure returns (LayerZeroPacket.Packet memory) {\n uint16 dstChainId;\n address dstAddress;\n uint
                          size;\n uint64 nonce;\n\n // The log consists of the destination chain id and then a bytes payload\n // 0
                          --------------------------------------------31\n // 0 | total bytes size\n // 32 | destination chain id\n // 64 | bytes
                          offset\n // 96 | bytes array size\n // 128 | payload\n assembly {\n dstChainId := mload(add(data, 32))\n
                           size := mload(add(data, 96)) /// size of the byte array\n nonce := mload(add(data, 104)) // offset to convert to uint64 128 is
                          index -24\n dstAddress := mload(add(data, sub(add(128, sizeOfSrcAddress), 4))) // offset to convert to address 12 -8\n }\n\n
                           Buffer.buffer memory srcAddressBuffer;\n srcAddressBuffer.init(sizeOfSrcAddress);\n srcAddressBuffer.writeRawBytes(0, data, 136,
                          sizeOfSrcAddress); // 128 + 8\n\n uint payloadSize = size.sub(28).sub(sizeOfSrcAddress);\n Buffer.buffer memory payloadBuffer;\n
                           payloadBuffer.init(payloadSize);\n payloadBuffer.writeRawBytes(0, data, sizeOfSrcAddress.add(156), payloadSize); // 148 + 8\n
                          return LayerZeroPacket.Packet(srcChain, dstChainId, nonce, dstAddress, srcAddressBuffer.buf, ulnAddress, payloadBuffer.buf);\n }\n\n function
                          getPacketV2(\n bytes memory data,\n uint sizeOfSrcAddress,\n bytes32 ulnAddress\n ) internal pure returns (LayerZeroPacket
                          .Packet memory) {\n // packet def: abi.encodePacked(nonce, srcChain, srcAddress, dstChain, dstAddress, payload);\n // data def: abi
                          .encode(packet) = offset(32) + length(32) + packet\n // if from EVM\n // 0 - 31 0 - 31 | total bytes
                          size\n // 32 - 63 32 - 63 | location\n // 64 - 95 64 - 95 | size of the packet\n // 96 - 103
                          96 - 103 | nonce\n // 104 - 105 104 - 105 | srcChainId\n // 106 - P 106 - 125 | srcAddress, where P =
                          106 + sizeOfSrcAddress - 1,\n // P+1 - P+2 126 - 127 | dstChainId\n // P+3 - P+22 128 - 147 | dstAddress\n
                          // P+23 - END 148 - END | payload\n\n // decode the packet\n uint256 realSize;\n uint64 nonce;\n uint16
                          srcChain;\n uint16 dstChain;\n address dstAddress;\n assembly {\n realSize := mload(add(data, 64))\n
                          nonce := mload(add(data, 72)) // 104 - 32\n srcChain := mload(add(data, 74)) // 106 - 32\n dstChain := mload(add(data, add(76
                          , sizeOfSrcAddress))) // P + 3 - 32 = 105 + size + 3 - 32 = 76 + size\n dstAddress := mload(add(data, add(96, sizeOfSrcAddress))) // P +
                          23 - 32 = 105 + size + 23 - 32 = 96 + size\n }\n\n require(srcChain != 0, \"LayerZeroPacket: invalid packet\");\n\n Buffer
                          .buffer memory srcAddressBuffer;\n srcAddressBuffer.init(sizeOfSrcAddress);\n srcAddressBuffer.writeRawBytes(0, data, 106,
                          sizeOfSrcAddress);\n\n uint nonPayloadSize = sizeOfSrcAddress.add(32);// 2 + 2 + 8 + 20, 32 + 20 = 52 if sizeOfSrcAddress == 20\n
                          uint payloadSize = realSize.sub(nonPayloadSize);\n Buffer.buffer memory payloadBuffer;\n payloadBuffer.init(payloadSize);\n
                          payloadBuffer.writeRawBytes(0, data, nonPayloadSize.add(96), payloadSize);\n\n return LayerZeroPacket.Packet(srcChain, dstChain, nonce,
                          dstAddress, srcAddressBuffer.buf, ulnAddress, payloadBuffer.buf);\n }\n\n function getPacketV3(\n bytes memory data,\n uint
                          sizeOfSrcAddress,\n bytes32 ulnAddress\n ) internal pure returns (LayerZeroPacket.Packet memory) {\n // data def: abi.encodePacked
                          (nonce, srcChain, srcAddress, dstChain, dstAddress, payload);\n // if from EVM\n // 0 - 31 0 - 31 |
                          total bytes size\n // 32 - 39 32 - 39 | nonce\n // 40 - 41 40 - 41 | srcChainId\n // 42 - P
                          42 - 61 | srcAddress, where P = 41 + sizeOfSrcAddress,\n // P+1 - P+2 62 - 63 | dstChainId\n // P+3 - P+22 64
                          - 83 | dstAddress\n // P+23 - END 84 - END | payload\n\n // decode the packet\n uint256 realSize = data
                          .length;\n uint nonPayloadSize = sizeOfSrcAddress.add(32);// 2 + 2 + 8 + 20, 32 + 20 = 52 if sizeOfSrcAddress == 20\n require
                          (realSize \u003e= nonPayloadSize, \"LayerZeroPacket: invalid packet\");\n uint payloadSize = realSize - nonPayloadSize;\n\n uint64
                          nonce;\n uint16 srcChain;\n uint16 dstChain;\n address dstAddress;\n assembly {\n nonce := mload(add(data, 8
                          )) // 40 - 32\n srcChain := mload(add(data, 10)) // 42 - 32\n dstChain := mload(add(data, add(12, sizeOfSrcAddress))) // P +
                          3 - 32 = 41 + size + 3 - 32 = 12 + size\n dstAddress := mload(add(data, add(32, sizeOfSrcAddress))) // P + 23 - 32 = 41 + size + 23 - 32
                          = 32 + size\n }\n\n require(srcChain != 0, \"LayerZeroPacket: invalid packet\");\n\n Buffer.buffer memory srcAddressBuffer;\n
                           srcAddressBuffer.init(sizeOfSrcAddress);\n srcAddressBuffer.writeRawBytes(0, data, 42, sizeOfSrcAddress);\n\n Buffer.buffer
                          memory payloadBuffer;\n if (payloadSize \u003e 0) {\n payloadBuffer.init(payloadSize);\n payloadBuffer.writeRawBytes(0
                          , data, nonPayloadSize.add(32), payloadSize);\n }\n\n return LayerZeroPacket.Packet(srcChain, dstChain, nonce, dstAddress,
                          srcAddressBuffer.buf, ulnAddress, payloadBuffer.buf);\n }\n}\n"},"NonceContract.sol":{"content":"// SPDX-License-Identifier: BUSL-1.1\n\npragma
                          solidity 0.7.6;\n\nimport \"./ILayerZeroEndpoint.sol\";\n\ncontract NonceContract {\n ILayerZeroEndpoint public immutable endpoint;\n //
                          outboundNonce = [dstChainId][remoteAddress + localAddress]\n mapping(uint16 =\u003e mapping(bytes =\u003e uint64)) public outboundNonce;\n\n
                          constructor(address _endpoint) {\n endpoint = ILayerZeroEndpoint(_endpoint);\n }\n\n function increment(uint16 _chainId, address _ua,
                          bytes calldata _path) external returns (uint64) {\n require(endpoint.getSendLibraryAddress(_ua) == msg.sender, \"NonceContract: msg.sender
                          is not valid sendlibrary\");\n return ++outboundNonce[_chainId][_path];\n }\n}\n"},"Ownable.sol":{"content":"// SPDX-License-Identifier:
                          MIT\n\npragma solidity ^0.7.0;\n\nimport \"./Context.sol\";\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n
                          * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the
                          one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will
                          make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract
                          Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n
                           /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor () {\n address msgSender =
                          _msgSender();\n _owner = msgSender;\n emit OwnershipTransferred(address(0), msgSender);\n }\n\n /**\n * @dev Returns the
                          address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n
                           * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(),
                          \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to
                          call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the
                          contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership
                          () public virtual onlyOwner {\n emit OwnershipTransferred(_owner, address(0));\n _owner = address(0);\n }\n\n /**\n * @dev
                          Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function
                          transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\"
                          );\n emit OwnershipTransferred(_owner, newOwner);\n _owner = newOwner;\n }\n}\n"},"ReentrancyGuard.sol":{"content":"// SPDX
                          -License-Identifier: MIT\n\npragma solidity ^0.7.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n *
                          Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no
                          nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may
                          not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points
                          to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n *
                          https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are
                          more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n
                          // slot\u0027s contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler\u0027s defense against
                          contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more
                          expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a
                          percentage of the total\n // transaction\u0027s gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of
                          the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256
                          private _status;\n\n constructor () {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself,
                          directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to
                          prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the
                          actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require
                          (_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status =
                          _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org
                          /EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n}\n"},"SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.7
                          .0;\n\nimport \"./IERC20.sol\";\nimport \"./SafeMath.sol\";\nimport \"./Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20
                          operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on
                          failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for
                          IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20
                          {\n using SafeMath for uint256;\n using Address for address;\n\n function safeTransfer(IERC20 token, address to, uint256 value) internal
                          {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(IERC20
                          token, address from, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector,
                          from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and
                          its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n
                           function safeApprove(IERC20 token, address spender, uint256 value) internal {\n // safeApprove should only be called when setting an
                          initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // \u0027safeIncreaseAllowance\u0027 and
                          \u0027safeDecreaseAllowance\u0027\n // solhint-disable-next-line max-line-length\n require((value == 0) || (token.allowance(address
                          (this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi
                          .encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(IERC20 token, address spender, uint256
                          value) internal {\n uint256 newAllowance = token.allowance(address(this), spender).add(value);\n _callOptionalReturn(token, abi
                          .encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(IERC20 token, address spender,
                          uint256 value) internal {\n uint256 newAllowance = token.allowance(address(this), spender).sub(value, \"SafeERC20: decreased allowance below
                          zero\");\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n /**\n * @dev
                          Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return
                          value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The
                          call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private
                          {\n // We need to perform a low level call here, to bypass Solidity\u0027s return data size checking mechanism, since\n // we\u0027re
                          implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n // the target address contains contract
                          code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low
                          -level call failed\");\n if (returndata.length \u003e 0) { // Return data is optional\n // solhint-disable-next-line max-line
                          -length\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n"},"SafeMath
                          .sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.7.0;\n\n/**\n * @dev Wrappers over Solidity\u0027s arithmetic operations
                          with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers
                          usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores
                          this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations
                          eliminates an entire\n * class of bugs, so it\u0027s recommended to use it always.\n */\nlibrary SafeMath {\n /**\n * @dev Returns the
                          addition of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryAdd(uint256 a, uint256
                          b) internal pure returns (bool, uint256) {\n uint256 c = a + b;\n if (c \u003c a) return (false, 0);\n return (true, c);\n
                          }\n\n /**\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n
                          */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n if (b \u003e a) return (false, 0);\n return
                          (true, a - b);\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n *\n *
                          _Available since v3.4._\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n // Gas optimization:
                          this is cheaper than requiring \u0027a\u0027 not being zero, but the\n // benefit is lost if \u0027b\u0027 is also tested.\n // See:
                          https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c /
                          a != b) return (false, 0);\n return (true, c);\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division
                          by zero flag.\n *\n * _Available since v3.4._\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n
                           if (b == 0) return (false, 0);\n return (true, a / b);\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned
                          integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryMod(uint256 a, uint256 b) internal pure
                          returns (bool, uint256) {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n\n /**\n * @dev Returns the
                          addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity\u0027s `+` operator.\n *\n *
                          Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n
                           uint256 c = a + b;\n require(c \u003e= a, \"SafeMath: addition overflow\");\n return c;\n }\n\n /**\n * @dev Returns the
                          subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity\u0027s `
                          -` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal
                          pure returns (uint256) {\n require(b \u003c= a, \"SafeMath: subtraction overflow\");\n return a - b;\n }\n\n /**\n * @dev
                          Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity\u0027s `*` operator.\n
                           *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure
                          returns (uint256) {\n if (a == 0) return 0;\n uint256 c = a * b;\n require(c / a == b, \"SafeMath: multiplication overflow\"
                          );\n return c;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting on\n * division by zero.
                          The result is rounded towards zero.\n *\n * Counterpart to Solidity\u0027s `/` operator. Note: this function uses a\n * `revert` opcode
                          (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n *
                          Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n
                           require(b \u003e 0, \"SafeMath: division by zero\");\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing
                          two unsigned integers. (unsigned integer modulo),\n * reverting when dividing by zero.\n *\n * Counterpart to Solidity\u0027s `%`
                          operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to
                          revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod
                          (uint256 a, uint256 b) internal pure returns (uint256) {\n require(b \u003e 0, \"SafeMath: modulo by zero\");\n return a % b;\n
                          }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is
                          negative).\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily.
                          For custom revert reasons use {trySub}.\n *\n * Counterpart to Solidity\u0027s `-` operator.\n *\n * Requirements:\n *\n *
                          - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n
                           require(b \u003c= a, errorMessage);\n return a - b;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers
                          , reverting with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * CAUTION: This function is
                          deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryDiv}.\n *\n
                           * Counterpart to Solidity\u0027s `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while
                          Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot
                          be zero.\n */\n function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b \u003e 0
                          , errorMessage);\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer
                          modulo),\n * reverting with custom message when dividing by zero.\n *\n * CAUTION: This function is deprecated because it requires
                          allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryMod}.\n *\n * Counterpart to
                          Solidity\u0027s `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n *
                          invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n
                          function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n require(b \u003e 0, errorMessage);\n
                           return a % b;\n }\n}\n"},"UltraLightNodeV2.sol":{"content":"// SPDX-License-Identifier: BUSL-1.1\n\npragma solidity 0.7.6;\npragma abicoder
                          v2;\n\nimport \"./Ownable.sol\";\nimport \"./SafeMath.sol\";\nimport \"./ReentrancyGuard.sol\";\nimport \"./IERC20.sol\";\nimport \"./SafeERC20
                          .sol\";\n\nimport \"./ILayerZeroValidationLibrary.sol\";\nimport \"./ILayerZeroReceiver.sol\";\nimport \"./ILayerZeroTreasury.sol\";\nimport \"
                          ./ILayerZeroEndpoint.sol\";\n// v2\nimport \"./ILayerZeroMessagingLibraryV2.sol\";\nimport \"./ILayerZeroOracleV2.sol\";\nimport \"
                          ./ILayerZeroUltraLightNodeV2.sol\";\nimport \"./ILayerZeroRelayerV2.sol\";\nimport \"./NonceContract.sol\";\n\ncontract UltraLightNodeV2 is
                          ILayerZeroMessagingLibraryV2, ILayerZeroUltraLightNodeV2, ReentrancyGuard, Ownable {\n using SafeERC20 for IERC20;\n using SafeMath for uint
                          ;\n\n // Application config\n uint public constant CONFIG_TYPE_INBOUND_PROOF_LIBRARY_VERSION = 1;\n uint public constant
                          CONFIG_TYPE_INBOUND_BLOCK_CONFIRMATIONS = 2;\n uint public constant CONFIG_TYPE_RELAYER = 3;\n uint public constant
                          CONFIG_TYPE_OUTBOUND_PROOF_TYPE = 4;\n uint public constant CONFIG_TYPE_OUTBOUND_BLOCK_CONFIRMATIONS = 5;\n uint public constant
                          CONFIG_TYPE_ORACLE = 6;\n\n // Token and Contracts\n IERC20 public layerZeroToken;\n ILayerZeroTreasury public treasuryContract;\n\n
                          mapping(address =\u003e uint) public nativeFees;\n uint public treasuryZROFees;\n\n // User Application\n mapping(address =\u003e mapping
                          (uint16 =\u003e ApplicationConfiguration)) public appConfig; // app address =\u003e chainId =\u003e config\n mapping(uint16 =\u003e
                          ApplicationConfiguration) public defaultAppConfig; // default UA settings if no version specified\n mapping(uint16 =\u003e mapping(uint16
                          =\u003e bytes)) public defaultAdapterParams;\n\n // Validation\n mapping(uint16 =\u003e mapping(uint16 =\u003e address)) public
                          inboundProofLibrary; // chainId =\u003e library Id =\u003e inboundProofLibrary contract\n mapping(uint16 =\u003e uint16) public
                          maxInboundProofLibrary; // chainId =\u003e inboundProofLibrary\n mapping(uint16 =\u003e mapping(uint16 =\u003e bool)) public
                          supportedOutboundProof; // chainId =\u003e outboundProofType =\u003e enabled\n mapping(uint16 =\u003e uint) public chainAddressSizeMap;\n
                          mapping(address =\u003e mapping(uint16 =\u003e mapping(bytes32 =\u003e mapping(bytes32 =\u003e uint)))) public hashLookup;
                          //[oracle][srcChainId][blockhash][datahash] -\u003e confirmation\n mapping(uint16 =\u003e bytes32) public ulnLookup; // remote ulns\n\n
                          ILayerZeroEndpoint public immutable endpoint;\n uint16 public immutable localChainId;\n NonceContract public immutable nonceContract;\n\n
                          constructor(address _endpoint, address _nonceContract, uint16 _localChainId) {\n require(_endpoint != address(0x0), \"LayerZero: endpoint
                          cannot be zero address\");\n require(_nonceContract != address(0x0), \"LayerZero: nonceContract cannot be zero address\");\n
                          ILayerZeroEndpoint lzEndpoint = ILayerZeroEndpoint(_endpoint);\n localChainId = _localChainId;\n endpoint = lzEndpoint;\n
                          nonceContract = NonceContract(_nonceContract);\n }\n\n // only the endpoint can call SEND() and setConfig()\n modifier onlyEndpoint() {\n
                           require(address(endpoint) == msg.sender, \"LayerZero: only endpoint\");\n _;\n }\n\n
                          //----------------------------------------------------------------------------------\n // PROTOCOL\n function validateTransactionProof(uint16
                          _srcChainId, address _dstAddress, uint _gasLimit, bytes32 _lookupHash, bytes32 _blockData, bytes calldata _transactionProof) external override {\n
                           // retrieve UA\u0027s configuration using the _dstAddress from arguments.\n ApplicationConfiguration memory uaConfig = _getAppConfig
                          (_srcChainId, _dstAddress);\n\n // assert that the caller == UA\u0027s relayer\n require(uaConfig.relayer == msg.sender, \"LayerZero:
                          invalid relayer\");\n\n LayerZeroPacket.Packet memory _packet;\n uint remoteAddressSize = chainAddressSizeMap[_srcChainId];\n
                          require(remoteAddressSize != 0, \"LayerZero: incorrect remote address size\");\n {\n // assert that the data submitted by
                          UA\u0027s oracle have no fewer confirmations than UA\u0027s configuration\n uint storedConfirmations = hashLookup[uaConfig
                          .oracle][_srcChainId][_lookupHash][_blockData];\n require(storedConfirmations \u003e 0 \u0026\u0026 storedConfirmations \u003e= uaConfig
                          .inboundBlockConfirmations, \"LayerZero: not enough block confirmations\");\n\n // decode\n address inboundProofLib =
                          inboundProofLibrary[_srcChainId][uaConfig.inboundProofLibraryVersion];\n _packet = ILayerZeroValidationLibrary(inboundProofLib
                          ).validateProof(_blockData, _transactionProof, remoteAddressSize);\n }\n\n // packet content assertion\n require
                          (ulnLookup[_srcChainId] == _packet.ulnAddress \u0026\u0026 _packet.ulnAddress != bytes32(0), \"LayerZero: invalid _packet.ulnAddress\");\n
                          require(_packet.srcChainId == _srcChainId, \"LayerZero: invalid srcChain Id\");\n // failsafe because the remoteAddress size being passed
                          into validateProof trims the address this should not hit\n require(_packet.srcAddress.length == remoteAddressSize, \"LayerZero: invalid
                          srcAddress size\");\n require(_packet.dstChainId == localChainId, \"LayerZero: invalid dstChain Id\");\n require(_packet.dstAddress
                          == _dstAddress, \"LayerZero: invalid dstAddress\");\n\n // if the dst is not a contract, then emit and return early. This will break inbound
                          nonces, but this particular\n // path is already broken and wont ever be able to deliver anyways\n if (!_isContract(_dstAddress)) {\n
                           emit InvalidDst(_packet.srcChainId, _packet.srcAddress, _packet.dstAddress, _packet.nonce, keccak256(_packet.payload));\n
                          return;\n }\n\n bytes memory pathData = abi.encodePacked(_packet.srcAddress, _packet.dstAddress);\n emit PacketReceived
                          (_packet.srcChainId, _packet.srcAddress, _packet.dstAddress, _packet.nonce, keccak256(_packet.payload));\n endpoint.receivePayload
                          (_srcChainId, pathData, _dstAddress, _packet.nonce, _gasLimit, _packet.payload);\n }\n\n function send(address _ua, uint64, uint16
                          _dstChainId, bytes calldata _path, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata
                          _adapterParams) external payable override onlyEndpoint {\n address ua = _ua;\n uint16 dstChainId = _dstChainId;\n require
                          (ulnLookup[dstChainId] != bytes32(0), \"LayerZero: dstChainId does not exist\");\n\n bytes memory dstAddress;\n uint64 nonce;\n
                           // code block for solving \u0027Stack Too Deep\u0027\n {\n uint chainAddressSize = chainAddressSizeMap[dstChainId];\n
                           // path = remoteAddress + localAddress\n require(chainAddressSize != 0 \u0026\u0026 _path.length == 20 + chainAddressSize, \"LayerZero
                          : incorrect remote address size\");\n address srcInPath;\n bytes memory path = _path; // copy to memory\n assembly
                          {\n srcInPath := mload(add(add(path, 20), chainAddressSize)) // chainAddressSize + 20\n }\n require(ua ==
                          srcInPath, \"LayerZero: wrong path data\");\n dstAddress = _path[0:chainAddressSize];\n nonce = nonceContract.increment
                          (dstChainId, ua, path);\n }\n\n bytes memory payload = _payload;\n ApplicationConfiguration memory uaConfig = _getAppConfig
                          (dstChainId, ua);\n\n // compute all the fees\n uint relayerFee = _handleRelayer(dstChainId, uaConfig, ua, payload.length,
                          _adapterParams);\n uint oracleFee = _handleOracle(dstChainId, uaConfig, ua);\n uint nativeProtocolFee = _handleProtocolFee(relayerFee
                          , oracleFee, ua, _zroPaymentAddress);\n\n // total native fee, does not include ZRO protocol fee\n uint totalNativeFee = relayerFee
                          .add(oracleFee).add(nativeProtocolFee);\n\n // assert the user has attached enough native token for this address\n require
                          (totalNativeFee \u003c= msg.value, \"LayerZero: not enough native for fees\");\n // refund if they send too much\n uint amount = msg
                          .value.sub(totalNativeFee);\n if (amount \u003e 0) {\n (bool success, ) = _refundAddress.call{value: amount}(\"\");\n
                          require(success, \"LayerZero: failed to refund\");\n }\n\n // emit the data packet\n bytes memory encodedPayload = abi
                          .encodePacked(nonce, localChainId, ua, dstChainId, dstAddress, payload);\n emit Packet(encodedPayload);\n }\n\n function
                          _handleRelayer(uint16 _dstChainId, ApplicationConfiguration memory _uaConfig, address _ua, uint _payloadSize, bytes memory _adapterParams) internal
                          returns (uint relayerFee) {\n if (_adapterParams.length == 0) {\n _adapterParams = defaultAdapterParams[_dstChainId][_uaConfig
                          .outboundProofType];\n }\n address relayerAddress = _uaConfig.relayer;\n ILayerZeroRelayerV2 relayer = ILayerZeroRelayerV2
                          (relayerAddress);\n relayerFee = relayer.assignJob(_dstChainId, _uaConfig.outboundProofType, _ua, _payloadSize, _adapterParams);\n\n
                          _creditNativeFee(relayerAddress, relayerFee);\n\n // emit the param events\n emit RelayerParams(_adapterParams, _uaConfig
                          .outboundProofType);\n }\n\n function _handleOracle(uint16 _dstChainId, ApplicationConfiguration memory _uaConfig, address _ua) internal
                          returns (uint oracleFee) {\n address oracleAddress = _uaConfig.oracle;\n oracleFee = ILayerZeroOracleV2(oracleAddress).assignJob
                          (_dstChainId, _uaConfig.outboundProofType, _uaConfig.outboundBlockConfirmations, _ua);\n\n _creditNativeFee(oracleAddress, oracleFee);\n
                          }\n\n function _handleProtocolFee(uint _relayerFee, uint _oracleFee, address _ua, address _zroPaymentAddress) internal returns (uint
                          protocolNativeFee) {\n // if no ZRO token or not specifying a payment address, pay in native token\n bool payInNative =
                          _zroPaymentAddress == address(0x0) || address(layerZeroToken) == address(0x0);\n uint protocolFee = treasuryContract.getFees(!payInNative,
                          _relayerFee, _oracleFee);\n\n if (protocolFee \u003e 0) {\n if (payInNative) {\n address treasuryAddress = address
                          (treasuryContract);\n _creditNativeFee(treasuryAddress, protocolFee);\n protocolNativeFee = protocolFee;\n
                           } else {\n // zro payment address must equal the ua or the tx.origin otherwise the transaction reverts\n require
                          (_zroPaymentAddress == _ua || _zroPaymentAddress == tx.origin, \"LayerZero: must be paid by sender or origin\");\n\n // transfer the
                          LayerZero token to this contract from the payee\n layerZeroToken.safeTransferFrom(_zroPaymentAddress, address(this), protocolFee
                          );\n\n treasuryZROFees = treasuryZROFees.add(protocolFee);\n }\n }\n }\n\n function _creditNativeFee(address
                          _receiver, uint _amount) internal {\n nativeFees[_receiver] = nativeFees[_receiver].add(_amount);\n }\n\n // Can be called by any
                          address to update a block header\n // can only upload new block data or the same block data with more confirmations\n function updateHash
                          (uint16 _srcChainId, bytes32 _lookupHash, uint _confirmations, bytes32 _blockData) external override {\n uint storedConfirmations =
                          hashLookup[msg.sender][_srcChainId][_lookupHash][_blockData];\n\n // if it has a record, requires a larger confirmation.\n require
                          (storedConfirmations \u003c _confirmations, \"LayerZero: oracle data can only update if it has more confirmations\");\n\n // set the new
                          information into storage\n hashLookup[msg.sender][_srcChainId][_lookupHash][_blockData] = _confirmations;\n\n emit HashReceived
                          (_srcChainId, msg.sender, _lookupHash, _blockData, _confirmations);\n }\n\n
                          //----------------------------------------------------------------------------------\n // Other Library Interfaces\n\n // default to DEFAULT
                          setting if ZERO value\n function getAppConfig(uint16 _remoteChainId, address _ua) external view override returns (ApplicationConfiguration
                          memory) {\n return _getAppConfig(_remoteChainId, _ua);\n }\n\n function _getAppConfig(uint16 _remoteChainId, address _ua) internal
                          view returns (ApplicationConfiguration memory) {\n ApplicationConfiguration memory config = appConfig[_ua][_remoteChainId];\n
                          ApplicationConfiguration storage defaultConfig = defaultAppConfig[_remoteChainId];\n\n if (config.inboundProofLibraryVersion == 0) {\n
                           config.inboundProofLibraryVersion = defaultConfig.inboundProofLibraryVersion;\n }\n\n if (config.inboundBlockConfirmations == 0
                          ) {\n config.inboundBlockConfirmations = defaultConfig.inboundBlockConfirmations;\n }\n\n if (config.relayer == address
                          (0x0)) {\n config.relayer = defaultConfig.relayer;\n }\n\n if (config.outboundProofType == 0) {\n config
                          .outboundProofType = defaultConfig.outboundProofType;\n }\n\n if (config.outboundBlockConfirmations == 0) {\n config
                          .outboundBlockConfirmations = defaultConfig.outboundBlockConfirmations;\n }\n\n if (config.oracle == address(0x0)) {\n
                          config.oracle = defaultConfig.oracle;\n }\n\n return config;\n }\n\n function setConfig(uint16 _remoteChainId, address _ua,
                          uint _configType, bytes calldata _config) external override onlyEndpoint {\n ApplicationConfiguration storage uaConfig =
                          appConfig[_ua][_remoteChainId];\n if (_configType == CONFIG_TYPE_INBOUND_PROOF_LIBRARY_VERSION) {\n uint16
                          inboundProofLibraryVersion = abi.decode(_config, (uint16));\n require(inboundProofLibraryVersion \u003c=
                          maxInboundProofLibrary[_remoteChainId], \"LayerZero: invalid inbound proof library version\");\n uaConfig.inboundProofLibraryVersion =
                          inboundProofLibraryVersion;\n } else if (_configType == CONFIG_TYPE_INBOUND_BLOCK_CONFIRMATIONS) {\n uint64 blockConfirmations =
                          abi.decode(_config, (uint64));\n uaConfig.inboundBlockConfirmations = blockConfirmations;\n } else if (_configType ==
                          CONFIG_TYPE_RELAYER) {\n address relayer = abi.decode(_config, (address));\n uaConfig.relayer = relayer;\n } else if
                          (_configType == CONFIG_TYPE_OUTBOUND_PROOF_TYPE) {\n uint16 outboundProofType = abi.decode(_config, (uint16));\n require
                          (supportedOutboundProof[_remoteChainId][outboundProofType] || outboundProofType == 0, \"LayerZero: invalid outbound proof type\");\n
                          uaConfig.outboundProofType = outboundProofType;\n } else if (_configType == CONFIG_TYPE_OUTBOUND_BLOCK_CONFIRMATIONS) {\n uint64
                          blockConfirmations = abi.decode(_config, (uint64));\n uaConfig.outboundBlockConfirmations = blockConfirmations;\n } else if
                          (_configType == CONFIG_TYPE_ORACLE) {\n address oracle = abi.decode(_config, (address));\n uaConfig.oracle = oracle;\n
                           } else {\n revert(\"LayerZero: Invalid config type\");\n }\n\n emit AppConfigUpdated(_ua, _configType, _config);\n
                          }\n\n function getConfig(uint16 _remoteChainId, address _ua, uint _configType) external view override returns (bytes memory) {\n
                          ApplicationConfiguration storage uaConfig = appConfig[_ua][_remoteChainId];\n\n if (_configType == CONFIG_TYPE_INBOUND_PROOF_LIBRARY_VERSION
                          ) {\n if (uaConfig.inboundProofLibraryVersion == 0) {\n return abi.encode(defaultAppConfig[_remoteChainId]
                          .inboundProofLibraryVersion);\n }\n return abi.encode(uaConfig.inboundProofLibraryVersion);\n } else if (_configType
                          == CONFIG_TYPE_INBOUND_BLOCK_CONFIRMATIONS) {\n if (uaConfig.inboundBlockConfirmations == 0) {\n return abi.encode
                          (defaultAppConfig[_remoteChainId].inboundBlockConfirmations);\n }\n return abi.encode(uaConfig.inboundBlockConfirmations);\n
                           } else if (_configType == CONFIG_TYPE_RELAYER) {\n if (uaConfig.relayer == address(0x0)) {\n return abi.encode
                          (defaultAppConfig[_remoteChainId].relayer);\n }\n return abi.encode(uaConfig.relayer);\n } else if (_configType ==
                          CONFIG_TYPE_OUTBOUND_PROOF_TYPE) {\n if (uaConfig.outboundProofType == 0) {\n return abi.encode
                          (defaultAppConfig[_remoteChainId].outboundProofType);\n }\n return abi.encode(uaConfig.outboundProofType);\n } else if
                          (_configType == CONFIG_TYPE_OUTBOUND_BLOCK_CONFIRMATIONS) {\n if (uaConfig.outboundBlockConfirmations == 0) {\n return
                          abi.encode(defaultAppConfig[_remoteChainId].outboundBlockConfirmations);\n }\n return abi.encode(uaConfig
                          .outboundBlockConfirmations);\n } else if (_configType == CONFIG_TYPE_ORACLE) {\n if (uaConfig.oracle == address(0x0)) {\n
                           return abi.encode(defaultAppConfig[_remoteChainId].oracle);\n }\n return abi.encode(uaConfig.oracle);\n }
                          else {\n revert(\"LayerZero: Invalid config type\");\n }\n }\n\n // returns the native fee the UA pays to cover fees\n
                          function estimateFees(uint16 _dstChainId, address _ua, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParams) external view
                          override returns (uint nativeFee, uint zroFee) {\n ApplicationConfiguration memory uaConfig = _getAppConfig(_dstChainId, _ua);\n\n //
                          Relayer Fee\n bytes memory adapterParams;\n if (_adapterParams.length \u003e 0) {\n adapterParams = _adapterParams;\n
                           } else {\n adapterParams = defaultAdapterParams[_dstChainId][uaConfig.outboundProofType];\n }\n uint relayerFee =
                          ILayerZeroRelayerV2(uaConfig.relayer).getFee(_dstChainId, uaConfig.outboundProofType, _ua, _payload.length, adapterParams);\n\n // Oracle
                          Fee\n address ua = _ua; // stack too deep\n uint oracleFee = ILayerZeroOracleV2(uaConfig.oracle).getFee(_dstChainId, uaConfig
                          .outboundProofType, uaConfig.outboundBlockConfirmations, ua);\n\n // LayerZero Fee\n uint protocolFee = treasuryContract.getFees
                          (_payInZRO, relayerFee, oracleFee);\n _payInZRO ? zroFee = protocolFee : nativeFee = protocolFee;\n\n // return the sum of fees\n
                           nativeFee = nativeFee.add(relayerFee).add(oracleFee);\n }\n\n
                          //---------------------------------------------------------------------------\n // Claim Fees\n\n // universal withdraw ZRO token function\n
                           function withdrawZRO(address _to, uint _amount) external override nonReentrant {\n require(msg.sender == address(treasuryContract),
                          \"LayerZero: only treasury\");\n treasuryZROFees = treasuryZROFees.sub(_amount);\n layerZeroToken.safeTransfer(_to, _amount);\n
                           emit WithdrawZRO(msg.sender, _to, _amount);\n }\n\n // universal withdraw native token function.\n // the source contract should perform
                          all the authentication control\n function withdrawNative(address payable _to, uint _amount) external override nonReentrant {\n require
                          (_to != address(0x0), \"LayerZero: _to cannot be zero address\");\n nativeFees[msg.sender] = nativeFees[msg.sender].sub(_amount);\n\n
                           (bool success, ) = _to.call{value: _amount}(\"\");\n require(success, \"LayerZero: withdraw failed\");\n emit WithdrawNative(msg
                          .sender, _to, _amount);\n }\n\n //---------------------------------------------------------------------------\n // Owner calls,
                          configuration only.\n function setLayerZeroToken(address _layerZeroToken) external onlyOwner {\n require(_layerZeroToken != address(0x0),
                          \"LayerZero: _layerZeroToken cannot be zero address\");\n layerZeroToken = IERC20(_layerZeroToken);\n emit SetLayerZeroToken
                          (_layerZeroToken);\n }\n\n function setTreasury(address _treasury) external onlyOwner {\n require(_treasury != address(0x0),
                          \"LayerZero: treasury cannot be zero address\");\n treasuryContract = ILayerZeroTreasury(_treasury);\n emit SetTreasury(_treasury);\n
                           }\n\n function addInboundProofLibraryForChain(uint16 _chainId, address _library) external onlyOwner {\n require(_library != address
                          (0x0), \"LayerZero: library cannot be zero address\");\n uint16 libId = maxInboundProofLibrary[_chainId];\n require(libId \u003c
                          65535, \"LayerZero: can not add new library\");\n maxInboundProofLibrary[_chainId] = ++libId;\n inboundProofLibrary[_chainId][libId]
                          = _library;\n emit AddInboundProofLibraryForChain(_chainId, _library);\n }\n\n function enableSupportedOutboundProof(uint16 _chainId,
                          uint16 _proofType) external onlyOwner {\n supportedOutboundProof[_chainId][_proofType] = true;\n emit EnableSupportedOutboundProof
                          (_chainId, _proofType);\n }\n\n function setDefaultConfigForChainId(uint16 _chainId, uint16 _inboundProofLibraryVersion, uint64
                          _inboundBlockConfirmations, address _relayer, uint16 _outboundProofType, uint64 _outboundBlockConfirmations, address _oracle) external onlyOwner
                          {\n require(_inboundProofLibraryVersion \u003c= maxInboundProofLibrary[_chainId] \u0026\u0026 _inboundProofLibraryVersion \u003e 0,
                          \"LayerZero: invalid inbound proof library version\");\n require(_inboundBlockConfirmations \u003e 0, \"LayerZero: invalid inbound block
                          confirmation\");\n require(_relayer != address(0x0), \"LayerZero: invalid relayer address\");\n require
                          (supportedOutboundProof[_chainId][_outboundProofType], \"LayerZero: invalid outbound proof type\");\n require(_outboundBlockConfirmations
                          \u003e 0, \"LayerZero: invalid outbound block confirmation\");\n require(_oracle != address(0x0), \"LayerZero: invalid oracle address\");\n
                           defaultAppConfig[_chainId] = ApplicationConfiguration(_inboundProofLibraryVersion, _inboundBlockConfirmations, _relayer, _outboundProofType,
                          _outboundBlockConfirmations, _oracle);\n emit SetDefaultConfigForChainId(_chainId, _inboundProofLibraryVersion, _inboundBlockConfirmations,
                          _relayer, _outboundProofType, _outboundBlockConfirmations, _oracle);\n }\n\n function setDefaultAdapterParamsForChainId(uint16 _chainId,
                          uint16 _proofType, bytes calldata _adapterParams) external onlyOwner {\n defaultAdapterParams[_chainId][_proofType] = _adapterParams;\n
                           emit SetDefaultAdapterParamsForChainId(_chainId, _proofType, _adapterParams);\n }\n\n function setRemoteUln(uint16 _remoteChainId, bytes32
                          _remoteUln) external onlyOwner {\n require(ulnLookup[_remoteChainId] == bytes32(0), \"LayerZero: remote uln already set\");\n
                          ulnLookup[_remoteChainId] = _remoteUln;\n emit SetRemoteUln(_remoteChainId, _remoteUln);\n }\n\n function setChainAddressSize(uint16
                          _chainId, uint _size) external onlyOwner {\n require(chainAddressSizeMap[_chainId] == 0, \"LayerZero: remote chain address size already
                          set\");\n chainAddressSizeMap[_chainId] = _size;\n emit SetChainAddressSize(_chainId, _size);\n }\n\n
                          //----------------------------------------------------------------------------------\n // view functions\n\n function accruedNativeFee
                          (address _address) external view override returns (uint) {\n return nativeFees[_address];\n }\n\n function getOutboundNonce(uint16
                          _chainId, bytes calldata _path) external view override returns (uint64) {\n return nonceContract.outboundNonce(_chainId, _path);\n }\n\n
                           function _isContract(address addr) internal view returns (bool) {\n uint size;\n assembly {\n size := extcodesize(addr
                          )\n }\n return size != 0;\n }\n}\n"}}
                      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                      File 5 of 9: OptimizedTransparentUpgradeableProxy
                      1
                      2
                      3
                      4
                      5
                      6
                      7
                      8
                      9
                      10
                      11
                      12
                      13
                      14
                      15
                      16
                      // SPDX-License-Identifier: MIT
                      pragma solidity ^0.7.0;
                      /**
                      * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
                      * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to
                      * be specified by overriding the virtual {_implementation} function.
                      *
                      * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
                      * different contract through the {_delegate} function.
                      *
                      * The success and return data of the delegated call will be returned back to the caller of the proxy.
                      */
                      abstract contract Proxy {
                      /**
                      * @dev Delegates the current call to `implementation`.
                      *
                      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                      File 6 of 9: Endpoint
                      1
                      2
                      3
                      4
                      5
                      6
                      7
                      8
                      9
                      10
                      11
                      12
                      13
                      14
                      15
                      16
                      // SPDX-License-Identifier: BUSL-1.1
                      pragma solidity 0.7.6;
                      import "./interfaces/ILayerZeroReceiver.sol";
                      import "./interfaces/ILayerZeroEndpoint.sol";
                      import "./interfaces/ILayerZeroMessagingLibrary.sol";
                      import "@openzeppelin/contracts/access/Ownable.sol";
                      contract Endpoint is Ownable, ILayerZeroEndpoint {
                      uint16 public immutable chainId;
                      // installed libraries and reserved versions
                      uint16 public constant BLOCK_VERSION = 65535;
                      uint16 public constant DEFAULT_VERSION = 0;
                      uint16 public latestVersion;
                      mapping(uint16 => ILayerZeroMessagingLibrary) public libraryLookup; // version -> ILayerZeroEndpointLibrary
                      // default send/receive libraries
                      uint16 public defaultSendVersion;
                      uint16 public defaultReceiveVersion;
                      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                      File 7 of 9: NonceContract
                      1
                      2
                      3
                      4
                      5
                      6
                      7
                      8
                      9
                      10
                      11
                      12
                      13
                      14
                      15
                      16
                      // SPDX-License-Identifier: BUSL-1.1
                      pragma solidity 0.7.6;
                      import "./interfaces/ILayerZeroEndpoint.sol";
                      contract NonceContract {
                      ILayerZeroEndpoint public immutable endpoint;
                      // outboundNonce = [dstChainId][remoteAddress + localAddress]
                      mapping(uint16 => mapping(bytes => uint64)) public outboundNonce;
                      constructor(address _endpoint) {
                      endpoint = ILayerZeroEndpoint(_endpoint);
                      }
                      function increment(uint16 _chainId, address _ua, bytes calldata _path) external returns (uint64) {
                      require(endpoint.getSendLibraryAddress(_ua) == msg.sender, "NonceContract: msg.sender is not valid sendlibrary");
                      return ++outboundNonce[_chainId][_path];
                      }
                      }
                      // SPDX-License-Identifier: BUSL-1.1
                      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                      File 8 of 9: OptimizedTransparentUpgradeableProxy
                      1
                      2
                      3
                      4
                      5
                      6
                      7
                      8
                      9
                      10
                      11
                      12
                      13
                      14
                      15
                      16
                      // SPDX-License-Identifier: MIT
                      pragma solidity ^0.7.0;
                      /**
                      * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
                      * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to
                      * be specified by overriding the virtual {_implementation} function.
                      *
                      * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
                      * different contract through the {_delegate} function.
                      *
                      * The success and return data of the delegated call will be returned back to the caller of the proxy.
                      */
                      abstract contract Proxy {
                      /**
                      * @dev Delegates the current call to `implementation`.
                      *
                      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                      File 9 of 9: TreasuryV2
                      1
                      2
                      3
                      4
                      5
                      6
                      7
                      8
                      9
                      10
                      11
                      12
                      13
                      14
                      15
                      16
                      // SPDX-License-Identifier: BUSL-1.1
                      pragma solidity 0.7.6;
                      import "./interfaces/ILayerZeroTreasury.sol";
                      import "@openzeppelin/contracts/access/Ownable.sol";
                      import "@openzeppelin/contracts/math/SafeMath.sol";
                      import "./interfaces/ILayerZeroUltraLightNodeV2.sol";
                      contract TreasuryV2 is ILayerZeroTreasury, Ownable {
                      using SafeMath for uint;
                      uint public nativeBP;
                      uint public zroFee;
                      bool public feeEnabled;
                      bool public zroEnabled;
                      ILayerZeroUltraLightNodeV2 public uln;
                      event NativeBP(uint bp);
                      event ZroFee(uint zroFee);
                      event FeeEnabled(bool feeEnabled);
                      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX